Files
ADAndor/documentation/LightFieldDoc.html
rivers 957549f8a0 New file
git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@17006 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
2013-10-12 23:19:01 +00:00

607 lines
23 KiB
HTML
Executable File

<!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 LightField driver</title>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
</head>
<body>
<div style="text-align: center">
<h1>
areaDetector LightField driver</h1>
<h2>
September 29, 2013</h2>
<h2>
Mark Rivers</h2>
<h2>
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">LightField 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 recent <a href="http://www.princetoninstruments.com/">
Princeton Instruments</a> detectors including the ProEM, PIXIS, PI-MAX3, PI-MAX4, PyLoN,
and Quad-RO. It also supports the Acton Series spectrographs.
</p>
<p>
The interface to the detector is via a the MicroSoft Common Language Runtime (CLR)
interface to the <b>LightField</b>
program that Princeton Instruments sells. The areaDetector driver effectively "drives" LightField
through the CLR interface, performing most of the same operations that can be performed
using the LightField GUI. The advantage of this communication mechanism is that the
user can continue to use LightField for viewing images and for configuration operations.
LightField is automatically started when the areaDetector software is started.
</p>
<p>
Because EPICS and the LightField GUI can control many of the same parameters the user
must be aware of the interactions between the two control systems. The basic rule
is that the value of a parameter will be determined by whichever control system
last wrote to that parameter. The LightField widget will display the
current value of a parameter no matter how it was last changed. EPICS will correctly display
the current value of the parameter in the "readback" record, which typically ends in "_RBV",
no matter how the value was last changed. However the EPICS output record does not currently
update if the value is changed in LightField. This may change in a future version of asyn
device support.
</p>
<p>
This driver inherits from <a href="areaDetectorDoc.html#ADDriver">ADDriver</a>.
It implements many of the parameters <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 LightField application.The <a href="areaDetectorDoxygenHTML/class_light_field.html">LightField
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 LightField driver implements some of the standard
driver parameters. Note that there are 3 possible levels of nested acquisition looping
when using the LightField driver. From the innermost to outermost loop these are as follows:</p>
<ol>
<li>ADNumExposures ($(P)$(R)NumExposures). This controls the number of exposures per
image. This is called "accumulations" in LightField's terminology.</li>
<li>ADNumImages ($(P)$(R)NumImages). This controls the number of images per acquisition.
This is also called "number of images" in LightField's terminology. These images will
all be acquired into a single 3-D array, and saved to a single SPE file in WinView.</li>
<li>LightFieldNumAcquisitions ($(P)$(R)NumNumAcquisitions). This controls the number of
times that the driver will repeat an acquisition sequence. This is has no equivalent
in WinView, it is handled entirely by the areaDetector driver. It can be used to
acquire multiple data sets, where each is controlled by the above parameters.</li>
</ol>
<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>
ADImageMode</td>
<td>
$(P)$(R)ImageMode</td>
<td>
The driver redefines the choices for the ADImageMode parameter (record $(P)$(R)ImageMode)
from ADDriver.h. The choices for the LightField are:
<ul>
<li>Normal: This is the same as pressing the Acquire button in WinView. It may collect
more than 1 exposure per image if NumExposures>1, more than 1 image per acquisition
if NumImages>1, and more than 1 aquisition if NumAcquisitions>1.</li>
<li>Continuous: This will cause the driver to perform acquisitions indefinitely, i.e.
it acts as if NumAcquisitions is infinite.</li>
<li>Focus: This is the same as pressing the Focus button in WinView. It causes acquisition
to proceed as quickly as possible. It does not save the data. It currently does
not call the callbacks for each frame, so the images can only be seen in WinView
and not in EPICS. This may be fixed in a future release. </li>
</ul>
</td>
</tr>
<tr>
<td>
ADAcquirePeriod</td>
<td>
$(P)$(R)AcquirePeriod</td>
<td>
Controls the period between images when ADImageMode is Continuous. If this is greater
than the acquisition time plus readout overhead then the driver will wait until
the period has elapsed before starting the next acquisition.</td>
</tr>
<tr>
<td>
ADNumExposures</td>
<td>
$(P)$(R)NumExposures</td>
<td>
Controls the number of exposures (accumulations) to acquire into a single image.
</td>
</tr>
<tr>
<td>
ADNumImages</td>
<td>
$(P)$(R)NumImages</td>
<td>
Controls the number of images to acquire into a single 3-D data set.</td>
</tr>
<tr>
<td>
ADTriggerMode</td>
<td>
$(P)$(R)TriggerMode</td>
<td>
The driver redefines the choices for the ADTriggerMode parameter (record $(P)$(R)TriggerMode)
from ADDriver.h. The choices for the LightField are:
<ul>
<li>Free run: This acquires images as quickly as possible given the exposure and readout
times.</li>
<li>Ext. sync: This acquires one image for each external trigger pulse.</li>
<li>Bulb trig.: The exposure time is determined by the external trigger pulse width.
</li>
<li>Single trig.: A single external trigger pulse will acquire an entire sequence
of images. </li>
</ul>
</td>
</tr>
<tr>
<td>
NDFileFormat</td>
<td>
$(P)$(R)FileFormat</td>
<td>
The driver redefines the choices for the NDFileFormat parameter (record $(P)$(R)FileFormat)
from asynNDArrayDriver.h. The choices for the LightField are:
<ul>
<li>SPE: This is the default file format for WinView. It is a binary format with a
header containing all of the acquisition and setup information.</li>
<li>TIFF: TIFF files that contain the full resolution of the image data. The TIFF
files do not contain any acquisition or setup information.</li>
<li>8-bit TIFF: 8-bit TIFF files that contain limited resolution image data. The TIFF
files do not contain any acquisition or setup information. </li>
</ul>
The driver does not automatically change the file extension (.SPE, .TIFF, etc.)
when the FileFormat is changed, the user should do this using the FileTemplate record.
</td>
</tr>
<tr>
<td>
ADGain</td>
<td>
$(P)$(R)Gain</td>
<td>
The precision of the $(P)$(R)Gain record is changed to 0 because the gain in WinView
is an integer. Allowed values are detector dependent, but 1 and 2 are typically
supported. </td>
</tr>
</tbody>
</table>
<h2 id="Driver_parameters" style="text-align: left">
LightField specific parameters</h2>
<p>
The LightField 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>marCCDState</code>.
</p>
<table border="1" cellpadding="2" cellspacing="2" style="text-align: left">
<tbody>
<tr>
<td align="center" colspan="7">
<b>Parameter Definitions in LightField.cpp and EPICS Record Definitions in LightField.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 align="center" colspan="7">
<b>Status parameters</b></td>
</tr>
<tr>
<td>
LightField<br />
NumAcquisitions</td>
<td>
asynInt32</td>
<td>
r/w</td>
<td>
The number of acquisitions to perform when acquisition is started. This controls
the number of iterations in the outermost acquisition loop explained above. </td>
<td>
LightField_NACQUISITIONS</td>
<td>
$(P)$(R)NumAcquisitions<br />
$(P)$(R)NumAcquisitions_RBV</td>
<td>
longout<br />
longin</td>
</tr>
<tr>
<td>
Roper<br />
NumAcquisitionsCounter</td>
<td>
asynInt32</td>
<td>
r/o</td>
<td>
The number of acquisitions performed so far. </td>
<td>
ROPER_NACQUISITIONS_COUNTER</td>
<td>
$(P)$(R)NumAcquisitionsCounter_RBV</td>
<td>
longin</td>
</tr>
<tr>
<td>
Roper<br />
AutoDataType</td>
<td>
asynInt32</td>
<td>
r/w</td>
<td>
A flag controlling whether WinView will automatically chose the optimal data type
for the image data. 0=No, 1=Yes. If this flag is 1 then the NDDataType parameter
($(P)$(R)DataType record) is ignored. If this flag is 0 then the NDDataType parameter
controls the data type of the images. </td>
<td>
AUTO_DATA_TYPE</td>
<td>
$(P)$(R)AutoDataType<br />
$(P)$(R)AutoDataType_RBV</td>
<td>
bo<br />
bi</td>
</tr>
<tr>
<td>
Roper<br />
ShutterMode</td>
<td>
asynInt32</td>
<td>
r/w</td>
<td>
The shutter operating mode for shutters controlled by WinView. Allowed values are:
<ul>
<li>Normal: The detector shutter will be opened and closed normally for each exposure.</li>
<li>Disabled closed: The shutter will be forced closed. Useful for taking a dark current
image.</li>
<li>Disabled open: The shutter will be forced open.</li>
</ul>
</td>
<td>
ROPER_SHUTTER_MODE</td>
<td>
$(P)$(R)RoperShutterMode<br />
$(P)$(R)RoperShutterMode_RBV</td>
<td>
mbbo<br />
mbbi</td>
</tr>
<tr>
<td>
Roper<br />
Comment(1-5)</td>
<td>
asynOctet</td>
<td>
r/w</td>
<td>
User comments for the data file. 5 comment fields of 80 characters each are available
in the header of WinView SPE files. These are waveform records with FTVL=UCHAR and
NELM=80 so that they can be longer than the 40 character string limit in EPICS.
</td>
<td>
COMMENT(1-5)</td>
<td>
$(P)$(R)Comment(1-5)<br />
$(P)$(R)Comment(1-5)_RBV</td>
<td>
waveform<br />
waveform</td>
</tr>
</tbody>
</table>
<h2 id="Unsupported">
Unsupported standard driver parameters</h2>
<p>
The LightField driver does not support the following standard driver parameters:</p>
<ul>
<li>Frame type (ADFrameType). This may be supported in a future release to control
acquisition of flat field and dark current frames.</li>
<li>Reading previous files (NDReadFile). This may be supported in a future release.</li>
<li>Capture or stream file saving (NDFileWriteMode, NDFileCapture, NDNumCapture, NDNumCaptured)</li>
</ul>
<h2 id="Configuration">
Configuration</h2>
<p>
The LightField driver is created with the LightFieldConfig command, either from C/C++ or from
the EPICS IOC shell.</p>
<pre>int LightFieldConfig(const char *portName,
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 LightFieldConfig function in the <a href="areaDetectorDoxygenHTML/LightField_8cpp.html">
LightField.cpp documentation</a> and in the documentation for the constructor for the
<a href="areaDetectorDoxygenHTML/classLightField.html">LightField class</a>.
</p>
<p>
There an example IOC boot directory and startup script (<a href="LightField_st_cmd.html">iocBoot/iocLightField/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 LightField detector.
Note that the general purpose screen ADBase.adl can be used, but it exposes a few
controls that are not applicable to the LightField, and lacks some fields that are important
for the LightField.</p>
<p>
<code>LightField.adl</code> is the main screen used to control the LightField driver.
</p>
<div style="text-align: center">
<h3 style="text-align: center">
LightField.adl</h3>
<img alt="LightField.png" src="LightField.png" /></div>
<p>
<code>LightFieldFile.adl</code> is the screen used to control WinView file I/O.
</p>
<div style="text-align: center">
<h3 style="text-align: center">
LightFieldFile.adl</h3>
<img alt="LightFieldFile.png" src="LightFieldFile.png" /></div>
<p>
<code>WinView</code> is program that the LightField driver is controlling via Microsoft
COM.
</p>
<div style="text-align: center">
<h3 style="text-align: center">
WinView program from LightField Scientific</h3>
<img alt="WinView.png" src="WinView.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 LightField driver. These measurements were made with a
CoolSnap-HQ2 detector which has 1392x1040 pixels. The acquisition time was 0.01
second. The overhead per image in the table below is the total time to acquire the
data set minus 1.00 seconds (the acquisition time) divided by 100. Acquisitions
were done in 2 modes:</p>
<ol>
<li>In the first mode NumImages=100 and NumAcquisitions=1, i.e. the data were all
collected into a single SPE file. In this mode the time per image is really controlled
by the acquisition time and readout time. At the end of the acquisition there is
then a delay, perhaps in copying the data from one buffer to another. The acquisition
time in this mode is the time from when acquire was started until WinView reported
acquisition was complete and the write to disk began. The additional time to write
the file to disk is also listed.</li>
<li>In the second mode NumImages=1 and NumAcquisitions=100, i.e. the data were collected
into 100 SPE files. This is equivalent to pressing the Acquire button in WinView
100 times. There is additional overhead per image that arises from downloading parameters
to the camera and in creating a new display window in WinView. In this mode the
test was done both with the EPICS AutoSave PV set to 1 (which effectively does a
WinView "Save As" operation for each file), and with AutoSave set to 0, which does
not write disk files at all. The acquisition time listed is with AutoSave on, i.e.
saving 100 disk files. Interestingly it was generally <i>faster</i> to collect the
data with AutoSave on than with it off! The time to save the 100 disk files is thus
actually negative, i.e. it took that much longer to collect the data sets <i>without</i>
saving the disk files. The reason for this is unclear, but it seems to be something
internal to WinView.</li>
</ol>
<table border="1" cellpadding="2" cellspacing="2" style="text-align: left">
<tbody>
<tr>
<th>
Binning</th>
<th>
Image dimensions</th>
<th>
Image size</th>
<th>
Mode</th>
<th>
Acquisition time for 100 images</th>
<th>
Overhead per image</th>
<th>
File size</th>
<th>
File saving time</th>
</tr>
<tr>
<td>
1x1 </td>
<td>
1392x1040 </td>
<td>
2827 KB </td>
<td>
1 SPE file </td>
<td>
29.49</td>
<td>
0.28 </td>
<td>
276 MB </td>
<td>
20.04</td>
</tr>
<tr>
<td>
1x1 </td>
<td>
1392x1040 </td>
<td>
2827 KB </td>
<td>
100 SPE files </td>
<td>
80.67</td>
<td>
0.79</td>
<td>
2.76 MB </td>
<td>
-3.62</td>
</tr>
<tr>
<td>
2x2</td>
<td>
696x520</td>
<td>
707 KB </td>
<td>
1 SPE file </td>
<td>
10.27</td>
<td>
0.09</td>
<td>
69 MB </td>
<td>
4.86</td>
</tr>
<tr>
<td>
2x2</td>
<td>
696x520</td>
<td>
707 KB </td>
<td>
100 SPE files </td>
<td>
46.14</td>
<td>
0.45</td>
<td>
0.71 MB </td>
<td>
-.72</td>
</tr>
<tr>
<td>
4x4</td>
<td>
348x260</td>
<td>
177 KB </td>
<td>
1 SPE file </td>
<td>
4.48</td>
<td>
0.03</td>
<td>
17 MB </td>
<td>
1.40</td>
</tr>
<tr>
<td>
4x4</td>
<td>
348x260</td>
<td>
177 KB </td>
<td>
100 SPE files </td>
<td>
36.59</td>
<td>
0.35</td>
<td>
0.18 MB </td>
<td>
0.69</td>
</tr>
</tbody>
</table>
<h2 id="Restrictions">
Restrictions</h2>
<p>
The following are some current restrictions of the LightField driver:</p>
<ul>
<li>The are hundreds of parameters that can be controlled in WinView via the COM interface
for acquiring, processing and displaying images. This driver does not attempt to
support all of them, just the ones that are most commonly needed for EPICS data
acquisition and control software. Additional features of WinView are very easy to
add to the EPICS interface if needed in the future. Settings that EPICS does not
control and which do not need to be frequently changed can simply be set via the
WinView GUI.</li>
<li>When NumImages is greater than one WinView collects a 3-D stack of images. The
areaDetector driver can save that data to a file using WinView. However, the driver
callbacks to plugins currently only passes the first image in that stack. It is
not practical to pass all the images in the stack at once as a 3-d array, because
this would require allocating a second 3-D array of the same size as the one in
the WinView buffer. What would be possible is to pass each of the images in the
stack on after the other. This will be implemented in a future release.</li>
<li>Reading data files back into WinView is not currently supported. This may be added
in a future release.</li>
<li>The values of ADNumImagesCounter ($(P)$(R)NumImagesCounter_RBV) and ADNumExposuresCounter
($(P)$(R)NumExposuresCounter_RBV) are not updated during acquisition. This is because
WinView does not appear to be correctly returning the values of the EXP_CSEQUENTS
and EXP_CACCUMS parameters. The reason for this is under investigation and hopefully
will be fixed in a future release.</li>
<li>The driver does not pass callbacks for images in WinView focus mode. I don't currently
have the required information on how to know when new data is available in focus
mode and how to read it. Hopefully this will be added in a future release.</li>
<li>WinView/WinSpec must be version 2.5.22 or later, because the class names changed
in that release.</li>
<li>The following items are hardcoded in the driver. They can be changed by recompiling
if necessary.
<ul>
<li>ERROR_MESSAGE_SIZE=256 The maximum size of error messages that can be retrieved
from WinView.</li>
<li>LightField_POLL_TIME=0.01 seconds. The time between polling WinView status to see when
acquisition is complete.</li>
</ul>
</li>
<li>There is a bug in Windows XP SP2 that causes WinView to hang after about 1600
acquisitions have been performed in a single WinView session. Acquisition means
the equivalent of pressing the Acquire button, regardless of how many images were
collected in a single acquisition. This would typically mean that 1600 SPE files
had been saved. After 1600 acquisitions it is necessary to exit WinView and restart
it. This problem is fixed in SP3 for Windows XP, and in Microsoft Vista.</li>
</ul>
</body>
</html>