Scientific cameras

Scientific camera and image acquisition drivers for 15 brands including Andor, Basler, Hamamatsu and FLIR.

Overview

Quatm provides a unified ICamera interface wrapper for 15 major scientific camera brands worldwide, covering EMCCD, sCMOS, high-speed CMOS and industrial cameras.


Andor series: iXon EMCCD / Zyla sCMOS / Shamrock spectrograph

Overview

Quatm provides two Andor camera drivers that deliver high-performance imaging control through the native SDKs:

Driver classSDKApplicable modelsInterface
AndorSDK2Cameraatmcd32d.dll (SDK2)iXon EMCCD, Luca, ClaraPCIe / USB
AndorSDK3Cameraatcore.dll (SDK3)Zyla, Neo, Marana (sCMOS)USB3 / CameraLink
ShamrockSpectrographShamrockCIF.dllSR-303i, SR-500i and other spectrographsUSB

All classes inherit from the io.camera interface and support ROI, binning, exposure control and frame buffer management.

Andor SDK2 (EMCCD) AndorSDK2Camera

iXon EMCCD Andor SDK2 series
CommunicationDLL (atm32cd32)
Readout modeEM/conventional
ADC frequency1/5/10 MHz
Pixel depth16-bit
CoolingTEC (≤ -100°C)
Suited to extremely low light levels (single atom/ion fluorescence), achieving single-photon sensitivity through electron multiplication (EM Gain).
Driver module: AndorSDK2Camera

Initialization

from quatm.drivers.andor.AndorSDK2 import AndorSDK2Camera

# connect the first camera
cam = AndorSDK2Camera(cam_id=0)

# acquisition parameters
cam.setup_acquisition(
    exposure=0.1,       # exposure time (s)
    em_gain=200,        # EM gain (0-1000)
    readout_rate="5MHz",# readout rate
    pre_amp_gain=2,     # pre-amplifier gain
    hsspeed=0,          # horizontal transfer rate
    temperature=-70,    # target temperature (°C)
)

# acquire a single frame
cam.start_acquisition(nframes=1)
image = cam.read_multiple_images(nframes=1)

Key parameters

ParameterDescriptionTypical range
exposureExposure time per frame0.001 – 3600 s
em_gainElectron multiplication gain0 – 1000 (linear or real gain mode)
readout_rateADC readout frequency1MHz / 5MHz / 10MHz
temperatureTarget sensor temperature-60 to -100°C (depends on cooler)
pre_amp_gainPreamplifier gain1× – 4×

Andor SDK3 (sCMOS) AndorSDK3Camera

Zyla / Neo sCMOS Andor SDK3 series
CommunicationDLL (atcore)
SensorsCMOS
InterfaceUSB3 / CameraLink
Pixel depth12/16-bit
Frame rateup to 100 fps (full resolution)
Suited to fast sequence imaging and applications requiring a large field of view. Exposure, ROI and triggering are configured through the GenAPI property model.
Driver module: AndorSDK3Camera

Initialization

from quatm.drivers.andor.AndorSDK3 import AndorSDK3Camera

cam = AndorSDK3Camera(cam_id=0)
cam.setup_acquisition(
    exposure=0.05,
    pixel_format="Mono16",
    trigger_mode="Internal",
)

Andor Shamrock spectrograph ShamrockSpectrograph

Controls grating selection, centre wavelength and slit width:

from quatm.drivers.andor.Shamrock import ShamrockSpectrograph

spec = ShamrockSpectrograph(idx=0)
spec.set_wavelength(780.24)      # centre wavelength (nm)
spec.set_grating(2)              # select grating
spec.set_slit_width(50, port=1)  # entrance slit (µm)

Device configuration

"emccd": {
    "type": "local",
    "module": "drivers.andor.AndorSDK2",
    "class": "AndorSDK2Camera",
    "arguments": {"cam_id": 0},
}

FLIR / Teledyne / Blackfly S / Grasshopper3

Overview

Quatm wraps the Spinnaker SDK in the TeledyneSpinnakerCamera class, supporting all GenICam/GenAPI-compatible FLIR/Teledyne USB3/GigE cameras.

Blackfly S / Grasshopper3 FLIR Spinnaker series
CommunicationSpinnaker SDK
InterfaceUSB3 / GigE
Pixel formatsMono8/16, Bayer
Triggerhardware/software
Frame ratedepends on model
For general laboratory imaging: MOT monitoring, alignment beam imaging and equipment status monitoring.
Driver module: TeledyneSpinnakerCamera

Initialization

from quatm.drivers.teledyne.spinnaker import TeledyneSpinnakerCamera

# list all available cameras
cam_list = TeledyneSpinnakerCamera.list_cameras()

# connect a camera by serial or index
cam = TeledyneSpinnakerCamera(cam_id="serial_xxx")
# or use an index
cam = TeledyneSpinnakerCamera(cam_id=0)

# configure and start acquisition
cam.setup_acquisition(
    exposure=0.02,          # 20 ms exposure
    pixel_format="Mono8",
    width=1920, height=1200,
    offset_x=0, offset_y=0,
)

Key methods

MethodDescription
list_cameras()Enumerate all Spinnaker cameras in the system
setup_acquisition(**kwargs)Configure ROI, exposure, pixel format, etc.
start_acquisition(nframes)Start acquisition of the specified number of frames
read_multiple_images(nframes)Read the acquired images
get_device_info()Get the camera serial number, model and firmware version

Common property operations

Camera parameters are read and written directly by GenAPI node name:

# Set gain
cam.set_attribute("Gain", 10.0)
# Enable auto exposure
cam.set_attribute("ExposureAuto", "Continuous")
# Get sensor temperature
temp = cam.get_attribute("DeviceTemperature")

Device configuration

"monitor_cam": {
    "type": "local",
    "module": "drivers.teledyne.spinnaker",
    "class": "TeledyneSpinnakerCamera",
    "arguments": {"cam_id": 0},
}
  • stop(): Stop capturing images.

  • quatm.drivers.blackfly.bfly.Camserver(name, serial)

    class quatm.drivers.blackfly.bfly.Camserver(object):
        def __init__(self, name, serial):
            pass
    
        def generateImageIndex(self):
            pass
    
        def run(self):
            pass
    
        def sendimage(self, im):
            pass
    
        def updateBusInfo(self):
            pass
    
    • generateImageIndex(): In the current measurement, count the images. If the next run has started (either task, repetition or run changes), reset the counter (imgindex).

    • run(): Run loop running forever. Sends images from the camera to the imagestream and initiates reconfiguration of the camera in case properties have changed.

    • sendimage(im): Send Blackfly camera image via the imagestream. The image is converted to numpy array, additional information like binning, timestamp, etc., is added to a dictionary and both are sent to the imagestream.

      • Args: im - Blackfly image object.
      • Returns: None
    • updateBusInfo(): Detect cameras on the bus and update info in properties if new camera has been found.

  • quatm.drivers.blackfly.bfly.pc2

    class quatm.drivers.blackfly.bfly.pc2(object):
        pass
    
    • Dummy class in case driver is not installed.

Function:

  • quatm.drivers.blackfly.bfly.run(name)

    def quatm.drivers.blackfly.bfly.run(name):
        pass
    
    • Initialize a Camserver and run it.

Thorlabs TSI / uc480 scientific cameras

TLCamera ThorlabsTLCamera

TSI series Thorlabs scientific camera
CommunicationTLCamera SDK
InterfaceUSB3
SensorsCMOS / CCD
SupportROI, binning
For high-frame-rate scientific imaging with SDK-level control.
Driver module: ThorlabsTLCamera
from quatm.drivers.thorlabs.TLCamera import ThorlabsTLCamera
cam = ThorlabsTLCamera(serial="12345678")
cam.setup_acquisition(exposure=0.01, width=1024, height=768)

Basler — Pylon SDK series

Basler ace / dart Pylon SDK series
CommunicationPylon SDK (GenICam)
InterfaceUSB3 / GigE
SensorCMOS
Pixel formatsMono8/16, Bayer
FeaturesROI, Binning, hardware trigger
Industrial CMOS cameras, suited to routine laboratory imaging tasks such as MOT fluorescence monitoring and alignment beam imaging.
Driver module: BaslerPylonCamera
from quatm.drivers.Basler.pylon import BaslerPylonCamera

# Enumerate all cameras
cams = BaslerPylonCamera.list_cameras()
cam = BaslerPylonCamera(cam_id=cams[0])

cam.setup_acquisition(exposure=0.02)
cam.start_acquisition(nframes=1)

Hamamatsu ORCA series sCMOS

ORCA-Fusion / ORCA-Flash4.0 Hamamatsu DCAM
CommunicationDCAM SDK (DLL)
SensorsCMOS
Pixels2048×2048 (Fusion)
Frame rateup to 100 fps
Readout noise< 1.6 e⁻
Ultra-low-noise sCMOS, suited to quantitative single atom/single ion fluorescence imaging.
Driver module: DCAMCamera
from quatm.drivers.DCAM.DCAM import DCAMCamera

cam = DCAMCamera(idx=0)
cam.setup_acquisition(exposure=0.1, pixel_format="Mono16")

Photometrics Prime / Evolve series

Prime BSI / Evolve EMCCD Photometrics PVCAM
CommunicationPVCAM SDK (DLL)
Sensorback-illuminated sCMOS / EMCCD
InterfacePCIe / USB3
Pixel depth16-bit
Back-illuminated sCMOS offers high quantum efficiency; EMCCD models provide single-photon sensitivity.
Driver module: PVCAMCamera
from quatm.drivers.Photometrics.pvcam import PVCAMCamera

cam = PVCAMCamera(cam_name="Prime_BSI_95B")
cam.setup_acquisition(exposure=0.05)

Princeton Instruments PIXIS / ProEM

PIXIS / ProEM / IsoPlane Princeton PICam
CommunicationPICam SDK (DLL)
SensorCCD / EMCCD
Coolingliquid nitrogen / TEC
InterfacePCIe / USB
Spectroscopy-grade CCD/EMCCD cameras, commonly used together with Acton/IsoPlane spectrographs.
Driver module: PicamCamera
from quatm.drivers.PrincetonInstruments.picam import PicamCamera

cam = PicamCamera(cam_id=0)
cam.setup_acquisition(exposure=1.0)  # long-exposure spectrum acquisition

PCO edge / dimax high-speed cameras

edge / dimax / pco.panda PCO SC2
CommunicationSC2 SDK (DLL)
InterfaceCameraLink HS / USB3 / GigE
Frame rateup to several thousand fps
SensorsCMOS / high-speed CMOS
Suited to fast dynamical processes: MOT loading dynamics and real-time observation of ion crystal reordering.
Driver module: PCOSC2Camera
from quatm.drivers.PCO.SC2 import PCOSC2Camera

cam = PCOSC2Camera(interface="USB 3.0")
cam.setup_acquisition(exposure=0.001)  # 1 ms high-speed acquisition

Allied Vision Alvium / Mako

Alvium / Mako / Bonito Allied Vision Vimba X
CommunicationVimbaX SDK (GenICam)
InterfaceUSB3 / GigE / CameraLink
SensorCMOS
Compact industrial cameras, suited to space-constrained optical path integration.
Driver module: AlliedVisionVimbaXCamera
from quatm.drivers.AlliedVision.VimbaX import AlliedVisionVimbaXCamera

cam = AlliedVisionVimbaXCamera(cam_id=0)

IDS uEye+ / Ensenso

uEye+ / Ensenso 3D IDS peak
CommunicationIDS peak SDK
InterfaceUSB3 / GigE
SensorCMOS
General-purpose USB/GigE cameras, including the Ensenso 3D stereo camera.
Driver module: GenericIDSPeakCamera
from quatm.drivers.IDS.peak import GenericIDSPeakCamera

cam = GenericIDSPeakCamera(cam_id=0)

Generic configuration pattern

All cameras are registered in device_db.py with type: "local":

"imaging_cam": {
    "type": "local",
    "module": "drivers.Basler.pylon",
    "class": "BaslerPylonCamera",
    "arguments": {"cam_id": 0},
}