From 3e1870a9bdaefd14e998313e1f94dde2347ed4e5 Mon Sep 17 00:00:00 2001 From: rivers Date: Fri, 21 Mar 2008 21:19:13 +0000 Subject: [PATCH] New file git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@6851 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b --- documentation/areaDetector.html | 158 +++ documentation/areaDetectorArchitecture.png | Bin 0 -> 42809 bytes documentation/areaDetectorArchitecture.ppt | Bin 0 -> 25088 bytes .../areaDetectorArchitecture_README.txt | 3 + documentation/areaDetectorDoc.html | 1035 +++++++++++++++++ documentation/areaDetectorReleaseNotes.html | 20 + 6 files changed, 1216 insertions(+) create mode 100755 documentation/areaDetector.html create mode 100755 documentation/areaDetectorArchitecture.png create mode 100755 documentation/areaDetectorArchitecture.ppt create mode 100644 documentation/areaDetectorArchitecture_README.txt create mode 100755 documentation/areaDetectorDoc.html create mode 100755 documentation/areaDetectorReleaseNotes.html diff --git a/documentation/areaDetector.html b/documentation/areaDetector.html new file mode 100755 index 0000000..8163496 --- /dev/null +++ b/documentation/areaDetector.html @@ -0,0 +1,158 @@ + + +areaDetector: EPICS software for area detectors + + + +

areaDetector: EPICS software for area detectors

+ +

Module Owner: Mark Rivers: University of Chicago

+ +

This page is the home of areaDetector, an application for controlling area (2-D) +detectors, including CCDs, pixel array detectors, and online imaging plates. + +

+NOTE: This module will replace the +ccd +and +pilatusROI +modules. + 

+ +

Devices supported in areaDetector include:

+ +

From Dectris +

+ +

From Prosilica +

+ +

From MAR

+ + +

From Roper

+ + +

From Bruker

+ + +

Please email any comments and bug reports to Mark +Rivers who is +responsible for coordinating development and releases.

+ +

Where to find it

+

You can download the software from the links in the table +below:

+ + + + + + + + + + + + + + + + + + + + + +
Module VersionRelease DateFilenameDocumentationRelease NotesKnown Problems
1-0beta121-Mar-2008areaDetectorHEAD.tgzareaDetectorDocRelease notesSee release notes
+ +

Required Modules

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Module VersionRequires moduleRelease neededRequired for
1-0betaEPICS base3.14.8.2Base support
asyn4-10Socket and interface support
sscan2-5-6Busy record
autosave4-3Save/restore
+ +

Installation and Building

+

After obtaining a copy of the distribution, it must be installed +and built for use at your site. These steps only need to be +performed once for the site (unless versions of the module running +under different releases of EPICS and/or the other required modules +are needed).

+
    +
  1. Create an installation directory for the module, usually this +will end with
    +
    + .../support/ +
    +
  2. +
  3. Place the distribution file in this directory. Then issue the +commands (Unix style) +
    tar xvzf areaDetectorRX-Y.tgz
    +
    +
    +where X-Y is the release.
  4. +
  5. This creates a <top> application.
    +
    .../support/areaDetectorRX-Y
    +
  6. +
  7. Edit the config[ure]/RELEASE file and set the paths to +your installation of EPICS base and to your versions of supporting modules.
  8. +
  9. Run gnumake in the top level directory and check for +any compilation errors.
  10. +
  11. Please email  Mark Rivers  so that a record can be kept of which sites are +using this software.
  12. +
+ +

In Use

+This software was originally developed by Mark Rivers. + + + + diff --git a/documentation/areaDetectorArchitecture.png b/documentation/areaDetectorArchitecture.png new file mode 100755 index 0000000000000000000000000000000000000000..874a8f85c0db44fb0c19042e838177523e972824 GIT binary patch literal 42809 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 literal 0 HcmV?d00001 diff --git a/documentation/areaDetectorArchitecture_README.txt b/documentation/areaDetectorArchitecture_README.txt new file mode 100644 index 0000000..502a85a --- /dev/null +++ b/documentation/areaDetectorArchitecture_README.txt @@ -0,0 +1,3 @@ +To make the PNG file from the PPT file, select the entire page (^A), right click, Save as Picture, select PNG. + +Saving the slide as PNG with Save As works, but it is lower resolution so the text is ugly. diff --git a/documentation/areaDetectorDoc.html b/documentation/areaDetectorDoc.html new file mode 100755 index 0000000..d9d8077 --- /dev/null +++ b/documentation/areaDetectorDoc.html @@ -0,0 +1,1035 @@ + + +EPICS Support for Area Detectors + + +

areaDetector: EPICS Area Detector Support

+ +

R1-0beta

+

March 21, 2008

+

Mark Rivers

+

University of Chicago

+ + +

 

+ +

Contents

+
+ +

 

+ +

+ Overview

+

+The areaDetector module provides a general-purpose interface for area (2-D) detectors in EPICS. +It is intended to be used with a wide variety of detectors and cameras, ranging from high frame rate +video cameras, pixel-array detectors such as the Pilatus, and large format detectors like the +MAR-345 online imaging plate.

+ +The goals of this module are: +
    +
  • Minimize the amount of code that needs to be written to implement a + new detector. +
  • Provide a standard interface defining the functions and parameters that + a detector driver must support. +
  • Provide a set of base EPICS records that will be present for every detector + using this module. This allows the use of generic EPICS clients for + displaying images and controlling cameras and detectors. +
  • Allow easy extensibility to take advantage of detector-specific features + beyond the standard parameters. +
  • Have high-performance. Applications can be written to get the detector + image data through EPICS, but hooks are also provided to get the detector + data at a lower-level for very high performance. +
  • Provide an optional Region-Of-Interest (ROI) driver that performs computations + on regions within the image data. A basic ROI driver is included in the module, + and it is easy to add addtional ROI drivers for specific applications. +
  • Provide detector drivers for commonly used detectors in synchrotron applications. + These include Prosilica GigE video cameras, MAR-CCD x-ray detectors, MAR-345 online + imaging plate detectors, the Pilatus pixel-array detector, and the Roper Scientific CCD + cameras. +
+ + +

 

+ +

+ Architecture

+

+The architecture of the areaDetector module is shown in Figure 1. + +

Figure 1. Architecture of areaDetector module.

+
+ +The EPICS implementation consists of the following:

+
    +
  • A State-Notation-Language (SNL) program, pilatusROI.st. + This program implements all of the logic for acquiring images, reading + the TIFF files, computing ROIs, and making the data available to EPICS. +
  • Database files, pilatusROI.template, pilatusROI_N.template. + These databases + contain almost no "logic" with no links between records in the database. + Some of the records use "streamDevice" for communication with camserver. Other + records are simply variables which channel access clients and the State + Notation Language (SNL) program use. +
  • A streamDevice protocol file, pilatusROI.protocol. + This file defines the protocol used for + communicating with camserver. +
  • Autosave request files, pilatusROI_settings.req, pilatusROI_N_settings.req. + These files define the EPICS PVs + that will be automatically saved and restored when the EPICS IOC is restarted, so that + state information is preserved. +
  • MEDM screens, pilatusROI.adl, + pilatus8ROIs.adl, pilatusROI_waveform.adl. These screens are + used to control image acquisition, and definition and display of ROI data. +
  • An IDL display program, epics_image_display.pro for displaying the images + as they are sent to EPICS. This program is also available as a pre-built IDL ".sav" file + that can be run for free under the IDL Virtual Machine. +
  • SPEC macros that use the ROI counts as spec counters. These work in both conventional + step scanning mode, and also in + trajectory scanning mode + with the Newport MM4005 and XPS motor controllers. +
+ +

 

+ +

+ EPICS records

+

+The following EPICS records are used by pilatusROI. All records are prefixed by the macro +$(DET) which must be passed to the template file when the records are loaded.

+

+ Acquisition related records

+
    +
  • AcquireMode (mbbo)
    + This record controls the acquisition mode. The allowed values are: +
      +
    • 0 ("Internal") Internal exposure mode, external signal not used. +
    • 1 ("Ext. Enable") External enable mode. External signal controls acquire and readout. +
    • 2 ("Ext. Trigger") External trigger mode. External signal triggers an acquisition sequence. +
    • 3 ("Mult. Trigger") Multiple trigger mode. Each external trigger edge triggers a single acquisition + for the programmed exposure time. +
    • 4 ("Alignment") Alignment mode. Repetitively collects single images as quickly as possible. + The images are written to a temporary file. + The MinImageUpdateTime PV is ignorred in + this mode, so that all images are sent to EPICS for display. + It is similar to the exposem command in TVX. +
    + The first 4 acquisition modes correspond directly to the camserver commands Exposure, + ExtEnable, ExtTrigger, and ExtMTriggerrespectively. + Alignment mode uses the Exposure command as well, but continuously takes images into + the same temporary file (alignment.tif). +
  • ExposureTime (ao)
    + This record controls the exposure time in seconds. In External Enable mode this value is not + used by camserver. However, it should be set larger than the maximum time exposure time from the + external source, so that pilatusROI.st can estimate how long + to wait for the data files to be created before timing out. +
  • NImages (longout)
    + This record controls the number of images to acquire. It applies in all acquisition modes except + Alignment. +
  • ExposurePeriod (ao)
    + This record controls the exposure period in seconds. It is only in Internal or External Trigger modes + when NImages>1. +
  • NExposures (longout)
    + This record controls the number of exposures per image. It is only used in External Enable mode. +
  • DelayTime (ao)
    + This record controls the delay in seconds between the external trigger + and the start of image acquisition. It only applies in External Trigger mode. +
  • Acquire (busy)
    + This record controls the acquisition. Setting this record to 1 ("Busy") starts image acquisition. + The SNL program sets the record to 0 ("Done") when acquisition is complete. This means an entire + acquisition series if NImages>1. This record is an EPICS + "busy" record from the synApps sscan module. This record does not call recGblFwdLink until + acquisition is complete. It can thus be used with the sscan record as a detector trigger that + will wait for acquisition to complete before going to the next point in the scan. It can also + be used with EPICS caPutCallback to wait for acquisition to complete before the callback completes. +
  • Armed (bo)
    + This record signals when the Pilatus is ready to accept trigger pulses. It changes from 0 to 1 + after camserver sends a response to an acquire start command indicating that the Pilatus is ready to + begin taking data. The SNL program sets the record to 0 when acquisition is complete. + This PV should be used by clients to indicate when it is OK to start sending trigger pulses + to the Pilatus. If pulses are send before Armed=1 then the Pilatus may miss them, leading to + DMA timeout errors from camserver. +
  • Abort (bo)
    + This record aborts an acquisition. Setting this record to 1 stops whatever acquisition is in progress. + If pilatusROI + was currently acquiring imges (Acquire=Busy) then this record will cause the "K" (Kill) command to + be sent to camserver. It will also set Acquire back to Done. +
  • StatusMessage (stringout)
    + This record contains a string that provides status information on the state of pilatusROI. It contains + strings like "Starting exposure", "Waiting for TIFF file", etc. +
+

+

+ Detector related records

+
    +
  • ThresholdEnergy (ao)
    + This record controls the threshold energy in eV. +
  • Gain (mbbo)
    + This record controls the value of Vrf, which in determines the shaping time and gain of the + input amplifiers. The allowed values are: +
      +
    • 0 ("Fast/Low") Fastest shaping time (~125ns) and lowest gain. +
    • 1 ("Medium/Medium") Medium shaping time (~200 ns) and medium gain. +
    • 2 ("Slow/High") Slow shaping time (~400 ns) and high gain. +
    • 3 ("Slow/Ultrahigh") Slowest peaking time (? ns) and highest gain. +
    +
+

+

+ File name related records

+The FilePath, Filename, FileNumber, and FileFormat PVs are all used to create the final FullFilename. +
    +
  • FilePath (waveform, FTVL=UCHAR, NELM=256)
    + This record controls the path for saving images. It must be a valid path for camserver + and for the SNL program. + If camserver and the EPICS IOC are not running on the same machine then soft links + will typically be used to make the paths look identical.

    + This record is an EPICS waveform record with FTVL=UCHAR and NELM=256. + This removes the 40 character + restriction on path name lengths that arise if an EPICS "string" PV is used. medm allows one to + edit and display such records correctly. EPICS clients will typically need to convert the path + name from a string to an integer or byte array before sending the path name to EPICS. This is easy + to do in clients like SPEC, Matlab, and IDL. +

  • Filename (stringout)
    + This record controls the base file name for saving images. It is limited to 40 characters. +
  • FileNumber (longout)
    + This record controls the number of the next file for saving images. +
  • FileFormat (stringout)
    + This record controls how the FilePath, Filename, and FileNumber are combined to form the final + file name. The format string is limited to 40 characters. + The final file name (which can be up to 256 characters) is created with the following code: +
    +            epicsSnprintf(FullFilename, sizeof(FullFilename), FileFormat, 
    +                          FilePath, Filename, FileNumber);
    +     
    + FilePath, Filename, FileNumber are converted in that order with FileFormat. + The default file format is "%s%s%4.4d.tif". The first %s converts the FilePath, + followed immediately by another %s for Filename. + FileNumber is formatted with %4.4d, which results in a + fixed field with of 4 digits, with leading zeros as required. Finally, the .tif extension + is added to the file name. This will make camserver save files in TIFF format with that extension. +

    + This mechanism for creating file names is very flexible. Other characters, such as _ can be put + in Filename or FileFormat as desired. If one does not want to have FileNumber in the file name + at all, then just omit the %d format specifier from FileFormat. +

    + Note that when saving multiple images (NImages>1) camserver has its own rules for creating the + names of the individual files. The rules are as follows: +

    + The name constructed using the above algorithm is used as a basename. + The following examples show the interpretation of the basename. +

    +     Basename            Files produced
    +     
    +     test6.tif           test6_00000.tif,  test6_00001.tif, ...
    +     test6_.tif          test6_00000.tif,  test6_00001.tif, ...
    +     test6_000.tif       test6_000.tif,    test6_001.tif, ...
    +     test6_014.tif       test6_014.tif,    test6_015.tif, ...
    +     test6_0008.tif      test6_0008.tif,   test6_0009.tif, ...
    +     test6_2_0035.tif    test6_2_0035.tif, test6_2_0036.tif, ...
    +     
    + + The numbers following the last '_' are taken as a format template, + and as a start value. The minimum format is 3; there is no maximum; the + default is 5. The format is also constrained by the requested number of images. +
  • AutoIncrement (bo)
    + This record controls whether FileNumber is automatically incremented by 1 each time an acquisition + completes. 0=No, 1=Yes. +
  • FullFilename (waveform, FTVL=UCHAR, NELM=256)
    + This is a read-only record that contains the full filename of the current file, after the above + code has been executed. Note that the FullFilename is not constructed until Acquire is set to 1. +
+

+ ROI related records

+The SNL code supports up to 32 rectangular ROIs. Fewer ROIs can be used by loading the pilatusROI_N.template file +fewer than 32 times, and passing NROIS<32 to the SNL program when it is started. In the following +record names $(N) is a number from 1 to 32. ROIs can be any size from a single pixel to the entire +chip. +An ROI is considered invalid and ignorred by the SNL program if any of Xmin, Xmax, YMin, YMax is less than 0 or +greater than the size of the chip in that direction. The ROI is also invalid if Xmin>XMax or YMin>YMax. +
    +
  • ROI$(N)XMin (longout)
    + The minimum value of X for ROI N. +
  • ROI$(N)XMax (longout)
    + The maximum value of X for ROI N. +
  • ROI$(N)YMin (longout)
    + The minimum value of Y for ROI N. +
  • ROI$(N)YMax (longout)
    + The maximum value of Y for ROI N. +
  • ROI$(N)BgdWidth (longout)
    + The background width ROI N. ROI$(N)BgdWidth<=0 means no background subtraction is done, and + ROI$(N)NetCounts=ROI$(N)TotalCounts. The background region is defined as follows: +
      +
    • If ROI$(N)BgdWidth=1 then the background is one pixel outside of the perimeter of the ROI, + i.e the single-pixel wide + rectangular box defined by ROI$(N)XMin-1, ROI$(N)XMax+1, ROI$(N)YMin-1, and ROI$(N)YMax+1. + However, if any of those locations would be outside of the chip then that dimension is changed + to be on the perimeter of the ROI. This ensures that + a valid background region can be defined even if the ROI touches the edge of the detector. +
    • If ROI$(N)BgdWidth>1 then the background is a rectangular box of width ROI$(N)BgdWidth, moving + out from the ROI location defined above. However, if the background would go + beyond the edge of the detector, then it is clipped to the largest valid width in + that direction. +
    +
  • ROI$(N)TotalCounts (ao)
    + The total counts in ROI N. +
  • ROI$(N)NetCounts (ao)
    + The net counts in ROI N, i.e. the total counts minus the background counts. This is determined + by computing the average number of counts per pixel in the background, and subtracting this from + the counts in the ROI. +
  • ROI$(N)MinCounts (longout)
    + The minimum counts in any pixel in ROI N. +
  • ROI$(N)MaxCounts (longout)
    + The maximum counts in any pixel in ROI N. This can be useful to monitor to make sure that the 20-bit + limit of 1,048,575 is not being approached. +
  • ROI$(N)Label (stringout)
    + The string label for ROI N. +
  • ROI$(N)WFTotalCounts (waveform, FTVL=DOUBLE, NELM=$(NCHANS))
    + The total counts in ROI N in a waveform record. Valid when NImages>1. +
  • ROI$(N)WFNetCounts (waveform, FTVL=DOUBLE, NELM=$(NCHANS))
    + The net counts in ROI N in a waveform record. Valid when NImages>1. +
  • MinWFUpdateTime (ao)
    + This record controls the minimum time between posting the ROI$(N)WFTotalCounts and ROI$(N)WFNetCounts + arrays to EPICS. + This should normally be set to a value >0.1 second to reduce the network bandwidth use. The SNL + program always posts the arrays when acquisition completes, so that the final ROI data for the + series is sent to EPICS. +
+The ROI$(N)TotalCounts and ROI$(N)NetCounts are computed as each TIFF file is read, regardless of the +value of NImages. The ROI$(N)WFTotalCounts and ROI$(N)WFNetCounts arrays are computed and posted to +EPICS when acquiring data with NImages>1. The first element in each array is the for the first image +in the series, etc. + +

+ Image related records

+
    +
  • ImageData (waveform, FTVL=LONG, NELM=$(NPIXELS))
    + The detector image data as an EPICS waveform record. In order for EPICS clients + to receive this data they must be built with EPICS R3.14 (not R3.13), and the environment variable + EPICS_CA_MAX_ARRAY_BYTES on both the EPICS IOC computer and EPICS client computer must be set to a value + at least as large as the image size in bytes, i.e. to 379860 or more. +
  • NXPixels (longout)
    + The number of pixels in the X direction on the detector. The SNL program needs to know this value. + EPICS clients can use this value to reformat ImageData from + a 1-D array to a 2-D array. +
  • NYPixels (longout)
    + The number of pixels in the Y direction on the detector. The SNL program needs to know this value. + EPICS clients can use this value to reformat ImageData from + a 1-D array to a 2-D array. +
  • HighlightROIs (bo)
    + This record controls the whether the SNL program highlights the ROI borders in the image before + sending the images to EPICS. If selected then the pixels on the ROI borders are replaced with the + value of the most intense pixel in the image, so they will always be visible in the display. + 0=No, don't highlight, 1=Yes, highlight. +
  • PostImages (bo)
    + This record controls the whether the SNL program sends ImageData to EPICS. + 0=No, don't send, 1=Yes, send. This can be set to 0 to reduce the network bandwidth use. +
  • MinImageUpdateTime (ao)
    + This record controls the minimum time between posting ImageData to EPICS. + This should normally be set to a value >0.5 second to reduce the network bandwidth use. This + means that not all images may be sent to EPICS. This value is ignorred when AcquireMode=Alignment. +
+ +

+ Bad pixel map related records

+
    +
  • BadPixelFile (waveform, FTVL=UCHAR, NELM=256)
    + This record contains the name of a file to be used to replace bad pixels. + If this record does not point to a valid bad pixel file then no bad pixel mapping is performed. + See the notes on theFilePath regarding using waveform records for long strings. + The bad pixel map + is used before computing the ROIs and before sending ImageData to EPICS. It does not modify + the data in the files that camserver writes. This is a simple ASCII file with the following + format: +
    +      badX1,badY1 replacementX1,replacementY1 
    +      badX2,badY2 replacementX2,replacementY2
    +      ...
    +      
    + The X and Y coordinates range from 0 to NXPixels-1 and NYPixels-1. Up to 100 bad pixels can be defined. + The bad pixel mapping simply replaces the bad pixels with another pixel's value. + It does not do any averaging. It is felt that this is sufficient for the purpose for which + pilatusROI was written, namely fast on-line viewing of ROIs and ImageData. More sophisticated + algorithms can be used for offline analysis of the image files themselves. + The following is an example bad pixel file for the GSECARS detector: +
    +          263,3   262,3
    +          264,3   266,3
    +          263,3   266,3
    +          300,85  299,85
    +          300,86  299,86
    +          471,129 472,129
    +      
    +
  • NBadPixels (longout)
    + The number of bad pixels defined in the bad pixel file. + Useful for seeing if the bad pixel file was read correctly. +
+ +

+ Flat field correction related records

+
    +
  • FlatFieldFile (waveform, FTVL=UCHAR, NELM=256)
    + This record contains the name of a file to be used to correct for the flat field. + If this record does not point to a valid flat field file then no flat field correction is performed. + See the notes on theFilePath regarding using waveform records for long strings. + The flat field file is simply a TIFF file collected by the Pilatus that is used to correct for + spatial non-uniformity in the response of the detector. It should be collected with a spatially uniform + intensity on the detector at roughly the same energy as the measurements being corrected. + When the flat field file is read, the average pixel value (averageFlatField) is computed + using all pixels with intensities > MinFlatField. All pixels with intensity < MinFlatField + in the flat field are replaced with averageFlatField. + When images are collected, before the ROIs are computed, and before the images + are sent to EPICS, the following per-pixel correction is applied: +
    +          ImageData[i] = (averageFlatField * ImageData[i])/flatField[i];
    +      
    +
  • MinFlatField (ao)
    + The mimimum valid intensity in the flat field. This value must be set > 0 to prevent divide by 0 errors. + If the flat field was collected with some pixels having very low intensity then this value can be used to + replace those pixels with the average response. +
  • FlatFieldValid (bo)
    + This record indicates if a valid flat field file has been read. 0=No, 1=Yes. +
+ +

+ Communication related records

+
    +
  • ReadTiffTimeout (ao)
    + This record controls the timeout in seconds between when the SNL program thinks a TIFF file should be ready + to read, and when a timeout will occur. It should be set to several seconds, because there can be delays + for various reasons. One reason is that there is sometimes a delay between when an External Enable + acquisition is started and when the first external pulse occurs. Another is that it can take some time for + camserver processes to finish writing the files. +
  • SendMessage (waveform, FTVL=UCHAR, NELM=256)
    + This read-only record contains the most recent message sent from the SNL program to camserver. +
  • ReplyMessage (waveform, FTVL=UCHAR, NELM=256)
    + This read-only record contains the most recent reply message from camserver to the SNL program. +
  • Connect (bo)
    + Processing this record causes the drvAsynIPPort server to connect to camserver. + This normally happens once in the + startup script, and does not need to be processed again unless Disconnect is processed. +
  • Disconnect (bo)
    + Processing this record causes the drvAsynIPPort server to disconnect from camserver. + This can be used to allow another + program, such as TVX, to temporarily take control of camserver, without restarting the EPICS IOC. Use + the Connect record to reconnect the IOC to camserver. +
+ +

+ Scan related records

+
    +
  • scan1, scan2, scan3, scan4, scanH (sscan)
    + The example IOC startup script loads the scan.sb database from the SSCAN module. This loads 5 sscan + records which can be used to perform up to 4-dimensional scans with any EPICS PV as positioners and + detectors. The scan records are very useful with the Pilatus for scanning the ThresholdEnergy PV + and plotting the counts in an ROI that includes the entire detector. This allows setting the energy + threshold to detect the x-rays of interest. + +

     

    + +

    + EPICS startup script

    +

    +pilatusROI.template is loaded with the following macro parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Macro parameterDescription
    $(DET)PV name prefix. This identifies this Pilatus detector from others that may be + running on the same subnet. +
    $(NXPIXELS)The number of pixels in the X (fast index) direction on the detector. This is 487 for the Pilatus 100K.
    $(NYPIXELS)The number of pixels in the Y (slow index) direction on the detector. This is 195 for the Pilatus 100K.
    $(NPIXELS)The total number of pixels on the detector. This is NXPIXELS*NYPIXELS=94965 for the Pilatus 100K.
    $(PORT)The name of the asyn port connected to the Pilatus via a TCP/IP socket.
    + +

    +pilatusROI_N.template is loaded for each ROI with the following macro parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Macro parameterDescription
    $(DET)PV name prefix. This identifies this Pilatus detector from others that may be + running on the same subnet.
    $(N)The number of this ROI. Starts with 1.
    $(XMIN)The minimum value of X for this ROI. Starts with 0.
    $(XMAX)The maximum value of X for this ROI. Starts with 0.
    $(YMIN)The minimum value of Y for this ROI. Starts with 0.
    $(YMAX)The maximum value of Y for this ROI. Starts with 0.
    $(BGD_WIDTH)The background width for this ROI. + If BGD_WIDTH <=0 then no background subtraction is done, and NetCounts=TotalCounts.
    $(NCHANS)The maximum number of elements in the WFTotalCounts and WFNetCounts waveform arrays. + This sets the maximum value of NImages for collecting ROI arrays.
    + +

    +The pilatusROIs SNL program is started with the following macro parameters: + + + + + + + + + + + + + + + + + + +
    Macro parameterDescription
    DETPV name prefix. This identifies this Pilatus detector from others that may be + running on the same subnet.
    PORTThe name of the asyn port connected to the Pilatus via a TCP/IP socket.
    NROISThe number of ROIs loaded in the substitutions file with pilatusROI_N.template. + Maximum=32.
    + +

    +The following is an example st.cmd startup script: +

    +< envPaths
    +
    +###
    +# Load the EPICS database file
    +dbLoadDatabase("$(PILATUS)/dbd/pilatus.dbd")
    +pilatus_registerRecordDeviceDriver(pdbbase)
    +
    +###
    +# Create the asyn port to talk to the Pilatus on port 41234.
    +drvAsynIPPortConfigure("pilatus","gse-pilatus1:41234")
    +# Set the input and output terminators.
    +asynOctetSetInputEos("pilatus", 0, "\030")
    +asynOctetSetOutputEos("pilatus", 0, "\n")
    +# Define the environment variable pointing to stream protocol files.
    +epicsEnvSet("STREAM_PROTOCOL_PATH", "$(PILATUS)/pilatusApp/Db")
    +
    +###
    +# Specify where save files should be
    +set_savefile_path(".", "autosave")
    +
    +###
    +# Specify what save files should be restored.  Note these files must be
    +# in the directory specified in set_savefile_path(), or, if that function
    +# has not been called, from the directory current when iocInit is invoked
    +set_pass0_restoreFile("auto_settings.sav")
    +set_pass1_restoreFile("auto_settings.sav")
    +
    +###
    +# Specify directories in which to to search for included request files
    +set_requestfile_path("./")
    +set_requestfile_path("$(AUTOSAVE)", "asApp/Db")
    +set_requestfile_path("$(CALC)",     "calcApp/Db")
    +set_requestfile_path("$(SSCAN)",    "sscanApp/Db")
    +set_requestfile_path("$(PILATUS)",  "pilatusApp/Db")
    +
    +###
    +# Load the save/restore status PVs
    +dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=PILATUS:")
    +
    +###
    +# Load the substitutions for for this IOC
    +dbLoadTemplate("PILATUS_all.subs")
    +# Load an asyn record for debugging
    +dbLoadRecords("$(ASYN)/db/asynRecord.db", "P=PILATUS:,R=asyn1,PORT=pilatus,ADDR=0,IMAX=80,OMAX=80")
    +
    +# Load sscan records for scanning
    +dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=PILATUS:,MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=2048")
    +
    +###
    +# Set debugging flags if desired
    +#asynSetTraceIOMask("pilatus",0,2)
    +#asynSetTraceMask("pilatus",0,3)
    +
    +###
    +# Start the IOC
    +iocInit
    +
    +###
    +# Save settings every thirty seconds
    +create_monitor_set("auto_settings.req", 30, "P=PILATUS:")
    +
    +###
    +# Start the SNL program
    +seq(pilatusROIs, "DET=PILATUS:, PORT=pilatus, NROIS=16")
    +
    + +The following is the substutitions file PILATUS_all.subs referenced above. +It creates 16 ROIS, and defines 5 valid ones: the entire chip, and the 4 quadrants of the chip: +
    +ffile $(PILATUS)/db/pilatusROI.template {
    +pattern 
    +{DET,       NXPIXELS,  NYPIXELS,  NPIXELS,   PORT}
    +{PILATUS:,       487,       195,    94965,   pilatus}
    +}
    +
    +file $(PILATUS)/db/pilatusROI_N.template {
    +pattern 
    +{DET,       N,  XMIN,   XMAX,  YMIN,  YMAX,  BGD_WIDTH,  NCHANS}
    +{PILATUS:,  1,     0,    486,     0,   194,          1,    2000}
    +{PILATUS:,  2,     0,    243,     0,    97,          1,    2000}
    +{PILATUS:,  3,     0,    243,    98,   194,          1,    2000}
    +{PILATUS:,  4,   244,    486,     0,    97,          1,    2000}
    +{PILATUS:,  5,   244,    486,    98,   194,          1,    2000}
    +{PILATUS:,  6,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:,  7,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:,  8,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:,  9,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 10,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 11,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 12,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 13,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 14,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 15,    -1,     -1,    -1,    -1,          1,    2000}
    +{PILATUS:, 16,    -1,     -1,    -1,    -1,          1,    2000}
    +}
    +
    + +

     

    + +

    + MEDM screens

    +

    +The following show the MEDM screens that are used to control the pilatusROI software.

    + +

     

    + +pilatusROI.adl is the main screen used to control the pilatusROI SNL +program. All records except those that are specific to each ROI are accessed through this +screen. +

    pilatusROI.adl

    +
    + +

     

    + +pilatus8ROIs.adl is used to define the ROIs, and to display the statistics for +each ROI. In this example there are 2 valid ROIs defined. ROI 1 is a small rectangle near the center +containing the Bragg diffraction peak from a crystal. ROI 2 is the entire chip. +

    pilatus8ROIs.adl

    +
    + +

     

    + +pilatusROI_waveform.adl is used to plot the net or total counts in an ROI when +NImages>1. In this example the plot is the net counts in ROI 1 as the diffractometer chi was scanned ++- 1 degree with 1000 points at .02 seconds/point. This was done with the SPEC command +
    +lup chi -1 1 1000 .02
    +
    +using trajectory scanning on a Newport kappa diffractometer. This was a compound motor scan with the +Newport XPS putting out pulses every .02 seconds. These pulses triggered the Pilatus in External Enable mode. +The pilatusROI program read each TIFF file as it was created and updated this plot every 0.2 seconds. +The total time to collect this scan with 1000 images was 20 seconds. +

    pilatusROI_waveform.adl

    +
    + +

     

    + +scan_more.adl is used to define a scan. In this example the sscan record is set up +to scan the ThresholdEnergy PV and to collect the total counts in ROI2, which was defined to include +the entire detector. +

    scan_more.adl

    +
    + +

     

    + +scanDetPlot.adl is used to plot the results of a scan after it is complete. +In this example the total counts in ROI 2 are plotted as a function of the ThresholdEnergy as it was +scanned from 3000 to 10000 eV in 250 eV steps. The source was Fe55, and the cut-off is at 6 keV, as +expected for the Mn Ka and Mn Kb x-rays that this source produces. +

    scanDetPlot.adl

    +
    + + +

     

    + +asynRecord.adl is used to control the debugging information printed by the asyn TCP/IP driver +(asynTraceIODriver) and the SNL program (asynTraceIODevice). +

    asynRecord.adl

    +
    + +

     

    + +asynOctet.adl can be used to send any command to camserver and display the response. It can +be loaded from the More menu in asynRecord.adl above. +

    asynOctet.adl

    +
    + +

     

    + +

    + IDL Image Display Client

    + +There is an IDL program called epics_image_display +that can be used to display the ImageData PV that pilatusROI sends over EPICS. This IDL +client is available as source code (which requires an IDL license), and also as a pre-built IDL .sav +file that can be run for free under the IDL Virtual Machine. This IDL program can run on any machine that IDL +runs on, and that has the ezcaIDL shareable library built for it. This includes Windows, Linux, Solaris, and Mac. +epics_image_display is included in the +CARS IDL imaging software. + +

    +The control window for epics_image_display is shown below. It has fields to input the name of +the EPICS PV with the image data, which is $(DET)ImageData in the case of pilatusROI. It also has fields +for the number of pixels in the X and Y directions. This is needed because EPICS waveform records are +1-dimensional only, and so do not contain the information on the number of rows and columns in the image. + +

    Main window for IDL epics_image_display

    +
    + +

     

    + +epics_image_display uses the routine +image_display.pro +to display the images. This routine displays row and column profiles as the cursor is moved. It allows +changing the color lookup tables, and zooming in and out with the left and right mouse buttons. The following +is an example of image_display displaying a Pilatus image with an Fe55 source in front of the detector. + +

    IDL image_display with Fe55 radioactive source

    +
    + +

     

    + +

    + SPEC interface

    + +At the GSECARS beamlines (13-ID-C and 13-BM-C) at the APS we use SPEC to control our Newport diffractometers. +We have added and modified SPEC macros to use pilatusROI to treat the Pilatus detector as a SPEC +counter. This works in both traditional step-scanning mode, as well as in +trajectory scanning mode. +Here are some snippets from the SPEC macros for the Pilatus. We can supply the source files on request. + +
    +# need some more globals (kludge)
    +global    PILATUS_ROI_PV    
    +global    PILATUS_IMGPATH_PV
    +global    PILATUS_FNAME_PV
    +global    PILATUS_FILENUMBER_PV
    +global    PILATUS_FILEFORMAT_PV
    +global    PILATUS_EXPSRTM_PV
    +global    PILATUS_NFRAME_PV
    +global    PILATUS_EXPPRD_PV
    +global    PILATUS_NEXPFRM_PV
    +global    PILATUS_ACQ_PV
    +global    PILATUS_ACQMODE_PV
    +
    +###############################################################
    +def _setup_img '{
    +     local j, str
    +		
    +     # PILATUS_PREFIX should be detector aquisition pv (GSE-PILATUS1:)
    +     if ( PILATUS_PREFIX == "") PILATUS_PREFIX = "GSE-PILATUS1:"
    +     PILATUS_PREFIX = getval("Enter PILATUS pv prefix",PILATUS_PREFIX)
    +
    +     # rois pvs
    +     PILATUS_ROI_PV    = PILATUS_PREFIX "ROI1NetCounts"
    +     PILATUS_IMGPATH_PV = PILATUS_PREFIX "FilePath"
    +     PILATUS_FNAME_PV   = PILATUS_PREFIX "Filename"
    +     PILATUS_FILENUMBER_PV   = PILATUS_PREFIX "FileNumber"
    +     PILATUS_FILEFORMAT_PV = PILATUS_PREFIX "FileFormat"
    +     PILATUS_EXPSRTM_PV = PILATUS_PREFIX "ExposureTime"
    +     PILATUS_NFRAME_PV  = PILATUS_PREFIX "NImages"
    +     PILATUS_EXPPRD_PV  = PILATUS_PREFIX "ExposurePeriod"
    +     PILATUS_NEXPFRM_PV = PILATUS_PREFIX "NExposures"
    +     PILATUS_ACQ_PV     = PILATUS_PREFIX "Acquire"
    +     PILATUS_ACQMODE_PV = PILATUS_PREFIX "AcquireMode"
    +...
    +
    +def epics_pilatus_count '{
    +...
    +     # write to data base fields
    +     # Need to convert path from string to byte array
    +     # Note: we use the "wait" parameter in epics_put here (new to spec5.7.02) so that
    +     # it uses ca_put_callback, to know that all PVs have been processed
    +     # before we start counting.  Use 1 second timeout, will actually be
    +     # much faster than this unless something is wrong.
    +     array _temp[256]
    +     _temp = PILATUS_IMAGE_DIR
    +     # Do not change path for now
    +     #epics_put(PILATUS_IMGPATH_PV,_temp, 1)
    +     epics_put(PILATUS_FNAME_PV,img_fname, 1)
    +     epics_put(PILATUS_FILENUMBER_PV,NPTS, 1)
    +     epics_put(PILATUS_FILEFORMAT_PV,_fileformat, 1)
    +     epics_put(sc_prtm_pv,cnt_time_val, 1)
    +     epics_put(PILATUS_EXPSRTM_PV,cnt_time_val, 1)
    +     epics_put(PILATUS_ACQMODE_PV,0, 1)  # Internal trigger 
    +     epics_put(PILATUS_NFRAME_PV, 1, 1)
    +     epics_put(PILATUS_NEXPFRM_PV, 1, 1)
    +
    +
    +def user_getcounts '{
    +    local pv_roi, j, pv
    +
    +...
    +   # using image_count routine  
    +    } else if ( EPICS_COUNT == 4 ) {
    +        S[iroi] = 0
    +        S[iroi] = epics_get(PILATUS_ROI_PV)
    +
    + +

     

    + +

    + Performance measurements

    + +The following measurements were done to demonstrate the performance that can be obtained with pilatusROI. +
      +
    1. AcquireMode=Internal, NImages=1000, ExposureTime=.005, ExposurePeriod=.01, NExposures=1. + The time to collect this series should be exactly 10.0 seconds. + The actual time was measured using the EPICS camonitor program. It printed the time when + acquisition was started (Acquire changed to Busy) and when acquisition was complete (Acquire changed to Done). + The time was 10.274 seconds. This includes the time for camserver to save all 1000 images to disk (366 MB), + and for pilatusROI to read each file, correct the bad pixels and flat field, compute the ROIs, and post the ROIs + to EPICS. It also posted the images to EPICS at 1Hz (10 images total). The total additional time was less + than 0.3 seconds for all 1000 images. +
    2. AcquireMode=Internal, NImages=1, ExposureTime=.01, NExposures=1. + An EPICS sscan record was used to collect 1000 points. + There were no positioner PVs (to eliminate motor overhead). + The only detector trigger was the pilatusROI Acquire PV. The only detector PV was ROI1TotalCounts. + In this mode camserver is being told to individually collect each file. + If there were no overhead then time to collect this series should be exactly 10.0 seconds. + The actual time measured using the EPICS camonitor program was 49.161 seconds. + The overhead is thus 39.161 seconds, or 39 ms per point. + In this single-frame mode pilatusROI is thus able to collect >20 images/second. + For comparison, another measurement was done using the same EPICS sscan record, + but using a Joerger VSC16 scaler as the detector + trigger and detector. The preset time was also .01 seconds. The elapsed time for a 1000 point scan was + 16.068 seconds, so the overhead was 6.068 seconds, or 6 ms per point. +
    3. AcquireMode=Ext. Enable, NImages=1000, NExposures=1. + SPEC was used to collect 1000 points using + trajectory scanning mode + with the Newport XPS motor controller. The following SPEC command was used: +
      +      lup chi -2 2 1000 .015
      +      
      + This tells SPEC to do a relative scan of the chi axis from -2 degrees to +2 degrees with 1000 points + at .015 seconds/point. On our kappa diffractometer this entails a coordinated motion of the phi, kappa + and omega axes. The EPICS trajectory scanning software downloads the non-linear trajectory that SPEC computes + into the XPS controller, which executes it. As the motors are moving the XPS outputs synchronization pulses + at the period of the collection time, .015 seconds in this case. These pulses are stretched + (see Hardware notes below) and used as the external input to the Pilatus. + The time to execute this scan should be 15.0 seconds. The actual time was 16.3 seconds, measured + using camonitor on the Acquire PV. Again, this includes the time for camserver to save all 1000 images to disk + (366 MB), and for pilatusROI to read each file, correct the bad pixels and flat field, compute the ROIs, and post the ROIs + to EPICS. It also posted the images to EPICS at 1Hz (15 images total). The total additional time was less + than 1.3 seconds for all 1000 images. As soon as the acquisition was complete SPEC plotted the net counts in + the first ROI (containing the Bragg peak) as follows: +

      1000 point SPEC scan with 15 ms per point collected in 16.3 seconds

      +
      +

      + For comparison this identical scan was executed in traditional step-scanning mode, where the motors stopped + at each point in the scan. The Pilatus was run in Internal mode with NImages=1. The total time for the scan + was 870 seconds (more than 14 minutes), compared to 16.3 seconds in trajectory mode. Most of this overhead + is the settling time for the motors, with only a small fraction due to the Pilatus single-exposure mode. The + trajectory scanning mode is thus more than 50 times faster to execute the identical SPEC scan. +

    + +

     

    + +

    + Hardware notes

    + +

    Trigger pulses

    +The Pilatus supports 3 types of external triggering. In External Trigger mode (the camserver ExtTrigger command) +the Pilatus uses the programmed values of ExposureTime, ExposurePeriod, NImages and NExposures. It waits for +a single external trigger, then waits for Delay seconds and then collects the entire sequence. It is very similar +to Internal mode with NImages>1, except that it waits for a trigger to begin collecting the sequence. + +

    In External Enable mode (the camserver ExtEnable command) the Pilatus uses the external signal to control acquisition. +Only NImages and NExposures are used, ExposureTime and ExposurePeriod are not used. When the signal +is high the detector counts, and on the transition to low it begins its readout. + +

    In External MultiTrigger Mode (the camserver ExtMTrigger command) the Pilatus uses the programmed ExposureTime, +in addition to NImages and NExposures. Each external trigger pulse causes the Pilatus to collect one image +at the programmed exposure time. This mode works well with a trigger source like the Newport motor controllers +or the SIS380x multichannel scaler, +that put out a short trigger pulse for each image. One only needs to take care that the time between external trigger +pulses is at least 4msec longer than the programmed exposure time, to allow time for the detector to read out before +the next trigger pulse arrives. + +

    When using the External Enable mode, we use an inexpensive analog pulse generator +to convert the trigger pulses from the MM4005 and XPS to a form suitable for External Enable mode +with the Pilatus. This is the solution we have developed that seems to be reliable: +

      +
    • The synchonization pulses from the Newport MM4005 or XPS controller are input into the external next pulse + (channel advance, control signal 1) input of the SIS3801 multiscaler. + This is the normal configuration used for MCS counting + without the Pilatus in trajectory scanning mode. +
    • The Copy In Progress (CIP) output of the SIS3801 (control signal 5) is connected to the Trigger Input of a + Tenma TGP110 10 MHz Pulse Generator. CIP will output a pulse whenever the SIS3801 does a channel advance, + either in external mode with the motor controller pulse input, or in internal timed channel advance mode. + The TGP100 Pulse Generator is configured as follows: +
        +
      • Trigger Input connected to CIP output of SIS3801. +
      • Triggered mode. +
      • Complement output. +
      • Pulse duration set with knobs to 3msec. +
      • TTL Output connected to the External Input of the Pilatus. +
      +
    • With this configuration the SIS3801 CIP output is normally at 5V, and outputs a 0V pulse 1 microsecond long. + The trailing (rising) edge of that pulse triggers the TGP110. The TGP110 TTL output is also normally at 5V, + and outputs a 0V pulse 3 milliseconds long each time the SIS3801 pulses. That output is connected to the + Pilatus External Input. In External Enable mode when Pilatus External Input is + high the Pilatus is counting. When the External Input is low the Pilatus reads out. The readout time is + set via the knobs on the pulse generator to be 3 ms, which is close to the minimum time allowed on the + Pilatus. +
    +The Tenma TGP110 seems to be currently called a Tenma 72-6860, and lists for about $350 new +at Newark. + +

    Detector Voltage

    +When we were initially testing the Pilatus in the lab, we had many errors in External Enable mode, where it did +not seem to be seeing the external pulses. camserver would get DMA timeouts, and need to be restarted. Dectris +said these were happening because the cables on our detector are longer than normal, and the voltage +drop from the power supply to the detector was leading to marginal voltage values. They suggested shortening +the cables or increasing the supply voltage slightly. When moving the detector to the hutch these +problems initially went away. However, they then recurred, and we fixed the problem by increasing +the power supply voltage from 4.4 to 4.7 volts at the detector. +

    +Dectris has since informed me that they have increased the power supply voltage on all new Pilatus systems, +so this should no longer be an issue. + + +

     

    + +

    + Restrictions

    +The following are some current restrictions of the pilatusROI SNL program: +
      +
    • Limited to TIFF file format. + camserver can save files in other formats, but pilatusROI can currently only read TIFF files. + Furthermore, it + has a very simple TIFF reader. It does not read the TIFF tags at all, but simply assumes that there + is a 4096 byte header, followed by the 32-bit image data. The size of the image data is controlled + by the NXPixels and NYPixels PVs, which thus must be correctly set. +
    • The EPICS IOC should be run on the same computer as camserver. + This is not strictly necessary, and places a small additional load on the CPU and network + on that computer. However, we have found that TIFF files are available to be read within 10ms after + camserver says they have been written if the IOC is running on the same machine as camserver. This is true + even if the files are being saved on a remote NFS or SMB file system. On the other hand, if the IOC and + camserver are running on separate machines, then the filesystem can wait up to 1 second after camserver + says the TIFF file has been written before the IOC can read it. This is true even if the files are being + written to the computer that the IOC is running on! This 1 second delay is often unacceptable for fast + single-exposure scans, i.e. with NImages=1. +
    • pilatusROI keeps retrying to read each TIFF file until + the modification date of the TIFF file is after the time that the exposure command was issued. + If it did not + do this check then it could be reading and displaying old files that happen to have the same name as the + current files being collected. This check requires that the computer that is running the soft IOC must + have its clock well synchronized with the + clock on the computer on which the files are being written + (i.e. the computer generating the file modification time). + If the clocks are not synchronized then the files may appear to be stale when they are not, + and pilatusROI will time out. pilatusROI actually tolerates up to 10 second clock skew betweeen the computers + but any more than this may lead to problems. +
    • The Abort PV does not always work because camserver does not reliably implement the "K" command to stop + an exposure sequence. In particular with NImages>1 camserver seems to often ignore + the K command completely, even with exposure times/periods as long as 10 seconds. + With NImages=1 it does kill the exposure after a few seconds. +
    • The following items are hardcoded in the SNL program. They can be changed before compiling if necessary. + Some could be changed to be EPICS PVs, so they could be controlled at run-time, but others must be defined + at compile time because of limitations in the SNL semantics. +
        +
      • MAX_MESSAGE_SIZE=256 The maximum size of message to/from camserver. +
      • MAX_FILENAME_LEN=256 The maximum size of a complete file name including path and extension. +
      • FILE_READ_DELAY=.01 seconds. The time between polling to see if the TIFF file exists + or if it is the expected size. +
      • MAX_BAD_PIXELS=100 The maximum number of bad pixels. +
      • MAX_ROIS=32 The maximum number of ROIs +
      • MAX_CHANS=2000 The maximum number of points in the ROI waveform arrays. +
      • MAX_PIXELS=94965 The maximum number of pixels in the ImageData array. Because of SNL semantics + limitations this value must be defined at compile time, and cannot be changed at run time. +
      • MAX_READ_ERRORS=3 The maximum number of TIFF file read errors before the SNL gives up and aborts + acquisition. +
      +
    + + + diff --git a/documentation/areaDetectorReleaseNotes.html b/documentation/areaDetectorReleaseNotes.html new file mode 100755 index 0000000..15b8aef --- /dev/null +++ b/documentation/areaDetectorReleaseNotes.html @@ -0,0 +1,20 @@ + + + +areaDetectorReleaseNotes.html + + +

    areaDetector Release Notes

    + +

    Release 1-0beta1 (21-Mar-2008)

    +
      +
    • Initial release, not nearly complete or debugged yet. +
    + +
    + Suggestions and Comments to:
    + Mark Rivers : + (rivers@cars.uchicago.edu)
    +
    + +