This is an EPICS areaDetector driver for the flat-panel amorphous silicon detectors from PerkinElmer.
The driver is based upon the XISL library provided by PerkinElmer. It only runs on Microsoft Windows computers. It supports both 32-bit and 64-bit versions of Windows.
This driver has been tested with the following detectors
This driver inherits from ADDriver. It implements many of the parameters in asynNDArrayDriver.h and in ADArrayDriver.h. It also implements a number of parameters that are specific to the PerkinElmer detectors. The PerkinElmer class documentation describes this class in detail.
The following table describes how the PerkinElmer driver implements some of the standard driver parameters.
Implementation of Parameters in asynNDArrayDriver.h and ADDriver.h, and EPICS Record Definitions in ADBase.template and NDFile.template | ||
Parameter index variable | EPICS record name | Description |
---|---|---|
ADNumImages | $(P)$(R)NumImages | Controls the number of images to acquire when ADImageMode is Multiple or Average |
ADAcquireTime |
$(P)$(R)AcquireTime $(P)$(R)AcquireTime_RBV |
When using Internal Triggers, this parameter controls the period between trigger pulses which will also be equal to the exposure time. |
ADTriggerMode |
$(P)$(R)TriggerMode $(P)$(R)TriggerMode_RBV |
Sets the trigger mode for the detector. Options are:
|
ADImageMode |
$(P)$(R)ImageMode $(P)$(R)ImageMode_RBV |
Sets the trigger mode for the detector. Options are:
|
The PerkinElmer driver implements the following parameters in addition to those
in asynNDArrayDriver.h and ADDriver.h. Note that to reduce the width of this table
the parameter index variable names have been split into 2 lines, but these are just
a single name, for example PerkinElmerXXX
.
Parameter Definitions in PerkinElmer.h and EPICS Record Definitions in PerkinElmer.template | ||||||
Parameter index variable | asyn interface | Access | Description | drvInfo string | EPICS record name | EPICS record type |
---|---|---|---|---|---|---|
PE_NumFrameBuffers | asynInt32 | r/w | Number of software frame buffers to use | PE_NUM_FRAME_BUFFERS |
$(P)$(R)PENumFrameBuffers $(P)$(R)PENumFrameBuffers_RBV |
longout longin |
PE_Initialize | asynInt32 | w | Initialize the detector | PE_INITIALIZE | $(P)$(R)PEInitialize | longout |
PE_StatusRBV | asynInt32 | r/w | Status of PerkinElmer driver. SHOULD DELETE THIS AND JUST USE DETECTOR STATE. | PE_STATUS | $(P)$(R)PE_STATUS_RBV | mbbi |
PE_SystemID | asynInt32 | r/w | PROM ID # used in communication with Perkin Elmer | PE_SYSTEMID | $(P)$(R)PESystemID | longin |
PE_Trigger | asynInt32 | w | Trigger record for soft trigger mode | PE_TRIGGER | $(P)$(R)PETrigger | longout |
PE_FrameBufferIndex | asynInt32 | r | Frame number from the hardware frame buffer for this image. Values go from 1 to 8. | PE_FRAME_BUFFER_INDEX | $(P)$(R)PEFrameBuffIndex | longout |
PE_ImageNumber | asynInt32 | r | Image number for this image in the software frame buffer array. | PE_IMAGE_NUMBER | $(P)$(R)PEImageNumber | longout |
Offset corrections | ||||||
PE_NumOffsetFrames | asynInt32 | r/w | Number of frames to collect and average when collecting offset frames | PE_NUM_OFFSET_FRAMES | $(P)$(R)PENumOffsetFrames | longout |
PE_CurrentOffsetFrame | asynInt32 | r | Current offset frame being collected when collecting offset frames | PE_CURRENT_OFFSET_FRAMEs | $(P)$(R)PECurrentOffsetFrame | longin |
PE_AcquireOffset | asynInt32 | r/w | Acquire offset frames | PE_ACQUIRE_OFFSET | $(P)$(R)PEAcquireOffset | busy |
PE_UseOffset | asynInt32 | r/w | Set whether offset image is to be used. Choices are "Disable" (0) and "Enable" (1). | PE_USE_OFFSET | $(P)$(R)PEUseOffset | mbbo |
PE_OffsetAvailable | asynInt32 | r | Report whether offset image has been collected and is available for use. Choices are "Not available" (0) and "Available" (1). | PE_OFFSET_AVAILABLE | $(P)$(R)PEOffsetAvailable | mbbi |
PE_OffsetConstant | asynInt32 | r/w |
An offset that is added to the image when the offset correction is performed. CorrectedImage
= RawImage - OffsetImage + OffsetConstant. This constant should be used to prevent
the CorrectedImage from having any negative pixel values, which would otherwise
be clipped to 0. For efficiency this value is actually subtracted from the offset
image as soon as it is collected, so it is then effectively added to each image
when offset correction is done. This results in 2 restrictions:
|
PE_OFFSET_CONSTANT |
$(P)$(R)PEOffsetContant $(P)$(R)PEOffsetContant_RBV |
longout
longin |
Gain corrections | ||||||
PE_NumGainFrames | asynInt32 | r/w | Number of frames to collect and average when collecting gain frames | PE_NUM_GAIN_FRAMES | $(P)$(R)PENumGainFrames | longout |
PE_CurrentGainFrame | asynInt32 | r | Current gain frame being collected when collecting gain frames | PE_CURRENT_GAIN_FRAMEs | $(P)$(R)PECurrentGainFrame | longin |
PE_AcquireGain | asynInt32 | w | Acquire gain frames | PE_ACQUIRE_GAIN | $(P)$(R)PEAcquireGain | busy |
PE_UseGain | asynInt32 | w | Set whether gain image is to be used. Choices are "Disable" (0) and "Enable" (1). | PE_USE_GAIN | $(P)$(R)PEUseGain | mbbo |
PE_GainAvailable | asynInt32 | r | Report whether offset image has been collected and is available for use. Choices are "Not available" (0) and "Available" (1). | PE_GAIN_AVAILABLE | $(P)$(R)PEGainAvailable | mbbi |
Bad pixel corrections | ||||||
PE_UsePixelCorrections | asynInt32 | w | Set whether bad pixel correction is to be used | PE_USE_PIXEL_CORRECTION | $(P)$(R)PEUsePixelCorrection | mbbo |
PE_PixelCorrectionAvailable | asynInt32 | r | Report whether pixel correction file has been set and is available for use | PE_PIXEL_CORRECTION_AVAILABLE | $(P)$(R)PEPixelCorrectionAvailable | mbbi |
PE_BadPixelFile PE_BadPixelFile_RBV |
asynOctetWrite aynnOctetRead |
w | File name for bad pixel file | PE_BAD_PIXEL_FILE |
$(P)$(R)PEBadPixelFile $(P)$(R)PEBadPixelFile_RBV |
waveform |
Load/Save offset/gain corrections | ||||||
PE_CorrectionsDirectory | asynOctetWrite | r/w | Directory where corrections files should be stored | PE_CORRECTIONS_DIRECTORY | $(P)$(R)PECorrectionsDir | waveform |
PE_LoadCorrectionsFile | asynInt32 | w | Load offset and gain corrections from a file for use | PE_LOAD_CORRECTION_FILES | $(P)$(R)PELoadCorrections | longout |
PE_SaveCorrectionsFile | asynInt32 | w | Save offset and gain corrections to a file | PE_SAVE_CORRECTION_FILES | $(P)$(R)PESaveCorrections | longout |
The PerkinElmer driver does not support the following standard driver parameters because they are not supported in the PerkinElmer library:
The PerkinElmer driver is created with the perkinElmerConfig command, either from C/C++ or from the EPICS IOC shell.
int PerkinElmerConfig(const char *portName, int IDType, const char* IDValue, int maxBuffers, size_t maxMemory, int priority, int stackSize )
For details on the meaning of the parameters to this function refer to the detailed documentation on the PerkinElmerConfig function in the PerkinElmer.cpp documentation and in the documentation for the constructor for the PerkinElmer class.
There an example IOC boot directory and startup script (iocBoot/iocPerkinElmer/st.cmd) provided with areaDetector.
The following show the MEDM screens that are used to control the PerkinElmer detector. Note that the general purpose screen ADBase.adl can be used, but it exposes many controls that are not applicable to the PerkinElmer, and lacks some fields that are important for the PerkinElmer driver.
PerkinElmer.adl
is the main screen used to control the PerkinElmer
driver.
The following measurements were done to demonstrate the performance that can be obtained with the areaDetector PerkinElmer driver.
The following are some current restrictions of the PerkinElmer driver: