Source code for lantz.drivers.andor.neo

# -*- coding: utf-8 -*-
"""
    lantz.drivers.andor.neo
    ~~~~~~~~~~~~~~~~~~~~~~~

    Implements a high level driver for the Andor Neo CMOS Camera


    Sources::

        - Andor Neo Manual

    :copyright: 2015 by Lantz Authors, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
"""


import ctypes as ct

import numpy as np

from lantz import Feat, Action, Q_
from lantz.foreign import RetStr, RetTuple

from .andor import Andor

[docs]class Neo(Andor): """Neo Andor CMOS Camera """
[docs] def initialize(self): super().initialize() self.flush() self.fan_speed = 1 self.width ,self.height = self.sensor_size self.length = self.width * self.height self.clock_rate = 100 self.pixel_encoding = 32 self.imagesizebytes = self.getint("ImageSizeBytes") self.userbuffer = ct.create_string_buffer(' ' * self.imagesizebytes)
@Feat(None, values={32: 'Mono32', 64: 'Mono64'}) def pixel_encoding(self, value): """Pixel encoding. """ self.setenumstring("PixelEncoding", value) @Feat() def sensor_size(self): width = self.getint("SensorWidth") height = self.getint("SensorHeight") return width, height @Feat(None, values={100: '100 MHz', 200: '200 MHz', 280: '280 MHz'}) def clock_rate(self, value): """Pixel clock rate """ self.setenumstring("PixelReadoutRate", value) @Feat(None) def fan_peed(self, value = 1): """Fan speed. """ self.setenumerated("FanSpeed", value) @Feat() def sensor_temp(self): """Sensor temperature. """ return self.getfloat("SensorTemperature") @Feat() def exposure_time(self): """Get exposure time. """ return self.getfloat("ExposureTime") @exposure_time.setter def exposure_time(self, exposure): self.setfloat("ExposureTime", exposure) @Feat(None) def roi(self, width_height_top_left): """Set region of interest """ width, height, top, left = width_height_top_left self.setint("AOIWidth", width) self.setint("AOILeft", left) self.setint("AOIHeight", height) self.setint("AOITop", top) @Action() def take_image(self): """Image acquisition. """ self.queuebuffer(self.userbuffer, self.imagesizebytes) self.command("AcquisitionStart") self.waitbuffer(*RetStr(1)) self.command("AcquisitionStop") self.flush() image = np.fromstring(self.userbuffer, dtype=np.uint32, count=self.length) image.shape = (self.height, self.width) return image @Action() def take_image(self, numbuff, numframes): """Image acquisition with circular buffer. """ imagesizebytes = self.getint("ImageSizeBytes") userbuffer = [] for i in range(numbuff): userbuffer.append(ct.create_string_buffer(' ' * imagesizebytes)) self.queuebuffer(userbuffer, imagesizebytes) self.command("AcquisitionStart") for i in range(numbuff): self.waitbuffer(*RetStr(1)) self.queuebuffer(userbuffer[i], imagesizebytes) self.command("AcquisitionStop") self.flush() image = np.fromstring(userbuffer[0], dtype=np.uint32, count=self.length) image.shape = (self.height, self.width) return image