From b6f91bcd459a1478c49df75c77ccbf033149a036 Mon Sep 17 00:00:00 2001 From: "Hood, Jonathan D" Date: Tue, 11 May 2021 11:11:00 -0400 Subject: [PATCH] routine --- Andor/{andorv1.0/andor => }/__init__.py | 0 .../andor/__pycache__/driver.cpython-37.pyc | Bin 2951 -> 0 bytes .../andor/__pycache__/driver.cpython-38.pyc | Bin 2959 -> 0 bytes .../build/lib/andor => andorv1}/__init__.py | 0 .../andor.egg-info/PKG-INFO | 0 .../andor.egg-info/SOURCES.txt | 0 .../andor.egg-info/dependency_links.txt | 0 .../andor.egg-info/entry_points.txt | 0 .../andor.egg-info/top_level.txt | 0 Andor/andorv1/andor/__init__.py | 0 .../andor/andor_driver.py} | 2 +- .../andor/aqctl_andor.py | 0 Andor/{andorv1.0 => andorv1}/andor/atmcd.py | 0 Andor/andorv1/build/lib/andor/__init__.py | 0 .../build/lib/andor/aqctl_andor.py | 2 +- .../build/lib/andor/atmcd.py | 0 .../build/lib/andor/driver.py | 0 .../dist/andor-0.0.0-py3.7.egg | Bin Andor/{andorv1.0 => andorv1}/doc/Makefile | 0 Andor/{andorv1.0 => andorv1}/doc/conf.py | 0 Andor/{andorv1.0 => andorv1}/doc/index.rst | 0 Andor/{andorv1.0 => andorv1}/setup.py | 0 Andor/andorv2/__init__.py | 0 Andor/andorv2/andor/SingleScan.py | 86 +++++++++ Andor/andorv2/andor/__init__.py | 0 Andor/andorv2/andor/andor_driver.py | 92 +++++++++ Andor/andorv2/andor/aqctl_andor.py | 64 +++++++ .../andor/atmcd.py} | Bin 428340 -> 417752 bytes Andor/andorv2/doc/Makefile | 19 ++ Andor/andorv2/doc/conf.py | 176 ++++++++++++++++++ Andor/andorv2/doc/index.rst | 24 +++ Andor/andorv2/setup.py | 12 ++ Andor/sdk's/sdk2/SingleScan.py | 8 +- andor_repo/andor.egg-info/PKG-INFO | 10 + andor_repo/andor.egg-info/SOURCES.txt | 11 ++ .../andor.egg-info/dependency_links.txt | 1 + andor_repo/andor.egg-info/entry_points.txt | 3 + andor_repo/andor.egg-info/top_level.txt | 1 + andor_repo/andor/SingleScan.py | 67 +++++++ andor_repo/andor/__init__.py | 0 andor_repo/andor/andor_driver.py | 131 +++++++++++++ andor_repo/andor/aqctl_andor.py | 64 +++++++ .../andor/atmcd.py | Bin 428954 -> 417752 bytes andor_repo/doc/Makefile | 19 ++ andor_repo/doc/conf.py | 176 ++++++++++++++++++ andor_repo/doc/index.rst | 24 +++ andor_repo/setup.py | 12 ++ 47 files changed, 1001 insertions(+), 3 deletions(-) rename Andor/{andorv1.0/andor => }/__init__.py (100%) delete mode 100644 Andor/andorv1.0/andor/__pycache__/driver.cpython-37.pyc delete mode 100644 Andor/andorv1.0/andor/__pycache__/driver.cpython-38.pyc rename Andor/{andorv1.0/build/lib/andor => andorv1}/__init__.py (100%) rename Andor/{andorv1.0 => andorv1}/andor.egg-info/PKG-INFO (100%) rename Andor/{andorv1.0 => andorv1}/andor.egg-info/SOURCES.txt (100%) rename Andor/{andorv1.0 => andorv1}/andor.egg-info/dependency_links.txt (100%) rename Andor/{andorv1.0 => andorv1}/andor.egg-info/entry_points.txt (100%) rename Andor/{andorv1.0 => andorv1}/andor.egg-info/top_level.txt (100%) create mode 100644 Andor/andorv1/andor/__init__.py rename Andor/{andorv1.0/andor/driver.py => andorv1/andor/andor_driver.py} (99%) rename Andor/{andorv1.0 => andorv1}/andor/aqctl_andor.py (100%) rename Andor/{andorv1.0 => andorv1}/andor/atmcd.py (100%) create mode 100644 Andor/andorv1/build/lib/andor/__init__.py rename Andor/{andorv1.0 => andorv1}/build/lib/andor/aqctl_andor.py (97%) rename Andor/{andorv1.0 => andorv1}/build/lib/andor/atmcd.py (100%) rename Andor/{andorv1.0 => andorv1}/build/lib/andor/driver.py (100%) rename Andor/{andorv1.0 => andorv1}/dist/andor-0.0.0-py3.7.egg (100%) rename Andor/{andorv1.0 => andorv1}/doc/Makefile (100%) rename Andor/{andorv1.0 => andorv1}/doc/conf.py (100%) rename Andor/{andorv1.0 => andorv1}/doc/index.rst (100%) rename Andor/{andorv1.0 => andorv1}/setup.py (100%) create mode 100644 Andor/andorv2/__init__.py create mode 100644 Andor/andorv2/andor/SingleScan.py create mode 100644 Andor/andorv2/andor/__init__.py create mode 100644 Andor/andorv2/andor/andor_driver.py create mode 100644 Andor/andorv2/andor/aqctl_andor.py rename Andor/{andorv1.0/andor/__pycache__/atmcd.cpython-38.pyc => andorv2/andor/atmcd.py} (77%) create mode 100644 Andor/andorv2/doc/Makefile create mode 100644 Andor/andorv2/doc/conf.py create mode 100644 Andor/andorv2/doc/index.rst create mode 100644 Andor/andorv2/setup.py create mode 100644 andor_repo/andor.egg-info/PKG-INFO create mode 100644 andor_repo/andor.egg-info/SOURCES.txt create mode 100644 andor_repo/andor.egg-info/dependency_links.txt create mode 100644 andor_repo/andor.egg-info/entry_points.txt create mode 100644 andor_repo/andor.egg-info/top_level.txt create mode 100644 andor_repo/andor/SingleScan.py create mode 100644 andor_repo/andor/__init__.py create mode 100644 andor_repo/andor/andor_driver.py create mode 100644 andor_repo/andor/aqctl_andor.py rename Andor/andorv1.0/andor/__pycache__/atmcd.cpython-37.pyc => andor_repo/andor/atmcd.py (77%) create mode 100644 andor_repo/doc/Makefile create mode 100644 andor_repo/doc/conf.py create mode 100644 andor_repo/doc/index.rst create mode 100644 andor_repo/setup.py diff --git a/Andor/andorv1.0/andor/__init__.py b/Andor/__init__.py similarity index 100% rename from Andor/andorv1.0/andor/__init__.py rename to Andor/__init__.py diff --git a/Andor/andorv1.0/andor/__pycache__/driver.cpython-37.pyc b/Andor/andorv1.0/andor/__pycache__/driver.cpython-37.pyc deleted file mode 100644 index a6708abec3cf0df6999e8759f12ff6d3526f9d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2951 zcmbUj+j84PbXON!zQ%RakQNwJC@^L^N&A{1(AH@}rc(oT3o{+h7*)GY)XGx2l0quv zCztz5Nco< z$t`HX73c^e*hLS~9wG`+Um~K;mB*N9L)6n>!#?U^j=!?SEdLak+=3SDKt~Z^qsI!t zM0trGt3)Llj2h8N1xB4zi2-AU)JPr1Drt}=j0S0uHjFj00-QQrw>;uA8v{l02^K=k zKD1yLx)8*iV~j#PM+q7$33{r$Qi*bkXBhU>1kV+*`&3KtGlgv>=#_ekF!Bu8)x=4H zgi3?ByYGdLRvg`i(JwFy@N&g%=hys`7(r}6Mnzkhc) z>?vFes5{{*aQg$X2I&3oz5dqdQ9xNRI`ntK(~bv zM^gIZn;SRM*@!Ubn6izd7u*<+g^c5|ChXdV4q*cuN)y+WI<&Yg&u-*sg+C0ytU;6h zsDPKi{^%7xMI&W~XG#d}PapsiWv=0L53CQKfsjf)Bk?t&Nq;Fs2kgpR&2S+|GPnWo zS^=++dIoO*yjj4jz*hyn>P!O;E!b-(Dp^UiIfy1X83cF{4WL@0omQkI9l*N)kZuXD zMlNO?R$=#2!J!TuG~l4mDzhr^ScBaU5}m9k6>>SL&W$Xdt__BvtC^>GHS-g1PC);hDsN0~ z7aDV8axYa_=B2c23d&XJy3m4a&>^jj+bZOel_qYkLxbGX)H=AUtl@53th+ewq*-Q> z28%p%ChxBUxjfIv8w@!{WOc4SXMN>sAxJ-FT)EWs~LLwhFIthck{jTRI*DTqBI2WE>r4NN}(y6JFEpnWJ+S<_A*m+B9hqWq7!UN zMiMV9CX<*7Gts1xz&vf^M?*I%M%`#J0Utn~&;_Au1G`BB Ar2qf` diff --git a/Andor/andorv1.0/andor/__pycache__/driver.cpython-38.pyc b/Andor/andorv1.0/andor/__pycache__/driver.cpython-38.pyc deleted file mode 100644 index e52fc96f37e6df6b4e224ed922a8f60f366be3b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2959 zcmbUj+iu%7l+?wRvDD?f9c#|Jp$4AHFI7 zWZ2w=5!`@@Ac9@=2pu9K5&0z|@=P)@Q3j~1zJYVp#VP*M=Bx5gg3VnR!9GkB!3|_e z1QY2cGG!tY1-=SVNd>+tsS*vo6;dNQe5<5R8t~OfleFMlBWu8|ovM~cd}d>yIR9}r zT-+Xv-~gr&#GPS`LOeqW8c7LyD!r14bb+TB&g2BoB!2o-N$@j??I!4ze1S0XG&oiG zO@g>;{kU`Fg^uMqf#V$;J!?Xl6>scB0o!qX+j4hkXzvJt;wwj%Fd9b8qa?o7 zvpmla4ciAYUPN!fDsqXzVNQ-8P{S64yK1VQGRF%+$8chkR0epeFX)=}{f9q~29JBa z`-8!2DOCdMj#C-9y+*7KdjI>Nw>x|sP!_U&vnB+NOZZ2R;@s*Ofm#?eUOc5T6gu!c3MfptlT5x2zM?K#?#Pc*=; z!4N*FfVaR0=oP*|LurbqQV3y?Kp-U2Ou^Y1cmTWu;gxwu;44HCK9h(F*p-=_<3h0H za1G$K0$w3{4zB~eQNXLfR|dZFQ~?f6IBO*`Sxb}|h$c8`1b7hzph}`#RD>jLz*`4M zr-WA{S8@&;aC)`ipaTa5IH=Rgv)-$-#_jltP2a#uoj_(;g-*+kdpkp|#mhUz4dq)%Nm@>i8DBpO*oMSjxzO**K$_qF6382gL;cLi70ZlP8V`>fABT=8Kacv{)!$ zC)6WAYyE5iIuoGd-#7j|{5yX6P5fzDiTmfLeh@MG$eEN()(H7_&$zvP`%VylQCt8O zN@j*TVA5bAnoe_SAVI^jA^#%R3V~2ud**mFbZld|N77VB_4W*4c(kAY-_`ZYV zc2;Q?rEsa%EY<%lAUUr!B8#EU@M?Af zwXOh+x4?k=4`Ch0TbbCaL_S>n&x$x4@OXcp@a@YO?-m^%0O+I;9jbf0nTdXx#D@#M zs8hdKPI%z6_le$F#d){zS3z)ZN%-9Et3;N>=PAfTQM9Osu$YI9Xcf{_PNYQMK)hu@ zo8r$2*z>Qzlc7yu(ahAMnW;p+4iAXDU8va;Vxc&s<@bI7d22&UzEshgV}}KyA*!FT zmsQ$I;J{;Iud9e)WNi>pSi$V9QtDO~SkSD8d#^L83=%W2Yo DQE2%6 diff --git a/Andor/andorv1.0/build/lib/andor/__init__.py b/Andor/andorv1/__init__.py similarity index 100% rename from Andor/andorv1.0/build/lib/andor/__init__.py rename to Andor/andorv1/__init__.py diff --git a/Andor/andorv1.0/andor.egg-info/PKG-INFO b/Andor/andorv1/andor.egg-info/PKG-INFO similarity index 100% rename from Andor/andorv1.0/andor.egg-info/PKG-INFO rename to Andor/andorv1/andor.egg-info/PKG-INFO diff --git a/Andor/andorv1.0/andor.egg-info/SOURCES.txt b/Andor/andorv1/andor.egg-info/SOURCES.txt similarity index 100% rename from Andor/andorv1.0/andor.egg-info/SOURCES.txt rename to Andor/andorv1/andor.egg-info/SOURCES.txt diff --git a/Andor/andorv1.0/andor.egg-info/dependency_links.txt b/Andor/andorv1/andor.egg-info/dependency_links.txt similarity index 100% rename from Andor/andorv1.0/andor.egg-info/dependency_links.txt rename to Andor/andorv1/andor.egg-info/dependency_links.txt diff --git a/Andor/andorv1.0/andor.egg-info/entry_points.txt b/Andor/andorv1/andor.egg-info/entry_points.txt similarity index 100% rename from Andor/andorv1.0/andor.egg-info/entry_points.txt rename to Andor/andorv1/andor.egg-info/entry_points.txt diff --git a/Andor/andorv1.0/andor.egg-info/top_level.txt b/Andor/andorv1/andor.egg-info/top_level.txt similarity index 100% rename from Andor/andorv1.0/andor.egg-info/top_level.txt rename to Andor/andorv1/andor.egg-info/top_level.txt diff --git a/Andor/andorv1/andor/__init__.py b/Andor/andorv1/andor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Andor/andorv1.0/andor/driver.py b/Andor/andorv1/andor/andor_driver.py similarity index 99% rename from Andor/andorv1.0/andor/driver.py rename to Andor/andorv1/andor/andor_driver.py index 8504017..5d89af0 100644 --- a/Andor/andorv1.0/andor/driver.py +++ b/Andor/andorv1/andor/andor_driver.py @@ -1,6 +1,6 @@ from atmcd import * -class andor(): +class andor: def __init__(self): print("Intialising Camera") self.cam = atmcd() #load the atmcd library diff --git a/Andor/andorv1.0/andor/aqctl_andor.py b/Andor/andorv1/andor/aqctl_andor.py similarity index 100% rename from Andor/andorv1.0/andor/aqctl_andor.py rename to Andor/andorv1/andor/aqctl_andor.py diff --git a/Andor/andorv1.0/andor/atmcd.py b/Andor/andorv1/andor/atmcd.py similarity index 100% rename from Andor/andorv1.0/andor/atmcd.py rename to Andor/andorv1/andor/atmcd.py diff --git a/Andor/andorv1/build/lib/andor/__init__.py b/Andor/andorv1/build/lib/andor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Andor/andorv1.0/build/lib/andor/aqctl_andor.py b/Andor/andorv1/build/lib/andor/aqctl_andor.py similarity index 97% rename from Andor/andorv1.0/build/lib/andor/aqctl_andor.py rename to Andor/andorv1/build/lib/andor/aqctl_andor.py index 4c3a96e..29d9c08 100644 --- a/Andor/andorv1.0/build/lib/andor/aqctl_andor.py +++ b/Andor/andorv1/build/lib/andor/aqctl_andor.py @@ -8,7 +8,7 @@ import os import asyncio -from andor.driver import andor +from andorv1.0.driver import andor from sipyco.pc_rpc import simple_server_loop from sipyco import common_args diff --git a/Andor/andorv1.0/build/lib/andor/atmcd.py b/Andor/andorv1/build/lib/andor/atmcd.py similarity index 100% rename from Andor/andorv1.0/build/lib/andor/atmcd.py rename to Andor/andorv1/build/lib/andor/atmcd.py diff --git a/Andor/andorv1.0/build/lib/andor/driver.py b/Andor/andorv1/build/lib/andor/driver.py similarity index 100% rename from Andor/andorv1.0/build/lib/andor/driver.py rename to Andor/andorv1/build/lib/andor/driver.py diff --git a/Andor/andorv1.0/dist/andor-0.0.0-py3.7.egg b/Andor/andorv1/dist/andor-0.0.0-py3.7.egg similarity index 100% rename from Andor/andorv1.0/dist/andor-0.0.0-py3.7.egg rename to Andor/andorv1/dist/andor-0.0.0-py3.7.egg diff --git a/Andor/andorv1.0/doc/Makefile b/Andor/andorv1/doc/Makefile similarity index 100% rename from Andor/andorv1.0/doc/Makefile rename to Andor/andorv1/doc/Makefile diff --git a/Andor/andorv1.0/doc/conf.py b/Andor/andorv1/doc/conf.py similarity index 100% rename from Andor/andorv1.0/doc/conf.py rename to Andor/andorv1/doc/conf.py diff --git a/Andor/andorv1.0/doc/index.rst b/Andor/andorv1/doc/index.rst similarity index 100% rename from Andor/andorv1.0/doc/index.rst rename to Andor/andorv1/doc/index.rst diff --git a/Andor/andorv1.0/setup.py b/Andor/andorv1/setup.py similarity index 100% rename from Andor/andorv1.0/setup.py rename to Andor/andorv1/setup.py diff --git a/Andor/andorv2/__init__.py b/Andor/andorv2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Andor/andorv2/andor/SingleScan.py b/Andor/andorv2/andor/SingleScan.py new file mode 100644 index 0000000..c6cc50f --- /dev/null +++ b/Andor/andorv2/andor/SingleScan.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +import sys, os + +sys.path.append(r'C:/Users/hoodl/Documents/GitHub/Instruments/Andor/andorv2/andor') + +from atmcd import * +import numpy as np +import matplotlib.pyplot as plt +import time + + +print("Single Scan Example") + +print("Intialising Camera") +sdkObject = atmcd() #load the atmcd library +(ret) = sdkObject.Initialize("/usr/local/etc/andor") #initialise camera # C:\Program Files\Andor SDK +print("Initialize returned",ret) + + + +if atmcd.DRV_SUCCESS==ret: + + (ret, iSerialNumber) = sdkObject.GetCameraSerialNumber() + # print("GetCameraSerialNumber returned:",ret,"Serial No:",iSerialNumber) + + #configure the acquisition + (ret) = sdkObject.CoolerON() + # print("Function CoolerON returned",ret) + + (ret) = sdkObject.SetTemperature(-40) + # print("Function CoolerON returned",ret) + + + (ret) = sdkObject.SetAcquisitionMode(1) + # print("Function SetAcquisitionMode returned",ret,"mode = Single Scan") + + (ret) = sdkObject.SetReadMode(4) + # print("Function SetReadMode returned",ret,"mode = Image") + + (ret) = sdkObject.SetShutter(0,1,50,50) # (0,1,50,50) opens shutter. (0,2,50,50) closes shutter. + + (ret) = sdkObject.SetExposureTime(1) + # print("Function SetExposureTime returned",ret,"time = 0.5s") + + (ret) = sdkObject.SetTriggerMode(0) + # print("Function SetTriggerMode returned",ret,"mode = Internal") + + (ret) = sdkObject.SetVSSpeed(3) + # print(sdkObject.GetAcquiredData()VSSpeed(0,0,0)) + + (ret, xpixels, ypixels) = sdkObject.GetDetector() + # print("Function GetDetector returned",ret,"xpixels =",xpixels,"ypixels =",ypixels) + + (ret) = sdkObject.SetImage(1, 1, 1, xpixels, 1, ypixels) + # print("Function SetImage returned",ret,"hbin = 1 vbin = 1 hstart = 1 hend =",xpixels,"vstart = 1 vend =",ypixels) + + (ret, fminExposure, fAccumulate, fKinetic) = sdkObject.GetAcquisitionTimings() + # print("Function GetAcquisitionTimings returned",ret,"exposure =",fminExposure,"accumulate =",fAccumulate,"kinetic =",fKinetic) + + (ret) = sdkObject.PrepareAcquisition() + # print("Function PrepareAcquisition returned",ret) + + #Perform Acquisition + (ret) = sdkObject.StartAcquisition() + # print("Function StartAcquisition returned",ret) + + (ret) = sdkObject.WaitForAcquisition() + # print("Function WaitForAcquisition returned",ret) + + imageSize = xpixels*ypixels + (ret, fullFrameBuffer) = sdkObject.GetMostRecentImage(imageSize) + # print("Function GetMostRecentImage returned",ret,"first pixel =",fullFrameBuffer[0],"size =",imageSize) + + #David's addition + image = np.reshape(fullFrameBuffer, (512,512)) #Converts c_long 262k array to 512x512 image numpy array + print(np.sum(image),(np.max(image))) + plt.imshow(image) + + #Clean up + # (ret) = sdkObject.SetShutter(0,2,50,50) + (ret) = sdkObject.ShutDown() + # print("Shutdown returned",ret) + +# else: + # print("Cannot continue, could not initialise camera") + diff --git a/Andor/andorv2/andor/__init__.py b/Andor/andorv2/andor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Andor/andorv2/andor/andor_driver.py b/Andor/andorv2/andor/andor_driver.py new file mode 100644 index 0000000..6128f81 --- /dev/null +++ b/Andor/andorv2/andor/andor_driver.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +from atmcd import * +import numpy as np +import matplotlib.pyplot as plt + + + +class ANDOR: + """Driver for ANDOR camera """ + def __init__(self): + self.cam = atmcd() #load the atmcd library + + + (ret) = self.cam.Initialize("/usr/local/etc/andor") #initialise camera # C:\Program Files\Andor SDK + (ret, iSerialNumber) = self.cam.GetCameraSerialNumber() + (ret) = self.cam.CoolerON() + + + (ret) = self.cam.SetTemperature(-40) #David added this + (ret) = self.cam.SetVSSpeed(3.3) #David added this + (ret) = self.cam.SetVSAmplitude(Normal) #David added this + (ret) = self.cam.SetPreAmpGain(3) #David added this + (ret) = self.cam.SetOutputAmplifier(0) # 0 is EMCCD. David added this + (ret) = self.cam.SetEMCCDGain(2) # Max is 300? David added this + #The only setting I have missed is the readout rate which I could not find. might be SetHSSpeed and SetHorizontalSpeed + + (ret) = self.cam.SetAcquisitionMode(1) + (ret) = self.cam.SetReadMode(4) + (ret) = self.cam.SetTriggerMode(0) # 0 is internal, 1 is external, 6 is external start? + (ret, self.xpixels, self.ypixels) = self.cam.GetDetector() + self.imageSize = self.xpixels*self.ypixels + (ret) = self.cam.SetImage(1, 1, 1, self.xpixels, 1, self.ypixels) + (ret) = self.cam.SetExposureTime(0.01) # Set exposure time here! + (ret, self.fminExposure, self.fAccumulate, self.fKinetic) = self.cam.GetAcquisitionTimings() + (ret) = self.cam.PrepareAcquisition() + (ret) = self.cam.StartAcquisition() + + if atmcd.DRV_SUCCESS==ret: + print("_init_() was successful...") + else: + print("_init_() failed...Try restarting Artiq and/or powercycling camera") + + + #Settings we still need: temperature(-40), shift speed (3.3), Vertical Clock Voltage Amplitude (Normal/+0), Readout Rate (17MHz at 16-bit) + # ,Pre-Amp Gain (Gain 3), Output Amplifier (Electron Multiplying), Electron Multiplier (EM) Gain (Enabled->2) + + + def await_trigger(self): + try: + (ret) = self.cam.WaitForAcquisition() + + print("Awaiting trigger...") + + except: + try: + (ret) = self.cam.ShutDown() + except: + pass + print("Error in await_trigger(), try restarting artiq...") + + + + def convert_image(self): + + try: + (ret, fullFrameBuffer) = self.cam.GetMostRecentImage(self.imageSize) # GetImages(somethinghere) might be a better command if we want to do background subtraction + image = np.reshape(fullFrameBuffer, (512,512)) #Converts c_long 262k array to 512x512 image numpy array + # plt.imshow(image) + + + # try: + ##Acquire images + # images=[] + # for i in range(num_of_im): + # 1. Get image from buffer (c_long + # 2. Convert c_long to numpy array + # 3. Wipe image from buffer + + # 1. end acquisition + # return images + except: + try: + (ret) = self.cam.ShutDown() + except: + pass + print("Error in convert_image(), try restarting artiq...") + + + + def reset(self): + (ret) = self.cam.ShutDown() + print("Shutdown successful...") diff --git a/Andor/andorv2/andor/aqctl_andor.py b/Andor/andorv2/andor/aqctl_andor.py new file mode 100644 index 0000000..23b4b42 --- /dev/null +++ b/Andor/andorv2/andor/aqctl_andor.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 + +# Written by Joe Britton, 2015 + +import argparse +import logging +import sys +import os +import asyncio + +sys.path.append(r'C:\Users\hoodl\Documents\GitHub\Instruments\andor_repo') + +from andor.andor_driver import ANDOR +from sipyco.pc_rpc import simple_server_loop +from sipyco import common_args + + +logger = logging.getLogger(__name__) + + + + +def get_argparser(): + parser = argparse.ArgumentParser( + description="ARTIQ controller for the ANDOR camera") + common_args.simple_network_args(parser, 3210) + parser.add_argument( + "-d", "--device", default=None, + help="serial port.") + parser.add_argument( + "--softtrig", default=False, action="store_true", + help="Sets trigger to software. Default is hardware") + parser.add_argument( + "--num", default=1, + help="Sets number of images. Default is hardware") + parser.add_argument( + "--simulation", action="store_true", + help="Put the driver in simulation mode, even if --device is used.") + common_args.verbosity_args(parser) + return parser + + +def main(): + args = get_argparser().parse_args() + common_args.init_logger_from_args(args) + if os.name == "nt": + asyncio.set_event_loop(asyncio.ProactorEventLoop()) + # if args.device is None: + # print("Starting in Simulation mode...") + # dev = ANDOR(args.device if not args.simulation else None) + + dev = ANDOR() + #asyncio.get_event_loop().run_until_complete(dev.setup()) + try: + print("ANDOR server startup on port",args.port,"successful...") + simple_server_loop( + {"ANDOR": dev}, common_args.bind_address_from_args(args), args.port) + truthcounter=1 + finally: + print("Closing server...") + #dev.close() + +if __name__ == "__main__": + main() diff --git a/Andor/andorv1.0/andor/__pycache__/atmcd.cpython-38.pyc b/Andor/andorv2/andor/atmcd.py similarity index 77% rename from Andor/andorv1.0/andor/__pycache__/atmcd.cpython-38.pyc rename to Andor/andorv2/andor/atmcd.py index bd4658db4ae07a4849b1c33a89042e431c07f32b..03a328128b0214dc874f763ff7b021ccff657a61 100644 GIT binary patch delta 80863 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 KdgMp8R~^s(^X4 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 LL;vFB8yfz9zSYL_ delta 93397 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 diff --git a/Andor/andorv2/doc/Makefile b/Andor/andorv2/doc/Makefile new file mode 100644 index 0000000..298ea9e --- /dev/null +++ b/Andor/andorv2/doc/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/Andor/andorv2/doc/conf.py b/Andor/andorv2/doc/conf.py new file mode 100644 index 0000000..f7c5161 --- /dev/null +++ b/Andor/andorv2/doc/conf.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + + +import os +import sys +from unittest.mock import Mock + +sys.path.insert(0, os.path.abspath('..')) + +mock_modules = ["asyncserial"] + +for module in mock_modules: + sys.modules[module] = Mock() + +# -- Project information ----------------------------------------------------- + +project = 'Andor' +copyright = '2019, M-Labs' +author = 'M-Labs' + +# The short X.Y version +version = '1.0' +# The full version, including alpha/beta/rc tags +release = '1.0' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinxarg.ext' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Novatech409Bdoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Novatech409B.tex', 'Novatech409B Documentation', + 'M-Labs', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'novatech409', 'Novatech409B Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Novatech409B', 'Novatech409B Documentation', + author, 'Novatech409B', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] diff --git a/Andor/andorv2/doc/index.rst b/Andor/andorv2/doc/index.rst new file mode 100644 index 0000000..8764c75 --- /dev/null +++ b/Andor/andorv2/doc/index.rst @@ -0,0 +1,24 @@ +Welcome to Novatech409B's documentation! +======================================== + +API +--- + +.. automodule:: novatech409b.driver + :members: + + +ARTIQ controller +---------------- + +.. argparse:: + :ref: novatech409b.aqctl_novatech409b.get_argparser + :prog: aqctl_novatech409b + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/Andor/andorv2/setup.py b/Andor/andorv2/setup.py new file mode 100644 index 0000000..84af854 --- /dev/null +++ b/Andor/andorv2/setup.py @@ -0,0 +1,12 @@ +from setuptools import setup, find_packages + +setup( + name="andor", + install_requires=[],#"sipyco", "asyncserial"], + packages=find_packages(), + entry_points={ + "console_scripts": [ + "aqctl_andor = andor.aqctl_andor:main", + ], + }, +) diff --git a/Andor/sdk's/sdk2/SingleScan.py b/Andor/sdk's/sdk2/SingleScan.py index 0039ede..5026b52 100644 --- a/Andor/sdk's/sdk2/SingleScan.py +++ b/Andor/sdk's/sdk2/SingleScan.py @@ -1,5 +1,7 @@ #!/usr/bin/env python from atmcd import * +import numpy as np +import matplotlib.pyplot as plt print("Single Scan Example") @@ -11,7 +13,7 @@ if atmcd.DRV_SUCCESS==ret: (ret, iSerialNumber) = sdkObject.GetCameraSerialNumber() - print("GetCameraSerialNumber returned:",ret,"Serial No:",iSerialNumber) + print("GetCameraSerialNumb er returned:",ret,"Serial No:",iSerialNumber) #configure the acquisition (ret) = sdkObject.CoolerON() @@ -56,6 +58,10 @@ (ret) = sdkObject.ShutDown() print("Shutdown returned",ret) + #David's addition + image = np.reshape(fullFrameBuffer, (512,512)) #Converts c_long 262k array to 512x512 image numpy array + plt.imshow(image) + else: print("Cannot continue, could not initialise camera") diff --git a/andor_repo/andor.egg-info/PKG-INFO b/andor_repo/andor.egg-info/PKG-INFO new file mode 100644 index 0000000..39a60ec --- /dev/null +++ b/andor_repo/andor.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: andor +Version: 0.0.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/andor_repo/andor.egg-info/SOURCES.txt b/andor_repo/andor.egg-info/SOURCES.txt new file mode 100644 index 0000000..4c0acb1 --- /dev/null +++ b/andor_repo/andor.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +setup.py +andor/SingleScan.py +andor/__init__.py +andor/andor_driver.py +andor/aqctl_andor.py +andor/atmcd.py +andor.egg-info/PKG-INFO +andor.egg-info/SOURCES.txt +andor.egg-info/dependency_links.txt +andor.egg-info/entry_points.txt +andor.egg-info/top_level.txt \ No newline at end of file diff --git a/andor_repo/andor.egg-info/dependency_links.txt b/andor_repo/andor.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/andor_repo/andor.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/andor_repo/andor.egg-info/entry_points.txt b/andor_repo/andor.egg-info/entry_points.txt new file mode 100644 index 0000000..2e14652 --- /dev/null +++ b/andor_repo/andor.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +aqctl_andor = andor.aqctl_andor:main + diff --git a/andor_repo/andor.egg-info/top_level.txt b/andor_repo/andor.egg-info/top_level.txt new file mode 100644 index 0000000..fe88de4 --- /dev/null +++ b/andor_repo/andor.egg-info/top_level.txt @@ -0,0 +1 @@ +andor diff --git a/andor_repo/andor/SingleScan.py b/andor_repo/andor/SingleScan.py new file mode 100644 index 0000000..c0ceaf4 --- /dev/null +++ b/andor_repo/andor/SingleScan.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +from atmcd import * +import numpy as np +import matplotlib.pyplot as plt + +print("Single Scan Example") + +print("Intialising Camera") +sdkObject = atmcd() #load the atmcd library +(ret) = sdkObject.Initialize("/usr/local/etc/andor") #initialise camera # C:\Program Files\Andor SDK +print("Initialize returned",ret) + +if atmcd.DRV_SUCCESS==ret: + + (ret, iSerialNumber) = sdkObject.GetCameraSerialNumber() + print("GetCameraSerialNumber returned:",ret,"Serial No:",iSerialNumber) + + #configure the acquisition + (ret) = sdkObject.CoolerON() + print("Function CoolerON returned",ret) + + (ret) = sdkObject.SetAcquisitionMode(1) + print("Function SetAcquisitionMode returned",ret,"mode = Single Scan") + + (ret) = sdkObject.SetReadMode(4) + print("Function SetReadMode returned",ret,"mode = Image") + + (ret) = sdkObject.SetTriggerMode(0) + print("Function SetTriggerMode returned",ret,"mode = Internal") + + (ret, xpixels, ypixels) = sdkObject.GetDetector() + print("Function GetDetector returned",ret,"xpixels =",xpixels,"ypixels =",ypixels) + + (ret) = sdkObject.SetImage(1, 1, 1, xpixels, 1, ypixels) + print("Function SetImage returned",ret,"hbin = 1 vbin = 1 hstart = 1 hend =",xpixels,"vstart = 1 vend =",ypixels) + + (ret) = sdkObject.SetExposureTime(0.01) + print("Function SetExposureTime returned",ret,"time = 0.01s") + + (ret, fminExposure, fAccumulate, fKinetic) = sdkObject.GetAcquisitionTimings() + print("Function GetAcquisitionTimings returned",ret,"exposure =",fminExposure,"accumulate =",fAccumulate,"kinetic =",fKinetic) + + (ret) = sdkObject.PrepareAcquisition() + print("Function PrepareAcquisition returned",ret) + + #Perform Acquisition + (ret) = sdkObject.StartAcquisition() + print("Function StartAcquisition returned",ret) + + (ret) = sdkObject.WaitForAcquisition() + print("Function WaitForAcquisition returned",ret) + + imageSize = xpixels*ypixels + (ret, fullFrameBuffer) = sdkObject.GetMostRecentImage(imageSize) + print("Function GetMostRecentImage returned",ret,"first pixel =",fullFrameBuffer[0],"size =",imageSize) + + #Clean up + (ret) = sdkObject.ShutDown() + print("Shutdown returned",ret) + + #David's addition + image = np.reshape(fullFrameBuffer, (512,512)) #Converts c_long 262k array to 512x512 image numpy array + plt.imshow(image) + +else: + print("Cannot continue, could not initialise camera") + diff --git a/andor_repo/andor/__init__.py b/andor_repo/andor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/andor_repo/andor/andor_driver.py b/andor_repo/andor/andor_driver.py new file mode 100644 index 0000000..f78ea5e --- /dev/null +++ b/andor_repo/andor/andor_driver.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python +from andor.atmcd import * +import numpy as np +import matplotlib.pyplot as plt +import time + + +class ANDOR: + """Driver for ANDOR camera """ + def __init__(self): + self.cam = atmcd() #load the atmcd library + # self.reset() + + + (ret) = self.cam.Initialize("/usr/local/etc/andor") #initialise camera # C:\Program Files\Andor SDK + (ret, iSerialNumber) = self.cam.GetCameraSerialNumber() + (ret) = self.cam.CoolerON() + (ret) = self.cam.SetCoolerMode(1) + (ret) = self.cam.SetTemperature(-40) #David added this + (ret) = self.cam.SetHSSpeed(0,0) #David added this + (ret) = self.cam.SetVSSpeed(3)#.3) #David added this + (ret) = self.cam.SetVSAmplitude(0) #David added this + (ret) = self.cam.SetPreAmpGain(3) #David added this + (ret) = self.cam.SetOutputAmplifier(0) # 0 is EMCCD. David added this + (ret) = self.cam.SetEMCCDGain(2) # Max is 300? David added this + #The only setting I have missed is the readout rate which I could not find. might be SetHSSpeed and SetHorizontalSpeed + + (ret) = self.cam.SetShutter(0,1,50,50) # (0,1,50,50) opens shutter. (0,2,50,50) closes shutter. + (ret) = self.cam.SetAcquisitionMode(1) + (ret) = self.cam.SetReadMode(4) + + (ret) = self.cam.SetTriggerMode(1) # 0 is internal, 1 is external, 6 is external start? + (ret, self.xpixels, self.ypixels) = self.cam.GetDetector() + self.imageSize = self.xpixels*self.ypixels + (ret) = self.cam.SetImage(1, 1, 1, self.xpixels, 1, self.ypixels) + (ret) = self.cam.SetExposureTime(.1) # Set exposure time here! + (ret, self.fminExposure, self.fAccumulate, self.fKinetic) = self.cam.GetAcquisitionTimings() + # (ret) = self.cam.PrepareAcquisition() + (ret) = self.cam.StartAcquisition() + + if atmcd.DRV_SUCCESS==ret: + print("Andor Initializiation was successful...") + else: + print("Andor Initializiation failed...Try restarting Artiq and/or powercycling camera") + + + #Settings we still need: temperature(-40), shift speed (3.3), Vertical Clock Voltage Amplitude (Normal/+0), Readout Rate (17MHz at 16-bit) + # ,Pre-Amp Gain (Gain 3), Output Amplifier (Electron Multiplying), Electron Multiplier (EM) Gain (Enabled->2) + + + def await_trigger(self): + # try: + + + + print("Awaiting trigger...") + (ret) = self.cam.WaitForAcquisition()#TimeOut(1000) + # self.cam.WaitForAcquisition(); + print("Taking image...") + # self.cam.CancelWait() + + + + + # except: + # try: + # (ret) = self.cam.ShutDown() + # except: + # pass + # print("Error in await_trigger(), try restarting artiq...") + + + def reset_image(self): + self.cam.CancelWait() + self.cam.AbortAcquisition() + + def start_acq(self): + self.cam.StartAcquisition() + + + def get_last_image(self): + + # try: + (ret, fullFrameBuffer) = self.cam.GetMostRecentImage(self.imageSize) # GetImages(somethinghere) might be a better command if we want to do background subtraction + image = np.reshape(fullFrameBuffer, (512,512)) #Converts c_long 262k array to 512x512 image numpy array + + return image + + def plot_image(self,image=None): + if type(image) == type(None): + image = self.last_image() + + plt.imshow(image) + plt.show(block=True) + # plt.pause(3) + # plt.close() + + + # except: + # try: + # (ret) = self.cam.ShutDown() + # except: + # pass + # print("Error in convert_image(), try restarting artiq...") + + + # try: + ##Acquire images + # images=[] + # for i in range(num_of_im): + # 1. Get image from buffer (c_long + # 2. Convert c_long to numpy array + # 3. Wipe image from buffer + + # 1. end acquisition + # return images + + + def take_pic(self): + print("Before T") + self.await_trigger() + print("After T") + self.plot_image() + + # self.CancelWait() + # (0,1,50,50) opens shutter. (0,2,50,50) closes shutter. + + def reset(self): + (ret) = self.cam.SetShutter(0,2,50,50) + (ret) = self.cam.ShutDown() + print("Camera Reset Successful...") diff --git a/andor_repo/andor/aqctl_andor.py b/andor_repo/andor/aqctl_andor.py new file mode 100644 index 0000000..68a57e9 --- /dev/null +++ b/andor_repo/andor/aqctl_andor.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 + +# Written by Joe Britton, 2015 + +import argparse +import logging +import sys +import os +import asyncio + +sys.path.append(r'C:\Users\hoodl\Documents\GitHub\Instruments\andor_repo') + +from andor.andor_driver import ANDOR +from sipyco.pc_rpc import simple_server_loop +from sipyco import common_args + + +logger = logging.getLogger(__name__) + + + + +def get_argparser(): + parser = argparse.ArgumentParser( + description="ARTIQ controller for the ANDOR camera") + common_args.simple_network_args(parser, 3220) + parser.add_argument( + "-d", "--device", default=None, + help="serial port.") + parser.add_argument( + "--softtrig", default=False, action="store_true", + help="Sets trigger to software. Default is hardware") + parser.add_argument( + "--num", default=1, + help="Sets number of images. Default is hardware") + parser.add_argument( + "--simulation", action="store_true", + help="Put the driver in simulation mode, even if --device is used.") + common_args.verbosity_args(parser) + return parser + + +def main(): + args = get_argparser().parse_args() + common_args.init_logger_from_args(args) + if os.name == "nt": + asyncio.set_event_loop(asyncio.ProactorEventLoop()) + # if args.device is None: + # print("Starting in Simulation mode...") + # dev = ANDOR(args.device if not args.simulation else None) + + dev = ANDOR() + #asyncio.get_event_loop().run_until_complete(dev.setup()) + try: + print("ANDOR server startup on port",args.port,"successful...") + simple_server_loop( + {"ANDOR": dev}, common_args.bind_address_from_args(args), args.port) + truthcounter=1 + finally: + print("Closing server...") + #dev.close() + +if __name__ == "__main__": + main() diff --git a/Andor/andorv1.0/andor/__pycache__/atmcd.cpython-37.pyc b/andor_repo/andor/atmcd.py similarity index 77% rename from Andor/andorv1.0/andor/__pycache__/atmcd.cpython-37.pyc rename to andor_repo/andor/atmcd.py index 7b42a641d2fe531ea8abd602b57793375d15c074..03a328128b0214dc874f763ff7b021ccff657a61 100644 GIT binary patch delta 80676 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 diff --git a/andor_repo/doc/Makefile b/andor_repo/doc/Makefile new file mode 100644 index 0000000..298ea9e --- /dev/null +++ b/andor_repo/doc/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/andor_repo/doc/conf.py b/andor_repo/doc/conf.py new file mode 100644 index 0000000..f7c5161 --- /dev/null +++ b/andor_repo/doc/conf.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + + +import os +import sys +from unittest.mock import Mock + +sys.path.insert(0, os.path.abspath('..')) + +mock_modules = ["asyncserial"] + +for module in mock_modules: + sys.modules[module] = Mock() + +# -- Project information ----------------------------------------------------- + +project = 'Andor' +copyright = '2019, M-Labs' +author = 'M-Labs' + +# The short X.Y version +version = '1.0' +# The full version, including alpha/beta/rc tags +release = '1.0' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinxarg.ext' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Novatech409Bdoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Novatech409B.tex', 'Novatech409B Documentation', + 'M-Labs', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'novatech409', 'Novatech409B Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Novatech409B', 'Novatech409B Documentation', + author, 'Novatech409B', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] diff --git a/andor_repo/doc/index.rst b/andor_repo/doc/index.rst new file mode 100644 index 0000000..8764c75 --- /dev/null +++ b/andor_repo/doc/index.rst @@ -0,0 +1,24 @@ +Welcome to Novatech409B's documentation! +======================================== + +API +--- + +.. automodule:: novatech409b.driver + :members: + + +ARTIQ controller +---------------- + +.. argparse:: + :ref: novatech409b.aqctl_novatech409b.get_argparser + :prog: aqctl_novatech409b + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/andor_repo/setup.py b/andor_repo/setup.py new file mode 100644 index 0000000..84af854 --- /dev/null +++ b/andor_repo/setup.py @@ -0,0 +1,12 @@ +from setuptools import setup, find_packages + +setup( + name="andor", + install_requires=[],#"sipyco", "asyncserial"], + packages=find_packages(), + entry_points={ + "console_scripts": [ + "aqctl_andor = andor.aqctl_andor:main", + ], + }, +)