Files
ADAndor/documentation/PerkinElmerDoc.html
rivers 93ddf2469c New date
git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@15329 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
2012-10-01 19:29:22 +00:00

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>