Object-oriented interface for Andor EMCCD cameras
Object-oriented, high-level interface for Andor cameras (SDK2), written in Cython.
This is not a stand-alone driver. Andor’s proprietary drivers must be installed. The setup script expects to find libandor.so in /usr/local/lib/ (the driver’s default installation directory).
Andor provides a low-level, ctypes wrapper on their SDK, called atcmd. If available, it will be imported as Andor._sdk.
This documentation should be read along Andor’s Software Development Kit manual.
To build the extension:
$ python2.7 setup_extension.py build_ext --inplace
This module is not thread-safe. If AcqMode.wait is blocking a background thread, and another function call is made from the main thread, the main thread will block too.
The camera is controlled via the top-level class Andor:
>>> from andor2 import Andor >>> cam = Andor()
The Andor instance is just a container for other objects that control various aspect of the camera:
- Info : camera information and available features
- Temperature : cooler control
- Shutter : shutter control
- EM: electron-multiplying gain control
- Detector: CCD control, including:
- VSS: vertical shift speed
- HSS: horizontal shift speed
- ADC: analog-to-digital converter
- OutputAmp: the output amplifier
- PreAmp: pre-amplifier control
- ReadMode: select the CCD read-out mode (full frame, vertical binning, tracks, etc.)
- Acquire <AcqMode>: control the acquisition mode (single shot, video, accumulate, kinetic)
>>> from andor2 import Andor >>> cam = Andor() >>> cam.Temperature.setpoint = -74 # start cooling >>> cam.Temperature.cooler = True >>> cam.Detector.OutputAmp(1) # use conventional CCD amplifier instead of electron multiplying >>> cam.PreAmp(2) # set pre-amplifier gain to 4.9 >>> cam.exposure = 10 # set exposure time to 10 ms >>> cam.ReadMode.SingleTrack(590,5) # set readout mode: single track, 5 pixels wide, centered at 590 pixels>>> cam.Acquire.Video() # set acquisition mode to video (continuous) >>> data = cam.Acquire.Newest(10) # collect latest 10 images as numpy array >>> cam.Acquire.stop()>>> cam.Acquire.Kinetic(10, 0.1, 5, 0.01) # set up kinetic sequence of 10 images every 100ms # with each image being an accumulation of 5 images # taken 10ms apart >>> cam.Acquire.start() # start acquiring >>> cam.Acquire.wait() # block until acquisition terminates >>> data = cam.Acquire.GetAcquiredData() # collect all data