git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@15329 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
637 lines
18 KiB
HTML
637 lines
18 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<title>areaDetector PerkinElmer driver</title>
|
|
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
|
|
</head>
|
|
<body>
|
|
<div style="text-align: center">
|
|
<h1>
|
|
areaDetector PerkinElmer driver</h1>
|
|
<h2>
|
|
October 1, 2012</h2>
|
|
<h2>
|
|
Mark Rivers, John Hammonds, Brian Tieman</h2>
|
|
<h2>
|
|
University of Chicago and Argonne National Laboratory</h2>
|
|
</div>
|
|
<h2>
|
|
Table of Contents</h2>
|
|
<ul>
|
|
<li><a href="#Introduction">Introduction</a></li>
|
|
<li><a href="#StandardNotes">Implementation of standard driver parameters</a></li>
|
|
<li><a href="#Driver_parameters">PerkinElmer specific parameters</a></li>
|
|
<li><a href="#Unsupported">Unsupported standard driver parameters</a></li>
|
|
<li><a href="#Configuration">Configuration</a></li>
|
|
<li><a href="#MEDM_screens">MEDM screens</a></li>
|
|
<li><a href="#Performance_measurements">Performance measurements</a> </li>
|
|
<li><a href="#Restrictions">Restrictions</a> </li>
|
|
</ul>
|
|
<h2 id="Introduction" style="text-align: left">
|
|
Introduction</h2>
|
|
<p>
|
|
This is an <a href="http://www.aps.anl.gov/epics">EPICS</a> <a href="areaDetector.html">
|
|
areaDetector</a> driver for the flat-panel amorphous silicon detectors from <a href="http://optoelectronics.perkinelmer.com/catalog/Category.aspx?CategoryName=X-Ray+Cameras">
|
|
PerkinElmer</a>.</p>
|
|
<p>
|
|
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.
|
|
</p>
|
|
<p>
|
|
This driver has been tested with the following detectors</p>
|
|
<ul>
|
|
<li>XRD0820 w/ XRD-FG PCI frame grabber</li>
|
|
<li>XRD0822 w/ Gigabit Ethernet interface</li>
|
|
<li>XRD1621 w/ XRD-FGX PCI frame grabber</li>
|
|
<li>XRD1621 w/ XRD-FGe Opto PCI-Express frame grabber</li>
|
|
</ul>
|
|
<p>
|
|
This driver inherits from <a href="areaDetectorDoc.html#ADDriver">ADDriver</a>.
|
|
It implements many of the parameters in <a href="areaDetectorDoxygenHTML/asyn_n_d_array_driver_8h.html">
|
|
asynNDArrayDriver.h</a> and in <a href="areaDetectorDoxygenHTML/_a_d_driver_8h.html">
|
|
ADArrayDriver.h</a>. It also implements a number of parameters that are specific
|
|
to the PerkinElmer detectors. The <a href="areaDetectorDoxygenHTML/class_perkin_elmer.html">
|
|
PerkinElmer class documentation</a> describes this class in detail.</p>
|
|
<h2 id="StandardNotes" style="text-align: left">
|
|
Implementation of standard driver parameters</h2>
|
|
<p>
|
|
The following table describes how the PerkinElmer driver implements some of the
|
|
standard driver parameters.
|
|
</p>
|
|
<table border="1" cellpadding="2" cellspacing="2" style="text-align: left">
|
|
<tbody>
|
|
<tr>
|
|
<td align="center" colspan="3">
|
|
<b>Implementation of Parameters in asynNDArrayDriver.h and ADDriver.h, and EPICS Record
|
|
Definitions in ADBase.template and NDFile.template</b></td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Parameter index variable</th>
|
|
<th>
|
|
EPICS record name</th>
|
|
<th>
|
|
Description</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
ADNumImages</td>
|
|
<td>
|
|
$(P)$(R)NumImages</td>
|
|
<td>
|
|
Controls the number of images to acquire when ADImageMode is Multiple or Average
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
ADAcquireTime</td>
|
|
<td>
|
|
$(P)$(R)AcquireTime<br />
|
|
$(P)$(R)AcquireTime_RBV</td>
|
|
<td>
|
|
When using Internal Triggers, this parameter controls the period between trigger
|
|
pulses which will also be equal to the exposure time.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
ADTriggerMode</td>
|
|
<td>
|
|
$(P)$(R)TriggerMode<br />
|
|
$(P)$(R)TriggerMode_RBV</td>
|
|
<td>
|
|
Sets the trigger mode for the detector. Options are:
|
|
<ul>
|
|
<li>Internal</li>
|
|
<li>External</li>
|
|
<li>Free Running</li>
|
|
<li>Soft Trigger</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
ADImageMode</td>
|
|
<td>
|
|
$(P)$(R)ImageMode<br />
|
|
$(P)$(R)ImageMode_RBV</td>
|
|
<td>
|
|
Sets the trigger mode for the detector. Options are:
|
|
<ul>
|
|
<li>Single</li>
|
|
<li>Multiple</li>
|
|
<li>Continuous</li>
|
|
<li>Average. This mode is new for the Perkin Elmer. It averages NumImages frames in
|
|
the hardware frame grabber. It is useful when the total acquisition time is longer
|
|
than the 5 second maximum allowed in Internal trigger mode, etc.</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2 id="Driver_parameters" style="text-align: left">
|
|
PerkinElmer specific parameters</h2>
|
|
<p>
|
|
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 <code>PerkinElmerXXX</code>.
|
|
</p>
|
|
<table border="1" cellpadding="2" cellspacing="2" style="text-align: left">
|
|
<tbody>
|
|
<tr>
|
|
<td align="center" colspan="7">
|
|
<b>Parameter Definitions in PerkinElmer.h and EPICS Record Definitions in PerkinElmer.template</b>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>
|
|
Parameter index variable</th>
|
|
<th>
|
|
asyn interface</th>
|
|
<th>
|
|
Access</th>
|
|
<th>
|
|
Description</th>
|
|
<th>
|
|
drvInfo string</th>
|
|
<th>
|
|
EPICS record name</th>
|
|
<th>
|
|
EPICS record type</th>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_NumFrameBuffers</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Number of software frame buffers to use</td>
|
|
<td>
|
|
PE_NUM_FRAME_BUFFERS</td>
|
|
<td>
|
|
$(P)$(R)PENumFrameBuffers<br />
|
|
$(P)$(R)PENumFrameBuffers_RBV</td>
|
|
<td>
|
|
longout<br />
|
|
longin</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_Initialize</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Initialize the detector</td>
|
|
<td>
|
|
PE_INITIALIZE</td>
|
|
<td>
|
|
$(P)$(R)PEInitialize</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_StatusRBV</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Status of PerkinElmer driver. SHOULD DELETE THIS AND JUST USE DETECTOR STATE.</td>
|
|
<td>
|
|
PE_STATUS</td>
|
|
<td>
|
|
$(P)$(R)PE_STATUS_RBV</td>
|
|
<td>
|
|
mbbi</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_SystemID</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
PROM ID # used in communication with Perkin Elmer</td>
|
|
<td>
|
|
PE_SYSTEMID</td>
|
|
<td>
|
|
$(P)$(R)PESystemID</td>
|
|
<td>
|
|
longin</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_Trigger</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Trigger record for soft trigger mode</td>
|
|
<td>
|
|
PE_TRIGGER</td>
|
|
<td>
|
|
$(P)$(R)PETrigger</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_FrameBufferIndex</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Frame number from the hardware frame buffer for this image. Values go from 1 to
|
|
8.</td>
|
|
<td>
|
|
PE_FRAME_BUFFER_INDEX</td>
|
|
<td>
|
|
$(P)$(R)PEFrameBuffIndex</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_ImageNumber</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Image number for this image in the software frame buffer array.</td>
|
|
<td>
|
|
PE_IMAGE_NUMBER</td>
|
|
<td>
|
|
$(P)$(R)PEImageNumber</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="center" colspan="7">
|
|
<b>Offset corrections</b></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_NumOffsetFrames</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Number of frames to collect and average when collecting offset frames</td>
|
|
<td>
|
|
PE_NUM_OFFSET_FRAMES</td>
|
|
<td>
|
|
$(P)$(R)PENumOffsetFrames</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_CurrentOffsetFrame</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Current offset frame being collected when collecting offset frames</td>
|
|
<td>
|
|
PE_CURRENT_OFFSET_FRAMEs</td>
|
|
<td>
|
|
$(P)$(R)PECurrentOffsetFrame</td>
|
|
<td>
|
|
longin</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_AcquireOffset</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Acquire offset frames</td>
|
|
<td>
|
|
PE_ACQUIRE_OFFSET</td>
|
|
<td>
|
|
$(P)$(R)PEAcquireOffset</td>
|
|
<td>
|
|
busy</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_UseOffset</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Set whether offset image is to be used. Choices are "Disable" (0) and "Enable" (1).
|
|
</td>
|
|
<td>
|
|
PE_USE_OFFSET</td>
|
|
<td>
|
|
$(P)$(R)PEUseOffset</td>
|
|
<td>
|
|
mbbo</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_OffsetAvailable</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Report whether offset image has been collected and is available for use. Choices
|
|
are "Not available" (0) and "Available" (1).</td>
|
|
<td>
|
|
PE_OFFSET_AVAILABLE</td>
|
|
<td>
|
|
$(P)$(R)PEOffsetAvailable</td>
|
|
<td>
|
|
mbbi</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="center" colspan="7">
|
|
<b>Gain corrections</b></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_NumGainFrames</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Number of frames to collect and average when collecting gain frames</td>
|
|
<td>
|
|
PE_NUM_GAIN_FRAMES</td>
|
|
<td>
|
|
$(P)$(R)PENumGainFrames</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_CurrentGainFrame</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Current gain frame being collected when collecting gain frames</td>
|
|
<td>
|
|
PE_CURRENT_GAIN_FRAMEs</td>
|
|
<td>
|
|
$(P)$(R)PECurrentGainFrame</td>
|
|
<td>
|
|
longin</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_AcquireGain</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Acquire gain frames</td>
|
|
<td>
|
|
PE_ACQUIRE_GAIN</td>
|
|
<td>
|
|
$(P)$(R)PEAcquireGain</td>
|
|
<td>
|
|
busy</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_UseGain</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Set whether gain image is to be used. Choices are "Disable" (0) and "Enable" (1).
|
|
</td>
|
|
<td>
|
|
PE_USE_GAIN</td>
|
|
<td>
|
|
$(P)$(R)PEUseGain</td>
|
|
<td>
|
|
mbbo</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_GainAvailable</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Report whether offset image has been collected and is available for use. Choices
|
|
are "Not available" (0) and "Available" (1).</td>
|
|
<td>
|
|
PE_GAIN_AVAILABLE</td>
|
|
<td>
|
|
$(P)$(R)PEGainAvailable</td>
|
|
<td>
|
|
mbbi</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="center" colspan="7">
|
|
<b>Bad pixel corrections</b></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_UsePixelCorrections</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Set whether bad pixel correction is to be used</td>
|
|
<td>
|
|
PE_USE_PIXEL_CORRECTION</td>
|
|
<td>
|
|
$(P)$(R)PEUsePixelCorrection</td>
|
|
<td>
|
|
mbbo</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_PixelCorrectionAvailable</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
r</td>
|
|
<td>
|
|
Report whether pixel correction file has been set and is available for use</td>
|
|
<td>
|
|
PE_PIXEL_CORRECTION_AVAILABLE</td>
|
|
<td>
|
|
$(P)$(R)PEPixelCorrectionAvailable</td>
|
|
<td>
|
|
mbbi</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_BadPixelFile PE_BadPixelFile_RBV</td>
|
|
<td>
|
|
asynOctetWrite<br />
|
|
aynnOctetRead</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
File name for bad pixel file</td>
|
|
<td>
|
|
PE_BAD_PIXEL_FILE</td>
|
|
<td>
|
|
$(P)$(R)PEBadPixelFile<br />
|
|
$(P)$(R)PEBadPixelFile_RBV</td>
|
|
<td>
|
|
waveform</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="center" colspan="7">
|
|
<b>Load/Save offset/gain corrections</b></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_CorrectionsDirectory</td>
|
|
<td>
|
|
asynOctetWrite</td>
|
|
<td>
|
|
r/w</td>
|
|
<td>
|
|
Directory where corrections files should be stored</td>
|
|
<td>
|
|
PE_CORRECTIONS_DIRECTORY</td>
|
|
<td>
|
|
$(P)$(R)PECorrectionsDir</td>
|
|
<td>
|
|
waveform</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_LoadCorrectionsFile</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Load offset and gain corrections from a file for use</td>
|
|
<td>
|
|
PE_LOAD_CORRECTION_FILES</td>
|
|
<td>
|
|
$(P)$(R)PELoadCorrections</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
PE_SaveCorrectionsFile</td>
|
|
<td>
|
|
asynInt32</td>
|
|
<td>
|
|
w</td>
|
|
<td>
|
|
Save offset and gain corrections to a file</td>
|
|
<td>
|
|
PE_SAVE_CORRECTION_FILES</td>
|
|
<td>
|
|
$(P)$(R)PESaveCorrections</td>
|
|
<td>
|
|
longout</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h2 id="Unsupported">
|
|
Unsupported standard driver parameters</h2>
|
|
<p>
|
|
The PerkinElmer driver does not support the following standard driver parameters
|
|
because they are not supported in the PerkinElmer library:</p>
|
|
<ul>
|
|
<li>Readout region (ADMinX, ADMinY, ADSizeX, ADSizeY)</li>
|
|
<li>Type/Color (NDDataType, NDColorMode)</li>
|
|
<li>File (None of the file parameters in NDFile)</li>
|
|
<li>No Hardware shutter control </li>
|
|
</ul>
|
|
<h2 id="Configuration">
|
|
Configuration</h2>
|
|
<p>
|
|
The PerkinElmer driver is created with the perkinElmerConfig command, either from
|
|
C/C++ or from the EPICS IOC shell.</p>
|
|
<pre>int PerkinElmerConfig(const char *portName, int IDType, const char* IDValue,
|
|
int maxBuffers, size_t maxMemory,
|
|
int priority, int stackSize )
|
|
</pre>
|
|
<p>
|
|
For details on the meaning of the parameters to this function refer to the detailed
|
|
documentation on the PerkinElmerConfig function in the <a href="areaDetectorDoxygenHTML/_perkin_elmer_8cpp.html">
|
|
PerkinElmer.cpp documentation</a> and in the documentation for the constructor
|
|
for the <a href="areaDetectorDoxygenHTML/class_perkin_elmer.html">PerkinElmer class</a>.
|
|
</p>
|
|
<p>
|
|
There an example IOC boot directory and startup script (<a href="perkin_elmer_st_cmd.html">iocBoot/iocPerkinElmer/st.cmd)</a>
|
|
provided with areaDetector.
|
|
</p>
|
|
<h2 id="MEDM_screens" style="text-align: left">
|
|
MEDM screens</h2>
|
|
<p>
|
|
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.</p>
|
|
<p>
|
|
<code>PerkinElmer.adl</code> is the main screen used to control the PerkinElmer
|
|
driver.
|
|
</p>
|
|
<div style="text-align: center">
|
|
<h3 style="text-align: center">
|
|
PerkinElmer.adl</h3>
|
|
<img alt="PerkinElmer.png" src="PerkinElmer.png" /></div>
|
|
<h2 id="Performance_measurements">
|
|
Performance measurements</h2>
|
|
<p>
|
|
The following measurements were done to demonstrate the performance that can be
|
|
obtained with the areaDetector PerkinElmer driver.</p>
|
|
<ul>
|
|
<li>XRD1621 detector with the XRD-FGe Opto PCI-Express frame grabber
|
|
<ul>
|
|
<li>Can stream data continuously to local disk at 15 frames/s at 2048x2048 (120 MB/s)
|
|
and 30 frames/s at 1024x1024 (60 MB/s). These tests were done on a Windows 7 64-bit
|
|
machine with 2 disk drives (SAS, 15K RPM, RAID 0).</li>
|
|
</ul>
|
|
</li>
|
|
<li>XRD0822 detector with a GigE interface
|
|
<ul>
|
|
<li>Can stream data continuously to local disk at 25 frames/s at 1024x1024 (50 MB/s)
|
|
and 50 frames/s at 512x512 (25 MB/s). These tests were done on a Windows 7 64-bit
|
|
laptop with a local disk drive.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
</p>
|
|
<h2 id="Restrictions">
|
|
Restrictions</h2>
|
|
<p>
|
|
The following are some current restrictions of the PerkinElmer driver:</p>
|
|
<ul>
|
|
<li>The driver currently only supports a single frame-grabber or directly connected
|
|
GigE detector. Future releases may allow the IDValue parameter to specify a specific
|
|
frame grabber or directly connected GigE detector.</li>
|
|
</ul>
|
|
</body>
|
|
</html>
|