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 class | SDK | Applicable models | Interface |
|---|
AndorSDK2Camera | atmcd32d.dll (SDK2) | iXon EMCCD, Luca, Clara | PCIe / USB |
AndorSDK3Camera | atcore.dll (SDK3) | Zyla, Neo, Marana (sCMOS) | USB3 / CameraLink |
ShamrockSpectrograph | ShamrockCIF.dll | SR-303i, SR-500i and other spectrographs | USB |
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
| Communication | DLL (atm32cd32) |
| Readout mode | EM/conventional |
| ADC frequency | 1/5/10 MHz |
| Pixel depth | 16-bit |
| Cooling | TEC (≤ -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
| Parameter | Description | Typical range |
|---|
exposure | Exposure time per frame | 0.001 – 3600 s |
em_gain | Electron multiplication gain | 0 – 1000 (linear or real gain mode) |
readout_rate | ADC readout frequency | 1MHz / 5MHz / 10MHz |
temperature | Target sensor temperature | -60 to -100°C (depends on cooler) |
pre_amp_gain | Preamplifier gain | 1× – 4× |
Andor SDK3 (sCMOS) AndorSDK3Camera
Zyla / Neo sCMOS Andor SDK3 series
| Communication | DLL (atcore) |
| Sensor | sCMOS |
| Interface | USB3 / CameraLink |
| Pixel depth | 12/16-bit |
| Frame rate | up 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},
}
Calibration note
EMCCD gain must be calibrated for quantitative fluorescence measurements. Excessive gain introduces clock-induced charge (CIC) noise and non-linearity. We recommend establishing a gain–signal curve using fluorescent beads or a calibrated light source.
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
| Communication | Spinnaker SDK |
| Interface | USB3 / GigE |
| Pixel formats | Mono8/16, Bayer |
| Trigger | hardware/software |
| Frame rate | depends 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
| Method | Description |
|---|
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},
}
Multi-camera synchronization
The Spinnaker SDK supports hardware-triggered synchronization of multiple cameras. Setting TriggerMode = On and TriggerSource = Line0 enables nanosecond-level synchronized exposure through an external TTL signal.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:
Thorlabs TSI / uc480 scientific cameras
TLCamera ThorlabsTLCamera
TSI series Thorlabs scientific camera
| Communication | TLCamera SDK |
| Interface | USB3 |
| Sensor | sCMOS / CCD |
| Support | ROI, 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
| Communication | Pylon SDK (GenICam) |
| Interface | USB3 / GigE |
| Sensor | CMOS |
| Pixel formats | Mono8/16, Bayer |
| Features | ROI, 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
| Communication | DCAM SDK (DLL) |
| Sensor | sCMOS |
| Pixels | 2048×2048 (Fusion) |
| Frame rate | up 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
| Communication | PVCAM SDK (DLL) |
| Sensor | back-illuminated sCMOS / EMCCD |
| Interface | PCIe / USB3 |
| Pixel depth | 16-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
| Communication | PICam SDK (DLL) |
| Sensor | CCD / EMCCD |
| Cooling | liquid nitrogen / TEC |
| Interface | PCIe / 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
| Communication | SC2 SDK (DLL) |
| Interface | CameraLink HS / USB3 / GigE |
| Frame rate | up to several thousand fps |
| Sensor | sCMOS / 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
| Communication | VimbaX SDK (GenICam) |
| Interface | USB3 / GigE / CameraLink |
| Sensor | CMOS |
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
| Communication | IDS peak SDK |
| Interface | USB3 / GigE |
| Sensor | CMOS |
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},
}
Frame grabbers
For cameras with a Camera Link interface, Quatm also ships drivers for NI IMAQ, BitFlow and Silicon Software frame grabbers. They are used in the same way as camera drivers: all frame grabbers likewise inherit the io.camera interface.