Files
ADAndor/documentation/PerkinElmerDoc.html
rivers 5ba5589ea2 Minor fixes
git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@10305 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
2010-03-22 18:45:39 +00:00

571 lines
16 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>
August 17, 2009</h2>
<h2>
John Hammonds, Brian Tieman, Mark Rivers</h2>
<h2>
Argonne National Laboratory and University of Chicago</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 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.
</p>
<p>
This driver has been tested with the following detectors</p>
<ul>
<li>XRD0820 w/ XRD-FG PCI frame grabber</li>
<li>XRD1621 w/ XRD-FGX PCI frame grabber</li>
</ul>
<p>
ADD ADDTIONAL INTRODUCTORY TEXT HERE.</p>
<p>
This driver inherits from <a href="areaDetectorDoc.html#ADDriver">ADDriver</a>.
It implements many of the parameters in NDStdDriverParam_t (see <a href="areaDetectorDoxygenHTML/asyn_n_d_array_driver_8h.html">
asynNDArryDriver.h</a>) and in ADStdDriverParam_t (see <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>
<p>
DOCUMENT IMPLEMENTATION OF STANDARD DRIVER PARAMETERS IN THIS TABLE</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 ADImageMultiple.</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. This parameter is only updated
when the detector is initialized</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 Run</li>
<li>Soft Trigger</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>
It is useful to use NDPluginROI to define an ROI containing the entire PerkinElmer
detector. The MaxValue_RBV PV in this ROI can be monitored to make sure that the
16-bit limit of 65,535 is not being approached in any pixel.
</p>
<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 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. Need to integrate this into DetectorState</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 frame buffer for this image</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 collections sequence</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 image</td>
<td>
PE_NUM_OFFSET_FRAMES</td>
<td>
$(P)$(R)PENumOffsetFrames</td>
<td>
longout</td>
</tr>
<tr>
<td>
PE_AcquireOffset</td>
<td>
asynInt32</td>
<td>
w</td>
<td>
Acquire Offset Image</td>
<td>
PE_ACQUIRE_OFFSET</td>
<td>
$(P)$(R)PEAcquireOffset</td>
<td>
longout</td>
</tr>
<tr>
<td>
PE_UseOffset</td>
<td>
asynInt32</td>
<td>
w</td>
<td>
Set wether offset image is to be used</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</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 image</td>
<td>
PE_NUM_GAIN_FRAMES</td>
<td>
$(P)$(R)PENumGainFrames</td>
<td>
longout</td>
</tr>
<tr>
<td>
PE_AcquireGain</td>
<td>
asynInt32</td>
<td>
w</td>
<td>
Acquire Gain Image</td>
<td>
PE_ACQUIRE_GAIN</td>
<td>
$(P)$(R)PEAcquireGain</td>
<td>
longout</td>
</tr>
<tr>
<td>
PE_UseGain</td>
<td>
asynInt32</td>
<td>
w</td>
<td>
Set wether gain image is to be used</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 gain image has been collected</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 wether 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</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>Size (ADBinX, ADBinY, ADMinX, ADMinY, ADSizeX, ADSizeY)</li>
<li>Type/Color (NDDataType, NDColorMode)</li>
<li>File ( None of the file parameters in NDFile )</li>
<li>Binning (Not supported in software yet ) </li>
<li>No Hardware shutter control </li>
<li>List any unsupported parameters here (WORK NEEDED)</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 maxSizeX, int maxSizeY, int dataType,
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>
<p>
PUT A TABLE OF PERFORMANCE MEASUREMENTS HERE</p>
<h2 id="Restrictions">
Restrictions</h2>
<p>
The following are some current restrictions of the PerkinElmer driver:</p>
<ul>
<li>DOCUMENT ANY IMPORTANT RESTRICTIONS OF THE PERKIN ELMER DRIVER HERE</li>
</ul>
</body>
</html>