From 644bcd76b9caa6d9ba3a7993fde74ce3bbc1069f Mon Sep 17 00:00:00 2001 From: Stephan Philips <s.g.j.philips@tudelft.nl> Date: Wed, 20 Feb 2019 13:11:58 +0100 Subject: [PATCH] update docs --- docs/_build/doctrees/environment.pickle | Bin 79198 -> 84202 bytes docs/_build/doctrees/index.doctree | Bin 12099 -> 13352 bytes docs/_build/doctrees/intro.doctree | Bin 100522 -> 163420 bytes docs/_build/doctrees/struct.doctree | Bin 2416 -> 13580 bytes .../doctrees/tutorials/init_lib.doctree | Bin 2341 -> 24646 bytes .../doctrees/tutorials/simple_pulse.doctree | Bin 2432 -> 4391 bytes docs/_build/html/_modules/base_pulse.html | 1 + docs/_build/html/_sources/index.rst.txt | 7 +- docs/_build/html/_sources/intro.rst.txt | 203 ++++++++++++++++- docs/_build/html/_sources/struct.rst.txt | 47 +++- .../html/_sources/tutorials/init_lib.rst.txt | 142 +++++++++++- .../_sources/tutorials/simple_pulse.rst.txt | 18 +- docs/_build/html/index.html | 19 +- docs/_build/html/intro.html | 215 +++++++++++++++++- docs/_build/html/objects.inv | Bin 943 -> 974 bytes docs/_build/html/searchindex.js | 2 +- docs/_build/html/struct.html | 72 +++++- docs/_build/html/tutorials/init_lib.html | 158 ++++++++++++- docs/_build/html/tutorials/simple_pulse.html | 39 +++- docs/index.rst | 7 +- docs/struct.rst | 47 +++- docs/tutorials/init_lib.rst | 143 +++++++++++- docs/tutorials/simple_pulse.rst | 18 +- 23 files changed, 1108 insertions(+), 30 deletions(-) diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index c737e6b661ca8e6b7b25a3b82aa6068c62add2e2..169cbb6d5dd3c77467bad1f55d172b3084d1ca97 100644 GIT binary patch delta 14672 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 PbZ!k-4AtryuJHc>kFuqd delta 9856 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 Pa6>4IOIOl0z6t8TEHPTB diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree index cfc554b6a7aa591bb50d0eac81d333acef1ff861..55262f8ac27b4a0c23feca58cd558aaa573b1451 100644 GIT binary patch delta 2855 zcmb7GYitx%6z=SEc3b+QTl&~-r@PyIls=#eR-2;bQP9T4QlmivWV@YuJ8XB$?kp6L zM^Oow!3SrI|0H0D5)zHsA3TguFeWA>8WIIfjFH5sV2Fr+2nmVj%<OL2Zb8@|ch9-^ zeBXTcoO5UHR~tTI<~^qOU5|fmzGgNQ8Q`Y5#wyUSO@M#+=WOlvtark;(xN+X*y6S5 z)1VYLSu-*4yG2^qZf_HMQ*wMPERRNnNPKKuj3s4s;xS<)o)DHV6XGKyNl{K_Q3KYW zxk_l~o67^NNGTqQ#v_|HZcfEz5tj1(TtCUEYgd_dy~>sZC)J&5fSK72%`aE9<%)Lo zO?7(3!FIxcD_|~R4z>;6GYYn?XvwJ|HUUR$VeSwZ?XQ>*;hd_)%|Ywk8F8oV-PYs! zGhoW@g@$6g`8dX%&=93)eN2eCIp(Y~r3nre3x$HGGJ>_`Ji${)c0r>pL+k8)Xh-2s z3oE3(lA)Dw*#mb<`tqo+AmL9Mbvar;5VcuT3{8Os=TIsd6=hZ7+SC;DvIJ{pKIZSI zw8bejG=`RhX-j4|$1K|8CbGUV`3SX!0qeSDER@A&xCXPnvg;wa;05c3-D`6&|3kv` z4k}k3IzHD@lAS9mVh)MNztm8eRqs^cx~mpGtK-d;IB$Y)tE%hopQIOIbLk)$OE20a zx6UNMuPzUa&(ZNt@~AFSEn1BZc8mRcZ$ao8)wts4OmM!Y5pI^6=B&vSi`F;||2!7! zZmz<2&~g?qRZu~(_D<q}J!NfNW%|>ykGSA2)FthqVJ{7D(6En&{WQEqgF?gGu)X57 z8Wl|xD2?NPMn@Iuh(c-QVopl0s2nixCuq$f9VcyCrhMofqfFJ!$W(yk`UzG$x?r)R zj5`N?j(+}}&T(Gjplo@N<4f{NC|hSp1|90#j>ovm&|2NWU)B*n<`7<t`@Rryp}K{; z0XM3B{0$xPcMj2vh`$OE+vojZ;|<!LEC#sha#Q&%v?+t;YV|uq^(n|YsXmE}e(qR7 z{fOXbda!mOXY1727wGKRT$WZ`Y&F1lRgTKSoWXB(ZbP2|_<EPEPlv9W78XS4a?RCJ z)r$dIs+9UxZati?57^f0n2pnz7R0QZ1+&WO<79|C-8NarY?;Q)M@(WC%x!1L_KqHX za5|bcbU<@?Dj=z%Zmgc!@uYqU#raIFnV7t;C!V9w)o{^vT7Sk#{TY<BPFzcCNqfMN zY=iNJPWZ4f!CitLj}OU9EFB2EsPR}x+&5%46iB0}uXSnZd!$um4<tSQDD@P_jJcB* zY{KR->dj+>TK9rxBY7B-IX;UD-?DftAm$F*Ybg>xeo`EcxLt-?BTTuS^!JOqiED-? z|6G{s3GyDDUciY)IOlU278qf#r_-|owJ6qvII=aIh^hPO*fvn8{;q!l)z%|qzL~6f zXnE$*=Bx7Lg|yb`^#<DpvSJ$1$i9N5+^jcm7C!L0xwWLw6p%WMaLMb*%6us+b7ce} zN-^paC&r_rkx^MaAU#cU{8)T=G&U?ws8TQb5^Y3Uiq_0MbfMls<m=#8KT!X*W`Elx z;<aSv>CesP>7RripTHfMRsX)M{uMx4XVY&<is3|r{h#_LQT^-4Hs4IvZrXv?epN=; z?hn?mTME~b_j#s58I5q(Kg2CcHw9`9+|_h<%VFd4BFfTT>`CbhvQFWUQf#sCm?&=> z7n5{xk|-vmt%p*qhGq!BTC`}QZD_x~8?Rxd$!$ql9NRc1CX?Y;MHSR+u`{3T+)YgB zUP?DMLA$XDVr)1mY#o(ZJS7WZVJI4oZ4#oRF|k`n#jwI+L>7n9q{7DJ%&o3GpW~TF zCCPoLQJX{RG11%E(u3wxCOG12>@i2hEn-ydHz+2`gsNCy?p+glHndVzOr%ZiuTU(> Ycq$PQRpz4;(q+P=Xm_75@EzU%0h6C~BLDyZ delta 2213 zcma)8drVtp6z98eFSie%&@^jdQ2Ksg2OUmOwk1B68D=1j`@<|zfvxQ8&FGMV1LI@M zLe#ADk#qOYVl<isHPIkz$g<1_hG>k&#o+!hF-n#tl4&p)vzSF^Jm<S@p#sx?4(IVZ zzw`LM@0NG?{A2R*iZh+9GxBv=nq{yeJE2N>h?${J>4s^=FU6YSPfIg8Sfy5OMyt2> zVfdg%g`1Vnv09i=1MrD@59@{+rQ4<R%13p+J90vQMh|nDKPhZmRzz+3q`n$(@Nu}> z6qc>r!AIfM@@CTrYDdQgcm`_B{p>V6VLl+AM&HW<SB2Us!r6<sLYb@wW)#o5;^*?k zMHEh1Eb=+zm=bK&sJ*obn;3W<+oe34h^`&w5>kC6NNZ5LxCtqT2djK=-MVKT@j{+B zg^1Kz;svC;B8Y9MeX|Mi{``R`uw?s8;mZj9MI_atwnRy4eql*SRJ)+9y0&VF2Y8T& z_R;P&f<T8oCR0MMurB*+b7$>o7KyR4GOd+FoJ2c`9V9wP+)bj3#4d<Co_5}k>KONH zZv30CVCN340q(7{!*>oJbLIYWBqa3!#U0us==Z^}s>T9n?Wg1co+=zFSHxb@rFIx^ z$NSD+mWEr-eQMeu8Wuz=W|ev2Q^ywQQ*Bn9SxXs|8JKppvq`w-YE>tVjOPm(vJY`5 z$tum5sE?XoBP`u#8=R=O!(6>t6)uPNdNJLP>1Wrc#~YT^3r4BgB9^9{A<MGboH&yP zO-8JypuqL<!s&PsKZy8HrLh~rHbS;em5C{lt7wcf^{P>2QB<K_wqWdgV)|dZJk#Wr zZZNpm)TrJtnEojC8%Czz$r7tsF*q}@%Y6s4g60mJtdcm#Y6%jqs1iZAnN)8n{-!&~ ze9+wNHTevDz`#cl@7VzVZgY=mw}ISgAZesdffSoFI=S8EsPkp9Ib##6n<J_OT=RTo z;zo%<!ArMrYaC+(=-p^@u<Uh$!#8C*ZlpbHbhZsso)QcSo#`=Bo3?IzoP-?}SPL&! zTJ4OgCvtE5tC{J7QDatuj{|Li^JFnzo_|qyVtX4r3VSfJ_X|Seh1Htytg_bOWcpAl zefaV5k>sEbdf_2y1sE^ODyj65R61E2g_A*#bVY)xU>93}4}C$H3pYxO5`;qA{ZXQ> zM8;$NBWe8wdhTCSS>uCp7Y^~Iu^Li87vpZB)y$Vn(St)|;HOX|R#u+x`7#2EEf&4s zmUv-j*vnLSGi+DF+K(85xu8c~AZmvuqkre#I^@e*u)pN^@R8KP)TsWV_A3Ii>d;Z# z#-Zf6uC1W0(IDDysQr6}4&;)M%ME>X6@XtAg*<=Xew3FYp`Nx4M=5$sMk#o?Evsab z{UZnYnjc36>ve82<qn#1&wZOsSs?q589TAU_O&z0<k?p6h|4@Lfx9JQe4DZ?s;~Vt z(czw#ps!`10`H@Ein+y>Ta3Mu`yuv5`2*9m;rB>r*r|3H#aPyq?jK5yP7EhA^xuI- am>v=D8RJg!Py&w%G_lXce}?7uu73b;oRgFQ diff --git a/docs/_build/doctrees/intro.doctree b/docs/_build/doctrees/intro.doctree index 2b2cf8823759a0f1359b268279db2dcb9c98d93f..88a1cde75f89c15a916f1773b4d6b587d2fc2233 100644 GIT binary patch literal 163420 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 OacB3?$+XVI=>G#;SRDlb delta 2187 zcmZXVX=qee6vuN;##ywDld)+tZya?R&<rt~OC(yuxFk}<#)zP%sF~>C_!>1jhSZu! z3fhhML1*;h7q=>iAc`PCP+UF)6_=u7a19ngK`2%f6$HKa-FKJwGGFG+oAW!%|DJR1 zqmO~(ySzO)*yyePBaeQv@cgT6+lPuXXW_t-K4Sp75#NXV_T7j5`M%rXygc((xUcRp zqyTS+$<ZfpuizGan;v1_WPg72?)eqM`Sb@#zJ^g`Z2}^FcLw2SAhGdyw+MO*+LN0y zsg>(enM`s`DwA8DD<un`LIpWkgY$5OL6ROEk3Slua2i&UD-&?s=w${CV3-SlenC1v z9ZA1TkDiYmt!A@9VwKp6zt~u(g;m8iQ=-?K+0e0RRVrs*rC_h8ZSDG0Zhn48I&LmA z$kS4cpuqRo_->BlW`mrIV-%^~!?<mi#N&9%wmV^vORH&i&HqA(_{(q<vy7IZAw6EV zEw3t%@5(Sb)-L65k0`~gXOGTmp4;#<1^+*hrxPq!X#<jECwxoV{WuIiDchIj+;(_{ zW*b$uK;3u3*u9f6ROb}xyl;q5mhy4GOqZEB(p{xFo+=$P2?r~A9*JuF+9!{T>PYUl zLy)w0(*9t%!$N@t$gA%#fc^ATt0gN%h4osfp9B+Pp^Qn~ympdS@}HXdZ_?b=8()kV zQgXIxr<N~mFF2xkIwU=@zy(uy;PNS2;0v1hIfuD_s%4)2bWDpt6@dpDG9VBoM^yrg z$jTb@(?+APlH{$%y%t=^Rb%tWp*2FkD}x}pwB2qd_>w)d2H_dR`q?<y1LRe6#r*Pd z%0j=&sZ8@!Dm+=ow5^t_H8|bX5zwG9a|EO6zc^ijDo&C!Ju}cN2rJ6j8EVjK3T5YB z3pzTNsoteU-6DLbsFv!%nOya@LAuuLg#knZa{_cv)9R2?&0ae+1H=4>zUO<)WG0Sj zYK7C9>yy$o>$U&txCo62w|X};=9*v}by&NMf=ay?oOzXSsTZHcqwFsRXNQoM9Z<pt zHjgBCX#K$kmYz@%>6vY5MJTHRjbX-oOF=|{)<Lb9i^V>%kT2BhRk5k7)xa7zXcfen zfPE3L6J4w^O@dKM9IWTXQBWngfio=)R0+E-E4_UUs*lcmBhPFvdvq*p_)ClWyY%5& zt}XO_6hox9LnFIBt!vF>CYozj&{56xVc}X8ME7LTaE95}+M~q~CUskRbxmDZLb|u& zBDk!1q1%Zb9%)&Mg}z?T_dhf==16%LMgr_^;!;v@BRrN2mxU1_9Eg%J-57Nmmyk8x f*aYt+F$~_wD52OulvXZpV^6Wt0qnFVZ^QU!M>AcQ diff --git a/docs/_build/doctrees/struct.doctree b/docs/_build/doctrees/struct.doctree index 10db82ef85691603af8d2c0713c9413c569f9cdc..da764a169e7b5916b0b52a439aa8d88cba0f5e92 100644 GIT binary patch literal 13580 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 WSFW$pH{;)K0B>f{jKZL#TKPA(+3)=T delta 191 zcmeCl`XI#Gz%n(Jb0h0SMhDJ<#G=IXqQruXDU+vYHcqLXqLIPc!;zGen34%3rev_k zPRS5O5@?+QRg|HhA(f#!nNeCxP&-39Ln}kZn*}JsoxzyFym_H|BNJ0b+GcgFK4zUB z_PoU0)XbD(py?S78MeheoFIXc%7RpgkY90zJW$FugS&Y0R=wxqJwhc#iFw6o`9-<$ Txv9m)iRnOvu~R0$Fi`;ji8Dqw diff --git a/docs/_build/doctrees/tutorials/init_lib.doctree b/docs/_build/doctrees/tutorials/init_lib.doctree index e0d1e81a898638ec52b2586af00415eb8e8c711a..250455de57ed0160cfe2c39dbe251eca6b5eeb7b 100644 GIT binary patch literal 24646 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 XUcm$AF-sp34Pi%7%9nsnQZ4@<MXK__ delta 74 zcmX?hfN`l1YXi$vDb9(kNgFeK85t8dzX+Se#FP=Xxju3hvqFYJhHh~WXI^4%YDr~5 dYVnlXDH#TS#ToKIS~r8cc=D;(=aab;tO4f!8^izr diff --git a/docs/_build/doctrees/tutorials/simple_pulse.doctree b/docs/_build/doctrees/tutorials/simple_pulse.doctree index 613fc0c54c64f70061592adf785651d98d43db5c..29233e595e75ad2dbc74e2b7a6250e4ec14ced23 100644 GIT binary patch delta 1825 zcmcIl&ubGw6gFvNe@SgE_RywwtVmOB>dAwMAWEyHl8b^M)-p+^d7-mA+nrrvgpvyC zK~_++Mf7a3P!Oe8DfD2a|ArTj{tLd@-N}#sLJJ-?F!NsCd*A!MZ+E%x(@0{ubtT#R zCXtP$z802Z6*%T~Sk$Hkn_A#k{jsP1lAnTv_kBv(#1PUU?6Jk{qQOi@juXq}l1bu9 zmvUYvIbq5o<_H&`c_NF3#Tl`wVM#*GJh3=+7#)=pozo_9fRTB@xhNIQf;!o(LP|x> zNtO{x=2;1Q;a@p6aDX~Qf+!L7ID%NVz!?qoH_7l9OJLReEG!Vrk!Ln>N}_3CAKGSp zIPLw|A5P^+cz!OwKM>Ks0lISpM9=+*Be(<ukcJqvz+eWFnd-}Uvf{!RT!cZm0LhtF zjCZNHn?;_xvRvdA<`!Myum+~#c(5WBcR6Ry97jU;#8XNrDl%7en9&gSF4IsHA!U^u zH5Hw%WO*dpCN`sarH&NiPnd0BR61qO#zJDowccPlBC5IEUsuyhX-i<G0hm#{=xy9Z zJKo-^ZD<ltH*hOcy1#d(216)SJGS7c$-DQ+qMI!`ox8^Mh7L{Fs@pGXpkCG2Qzsyg z17-IN-GR4{)a?lcB^sJlU&RNLAz8i`OZzHzJ)&H}yjFvG6;FWxLV+OQ+QPjDx6yy3 zEZk7BoKf4<W;5u5@)!%59Vb~Nka8))INs-gnkM6Da;#Aj_CnxjQDDl|6AFGsx$b}V zsPFCtqI_1jft#f;v{Zc^?{6|gm)-?#p;OZyiT|WNdp(m{rjc+pm3ssA0p4NhmE8m2 zTeMn@_XRU_W5U}oAuwilI3uPE&-z}Ewnkd_q;MABTIU*L+DJZy^B5bQ4QN*ai3rw( zcY%B8LmgfJ%~07~(bb^C$a@Ec>qx&~zt44~HK8eh>kR-;H396845iwpX<9nzz*GoD z!)(mJ!SIWsGY$cZO&APq{EB^x$9`{oZ2i!3B?UXM4QsFpTd?VR9VRuHQ?{54zG^!e cSj)gx#)V<^k=w@Ats*a*u<mX=Y9ERH0Y5X0NdN!< delta 69 zcmZ3k)F8~-z%sRzb0TZf#*A7<#>CCVocov<!!{f7%wkr^Fv!p??%~W!%uOw+EJ!V$ YQadHXz^^z%9!TqEa2Ic86;NUX03cu%<p2Nx diff --git a/docs/_build/html/_modules/base_pulse.html b/docs/_build/html/_modules/base_pulse.html index badaf709..e50f08c3 100644 --- a/docs/_build/html/_modules/base_pulse.html +++ b/docs/_build/html/_modules/base_pulse.html @@ -286,6 +286,7 @@ <span class="k">def</span> <span class="nf">finish_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># function that finishes the initialisation</span> + <span class="c1"># TODO rewrite, so this function is embedded in the other ones.</span> <span class="bp">self</span><span class="o">.</span><span class="n">uploader</span> <span class="o">=</span> <span class="n">keysight_uploader</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">awg_devices</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cpp_uploader</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">awg_channels</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">awg_channels_to_physical_locations</span> <span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">channel_delays_computed</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">channel_compenstation_limits</span><span class="p">)</span> <div class="viewcode-block" id="pulselib.mk_segment"><a class="viewcode-back" href="../intro.html#base_pulse.pulselib.mk_segment">[docs]</a> <span class="k">def</span> <span class="nf">mk_segment</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt index 0a985924..81ee2632 100644 --- a/docs/_build/html/_sources/index.rst.txt +++ b/docs/_build/html/_sources/index.rst.txt @@ -9,11 +9,12 @@ This is a pulse library designed to provide all the control signals that are nee A lot of attention is given to performance, structure and ease of use. Features now include: - - Support for arbitrary pulse/sine wave based sequences (phase coherent atm) + - Support for arbitrary pulse/sine wave based sequences (phase coherent atm). - Fully multidimensional. Execute any command as a loop in any dimension. - Short and clean syntax. No sympy. - - Native support for virtual gates - - IQ toolkit and IQ virtual channels -- Full suppport for single sideband modulation (Along with PM/AM/FM) + - Native support for virtual gates. + - IQ toolkit and IQ virtual channels -- Full suppport for single sideband modulation (Along with PM/AM/FM). + - Automatic compenstation for DC offsets. - High speed uploader for Keysight PXI systems which supports upload during playback. .. toctree:: diff --git a/docs/_build/html/_sources/intro.rst.txt b/docs/_build/html/_sources/intro.rst.txt index 179896d9..1fadef40 100644 --- a/docs/_build/html/_sources/intro.rst.txt +++ b/docs/_build/html/_sources/intro.rst.txt @@ -11,4 +11,205 @@ Introduction :members: .. automodule:: segments.segments_IQ - :members: \ No newline at end of file + :members: + +# Initializing the library + +The general object that will manage all the segments and the interection with the AWG is the pulse object. The pulse object is best created in the station. +```python + from pulse_lib.base_pulse import pulselib + p = pulselib() +``` + +Let's intitialize the AWG's and make some channels in the pulse library +```python + # init AWG + awg1 = keysight_awg.SD_AWG('awg1', chassis = 0, slot= 2, channels = 4, triggers= 8) + awg2 = keysight_awg.SD_AWG('awg2', chassis = 0, slot= 3, channels = 4, triggers= 8) + awg3 = keysight_awg.SD_AWG('awg3', chassis = 0, slot= 4, channels = 4, triggers= 8) + awg4 = keysight_awg.SD_AWG('awg4', chassis = 0, slot= 5, channels = 4, triggers= 8) + + # add to pulse_lib + p.add_awgs('AWG1',awg1) + p.add_awgs('AWG2',awg2) + p.add_awgs('AWG3',awg3) + p.add_awgs('AWG4',awg4) + + # define channels + awg_channels_to_physical_locations = dict({'B0':('AWG1', 1), 'P1':('AWG1', 2), + 'B1':('AWG1', 3), 'P2':('AWG1', 4), + 'B2':('AWG2', 1), 'P3':('AWG2', 2), + 'B3':('AWG2', 3), 'P4':('AWG2', 4), + 'B4':('AWG3', 1), 'P5':('AWG3', 2), + 'B5':('AWG3', 3), 'G1':('AWG3', 4), + 'I_MW':('AWG4', 1), 'Q_MW':('AWG4', 2), + 'M1':('AWG4', 3), 'M2':('AWG4', 4)}) + + p.define_channels(awg_channels_to_physical_locations) +``` +Now we have some channels, we can also specity delays (e.g. due to different lenght of coaxial cables, cables that pass through a mixer, ...). +```python + # format : dict of channel name with delay in ns (can be posive/negative) + p.add_channel_delay({'I_MW':50, 'Q_MW':50, 'M1':20, 'M2':-25, }) +``` + +You might also want to define some virtual gates, +this can simply be done by defining: +```python + awg_virtual_gates = {'virtual_gates_names_virt' : + ['vP1','vP2','vP3','vP4','vP5','vB0','vB1','vB2','vB3','vB4','vB5'], + 'virtual_gates_names_real' : + ['P1','P2','P3','P4','P5','B0','B1','B2','B3','B4','B5'], + 'virtual_gate_matrix' : np.eye(11) + } + p.add_virtual_gates(awg_virtual_gates) +``` +The matrix can be updated with (not yet implemented): +```python + p.update_virtual_gate_matrix(my_matrix) +``` +To generate virtual channels for IQ signals, you can add the following code: +```python + awg_IQ_channels = {'vIQ_channels' : ['qubit_1','qubit_2'], + 'rIQ_channels' : [['I_MW','Q_MW'],['I_MW','Q_MW']], + 'LO_freq' :[MW_source.frequency, 1e9] + # do not put the brackets for the MW source + # e.g. MW_source.frequency + } + + p.add_IQ_virt_channels(awg_IQ_channels) +``` +Where the virtual channels are the new names of the new channels created to do IQ channals. Each of these channels refer to a real channel (note that you can refer to the same real channel multiple times). It is recomendable to create one IQ virtual channel for each qubit. + +Note to finize the initialisation of the pulse library, you should call: +```python + p.finish_init() +``` +This will prepare all the segment/sequencing objects you might need later. + +The code above can be placed in your station. + +# Generating segments + +Segments come by default in containers (e.g. for all the channels (real/virtual) you defined). +Note that all segments in these containers are assumed to have the same length (so P1, P2, P3, ...). + +An example of defining some segments. +```python + + seg = p.mk_segment('INIT') + seg2 = p.mk_segment('Manip') + seg3 = p.mk_segment('Readout') +``` +Each segment has a unique name. This name we will use later for playback. + +## Making your first pulse + +To each segments you can add basic waveforms. Here you are free to add anything you want. +Some examples follow (times are by default in ns). +```python + # B0 is the barrier 0 channel + # adds a linear ramp from 10 to 20 ns with amplitude of 5 to 10. + seg.B0.add_pulse([[10.,0.],[10.,5.],[20.,10.],[20.,0.]]) + # add a block pulse of 2V from 40 to 70 ns, to whaterver waveform is already there + seg.B0.add_block(40,70,2) + # just waits (e.g. you want to ake a segment 50 ns longer) + seg.B0.wait(50) + # resets time back to zero in segment. Al the commannds we run before will be put at a negative time. + seg.B0.reset_time() + # this pulse will be placed directly after the wait() + seg.B0.add_block(0,10,2) +``` +# Playback of pulses + +Once pulses are added, you can define a sequence like: +```python + SEQ = [['INIT', 1, 0], ['Manip', 1, 0], ['Readout', 1, 0] ] +``` +Where (e.g.) init is played once (1) and has a prescalor of 0 (see Keysight manual) + +This sequence can be added to the pulse object and next be uploaded. +```python + p.add_sequence('mysequence', SEQ) + p.start_sequence('mysequence') +``` + + +# Some examples of easy pulses: +(more advanced examples follow later) +* 1D scan +```python +seg = p.mk_segment('1D_scan') +#lets sweep the virtual plunger, +n_points = 100 +swing = 1000 #mV +period = 1000 #ns + +v_start =swing/2 +step = swing/npoints + +for i in range(n_points): + seg.vP1.add_block(i*period, (i+1)period, v_start + i*step) +#done. +``` +* 2D scan +```python +seg = p.mk_segment('2D_scan') +#lets sweep the virtual plunger 1 versus virtual plunger 2, +n_points1 = 100 +n_points2 = 100 + +swing1 = 1000 #mV +swing2 = 1000 #mV + +period = 1000 #ns +period1 = period #ns +period2 = period*n_points1 #ns + + +v_start1 =swing1/2 +step1 = swing1/npoints1 +v_start1 =swing1/2 +step1 = swing1/npoints1 + +for i in range(n_points1): + seg.vP1.add_block(i*period1, (i+1)period1, v_start1 + i*step1) +seg.repeat(n_points2) +for i in range(n_points2): + seg.vP1.add_block(i*period2, (i+1)period2, v_start2 + i*step2) +#done. +``` +* 2D FM scan +```python +lets build on top of the perv sample. let att the modulation on the real plungers (1 and 2) and barrier (2). +seg.P1.add_sin(10e6, ...) +... + +``` +* Ramsey experiment (using loops) +```python +seg = p.mk_segment('Ramsey') + +# do pi/2 pulse +seg.IQ.add_sin(0,100e-9,freq = 2e9, amp = 10, phase = 0) +# wait -- use a loop object (has access to default numpy operators if it is numerical) +times = lp.linspace(5,20e3, 500, axis=0, name="time", unit="ns") +seg.IQ.wait(times) +# reset time +seg.IQ.reset_time() +# do pi/2 pulse +seg.IQ.add_sin(0,100e-9,freq = 2e9, amp = 10, phase = 0) +``` +One can see that here a call to a single loopobject it made. We will be sweeping from 50ns to 20us. This sweep axis is 0 (first axis). The default is always a new axis. You only need to explicitely specify it if you want to parameters to be coupled (e.g. swept on the same axis). The name is optional and can be used for plotting, same for the unit. + +* Rabi experiment (power vs frequency of the pulse): Good example of a two dimensioal sweep +```python +seg = p.mk_segment('RABI') + +t0 = 0 +t1 = 50 +freq = lp.linspace(1e9,1.1e9, 500, axis= 0, name="frequency", unit="Hz") +amp = lp.linspace(5,20e3, 500, axis= 1, name="VoltageIQ", unit="a.u.") +phase = 0 +seg.IQ.add_sin(t0,t1,freq, amp, phase) +``` diff --git a/docs/_build/html/_sources/struct.rst.txt b/docs/_build/html/_sources/struct.rst.txt index 50e8325e..5c25247a 100644 --- a/docs/_build/html/_sources/struct.rst.txt +++ b/docs/_build/html/_sources/struct.rst.txt @@ -1,4 +1,49 @@ Structure of the library ======================== -bladibla \ No newline at end of file +The structure to the library is given by the following three classes: + - :ref:`seg` + - :ref:`seg_con` + - :ref:`seq` +These is also the pulse-lib class, which is an organizational element. This element is used to generate empty segment containers. More info on how to do this can be found <here>. + +**Overview** + +A quick overview of the relation between the different structural elements can be found below, + +<<< image >>> + + +.. _seg: + +Segments +-------- +A segment is collection of data points that forms a single waveform. You can think of this as for example, the set of pulses that does the readout on you sample. +Note that a segment only contains the information for one channel. + +There are two types of segments: + - segments_base : these are segments that should be used for generating block pulses and ramps. + - segments_IQ : these are segments that are used to work with IQ signals of vector MW sources. +Both types can be used interchangeably. More details can be found in the tutorials (or if you feel really courageous in the source code). + + +.. _seg_con: + +Segment containers +------------------ +A segment container, as the name already gives away, is a container of channels. If we would think of the example before, than in this element you would have the collection of all the channels that are involved in your readout pulse. This object is generated automatically, so no need for you to specify channels each time. + +There are some rules for segment containers though, + - All segments in a segment container must have the same length when rendered + - A segment container contains by default all the AWG channels you have defined in your setup + - All elements in the segment container must contain times that are >= 0. + +.. _seq: + +Sequences +--------- +Sequences are a collection of segment containers. Basically it means just concatenate different segment containers. + +One could for example make 3 segment containers, on for initialization of the qubits, one for manipulation and one for readout. +When executing the experiment, you would tell the the AWG, play initialization -> manipulation -> readout. + diff --git a/docs/_build/html/_sources/tutorials/init_lib.rst.txt b/docs/_build/html/_sources/tutorials/init_lib.rst.txt index 45641b7c..f56ac905 100644 --- a/docs/_build/html/_sources/tutorials/init_lib.rst.txt +++ b/docs/_build/html/_sources/tutorials/init_lib.rst.txt @@ -1,2 +1,142 @@ Tutorial : Initializing the library -=================================== \ No newline at end of file +=================================== + +Before making a pulse, the pulse library needs to know some stuff from you. The main items you need to provide are: + + - QCodes objects of the AWG's (only when using Keysight AWG's) + - Translation of you sample channels names (e.g. barrier gate 1) to the physical location if the set up (e.g. AWG3 channel 4) + - Virtual gates and virtual gate matrix if needed <reference needed here> + - Virtual IQ channels, if you are doing IQ modulation <link explaining IQ modulation > + - Channels delay's (e.g. if not all you coaxes have the same length) + +All these properties are contained in the ``pulselib`` object. Below a complete example is worked out to explaining how to do this. +The source code of the example can be found in ``tutorials/init_pulselib.py`` if you would want to execute it yourselves [TODO]. + +Tutorial example : initialization for a two-qubit setup +------------------------------------------------------- + +For this setup, we have 6 coax cables going to the sample, + + - B0, B1, B2 : gates that are connected to the barrier gates on the sample. + - P1, P2 : gates that are connected to the plungers on the sample. + - MW_gate : a screening gate on the sample that can be used for EDSR. + - MW_marker : a marker to control on/off state of the vector source. + +Practically the things that we want to set are: + 1. Which channels of the AWG are corresponding to the gates on the sample. + 2. Virtual gates to move easily around in charge stability diagrams. + 3. Two virtual IQ channels, one per qubit. + 4. A channel delay for the MW channel, to compensate for the time that the waveform spends in the vector signal source generator. + +Step 1 : initializing the pulse lib object and defining real gates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The first thing we need to do is to make the ``pulselib`` object, once it is make, we can start to define extra properties. + +.. code-block:: python + + from pulse_lib.base_pulse import pulselib + pulse = pulselib() + +That was it, let's now add some AWG's and define the channel names. In this example we will need 8 channels, thus two, 4 channel AWG's. + +.. code-block:: python + + # init AWG + awg1 = keysight_awg.SD_AWG('awg1', chassis = 0, slot= 2, channels = 4, triggers= 8) + awg2 = keysight_awg.SD_AWG('awg2', chassis = 0, slot= 3, channels = 4, triggers= 8) + + # add to pulse_lib + pulse.add_awgs('AWG1',awg1) + pulse.add_awgs('AWG2',awg2) + + + # define channels + awg_channels_to_physical_locations = dict({'B0':('AWG1', 1), 'P1':('AWG1', 2), + 'B1':('AWG1', 3), 'P2':('AWG1', 4),'B2':('AWG2', 1), + 'MW_gate_I':('AWG2', 2), 'MW_gate_Q':('AWG2', 3), + 'MW_marker':('AWG2', 4)}) + + pulse.define_channels(awg_channels_to_physical_locations) + +Note, when not using the Keysight back-end, you can just call ``p.add_awgs('AWG1', None)``. You will have to feed then the library in another uploaded (e.g. qtt virtual AWG). + +Step 2 : defining the virtual gates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is a quite straightforward process, just define the channels for the virtual gate and their corresponding real channels in a dictionary. + +.. code-block:: python + + awg_virtual_gates = { + 'virtual_gates_names_virt' : + ['vB0', 'vB1', 'vB2', 'vP1', 'vP2'], + 'virtual_gates_names_real' : + ['B0', 'B1', 'B2', 'P1', 'P2'], + 'virtual_gate_matrix' : np.eye(5) + } + pulse.add_virtual_gates(awg_virtual_gates) +In this case we just constructed a 1 on 1 map of the virtual gates of real gates (diagonal virtual gate matrix). + +The matrix can be updated at any time with: + +.. code-block:: python + + pulse.update_virtual_gate_matrix(my_matrix) + +When the matrix is updated, it will automatically also update in all segments that have been created before. +An example how to practically work with virtual gates can be found here [TODO]. + +Step 3 : defining IQ channels +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you are new to IQ modulation, it is recommended to read the introduction on IQ modulation, here [TODO]. + +When operating a vector source, you usually have to connect (usually) 3 coax cables: + + - I channel + - Q channel + - marker + - ``[opt]`` if you want to go wide-band, you might also need to provide the negative image of the I/Q channel (currently not implemented .., though easy todo). + +Most of the time, you will want to make a virtual channel per qubit, as it allows you to keep easy track of the phase of the qubit. An example of this can be found in the mircowave tutorial. + +.. code-block:: python + + awg_IQ_channels = { + 'vIQ_channels' : ['qubit_1','qubit_2'], + 'rIQ_channels' : [['MW_gate_I','MW_gate_Q'],['MW_gate_I','MW_gate_Q']], + 'LO_freq' :[MW_source.frequency, 1e9] + # do not put the brackets for the MW source + # e.g. MW_source.frequency (this should be a qcodes parameter) + } + + pulse.add_IQ_virt_channels(awg_IQ_channels) + +At the moment markers are not added automatically, this is something that will be implemented in the next release of this library. + +Step 4 : defining channel delays +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In our case here, we have to compensate for the fact that some signals take a longer time to get to the sample than other ones. More info on how this is practically accomplished, can be found here ``TODO``. +Practically, example latencies could be the following: + + - 20 ns for the barrier and plunger gates to get from the AWG channels into the fridge. + - 70 ns to get to microwave channel from the IQ output into the fridge. 5 ns for the signal to reach the vector source, then the signal needs 45ns to be mixed with the carrier frequency, next 20 additional ns are needed to go down in the fridge. + - 5 ns marker delay + +Or translated into python code, + +.. code-block:: python + + pulse.add_channel_delay({ + 'B0': 20, + 'P1': 20, + 'B1': 20, + 'P2': 20, + 'B2': 20, + 'MW_gate_I': 70, + 'MW_gate_Q': 70, + 'MW_marker': 5 + }) + +Note, also negative delays are allowed. All units are in ``ns`` by default. \ No newline at end of file diff --git a/docs/_build/html/_sources/tutorials/simple_pulse.rst.txt b/docs/_build/html/_sources/tutorials/simple_pulse.rst.txt index 97ebb235..3ec80d27 100644 --- a/docs/_build/html/_sources/tutorials/simple_pulse.rst.txt +++ b/docs/_build/html/_sources/tutorials/simple_pulse.rst.txt @@ -1,2 +1,18 @@ Tutorial : Making simple pulses for DC control of qubits. -========================================================= \ No newline at end of file +========================================================= + +For most experiments, pulses usually consist out of simple ramps and platea's. +In the following there will be a few examples that show how to program these things. +We will consider two experiments, + + - a pulse that can be used for readout (elzerman style) + - a pulse to control a ST qubit + +Here you will learn how to make the pulse, but also how the channels are working together. + +Elzerman readout +^^^^^^^^^^^^^^^^ + + +Controlling a ST qubit +^^^^^^^^^^^^^^^^^^^^^^ \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 52dd96dd..399415cb 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -158,16 +158,27 @@ A lot of attention is given to performance, structure and ease of use.</p> <dl class="docutils"> <dt>Features now include:</dt> -<dd><ul class="first last simple"> -<li>Support for arbitrary pulse/sine wave based sequences (phase coherent atm)</li> +<dd><blockquote class="first"> +<div><ul class="simple"> +<li>Support for arbitrary pulse/sine wave based sequences (phase coherent atm).</li> <li>Fully multidimensional. Execute any command as a loop in any dimension.</li> <li>Short and clean syntax. No sympy.</li> -<li>Native support for virtual gates</li> -<li>IQ toolkit and IQ virtual channels – Full suppport for single sideband modulation (Along with PM/AM/FM)</li> +<li>Native support for virtual gates.</li> +<li>IQ toolkit and IQ virtual channels – Full suppport for single sideband modulation (Along with PM/AM/FM).</li> +</ul> +</div></blockquote> +<ul class="last simple"> +<li><dl class="first docutils"> +<dt>Automatic compenstation for DC offsets.</dt> +<dd><ul class="first last"> <li>High speed uploader for Keysight PXI systems which supports upload during playback.</li> </ul> </dd> </dl> +</li> +</ul> +</dd> +</dl> <div class="toctree-wrapper compound"> <p class="caption"><span class="caption-text">Getting started</span></p> <ul> diff --git a/docs/_build/html/intro.html b/docs/_build/html/intro.html index 3c8e5347..5650f162 100644 --- a/docs/_build/html/intro.html +++ b/docs/_build/html/intro.html @@ -76,11 +76,19 @@ - <!-- Local TOC --> - <div class="local-toc"><ul> -<li><a class="reference internal" href="#">Introduction</a></li> + <p class="caption"><span class="caption-text">Getting started</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="struct.html">Structure of the library</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/init_lib.html">Tutorial : Initializing the library</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/simple_pulse.html">Tutorial : Making simple pulses for DC control of qubits.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/MW_pulse.html">Tutorial : Making pulses for Microwave control.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/sequence.html">Tutotial : Making from pulses a sequence</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/looping.html">Tutorial : Looping variables.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/reset_time_and_slicing.html">Concepts : Reset time and slicing of waveforms.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/example_PT.html">Advanced Tutorial : Programming a process tomography experiment to characterize a two qubit gate.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/example_RB.html">Advanced Tutorial : Designing pulses for a Randomised Benchmarking experiment.</a></li> </ul> -</div> + </div> @@ -537,6 +545,205 @@ Args:</p> </dd></dl> +<p># Initializing the library</p> +<p>The general object that will manage all the segments and the interection with the AWG is the pulse object. The pulse object is best created in the station. +<a href="#id1"><span class="problematic" id="id2">``</span></a><a href="#id3"><span class="problematic" id="id4">`</span></a>python</p> +<blockquote> +<div>from pulse_lib.base_pulse import pulselib +p = pulselib()</div></blockquote> +<p><a href="#id5"><span class="problematic" id="id6">``</span></a><a href="#id7"><span class="problematic" id="id8">`</span></a></p> +<p>Let’s intitialize the AWG’s and make some channels in the pulse library +<a href="#id9"><span class="problematic" id="id10">``</span></a><a href="#id11"><span class="problematic" id="id12">`</span></a>python</p> +<blockquote> +<div><p># init AWG +awg1 = keysight_awg.SD_AWG(‘awg1’, chassis = 0, slot= 2, channels = 4, triggers= 8) +awg2 = keysight_awg.SD_AWG(‘awg2’, chassis = 0, slot= 3, channels = 4, triggers= 8) +awg3 = keysight_awg.SD_AWG(‘awg3’, chassis = 0, slot= 4, channels = 4, triggers= 8) +awg4 = keysight_awg.SD_AWG(‘awg4’, chassis = 0, slot= 5, channels = 4, triggers= 8)</p> +<p># add to pulse_lib +p.add_awgs(‘AWG1’,awg1) +p.add_awgs(‘AWG2’,awg2) +p.add_awgs(‘AWG3’,awg3) +p.add_awgs(‘AWG4’,awg4)</p> +<p># define channels +awg_channels_to_physical_locations = dict({‘B0’:(‘AWG1’, 1), ‘P1’:(‘AWG1’, 2),</p> +<blockquote> +<div>‘B1’:(‘AWG1’, 3), ‘P2’:(‘AWG1’, 4), +‘B2’:(‘AWG2’, 1), ‘P3’:(‘AWG2’, 2), +‘B3’:(‘AWG2’, 3), ‘P4’:(‘AWG2’, 4), +‘B4’:(‘AWG3’, 1), ‘P5’:(‘AWG3’, 2), +‘B5’:(‘AWG3’, 3), ‘G1’:(‘AWG3’, 4), +‘I_MW’:(‘AWG4’, 1), ‘Q_MW’:(‘AWG4’, 2), +‘M1’:(‘AWG4’, 3), ‘M2’:(‘AWG4’, 4)})</div></blockquote> +<p>p.define_channels(awg_channels_to_physical_locations)</p> +</div></blockquote> +<p><a href="#id13"><span class="problematic" id="id14">``</span></a>` +Now we have some channels, we can also specity delays (e.g. due to different lenght of coaxial cables, cables that pass through a mixer, …). +<a href="#id15"><span class="problematic" id="id16">``</span></a><a href="#id17"><span class="problematic" id="id18">`</span></a>python</p> +<blockquote> +<div># format : dict of channel name with delay in ns (can be posive/negative) +p.add_channel_delay({‘I_MW’:50, ‘Q_MW’:50, ‘M1’:20, ‘M2’:-25, })</div></blockquote> +<p><a href="#id19"><span class="problematic" id="id20">``</span></a><a href="#id21"><span class="problematic" id="id22">`</span></a></p> +<p>You might also want to define some virtual gates, +this can simply be done by defining: +<a href="#id23"><span class="problematic" id="id24">``</span></a><a href="#id25"><span class="problematic" id="id26">`</span></a>python</p> +<blockquote> +<div><dl class="docutils"> +<dt>awg_virtual_gates = {‘virtual_gates_names_virt’ :</dt> +<dd><dl class="first last docutils"> +<dt>[‘vP1’,’vP2’,’vP3’,’vP4’,’vP5’,’vB0’,’vB1’,’vB2’,’vB3’,’vB4’,’vB5’],</dt> +<dd>‘virtual_gates_names_real’ :</dd> +<dt>[‘P1’,’P2’,’P3’,’P4’,’P5’,’B0’,’B1’,’B2’,’B3’,’B4’,’B5’],</dt> +<dd>‘virtual_gate_matrix’ : np.eye(11)</dd> +</dl> +</dd> +</dl> +<p>} +p.add_virtual_gates(awg_virtual_gates)</p> +</div></blockquote> +<p><a href="#id27"><span class="problematic" id="id28">``</span></a>` +The matrix can be updated with (not yet implemented): +<a href="#id29"><span class="problematic" id="id30">``</span></a><a href="#id31"><span class="problematic" id="id32">`</span></a>python</p> +<blockquote> +<div>p.update_virtual_gate_matrix(my_matrix)</div></blockquote> +<p><a href="#id33"><span class="problematic" id="id34">``</span></a>` +To generate virtual channels for IQ signals, you can add the following code: +<a href="#id35"><span class="problematic" id="id36">``</span></a><a href="#id37"><span class="problematic" id="id38">`</span></a>python</p> +<blockquote> +<div><dl class="docutils"> +<dt>awg_IQ_channels = {‘vIQ_channels’ <span class="classifier-delimiter">:</span> <span class="classifier">[‘qubit_1’,’qubit_2’],</span></dt> +<dd>‘rIQ_channels’ : [[‘I_MW’,’Q_MW’],[‘I_MW’,’Q_MW’]], +‘LO_freq’ :[MW_source.frequency, 1e9] +# do not put the brackets for the MW source +# e.g. MW_source.frequency +}</dd> +</dl> +<p>p.add_IQ_virt_channels(awg_IQ_channels)</p> +</div></blockquote> +<p><a href="#id39"><span class="problematic" id="id40">``</span></a>` +Where the virtual channels are the new names of the new channels created to do IQ channals. Each of these channels refer to a real channel (note that you can refer to the same real channel multiple times). It is recomendable to create one IQ virtual channel for each qubit.</p> +<p>Note to finize the initialisation of the pulse library, you should call: +<a href="#id41"><span class="problematic" id="id42">``</span></a><a href="#id43"><span class="problematic" id="id44">`</span></a>python</p> +<blockquote> +<div>p.finish_init()</div></blockquote> +<p><a href="#id45"><span class="problematic" id="id46">``</span></a>` +This will prepare all the segment/sequencing objects you might need later.</p> +<p>The code above can be placed in your station.</p> +<p># Generating segments</p> +<p>Segments come by default in containers (e.g. for all the channels (real/virtual) you defined). +Note that all segments in these containers are assumed to have the same length (so P1, P2, P3, …).</p> +<p>An example of defining some segments. +<a href="#id47"><span class="problematic" id="id48">``</span></a><a href="#id49"><span class="problematic" id="id50">`</span></a>python</p> +<blockquote> +<div>seg = p.mk_segment(‘INIT’) +seg2 = p.mk_segment(‘Manip’) +seg3 = p.mk_segment(‘Readout’)</div></blockquote> +<p><a href="#id51"><span class="problematic" id="id52">``</span></a>` +Each segment has a unique name. This name we will use later for playback.</p> +<p>## Making your first pulse</p> +<p>To each segments you can add basic waveforms. Here you are free to add anything you want. +Some examples follow (times are by default in ns). +<a href="#id53"><span class="problematic" id="id54">``</span></a><a href="#id55"><span class="problematic" id="id56">`</span></a>python</p> +<blockquote> +<div># B0 is the barrier 0 channel +# adds a linear ramp from 10 to 20 ns with amplitude of 5 to 10. +seg.B0.add_pulse([[10.,0.],[10.,5.],[20.,10.],[20.,0.]]) +# add a block pulse of 2V from 40 to 70 ns, to whaterver waveform is already there +seg.B0.add_block(40,70,2) +# just waits (e.g. you want to ake a segment 50 ns longer) +seg.B0.wait(50) +# resets time back to zero in segment. Al the commannds we run before will be put at a negative time. +seg.B0.reset_time() +# this pulse will be placed directly after the wait() +seg.B0.add_block(0,10,2)</div></blockquote> +<p><a href="#id57"><span class="problematic" id="id58">``</span></a>` +# Playback of pulses</p> +<p>Once pulses are added, you can define a sequence like: +<a href="#id59"><span class="problematic" id="id60">``</span></a><a href="#id61"><span class="problematic" id="id62">`</span></a>python</p> +<blockquote> +<div>SEQ = [[‘INIT’, 1, 0], [‘Manip’, 1, 0], [‘Readout’, 1, 0] ]</div></blockquote> +<p><a href="#id63"><span class="problematic" id="id64">``</span></a>` +Where (e.g.) init is played once (1) and has a prescalor of 0 (see Keysight manual)</p> +<p>This sequence can be added to the pulse object and next be uploaded. +<a href="#id65"><span class="problematic" id="id66">``</span></a><a href="#id67"><span class="problematic" id="id68">`</span></a>python</p> +<blockquote> +<div>p.add_sequence(‘mysequence’, SEQ) +p.start_sequence(‘mysequence’)</div></blockquote> +<p><a href="#id69"><span class="problematic" id="id70">``</span></a><a href="#id71"><span class="problematic" id="id72">`</span></a></p> +<p># Some examples of easy pulses: +(more advanced examples follow later) +* 1D scan +<a href="#id73"><span class="problematic" id="id74">``</span></a><a href="#id75"><span class="problematic" id="id76">`</span></a>python +seg = p.mk_segment(‘1D_scan’) +#lets sweep the virtual plunger, +n_points = 100 +swing = 1000 #mV +period = 1000 #ns</p> +<p>v_start =swing/2 +step = swing/npoints</p> +<dl class="docutils"> +<dt>for i in range(n_points):</dt> +<dd>seg.vP1.add_block(i*period, (i+1)period, v_start + i*step)</dd> +</dl> +<p>#done. +<a href="#id77"><span class="problematic" id="id78">``</span></a>` +* 2D scan +<a href="#id79"><span class="problematic" id="id80">``</span></a><a href="#id81"><span class="problematic" id="id82">`</span></a>python +seg = p.mk_segment(‘2D_scan’) +#lets sweep the virtual plunger 1 versus virtual plunger 2, +n_points1 = 100 +n_points2 = 100</p> +<p>swing1 = 1000 #mV +swing2 = 1000 #mV</p> +<p>period = 1000 #ns +period1 = period #ns +period2 = period*n_points1 #ns</p> +<p>v_start1 =swing1/2 +step1 = swing1/npoints1 +v_start1 =swing1/2 +step1 = swing1/npoints1</p> +<dl class="docutils"> +<dt>for i in range(n_points1):</dt> +<dd>seg.vP1.add_block(i*period1, (i+1)period1, v_start1 + i*step1)</dd> +</dl> +<p>seg.repeat(n_points2) +for i in range(n_points2):</p> +<blockquote> +<div>seg.vP1.add_block(i*period2, (i+1)period2, v_start2 + i*step2)</div></blockquote> +<p>#done. +<a href="#id83"><span class="problematic" id="id84">``</span></a>` +* 2D FM scan +<a href="#id85"><span class="problematic" id="id86">``</span></a><a href="#id87"><span class="problematic" id="id88">`</span></a>python +lets build on top of the perv sample. let att the modulation on the real plungers (1 and 2) and barrier (2). +seg.P1.add_sin(10e6, …) +…</p> +<p><a href="#id89"><span class="problematic" id="id90">``</span></a>` +* Ramsey experiment (using loops) +<a href="#id91"><span class="problematic" id="id92">``</span></a><a href="#id93"><span class="problematic" id="id94">`</span></a>python +seg = p.mk_segment(‘Ramsey’)</p> +<p># do pi/2 pulse +seg.IQ.add_sin(0,100e-9,freq = 2e9, amp = 10, phase = 0) +# wait – use a loop object (has access to default numpy operators if it is numerical) +times = lp.linspace(5,20e3, 500, axis=0, name=â€timeâ€, unit=â€nsâ€) +seg.IQ.wait(times) +# reset time +seg.IQ.reset_time() +# do pi/2 pulse +seg.IQ.add_sin(0,100e-9,freq = 2e9, amp = 10, phase = 0) +<a href="#id95"><span class="problematic" id="id96">``</span></a>` +One can see that here a call to a single loopobject it made. We will be sweeping from 50ns to 20us. This sweep axis is 0 (first axis). The default is always a new axis. You only need to explicitely specify it if you want to parameters to be coupled (e.g. swept on the same axis). The name is optional and can be used for plotting, same for the unit.</p> +<ul class="simple"> +<li>Rabi experiment (power vs frequency of the pulse): Good example of a two dimensioal sweep</li> +</ul> +<p><a href="#id97"><span class="problematic" id="id98">``</span></a><a href="#id99"><span class="problematic" id="id100">`</span></a>python +seg = p.mk_segment(‘RABI’)</p> +<p>t0 = 0 +t1 = 50 +freq = lp.linspace(1e9,1.1e9, 500, axis= 0, name=â€frequencyâ€, unit=â€Hzâ€) +amp = lp.linspace(5,20e3, 500, axis= 1, name=â€VoltageIQâ€, unit=â€a.u.â€) +phase = 0 +seg.IQ.add_sin(t0,t1,freq, amp, phase) +<a href="#id101"><span class="problematic" id="id102">``</span></a><a href="#id103"><span class="problematic" id="id104">`</span></a></p> </div> diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index a4155de5080d16a5c0ed7ff71ae7f2aaedded4e6..2ec535a5e21ded36fe39ce12c33f912bec871ea3 100644 GIT binary patch delta 866 zcmV-o1D*V@2hInOd4Ef8+b|H_`xFG)t=(qpU6XDC)IjP4$daJMu|$L)g`^xit6rnm z>q$B!C0j{k!IHBvDDusl;mjjB&X@yQ)zSf}_Df}WErEO|LVIf#rC0Jxnwx(m^I3KP zFXFEhS+L3_bB<hfjZUB!jB|SXn{I{mG%uOfAYF6}zBK%N4uAGiOtNcy(%h&DwDZgh zqp1{1_>1^BNVcCs5He9SNekv-bOanWLc`=lswe88P@w%J%jX(&4nw95yIXMP8I3Y& zHaV=bUb_YACVUSlZqRPQDl9o49q+-u08cwHOe1kp<UqYp;}h3>80{HW-Hy&fh#xi^ z$i3KNMGYEJU4N@AQEh6Shr@6#Thzj|f*egJ*Q7%cwq?PISK#!8ZDC`qx|ndQ*zOZZ zguaLb@laU289rxY7E_&yJ(*&peA~g8Gyi@tPVuL$$7pSU1;4=3luDrsid%q-Id{T; zI;BTG%7wa=DJXfA{06x2oFdz3`SdWkl2ws}d2dBldw-b7GfmJvOx}2W$6KZ`Vd1MX z<$$2sAq<DQk<bvGdq#Q*&VA+z&;kX!BhK@sWEn^@zas5y#F5)DoE>4@<N?${Jc7hl z42U-*HKEvD{QL9Q5rozuu-Kr@qVKm9Z7}ErhrEuD*9`O36IHdJw+qQ;l~SGJbHHp~ zzO_hm34eT_*6&yWA&2jP-lFR^E%!}k11?D8G!_B#0B9`8K}W&%dDus4ybu`YyJ_hl z$$cEx7KqspU&hp0X7@8+dt(KY?%V3IY5hACA6FCILo-j7WW}CPEvaCR;JrXrBDW@7 z5^*2a$VJBs?3k)hTXzrreva$O(+|F7xIf-?d4FdOK7>jIzbH#<aQ_Zfqr!Am?g{KF zygXwnQA^knTbAQRja>oa{fi;bbtXIsZFXO5>+9jz*4L+F`-#m*q2FbMku}rYDB%!% zjrA%OvoUSQNV|aujZZ-MKh+yXyZWINx43{K@fw)>i!6<)!fG#Zv-pAcS7WqgIFU(g z0$Vza$6K7@9%;BjPdezwCVw{uQ(0kmuq5jMBk}S?7-=a{x$V>QCW6DCk6xec>Ty^8 sjc_;CsJ2#&wCFCqh(#Yb8(qYy^N}!JQT)7V&qvr<R3vWeKhx-|&f}@4%K!iX delta 835 zcmV-J1HAms2d@W^d4J7r+b|5i=P3ki*JSH8x3#?#Sb#1o(4!z*j4f0@t|X^PPkW8M z-kxNXWG8Ox7_rk!AWP&&iu@=t8FN6ZS~?)reyI$vC6Mn#Xm8D;^h$n7d-JbkKFbcm zi}))=7PNB7oFi9Vr4!N%#yP$FMYqCwnwLy#kS-bqUmAWs27h}gCh0XcX>L>n+Ii-M z(Nqd0{6%;iB->8`2$86nqy_UZ+5-+7p<!|$)f074DA0bA=5q}?hauGl-7Prtj7FL? zmmKC<uigTA6TSx+H>kH@6{ehz_V=J)fTtZFrhzyqa-d$Q@queTjP?w(Zb!!<_z#;6 z<X&tsqXw0zu76dQpf<J6Lou9-7P&AjAxG88Iq5)zYgusO6*zriTi6(@E(Y8xw)+GS zp)UeKc_=Kt44-o`i=j@*o(wUPzU^X6&A(raWBh6DF<cu!!7s2hg;MB(;uYXx%$@L` z4(Sn(a-l9o3QQhFzX2?)Q$!n0pB^MvvMPcw@2$vc4}TMJrV+Xa$s3P-yhR%07Iu{> z1%he^HyrXtLIZSejr0PX+vW<;0tve#&hw>Y8Avj}BJFOJBX?mrJBo3W2ceF{BS;*@ zfOtdF5Q@{qzdwH+LD4!m76-IhwEY&Mbq0;#lGm|$%`jd)URC>fdysTiDb&e72h8T> zTaC1rgnxgh^Ltjn%z2BJx}Kz+Ml!Bz3&d=QFXL@2v-_E^y|IEx_igpqOxqoZkEaRl zq1h)(vSLq|pcErVuoTHk<kp0`B!Pm~$VJBr?3k)Bo%av@c8=%C(ht66ILq;_$$M+C z_b3(YA``610a@jZ3fon=C$OvVy^7-_rVocu%YSlw8?h0iyniv|xz2<qVY2P>ZGAoL z+xq&nZ@1X*3;ix4jI5dFMhS<)*EpM&irE;pqo-X*gvM7l{DtXtqdonQiaR{Om3R%v z{YjR_RN=H2xH<fQ`?FEnGTg`{_T3KR@!_O+M;czOlLq=_lf4^*p{%eWFUdNHk@#Mr z7(8hqk-6<_|HgyEyx(iHJw4vazaj3%8r9~Ckyg43FJjUMYNIQ0sy>oTmlU@*ZGD8B NMMmPa{sZ5BdJzcKlso_c diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 026018b3..f58a9b9b 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index","intro","struct","tutorials/MW_pulse","tutorials/example_PT","tutorials/example_RB","tutorials/init_lib","tutorials/looping","tutorials/reset_time_and_slicing","tutorials/sequence","tutorials/simple_pulse"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:55},filenames:["index.rst","intro.rst","struct.rst","tutorials/MW_pulse.rst","tutorials/example_PT.rst","tutorials/example_RB.rst","tutorials/init_lib.rst","tutorials/looping.rst","tutorials/reset_time_and_slicing.rst","tutorials/sequence.rst","tutorials/simple_pulse.rst"],objects:{"":{base_pulse:[1,0,0,"-"]},"base_pulse.pulselib":{add_IQ_virt_channels:[1,2,1,""],add_awgs:[1,2,1,""],add_channel_compenstation_limits:[1,2,1,""],add_channel_delay:[1,2,1,""],add_virtual_gates:[1,2,1,""],define_channels:[1,2,1,""],mk_segment:[1,2,1,""],mk_sequence:[1,2,1,""]},"segments.data_classes":{IQ_data:[1,1,1,""],data_container:[1,1,1,""],get_effective_point_number:[1,3,1,""],pulse_data:[1,1,1,""]},"segments.data_classes.IQ_data":{append:[1,2,1,""],get_IQ_data:[1,2,1,""],slice_time:[1,2,1,""]},"segments.data_classes.pulse_data":{append:[1,2,1,""],get_resized_waveform:[1,2,1,""],get_vmax:[1,2,1,""],get_vmin:[1,2,1,""],integrate_waveform:[1,2,1,""],render:[1,2,1,""],slice_time:[1,2,1,""]},"segments.segments":{segment_container:[1,1,1,""]},"segments.segments.segment_container":{append:[1,2,1,""],enter_rendering_mode:[1,2,1,""],exit_rendering_mode:[1,2,1,""],extend_dim:[1,2,1,""],get_waveform:[1,2,1,""],reset_time:[1,2,1,""],shape:[1,4,1,""],slice_time:[1,2,1,""],total_time:[1,4,1,""]},"segments.segments_IQ":{segment_single_IQ:[1,1,1,""]},"segments.segments_IQ.segment_single_IQ":{get_IQ_data:[1,2,1,""]},base_pulse:{pulselib:[1,1,1,""]},segments:{data_classes:[1,0,0,"-"],segments:[1,0,0,"-"],segments_IQ:[1,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute"},terms:{"10n":1,"140n":1,"20n":1,"class":[0,1],"default":1,"final":1,"function":[0,1],"int":1,"long":1,"new":1,"return":1,"short":0,"true":1,The:1,Will:1,actual:1,add:1,add_awg:1,add_channel_compenstation_limit:1,add_channel_delai:1,add_iq_virt_channel:1,add_virtual_g:1,added:1,adding:1,adiabat:1,advanc:0,after:1,algorithm:1,all:[0,1],allow:1,along:0,alreadi:1,also:0,amount:1,amp:1,ani:0,api:0,append:1,applic:1,arbitrari:0,arg:1,argument:1,arrai:1,atm:0,attent:0,automaticc:1,awg1:1,awg:[0,1],base:[0,1],base_level:1,base_puls:1,befor:1,benchmark:0,blabla:[],bladibla:2,block:1,bool:1,both:1,cach:1,calcul:1,call:1,can:[0,1],cannot:1,capabl:1,certain:1,chan1:1,chan2:1,chang:1,channel:[0,1],channnel:1,character:0,check:1,chirp:1,chrip:1,clean:0,cleaner:1,clear:1,clear_cache_on_exit:1,coher:0,coherenli:0,collector:1,combin:[0,1],command:0,compos:1,concept:0,concern:1,constain:1,construct:1,contain:[0,1],control:[0,1],convert:1,copi:1,correspond:1,current:1,cut:1,cut_seg:1,data:[0,1],data_class:1,data_contain:1,debug:1,defin:1,define_channel:1,delai:1,denot:1,depend:1,design:0,desir:1,develop:0,dict:1,dictionari:1,differ:[0,1],dimens:[0,1],discret:1,doc:1,doe:0,doing:1,doubl:1,dtype:1,duobl:1,dure:0,each:1,eas:0,element:1,end:1,ensur:1,enter_rendering_mod:1,entir:1,error:1,everyth:1,exampl:1,execut:[0,1],exist:1,exit:1,exit_rendering_mod:1,expect:1,experi:0,extend:1,extend_dim:1,extend_onli:1,extents:1,extra:1,fals:1,featur:0,first:[0,1],follow:1,format:1,found:0,freq1:1,freq2:1,freq:1,frequenc:1,from:[0,1],front:1,full:[0,1],fulli:0,fundamet:1,garbarg:1,gate:[0,1],gener:1,get:[0,1],get_effective_point_numb:1,get_iq_data:1,get_resized_waveform:1,get_vmax:1,get_vmin:1,get_waveform:1,give:1,given:[0,1],global:1,handi:1,have:1,high:0,how:[0,1],hvi:0,i_or_q:1,idea:1,includ:[0,1],index:[0,1],indic:1,individula:1,initi:0,input:1,insid:1,instead:1,instrument:1,integr:[0,1],integrate_waveform:1,intragr:1,intro:[],introduct:[],iq_channel:1,iq_data:1,iq_virt_channel:1,just:1,kei:1,keysight:[0,1],know:1,last:1,later:1,length:1,level:1,librari:[0,1],limit:1,linspac:1,list:1,lo_freq:1,local:1,locat:1,loop:[0,1],lot:0,low:1,main:1,make:[0,1],manag:1,mani:1,manual:1,matrix:1,max:1,maximum:1,mean:1,measur:1,memori:1,microwav:0,min:1,minimum:1,mk_segment:1,mk_sequenc:1,mod:1,mode:1,modul:[0,1],moment:1,more:[0,1],multidimension:0,my_input:1,my_seg:1,name:1,nativ:0,ndarrai:1,ndim:1,need:[0,1],neg:1,new_data:1,none:1,normal:1,note:1,noth:1,now:[0,1],number:1,numpi:1,object:[0,1],occup:1,occur:1,offset:1,one:1,ones:1,oper:1,opt:1,option:0,organis:1,oscil:1,other:1,outcom:1,overview:0,page:0,part:1,peculiar:1,per:1,perform:[0,1],phase:[0,1],place:1,plai:1,playback:0,point:1,pointer:1,possibl:1,post_delai:1,pratic:1,pre:1,pre_delai:1,prescal:1,present:1,previous:1,process:0,program:0,provid:0,puls:1,pulse_data:1,pulselib:1,purpos:1,put:1,pxi:0,qcode:1,qubit:[0,1],r_iq_channel:1,ram:1,randomis:0,rate:1,raw:1,read:1,real_channel:1,recomend:[],ref:1,refer:1,referenc:1,remov:1,render:1,repres:1,request:0,requir:1,reset:[0,1],reset_tim:1,run:[0,1],runn:1,sampl:1,sample_r:1,save:1,schedul:1,search:0,sec:1,see:1,segement:1,segment:[0,1],segment_contain:1,segment_singl:1,segment_single_iq:1,segments_iq:1,seq:1,sequenc:[0,1],seri:1,set:1,shape:1,shift:1,should:1,shrink:1,sideband:0,signal:[0,1],simpl:0,sine:[0,1],singl:[0,1],size:1,slice:[0,1],slice_tim:1,sourc:1,speed:0,spin:[0,1],ssb:1,standard:1,start:[0,1],start_tim:1,std:1,step:[0,1],still:1,stop:1,stop_tim:1,store:1,str:1,string:1,struct:[],structur:0,support:[0,1],suppport:0,sure:1,sympi:0,syntax:0,system:0,take:1,taken:1,termin:1,than:1,thei:1,them:1,thi:[0,1],though:1,through:[],time:[0,1],time_step:1,todo:1,toget:1,tomographi:0,toolkit:0,total:1,total_tim:1,totaltim:1,tupl:1,tutori:0,tutoti:0,two:[0,1],type:1,unit:1,until:1,upload:[0,1],usag:1,use:[0,1],used:1,using:[0,1],valu:1,variabl:0,viq_channel:1,virtual:[0,1],virtual_g:1,virtual_gate_matrix:1,virtual_gates_names_r:1,virtual_gates_names_virt:1,vmax:1,vmin:1,volatag:1,voltag:1,want:1,wave:[0,1],waveform:[0,1],wavoform:1,what:[0,1],wheather:1,when:[0,1],where:1,which:[0,1],whole:1,work:0,would:1,you:1,your:0,zero:1},titles:["Welcome to pulse lib\u2019s documentation","Introduction","Structure of the library","Tutorial : Making pulses for Microwave control.","Advanced Tutorial : Programming a process tomography experiment to characterize a two qubit gate.","Advanced Tutorial : Designing pulses for a Randomised Benchmarking experiment.","Tutorial : Initializing the library","Tutorial : Looping variables.","Concepts : Reset time and slicing of waveforms.","Tutotial : Making from pulses a sequence","Tutorial : Making simple pulses for DC control of qubits."],titleterms:{advanc:[4,5],benchmark:5,character:4,concept:8,control:[3,10],design:5,document:0,experi:[4,5],from:9,gate:4,indic:0,initi:6,introduct:1,lib:0,librari:[2,6],loop:7,make:[3,9,10],microwav:3,process:4,program:4,puls:[0,3,5,9,10],qubit:[4,10],randomis:5,reset:8,sequenc:9,simpl:10,slice:8,structur:2,tabl:0,test:[],time:8,tomographi:4,tutori:[3,4,5,6,7,10],tutoti:9,two:4,variabl:7,waveform:8,welcom:0}}) \ No newline at end of file +Search.setIndex({docnames:["index","intro","struct","tutorials/MW_pulse","tutorials/example_PT","tutorials/example_RB","tutorials/init_lib","tutorials/looping","tutorials/reset_time_and_slicing","tutorials/sequence","tutorials/simple_pulse"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:55},filenames:["index.rst","intro.rst","struct.rst","tutorials/MW_pulse.rst","tutorials/example_PT.rst","tutorials/example_RB.rst","tutorials/init_lib.rst","tutorials/looping.rst","tutorials/reset_time_and_slicing.rst","tutorials/sequence.rst","tutorials/simple_pulse.rst"],objects:{"":{base_pulse:[1,0,0,"-"]},"base_pulse.pulselib":{add_IQ_virt_channels:[1,2,1,""],add_awgs:[1,2,1,""],add_channel_compenstation_limits:[1,2,1,""],add_channel_delay:[1,2,1,""],add_virtual_gates:[1,2,1,""],define_channels:[1,2,1,""],mk_segment:[1,2,1,""],mk_sequence:[1,2,1,""]},"segments.data_classes":{IQ_data:[1,1,1,""],data_container:[1,1,1,""],get_effective_point_number:[1,3,1,""],pulse_data:[1,1,1,""]},"segments.data_classes.IQ_data":{append:[1,2,1,""],get_IQ_data:[1,2,1,""],slice_time:[1,2,1,""]},"segments.data_classes.pulse_data":{append:[1,2,1,""],get_resized_waveform:[1,2,1,""],get_vmax:[1,2,1,""],get_vmin:[1,2,1,""],integrate_waveform:[1,2,1,""],render:[1,2,1,""],slice_time:[1,2,1,""]},"segments.segments":{segment_container:[1,1,1,""]},"segments.segments.segment_container":{append:[1,2,1,""],enter_rendering_mode:[1,2,1,""],exit_rendering_mode:[1,2,1,""],extend_dim:[1,2,1,""],get_waveform:[1,2,1,""],reset_time:[1,2,1,""],shape:[1,4,1,""],slice_time:[1,2,1,""],total_time:[1,4,1,""]},"segments.segments_IQ":{segment_single_IQ:[1,1,1,""]},"segments.segments_IQ.segment_single_IQ":{get_IQ_data:[1,2,1,""]},base_pulse:{pulselib:[1,1,1,""]},segments:{data_classes:[1,0,0,"-"],segments:[1,0,0,"-"],segments_IQ:[1,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute"},terms:{"100e":1,"10e6":1,"10n":1,"140n":1,"1d_scan":1,"1e9":[1,6],"20e3":1,"20n":1,"20u":1,"2d_scan":1,"2e9":1,"45n":6,"50n":1,"case":6,"class":[0,1,2],"default":[1,2,6],"final":1,"function":[0,1],"import":[1,6],"int":1,"long":1,"new":[1,6],"return":1,"short":0,"true":1,For:[6,10],One:[1,2],That:6,The:[1,2,6],There:2,These:2,Will:1,abov:1,access:1,accomplish:6,actual:1,add:[1,6],add_awg:[1,6],add_block:1,add_channel_compenstation_limit:1,add_channel_delai:[1,6],add_iq_virt_channel:[1,6],add_puls:1,add_sequ:1,add_sin:1,add_virtual_g:[1,6],added:[1,6],adding:1,addit:6,adiabat:1,advanc:[0,1],after:1,ake:1,algorithm:1,all:[0,1,2,6],allow:[1,6],along:0,alreadi:[1,2],also:[0,1,2,6,10],alwai:1,amount:1,amp:1,amplitud:1,ani:[0,6],anoth:6,anyth:1,api:0,append:1,applic:1,arbitrari:0,arg:1,argument:1,around:6,arrai:1,assum:1,atm:0,att:1,attent:0,automat:[0,2,6],automaticc:1,awai:2,awg1:[1,6],awg2:[1,6],awg3:[1,6],awg4:1,awg:[0,1,2,6],awg_channels_to_physical_loc:[1,6],awg_iq_channel:[1,6],awg_virtual_g:[1,6],axi:1,back:[1,6],band:6,barrier:[1,6],base:[0,1],base_level:1,base_puls:[1,6],basic:[1,2],been:6,befor:[1,2,6],below:[2,6],benchmark:0,best:1,between:2,blabla:[],bladibla:[],block:[1,2],bool:1,both:[1,2],bracket:[1,6],build:1,cabl:[1,6],cach:1,calcul:1,call:[1,6],can:[0,1,2,6,10],cannot:1,capabl:1,carrier:6,certain:1,chan1:1,chan2:1,chang:1,channal:1,channel:[0,1,2,10],channnel:1,character:0,charg:6,chassi:[1,6],check:1,chirp:1,chrip:1,clean:0,cleaner:1,clear:1,clear_cache_on_exit:1,coax:6,coaxial:1,code:[1,2,6],coher:0,coherenli:0,collect:2,collector:1,combin:[0,1],come:1,command:0,commannd:1,compens:6,compenst:0,complet:6,compos:1,concaten:2,concept:0,concern:1,connect:6,consid:10,consist:10,constain:1,construct:[1,6],contain:[0,1,6],control:[0,1,6],convert:1,copi:1,correspond:[1,6],could:[2,6],coupl:1,courag:2,creat:[1,6],current:[1,6],cut:1,cut_seg:1,data:[0,1,2],data_class:1,data_contain:1,debug:1,defin:[1,2],define_channel:[1,6],delai:1,denot:1,depend:1,design:0,desir:1,detail:2,develop:0,diagon:6,diagram:6,dict:[1,6],dictionari:[1,6],differ:[0,1,2],dimens:[0,1],dimensio:1,directli:1,discret:1,doc:1,doe:[0,2],doing:[1,6],done:1,dot:[],doubl:1,down:6,dtype:1,due:1,duobl:1,dure:0,each:[1,2],eas:0,easi:[1,6],easili:6,edsr:6,element:[1,2],empti:2,end:[1,6],ensur:1,enter_rendering_mod:1,entir:1,error:1,everyth:1,exampl:[1,2,10],execut:[0,1,2,6],exist:1,exit:1,exit_rendering_mod:1,expect:1,experi:[0,1,2,10],explain:6,explicit:1,extend:1,extend_dim:1,extend_onli:1,extents:1,extra:[1,6],eye:[1,6],fact:6,fals:1,featur:0,feed:6,feel:2,few:10,finish_init:1,finiz:1,first:[0,1,6],follow:[1,2,6,10],form:2,format:1,found:[0,2,6],free:1,freq1:1,freq2:1,freq:1,frequenc:[1,6],fridg:6,from:[0,1,6],front:1,full:[0,1],fulli:0,fundamet:1,garbarg:1,gate:[0,1],gener:[1,2,6],get:[0,1,6],get_effective_point_numb:1,get_iq_data:1,get_resized_waveform:1,get_vmax:1,get_vmin:1,get_waveform:1,give:[1,2],given:[0,1,2],global:1,going:6,good:1,graphic:[],handi:1,has:1,have:[1,2,6],here:[1,2,6,10],high:0,highlight:[],how:[0,1,2,6,10],hvi:0,i_mw:1,i_or_q:1,idea:1,imag:[2,6],implement:[1,6],includ:[0,1],index:[0,1],indic:1,individula:1,info:[2,6],inform:2,init:[1,6],init_pulselib:6,initi:[0,1,2],initialis:1,input:1,insid:1,instead:1,instrument:1,integr:[0,1],integrate_waveform:1,interchang:2,interect:1,intiti:1,intragr:1,intro:[],introduct:6,involv:2,iq_channel:1,iq_data:1,iq_virt_channel:1,item:6,just:[1,2,6],keep:6,kei:1,keysight:[0,1,6],keysight_awg:[1,6],know:[1,6],last:1,latenc:6,later:1,learn:10,lenght:1,length:[1,2,6],let:[1,6],level:1,lib:2,librari:[0,1],like:1,limit:1,linear:1,link:6,linspac:1,list:1,lo_freq:[1,6],local:1,locat:[1,6],longer:[1,6],loop:[0,1],loopobject:1,lot:0,low:1,made:1,main:[1,6],make:[0,1,2,6],manag:1,mani:1,manip:1,manipul:2,manual:1,map:6,marker:6,matrix:[1,6],max:1,maximum:1,mean:[1,2],measur:1,memori:1,microwav:[0,6],might:[1,6],min:1,minimum:1,mircowav:6,mix:6,mixer:1,mk_segment:1,mk_sequenc:1,mod:1,mode:1,modul:[0,1,6],moment:[1,6],more:[0,1,2,6],most:[6,10],move:6,multidimension:0,multipl:1,must:2,mw_gate:6,mw_gate_i:6,mw_gate_q:6,mw_marker:6,mw_sourc:[1,6],my_input:1,my_matrix:[1,6],my_seg:1,mysequ:1,n_point:1,n_points1:1,n_points2:1,name:[1,2,6],nativ:0,ndarrai:1,ndim:1,need:[0,1,2,6],neg:[1,6],new_data:1,next:[1,6],none:[1,6],normal:1,note:[1,2,6],noth:1,now:[0,1,6],npoint:1,npoints1:1,number:1,numer:1,numpi:1,object:[0,1,2],occup:1,occur:1,off:6,offset:[0,1],onc:[1,6],one:[1,2,6],ones:[1,6],onli:[1,2,6],oper:[1,6],opt:[1,6],option:[0,1],organis:1,organiz:2,oscil:1,other:[1,6],our:6,out:[6,10],outcom:1,output:6,overview:[0,2],page:0,paramet:[1,6],part:1,pass:1,peculiar:1,per:[1,6],perform:[0,1],period1:1,period2:1,period:1,perv:1,phase:[0,1,6],physic:6,place:1,plai:[1,2],platea:10,playback:[0,1],plot:1,plunger:[1,6],point:[1,2],pointer:1,posiv:1,possibl:1,post_delai:1,power:1,practic:6,pratic:1,pre:1,pre_delai:1,prepar:1,prescal:1,prescalor:1,present:1,previous:1,process:[0,6],program:[0,10],properti:6,provid:[0,6],puls:[1,2],pulse_data:1,pulse_lib:[1,6],pulselib:[1,6],purpos:1,put:[1,6],pxi:0,python:[1,6],q_mw:1,qcode:[1,6],qtt:6,qubit:[0,1,2],qubit_1:[1,6],qubit_2:[1,6],quick:2,quit:6,r_iq_channel:1,rabi:1,ram:1,ramp:[1,2,10],ramsei:1,randomis:0,rang:1,rate:1,raw:1,reach:6,read:[1,6],readout:[1,2],real:1,real_channel:1,realli:2,recomend:1,recommend:6,ref:1,refer:[1,6],referenc:1,relat:2,releas:6,remov:1,render:[1,2],repeat:1,repres:1,request:0,requir:1,reset:[0,1],reset_tim:1,riq_channel:[1,6],rule:2,run:[0,1],runn:1,same:[1,2,6],sampl:[1,2,6],sample_r:1,save:1,scan:1,schedul:1,screen:6,sd_awg:[1,6],sd_p:[],search:0,sec:1,see:1,seg2:1,seg3:1,seg:1,segement:1,segment:[0,1,6],segment_contain:1,segment_singl:1,segment_single_iq:1,segments_bas:2,segments_iq:[1,2],sens:[],seq:1,sequenc:[0,1],seri:1,set:[1,2,6],setup:2,shape:1,shift:1,should:[1,2,6],show:10,shrink:1,sideband:0,signal:[0,1,2,6],simpl:0,simpli:1,sine:[0,1],singl:[0,1,2],size:1,slice:[0,1],slice_tim:1,slot:[1,6],some:[1,2,6],someth:6,sourc:[1,2,6],specifi:[1,2],speciti:1,speed:0,spend:6,spin:[0,1],ssb:1,stabil:6,standard:1,start:[0,1,6],start_sequ:1,start_tim:1,state:6,station:1,std:1,step1:1,step2:1,step:[0,1],still:1,stop:1,stop_tim:1,store:1,str:1,straightforward:6,string:1,struct:[],structur:0,stuff:6,style:10,support:[0,1],suppport:0,sure:1,sweep:1,swept:1,swing1:1,swing2:1,swing:1,sympi:0,syntax:0,system:0,take:[1,6],taken:1,tell:2,termin:1,than:[1,2,6],thei:1,them:1,thi:[0,1,2,6],thing:[6,10],think:2,though:[1,2,6],three:2,through:1,thu:6,time:[0,1,2,6],time_step:1,todo:[1,6],toget:1,togeth:10,tomographi:0,toolkit:0,top:1,total:1,total_tim:1,totaltim:1,track:6,translat:6,trigger:[1,6],tupl:1,tutori:[0,2],tutoti:0,two:[0,1,2,10],type:[1,2],uniqu:1,unit:[1,6],until:1,updat:[1,6],update_virtual_gate_matrix:[1,6],upload:[0,1,6],usag:1,use:[0,1],used:[1,2,6,10],using:[0,1,6],usual:[6,10],v_start1:1,v_start2:1,v_start:1,valu:1,variabl:0,vb0:[1,6],vb1:[1,6],vb2:[1,6],vb3:1,vb4:1,vb5:1,vector:[2,6],versu:1,viq_channel:[1,6],virtual:[0,1],virtual_g:1,virtual_gate_matrix:[1,6],virtual_gates_names_r:[1,6],virtual_gates_names_virt:[1,6],vmax:1,vmin:1,volatag:1,voltag:1,voltageiq:1,vp1:[1,6],vp2:[1,6],vp3:1,vp4:1,vp5:1,wait:1,want:[1,6],wave:[0,1],waveform:[0,1,2,6],wavoform:1,what:[0,1],whaterv:1,wheather:1,when:[0,1,2,6],where:1,which:[0,1,2,6],whole:1,wide:6,work:[0,2,6,10],would:[1,2,6],yet:1,you:[1,2,6,10],your:[0,1,2],yourselv:6,zero:1},titles:["Welcome to pulse lib\u2019s documentation","Introduction","Structure of the library","Tutorial : Making pulses for Microwave control.","Advanced Tutorial : Programming a process tomography experiment to characterize a two qubit gate.","Advanced Tutorial : Designing pulses for a Randomised Benchmarking experiment.","Tutorial : Initializing the library","Tutorial : Looping variables.","Concepts : Reset time and slicing of waveforms.","Tutotial : Making from pulses a sequence","Tutorial : Making simple pulses for DC control of qubits."],titleterms:{advanc:[4,5],benchmark:5,channel:6,character:4,concept:8,contain:2,control:[3,10],defin:6,delai:6,design:5,document:0,elzerman:10,exampl:6,experi:[4,5],from:9,gate:[4,6],indic:0,initi:6,introduct:1,lib:[0,6],librari:[2,6],loop:7,make:[3,9,10],microwav:3,object:6,overview:[],process:4,program:4,puls:[0,3,5,6,9,10],qubit:[4,6,10],randomis:5,readout:10,real:6,reset:8,segment:2,sequenc:[2,9],setup:6,simpl:10,slice:8,step:6,structur:2,tabl:0,test:[],time:8,tomographi:4,tutori:[3,4,5,6,7,10],tutoti:9,two:[4,6],variabl:7,virtual:6,waveform:8,welcom:0}}) \ No newline at end of file diff --git a/docs/_build/html/struct.html b/docs/_build/html/struct.html index d8666b85..05a111ee 100644 --- a/docs/_build/html/struct.html +++ b/docs/_build/html/struct.html @@ -27,7 +27,9 @@ <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> - <link rel="search" title="Search" href="search.html" /> + <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Tutorial : Initializing the library" href="tutorials/init_lib.html" /> + <link rel="prev" title="Welcome to pulse lib’s documentation" href="index.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -77,8 +79,16 @@ <p class="caption"><span class="caption-text">Getting started</span></p> -<ul> -<li class="toctree-l1"><a class="reference internal" href="intro.html">Introduction</a></li> +<ul class="current"> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Structure of the library</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/init_lib.html">Tutorial : Initializing the library</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/simple_pulse.html">Tutorial : Making simple pulses for DC control of qubits.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/MW_pulse.html">Tutorial : Making pulses for Microwave control.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/sequence.html">Tutotial : Making from pulses a sequence</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/looping.html">Tutorial : Looping variables.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/reset_time_and_slicing.html">Concepts : Reset time and slicing of waveforms.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/example_PT.html">Advanced Tutorial : Programming a process tomography experiment to characterize a two qubit gate.</a></li> +<li class="toctree-l1"><a class="reference internal" href="tutorials/example_RB.html">Advanced Tutorial : Designing pulses for a Randomised Benchmarking experiment.</a></li> </ul> @@ -145,7 +155,52 @@ <div class="section" id="structure-of-the-library"> <h1>Structure of the library<a class="headerlink" href="#structure-of-the-library" title="Permalink to this headline">¶</a></h1> -<p>bladibla</p> +<dl class="docutils"> +<dt>The structure to the library is given by the following three classes:</dt> +<dd><ul class="first last simple"> +<li><a class="reference internal" href="#seg"><span class="std std-ref">Segments</span></a></li> +<li><a class="reference internal" href="#seg-con"><span class="std std-ref">Segment containers</span></a></li> +<li><a class="reference internal" href="#seq"><span class="std std-ref">Sequences</span></a></li> +</ul> +</dd> +</dl> +<p>These is also the pulse-lib class, which is an organizational element. This element is used to generate empty segment containers. More info on how to do this can be found <here>.</p> +<p><strong>Overview</strong></p> +<p>A quick overview of the relation between the different structural elements can be found below,</p> +<p><<< image >>></p> +<div class="section" id="segments"> +<span id="seg"></span><h2>Segments<a class="headerlink" href="#segments" title="Permalink to this headline">¶</a></h2> +<p>A segment is collection of data points that forms a single waveform. You can think of this as for example, the set of pulses that does the readout on you sample. +Note that a segment only contains the information for one channel.</p> +<dl class="docutils"> +<dt>There are two types of segments:</dt> +<dd><ul class="first last simple"> +<li>segments_base : these are segments that should be used for generating block pulses and ramps.</li> +<li>segments_IQ : these are segments that are used to work with IQ signals of vector MW sources.</li> +</ul> +</dd> +</dl> +<p>Both types can be used interchangeably. More details can be found in the tutorials (or if you feel really courageous in the source code).</p> +</div> +<div class="section" id="segment-containers"> +<span id="seg-con"></span><h2>Segment containers<a class="headerlink" href="#segment-containers" title="Permalink to this headline">¶</a></h2> +<p>A segment container, as the name already gives away, is a container of channels. If we would think of the example before, than in this element you would have the collection of all the channels that are involved in your readout pulse. This object is generated automatically, so no need for you to specify channels each time.</p> +<dl class="docutils"> +<dt>There are some rules for segment containers though,</dt> +<dd><ul class="first last simple"> +<li>All segments in a segment container must have the same length when rendered</li> +<li>A segment container contains by default all the AWG channels you have defined in your setup</li> +<li>All elements in the segment container must contain times that are >= 0.</li> +</ul> +</dd> +</dl> +</div> +<div class="section" id="sequences"> +<span id="seq"></span><h2>Sequences<a class="headerlink" href="#sequences" title="Permalink to this headline">¶</a></h2> +<p>Sequences are a collection of segment containers. Basically it means just concatenate different segment containers.</p> +<p>One could for example make 3 segment containers, on for initialization of the qubits, one for manipulation and one for readout. +When executing the experiment, you would tell the the AWG, play initialization -> manipulation -> readout.</p> +</div> </div> @@ -154,6 +209,15 @@ </div> <footer> + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="tutorials/init_lib.html" class="btn btn-neutral float-right" title="Tutorial : Initializing the library" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="index.html" class="btn btn-neutral" title="Welcome to pulse lib’s documentation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + <hr/> diff --git a/docs/_build/html/tutorials/init_lib.html b/docs/_build/html/tutorials/init_lib.html index 2c2767df..1037c952 100644 --- a/docs/_build/html/tutorials/init_lib.html +++ b/docs/_build/html/tutorials/init_lib.html @@ -27,7 +27,9 @@ <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="../genindex.html" /> - <link rel="search" title="Search" href="../search.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Tutorial : Making simple pulses for DC control of qubits." href="simple_pulse.html" /> + <link rel="prev" title="Structure of the library" href="../struct.html" /> <script src="../_static/js/modernizr.min.js"></script> @@ -77,8 +79,16 @@ <p class="caption"><span class="caption-text">Getting started</span></p> -<ul> +<ul class="current"> <li class="toctree-l1"><a class="reference internal" href="../struct.html">Structure of the library</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Tutorial : Initializing the library</a></li> +<li class="toctree-l1"><a class="reference internal" href="simple_pulse.html">Tutorial : Making simple pulses for DC control of qubits.</a></li> +<li class="toctree-l1"><a class="reference internal" href="MW_pulse.html">Tutorial : Making pulses for Microwave control.</a></li> +<li class="toctree-l1"><a class="reference internal" href="sequence.html">Tutotial : Making from pulses a sequence</a></li> +<li class="toctree-l1"><a class="reference internal" href="looping.html">Tutorial : Looping variables.</a></li> +<li class="toctree-l1"><a class="reference internal" href="reset_time_and_slicing.html">Concepts : Reset time and slicing of waveforms.</a></li> +<li class="toctree-l1"><a class="reference internal" href="example_PT.html">Advanced Tutorial : Programming a process tomography experiment to characterize a two qubit gate.</a></li> +<li class="toctree-l1"><a class="reference internal" href="example_RB.html">Advanced Tutorial : Designing pulses for a Randomised Benchmarking experiment.</a></li> </ul> @@ -145,6 +155,141 @@ <div class="section" id="tutorial-initializing-the-library"> <h1>Tutorial : Initializing the library<a class="headerlink" href="#tutorial-initializing-the-library" title="Permalink to this headline">¶</a></h1> +<p>Before making a pulse, the pulse library needs to know some stuff from you. The main items you need to provide are:</p> +<blockquote> +<div><ul class="simple"> +<li>QCodes objects of the AWG’s (only when using Keysight AWG’s)</li> +<li>Translation of you sample channels names (e.g. barrier gate 1) to the physical location if the set up (e.g. AWG3 channel 4)</li> +<li>Virtual gates and virtual gate matrix if needed <reference needed here></li> +<li>Virtual IQ channels, if you are doing IQ modulation <link explaining IQ modulation ></li> +<li>Channels delay’s (e.g. if not all you coaxes have the same length)</li> +</ul> +</div></blockquote> +<p>All these properties are contained in the <code class="docutils literal notranslate"><span class="pre">pulselib</span></code> object. Below a complete example is worked out to explaining how to do this. +The source code of the example can be found in <code class="docutils literal notranslate"><span class="pre">tutorials/init_pulselib.py</span></code> if you would want to execute it yourselves [TODO].</p> +<div class="section" id="tutorial-example-initialization-for-a-two-qubit-setup"> +<h2>Tutorial example : initialization for a two-qubit setup<a class="headerlink" href="#tutorial-example-initialization-for-a-two-qubit-setup" title="Permalink to this headline">¶</a></h2> +<p>For this setup, we have 6 coax cables going to the sample,</p> +<blockquote> +<div><ul class="simple"> +<li>B0, B1, B2 : gates that are connected to the barrier gates on the sample.</li> +<li>P1, P2 : gates that are connected to the plungers on the sample.</li> +<li>MW_gate : a screening gate on the sample that can be used for EDSR.</li> +<li>MW_marker : a marker to control on/off state of the vector source.</li> +</ul> +</div></blockquote> +<dl class="docutils"> +<dt>Practically the things that we want to set are:</dt> +<dd><ol class="first last arabic simple"> +<li>Which channels of the AWG are corresponding to the gates on the sample.</li> +<li>Virtual gates to move easily around in charge stability diagrams.</li> +<li>Two virtual IQ channels, one per qubit.</li> +<li>A channel delay for the MW channel, to compensate for the time that the waveform spends in the vector signal source generator.</li> +</ol> +</dd> +</dl> +<div class="section" id="step-1-initializing-the-pulse-lib-object-and-defining-real-gates"> +<h3>Step 1 : initializing the pulse lib object and defining real gates<a class="headerlink" href="#step-1-initializing-the-pulse-lib-object-and-defining-real-gates" title="Permalink to this headline">¶</a></h3> +<p>The first thing we need to do is to make the <code class="docutils literal notranslate"><span class="pre">pulselib</span></code> object, once it is make, we can start to define extra properties.</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">pulse_lib.base_pulse</span> <span class="kn">import</span> <span class="n">pulselib</span> +<span class="n">pulse</span> <span class="o">=</span> <span class="n">pulselib</span><span class="p">()</span> +</pre></div> +</div> +<p>That was it, let’s now add some AWG’s and define the channel names. In this example we will need 8 channels, thus two, 4 channel AWG’s.</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># init AWG</span> +<span class="n">awg1</span> <span class="o">=</span> <span class="n">keysight_awg</span><span class="o">.</span><span class="n">SD_AWG</span><span class="p">(</span><span class="s1">'awg1'</span><span class="p">,</span> <span class="n">chassis</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">slot</span><span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">channels</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">triggers</span><span class="o">=</span> <span class="mi">8</span><span class="p">)</span> +<span class="n">awg2</span> <span class="o">=</span> <span class="n">keysight_awg</span><span class="o">.</span><span class="n">SD_AWG</span><span class="p">(</span><span class="s1">'awg2'</span><span class="p">,</span> <span class="n">chassis</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">slot</span><span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">channels</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">triggers</span><span class="o">=</span> <span class="mi">8</span><span class="p">)</span> + +<span class="c1"># add to pulse_lib</span> +<span class="n">pulse</span><span class="o">.</span><span class="n">add_awgs</span><span class="p">(</span><span class="s1">'AWG1'</span><span class="p">,</span><span class="n">awg1</span><span class="p">)</span> +<span class="n">pulse</span><span class="o">.</span><span class="n">add_awgs</span><span class="p">(</span><span class="s1">'AWG2'</span><span class="p">,</span><span class="n">awg2</span><span class="p">)</span> + + +<span class="c1"># define channels</span> +<span class="n">awg_channels_to_physical_locations</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">({</span><span class="s1">'B0'</span><span class="p">:(</span><span class="s1">'AWG1'</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="s1">'P1'</span><span class="p">:(</span><span class="s1">'AWG1'</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> + <span class="s1">'B1'</span><span class="p">:(</span><span class="s1">'AWG1'</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="s1">'P2'</span><span class="p">:(</span><span class="s1">'AWG1'</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span><span class="s1">'B2'</span><span class="p">:(</span><span class="s1">'AWG2'</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> + <span class="s1">'MW_gate_I'</span><span class="p">:(</span><span class="s1">'AWG2'</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="s1">'MW_gate_Q'</span><span class="p">:(</span><span class="s1">'AWG2'</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> + <span class="s1">'MW_marker'</span><span class="p">:(</span><span class="s1">'AWG2'</span><span class="p">,</span> <span class="mi">4</span><span class="p">)})</span> + +<span class="n">pulse</span><span class="o">.</span><span class="n">define_channels</span><span class="p">(</span><span class="n">awg_channels_to_physical_locations</span><span class="p">)</span> +</pre></div> +</div> +<p>Note, when not using the Keysight back-end, you can just call <code class="docutils literal notranslate"><span class="pre">p.add_awgs('AWG1',</span> <span class="pre">None)</span></code>. You will have to feed then the library in another uploaded (e.g. qtt virtual AWG).</p> +</div> +<div class="section" id="step-2-defining-the-virtual-gates"> +<h3>Step 2 : defining the virtual gates<a class="headerlink" href="#step-2-defining-the-virtual-gates" title="Permalink to this headline">¶</a></h3> +<p>This is a quite straightforward process, just define the channels for the virtual gate and their corresponding real channels in a dictionary.</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">awg_virtual_gates</span> <span class="o">=</span> <span class="p">{</span> + <span class="s1">'virtual_gates_names_virt'</span> <span class="p">:</span> + <span class="p">[</span><span class="s1">'vB0'</span><span class="p">,</span> <span class="s1">'vB1'</span><span class="p">,</span> <span class="s1">'vB2'</span><span class="p">,</span> <span class="s1">'vP1'</span><span class="p">,</span> <span class="s1">'vP2'</span><span class="p">],</span> + <span class="s1">'virtual_gates_names_real'</span> <span class="p">:</span> + <span class="p">[</span><span class="s1">'B0'</span><span class="p">,</span> <span class="s1">'B1'</span><span class="p">,</span> <span class="s1">'B2'</span><span class="p">,</span> <span class="s1">'P1'</span><span class="p">,</span> <span class="s1">'P2'</span><span class="p">],</span> + <span class="s1">'virtual_gate_matrix'</span> <span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">eye</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> +<span class="p">}</span> +<span class="n">pulse</span><span class="o">.</span><span class="n">add_virtual_gates</span><span class="p">(</span><span class="n">awg_virtual_gates</span><span class="p">)</span> +</pre></div> +</div> +<p>In this case we just constructed a 1 on 1 map of the virtual gates of real gates (diagonal virtual gate matrix).</p> +<p>The matrix can be updated at any time with:</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">pulse</span><span class="o">.</span><span class="n">update_virtual_gate_matrix</span><span class="p">(</span><span class="n">my_matrix</span><span class="p">)</span> +</pre></div> +</div> +<p>When the matrix is updated, it will automatically also update in all segments that have been created before. +An example how to practically work with virtual gates can be found here [TODO].</p> +</div> +<div class="section" id="step-3-defining-iq-channels"> +<h3>Step 3 : defining IQ channels<a class="headerlink" href="#step-3-defining-iq-channels" title="Permalink to this headline">¶</a></h3> +<p>If you are new to IQ modulation, it is recommended to read the introduction on IQ modulation, here [TODO].</p> +<p>When operating a vector source, you usually have to connect (usually) 3 coax cables:</p> +<blockquote> +<div><ul class="simple"> +<li>I channel</li> +<li>Q channel</li> +<li>marker</li> +<li><code class="docutils literal notranslate"><span class="pre">[opt]</span></code> if you want to go wide-band, you might also need to provide the negative image of the I/Q channel (currently not implemented .., though easy todo).</li> +</ul> +</div></blockquote> +<p>Most of the time, you will want to make a virtual channel per qubit, as it allows you to keep easy track of the phase of the qubit. An example of this can be found in the mircowave tutorial.</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">awg_IQ_channels</span> <span class="o">=</span> <span class="p">{</span> + <span class="s1">'vIQ_channels'</span> <span class="p">:</span> <span class="p">[</span><span class="s1">'qubit_1'</span><span class="p">,</span><span class="s1">'qubit_2'</span><span class="p">],</span> + <span class="s1">'rIQ_channels'</span> <span class="p">:</span> <span class="p">[[</span><span class="s1">'MW_gate_I'</span><span class="p">,</span><span class="s1">'MW_gate_Q'</span><span class="p">],[</span><span class="s1">'MW_gate_I'</span><span class="p">,</span><span class="s1">'MW_gate_Q'</span><span class="p">]],</span> + <span class="s1">'LO_freq'</span> <span class="p">:[</span><span class="n">MW_source</span><span class="o">.</span><span class="n">frequency</span><span class="p">,</span> <span class="mf">1e9</span><span class="p">]</span> + <span class="c1"># do not put the brackets for the MW source</span> + <span class="c1"># e.g. MW_source.frequency (this should be a qcodes parameter)</span> + <span class="p">}</span> + +<span class="n">pulse</span><span class="o">.</span><span class="n">add_IQ_virt_channels</span><span class="p">(</span><span class="n">awg_IQ_channels</span><span class="p">)</span> +</pre></div> +</div> +<p>At the moment markers are not added automatically, this is something that will be implemented in the next release of this library.</p> +</div> +<div class="section" id="step-4-defining-channel-delays"> +<h3>Step 4 : defining channel delays<a class="headerlink" href="#step-4-defining-channel-delays" title="Permalink to this headline">¶</a></h3> +<p>In our case here, we have to compensate for the fact that some signals take a longer time to get to the sample than other ones. More info on how this is practically accomplished, can be found here <code class="docutils literal notranslate"><span class="pre">TODO</span></code>. +Practically, example latencies could be the following:</p> +<blockquote> +<div><ul class="simple"> +<li>20 ns for the barrier and plunger gates to get from the AWG channels into the fridge.</li> +<li>70 ns to get to microwave channel from the IQ output into the fridge. 5 ns for the signal to reach the vector source, then the signal needs 45ns to be mixed with the carrier frequency, next 20 additional ns are needed to go down in the fridge.</li> +<li>5 ns marker delay</li> +</ul> +</div></blockquote> +<p>Or translated into python code,</p> +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">pulse</span><span class="o">.</span><span class="n">add_channel_delay</span><span class="p">({</span> + <span class="s1">'B0'</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> + <span class="s1">'P1'</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> + <span class="s1">'B1'</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> + <span class="s1">'P2'</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> + <span class="s1">'B2'</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> + <span class="s1">'MW_gate_I'</span><span class="p">:</span> <span class="mi">70</span><span class="p">,</span> + <span class="s1">'MW_gate_Q'</span><span class="p">:</span> <span class="mi">70</span><span class="p">,</span> + <span class="s1">'MW_marker'</span><span class="p">:</span> <span class="mi">5</span> +<span class="p">})</span> +</pre></div> +</div> +<p>Note, also negative delays are allowed. All units are in <code class="docutils literal notranslate"><span class="pre">ns</span></code> by default.</p> +</div> +</div> </div> @@ -153,6 +298,15 @@ </div> <footer> + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="simple_pulse.html" class="btn btn-neutral float-right" title="Tutorial : Making simple pulses for DC control of qubits." accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="../struct.html" class="btn btn-neutral" title="Structure of the library" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + <hr/> diff --git a/docs/_build/html/tutorials/simple_pulse.html b/docs/_build/html/tutorials/simple_pulse.html index 0d70ca0a..b505bff7 100644 --- a/docs/_build/html/tutorials/simple_pulse.html +++ b/docs/_build/html/tutorials/simple_pulse.html @@ -27,7 +27,9 @@ <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="../genindex.html" /> - <link rel="search" title="Search" href="../search.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Tutorial : Making pulses for Microwave control." href="MW_pulse.html" /> + <link rel="prev" title="Tutorial : Initializing the library" href="init_lib.html" /> <script src="../_static/js/modernizr.min.js"></script> @@ -77,8 +79,16 @@ <p class="caption"><span class="caption-text">Getting started</span></p> -<ul> +<ul class="current"> <li class="toctree-l1"><a class="reference internal" href="../struct.html">Structure of the library</a></li> +<li class="toctree-l1"><a class="reference internal" href="init_lib.html">Tutorial : Initializing the library</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Tutorial : Making simple pulses for DC control of qubits.</a></li> +<li class="toctree-l1"><a class="reference internal" href="MW_pulse.html">Tutorial : Making pulses for Microwave control.</a></li> +<li class="toctree-l1"><a class="reference internal" href="sequence.html">Tutotial : Making from pulses a sequence</a></li> +<li class="toctree-l1"><a class="reference internal" href="looping.html">Tutorial : Looping variables.</a></li> +<li class="toctree-l1"><a class="reference internal" href="reset_time_and_slicing.html">Concepts : Reset time and slicing of waveforms.</a></li> +<li class="toctree-l1"><a class="reference internal" href="example_PT.html">Advanced Tutorial : Programming a process tomography experiment to characterize a two qubit gate.</a></li> +<li class="toctree-l1"><a class="reference internal" href="example_RB.html">Advanced Tutorial : Designing pulses for a Randomised Benchmarking experiment.</a></li> </ul> @@ -145,6 +155,22 @@ <div class="section" id="tutorial-making-simple-pulses-for-dc-control-of-qubits"> <h1>Tutorial : Making simple pulses for DC control of qubits.<a class="headerlink" href="#tutorial-making-simple-pulses-for-dc-control-of-qubits" title="Permalink to this headline">¶</a></h1> +<p>For most experiments, pulses usually consist out of simple ramps and platea’s. +In the following there will be a few examples that show how to program these things. +We will consider two experiments,</p> +<blockquote> +<div><ul class="simple"> +<li>a pulse that can be used for readout (elzerman style)</li> +<li>a pulse to control a ST qubit</li> +</ul> +</div></blockquote> +<p>Here you will learn how to make the pulse, but also how the channels are working together.</p> +<div class="section" id="elzerman-readout"> +<h2>Elzerman readout<a class="headerlink" href="#elzerman-readout" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="controlling-a-st-qubit"> +<h2>Controlling a ST qubit<a class="headerlink" href="#controlling-a-st-qubit" title="Permalink to this headline">¶</a></h2> +</div> </div> @@ -153,6 +179,15 @@ </div> <footer> + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="MW_pulse.html" class="btn btn-neutral float-right" title="Tutorial : Making pulses for Microwave control." accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="init_lib.html" class="btn btn-neutral" title="Tutorial : Initializing the library" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + <hr/> diff --git a/docs/index.rst b/docs/index.rst index 0a985924..81ee2632 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,11 +9,12 @@ This is a pulse library designed to provide all the control signals that are nee A lot of attention is given to performance, structure and ease of use. Features now include: - - Support for arbitrary pulse/sine wave based sequences (phase coherent atm) + - Support for arbitrary pulse/sine wave based sequences (phase coherent atm). - Fully multidimensional. Execute any command as a loop in any dimension. - Short and clean syntax. No sympy. - - Native support for virtual gates - - IQ toolkit and IQ virtual channels -- Full suppport for single sideband modulation (Along with PM/AM/FM) + - Native support for virtual gates. + - IQ toolkit and IQ virtual channels -- Full suppport for single sideband modulation (Along with PM/AM/FM). + - Automatic compenstation for DC offsets. - High speed uploader for Keysight PXI systems which supports upload during playback. .. toctree:: diff --git a/docs/struct.rst b/docs/struct.rst index 50e8325e..5c25247a 100644 --- a/docs/struct.rst +++ b/docs/struct.rst @@ -1,4 +1,49 @@ Structure of the library ======================== -bladibla \ No newline at end of file +The structure to the library is given by the following three classes: + - :ref:`seg` + - :ref:`seg_con` + - :ref:`seq` +These is also the pulse-lib class, which is an organizational element. This element is used to generate empty segment containers. More info on how to do this can be found <here>. + +**Overview** + +A quick overview of the relation between the different structural elements can be found below, + +<<< image >>> + + +.. _seg: + +Segments +-------- +A segment is collection of data points that forms a single waveform. You can think of this as for example, the set of pulses that does the readout on you sample. +Note that a segment only contains the information for one channel. + +There are two types of segments: + - segments_base : these are segments that should be used for generating block pulses and ramps. + - segments_IQ : these are segments that are used to work with IQ signals of vector MW sources. +Both types can be used interchangeably. More details can be found in the tutorials (or if you feel really courageous in the source code). + + +.. _seg_con: + +Segment containers +------------------ +A segment container, as the name already gives away, is a container of channels. If we would think of the example before, than in this element you would have the collection of all the channels that are involved in your readout pulse. This object is generated automatically, so no need for you to specify channels each time. + +There are some rules for segment containers though, + - All segments in a segment container must have the same length when rendered + - A segment container contains by default all the AWG channels you have defined in your setup + - All elements in the segment container must contain times that are >= 0. + +.. _seq: + +Sequences +--------- +Sequences are a collection of segment containers. Basically it means just concatenate different segment containers. + +One could for example make 3 segment containers, on for initialization of the qubits, one for manipulation and one for readout. +When executing the experiment, you would tell the the AWG, play initialization -> manipulation -> readout. + diff --git a/docs/tutorials/init_lib.rst b/docs/tutorials/init_lib.rst index 45641b7c..48e07242 100644 --- a/docs/tutorials/init_lib.rst +++ b/docs/tutorials/init_lib.rst @@ -1,2 +1,143 @@ Tutorial : Initializing the library -=================================== \ No newline at end of file +=================================== + +Before making a pulse, the pulse library needs to know some stuff from you. The main items you need to provide are: + + - QCodes objects of the AWG's (only when using Keysight AWG's) + - Translation of you sample channels names (e.g. barrier gate 1) to the physical location if the set up (e.g. AWG3 channel 4) + - Virtual gates and virtual gate matrix if needed <reference needed here> + - Virtual IQ channels, if you are doing IQ modulation <link explaining IQ modulation > + - Channels delay's (e.g. if not all you coaxes have the same length) + +All these properties are contained in the ``pulselib`` object. Below a complete example is worked out to explaining how to do this. +The source code of the example can be found in ``tutorials/init_pulselib.py`` if you would want to execute it yourselves [TODO]. + +Tutorial example : initialization for a two-qubit setup +------------------------------------------------------- + +For this setup, we have 6 coax cables going to the sample, + + - B0, B1, B2 : gates that are connected to the barrier gates on the sample. + - P1, P2 : gates that are connected to the plungers on the sample. + - MW_gate : a screening gate on the sample that can be used for EDSR. + - MW_marker : a marker to control on/off state of the vector source. + +Practically the things that we want to set are: + 1. Which channels of the AWG are corresponding to the gates on the sample. + 2. Virtual gates to move easily around in charge stability diagrams. + 3. Two virtual IQ channels, one per qubit. + 4. A channel delay for the MW channel, to compensate for the time that the waveform spends in the vector signal source generator. + 5. Voltage compensation boundaries for DC offsets ``write DC offset article`` + +Step 1 : initializing the pulse lib object and defining real gates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The first thing we need to do is to make the ``pulselib`` object, once it is make, we can start to define extra properties. + +.. code-block:: python + + from pulse_lib.base_pulse import pulselib + pulse = pulselib() + +That was it, let's now add some AWG's and define the channel names. In this example we will need 8 channels, thus two, 4 channel AWG's. + +.. code-block:: python + + # init AWG + awg1 = keysight_awg.SD_AWG('awg1', chassis = 0, slot= 2, channels = 4, triggers= 8) + awg2 = keysight_awg.SD_AWG('awg2', chassis = 0, slot= 3, channels = 4, triggers= 8) + + # add to pulse_lib + pulse.add_awgs('AWG1',awg1) + pulse.add_awgs('AWG2',awg2) + + + # define channels + awg_channels_to_physical_locations = dict({'B0':('AWG1', 1), 'P1':('AWG1', 2), + 'B1':('AWG1', 3), 'P2':('AWG1', 4),'B2':('AWG2', 1), + 'MW_gate_I':('AWG2', 2), 'MW_gate_Q':('AWG2', 3), + 'MW_marker':('AWG2', 4)}) + + pulse.define_channels(awg_channels_to_physical_locations) + +Note, when not using the Keysight back-end, you can just call ``p.add_awgs('AWG1', None)``. You will have to feed then the library in another uploaded (e.g. qtt virtual AWG). + +Step 2 : defining the virtual gates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is a quite straightforward process, just define the channels for the virtual gate and their corresponding real channels in a dictionary. + +.. code-block:: python + + awg_virtual_gates = { + 'virtual_gates_names_virt' : + ['vB0', 'vB1', 'vB2', 'vP1', 'vP2'], + 'virtual_gates_names_real' : + ['B0', 'B1', 'B2', 'P1', 'P2'], + 'virtual_gate_matrix' : np.eye(5) + } + pulse.add_virtual_gates(awg_virtual_gates) +In this case we just constructed a 1 on 1 map of the virtual gates of real gates (diagonal virtual gate matrix). + +The matrix can be updated at any time with: + +.. code-block:: python + + pulse.update_virtual_gate_matrix(my_matrix) + +When the matrix is updated, it will automatically also update in all segments that have been created before. +An example how to practically work with virtual gates can be found here [TODO]. + +Step 3 : defining IQ channels +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you are new to IQ modulation, it is recommended to read the introduction on IQ modulation, here [TODO]. + +When operating a vector source, you usually have to connect (usually) 3 coax cables: + + - I channel + - Q channel + - marker + - ``[opt]`` if you want to go wide-band, you might also need to provide the negative image of the I/Q channel (currently not implemented .., though easy todo). + +Most of the time, you will want to make a virtual channel per qubit, as it allows you to keep easy track of the phase of the qubit. An example of this can be found in the mircowave tutorial. + +.. code-block:: python + + awg_IQ_channels = { + 'vIQ_channels' : ['qubit_1','qubit_2'], + 'rIQ_channels' : [['MW_gate_I','MW_gate_Q'],['MW_gate_I','MW_gate_Q']], + 'LO_freq' :[MW_source.frequency, 1e9] + # do not put the brackets for the MW source + # e.g. MW_source.frequency (this should be a qcodes parameter) + } + + pulse.add_IQ_virt_channels(awg_IQ_channels) + +At the moment markers are not added automatically, this is something that will be implemented in the next release of this library. + +Step 4 : defining channel delays +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In our case here, we have to compensate for the fact that some signals take a longer time to get to the sample than other ones. More info on how this is practically accomplished, can be found here ``TODO``. +Practically, example latencies could be the following: + + - 20 ns for the barrier and plunger gates to get from the AWG channels into the fridge. + - 70 ns to get to microwave channel from the IQ output into the fridge. 5 ns for the signal to reach the vector source, then the signal needs 45ns to be mixed with the carrier frequency, next 20 additional ns are needed to go down in the fridge. + - 5 ns marker delay + +Or translated into python code, + +.. code-block:: python + + pulse.add_channel_delay({ + 'B0': 20, + 'P1': 20, + 'B1': 20, + 'P2': 20, + 'B2': 20, + 'MW_gate_I': 70, + 'MW_gate_Q': 70, + 'MW_marker': 5 + }) + +Note, also negative delays are allowed. All units are in ``ns`` by default. \ No newline at end of file diff --git a/docs/tutorials/simple_pulse.rst b/docs/tutorials/simple_pulse.rst index 97ebb235..3ec80d27 100644 --- a/docs/tutorials/simple_pulse.rst +++ b/docs/tutorials/simple_pulse.rst @@ -1,2 +1,18 @@ Tutorial : Making simple pulses for DC control of qubits. -========================================================= \ No newline at end of file +========================================================= + +For most experiments, pulses usually consist out of simple ramps and platea's. +In the following there will be a few examples that show how to program these things. +We will consider two experiments, + + - a pulse that can be used for readout (elzerman style) + - a pulse to control a ST qubit + +Here you will learn how to make the pulse, but also how the channels are working together. + +Elzerman readout +^^^^^^^^^^^^^^^^ + + +Controlling a ST qubit +^^^^^^^^^^^^^^^^^^^^^^ \ No newline at end of file -- GitLab