[NeXus-tech] Updated proposal for multi-module detectors

Herbert J. Bernstein yayahjb at gmail.com
Thu Jun 5 03:22:19 BST 2014


To:    Interested Parties
From:  H. J. Bernstein
Re:    Open issues for NeXus handling of multi-module detectors

There are some issues that need to be resolved to finish the definitions
for the handling of the Eiger, FEL, Pilatus 12M-DLS and other multi-
module detectors:

   1.  The handling of the data itself;
   2.  The association of axes with the data;
   3.  The handling of array sections or regions of interest.

This is a revised proposal reflecting discussion in the NeXus Technical
Committee e-meeting of 4 Jun 2014.

Please note that for the CSPAD in particular resolution of these issues
in becoming time-critical and, with delivery of Eiger detectors already
started and files being written in the earlier Dectris HDF5 format,
prompt resolution of these issues would, hopefully, reduce the number of 
images
in the earlier format needing different processing from those that will
be in the final format.

1.  The handling of the data itself.

The current Dectris Eiger specification is for several data arrays, each of
which will contain a significant number of images.  There are multiple 
modules
per detector, but the current plan is to treat the images as if they 
came from
one large panel.  Dectris has proposed having several NXData groups with 
names
data_xxxxxx, but each would actually be a link to an external file 
data:NXdata
group.  Each array consists of a number of complete images drawn from 
multiple
modules.  The compression logic uses one chunk per image.  A single scan is
likely to involve multiple arrays.  The Dectris design assumes a master
file with most of the metadata an a significant number of external files 
with the
actual data.  For the largest Eigers, there would probably be about 50 
images per
data block.  For smaller Eigers there could be several hundred to a few 
thousand
images per data block.

The CSPAD proposal from Aaron Brewster proposal is for several master 
files,
one per run, with the metadata for metrology of the detector, linked to 
multiple
external files with the actual data, the wavelength for each image and
a timestamp for each image.  There are 64 ASICs in the CSPAD, so for
each run there would be some numtiple of 64 data blocks organized by 
ASIC x,y
and frame number, organized with about 50 -- 500 images per data block.

The Pilatus 12M-DLS with produce images from a cylinder of detector modules,
organized into 24 rows of 5 modules per row.  The entire image will be read
out as if coming from one large panel, but it is important to have access
to each row (if not each module) separately.

2.  Association of axes with the data.

For these detectors, it is essential to be able to associate each pixel 
with its
position in space.  To get this information, we need both information 
about the
positions of pixels relative to the detector and about the position of 
the detector in space.

For the Eiger, even though detail module positioning information is 
available,
the entire detractor is treated as if it were a uniform array of pixels,
so an only two axes for the two orthogonal edges of the detector are needed.

For the CSPAD, it is essential to determine positions on a finer grain,
so many more axes are needed.   For the Pilatus-12M-DLS at a minimum 
each of the
24 rows needs two axes.

3.  The handling of array sections or regions of interest.

For the Pilatus-12M-DLS, the data from each planar row will be contained 
within a larger
array of 12 megapixels.  Tobias Richter has suggested similar 
aggregation for the CSPAD
and use os something similar to the Dectris region_of_interest field to 
associate axis
information with a portion of an array.  After discussion in the NeXus 
technical committee,
use of the fields in NXdetector_module was chosen instead.

The proposed solution:

We propose the following approach to implement the above requirements:

A.  Inclusion of an arbitrary number of NXdata groups with different 
names in NXentry,
and multiple NXdetector groups with different names in NXentry.

B.  For the CSPAD, we propose a structure similar to that for the Eiger, 
with
     all the metrology data gathered under
     NXinstrument/NXtransformations
     and
     NXinstrument/NXdetector/NXtransformations
  for multiple NXdetector groups, one for the overall
  detector and then 64 nested NXdetector groups with the
  axis information for the data blocks.


Master file:

     * entry:NXentry
           /ELE_D0Q0S0A0 -> <subfile_name>/entry/ELE_D0Q0S0A0
           /ELE_D0Q0S0A1 -> <subfile_name>/entry/ELE_D0Q0S0A1
             ...
           /instrument:NXinstrument
                 /transformations:NXtransformations
                      /AXIS_SOURCE
                        @transformation_type="general"
                        @equipment_component="source"
                        @depends_on="."
                        @vector=[0,0,-1]
                      /AXIS_GRAVITY
                        @transformation_type="general"
                        @equipment_component="gravity"
                        @depends_on="."
                        @vector=[0,-1,0]

                 /CSPAD_FRONT:NXdetector
                    /transformations:NXtransformations
                      /AXIS_D0_Z
                        @transformation_type="translation"
                        @equipment_component="detector_arm"
                        @depends_on="."
                        @vector=[0,0,-1]
                      /AXIS_D0_Y
                        @transformation_type="translation"
                        @equipment_component="detector_arm"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0_Z"
                        @vector=[0,1,0]
                      /AXIS_D0_X
                        @transformation_type="translation"
                        @equipment_component="detector_arm"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0_Y
                        @vector=[-1,0,0]
                      /AXIS_D0_R
                        @transformation_type="rotation"
                        @equipment_component="detector_arm"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0_X"
                        @vector=[0,0,-1]
                        @offset=[0,0,0]
                        @offset_units="mm"
                      /FS_D0Q0
                        @transformation_type="rotation"
                        @equipment_component="detector_quadrant"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0_R"
                        @vector=[0,0-1]
                        @offset=[49.6,43.6,0.01203125]
                        @offset_units="mm"
                      /FS_D0Q0S0
                        @transformation_type="rotation"
                        @equipment_component="detector_sensor"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/FS_D0Q0"
                        @vector=[0.000974376302058 0.00044773585801 
-0.999999425062]
                        @offset=[-11.304125,-23.19540625,-0.00753125]
                        @offset_units="mm"
                      /FS_D0Q0S0A0
                        @transformation_type="rotation"
                        @equipment_component="detector_asic"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/FS_D0Q0S0"
                        @vector=[0,0,-1]
                        @offset=[10.835,0.0,0.0]
                        @offset_units="mm"
                      /AXIS_D0Q0S0A0_S
                        @transformation_type="translation"
                        @equipment_component="detector_asic"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/FS_D0Q0S0A0"
                        @vector=[0,-1,0]
                        @offset=[10.670000 10.175000 0.0]
                        @offset_units="mm"
                      /AXIS_D0Q0S0A0_F
                        @transformation_type="translation"
                        @equipment_component="detector_asic"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0Q0S0A0_S"
                        @vector=[-1,0,0]
                        @offset=[0,0,0]
                        @offset_units="mm"
                      /FS_D0Q0S0A1
                        @transformation_type="rotation"
                        @equipment_component="detector_asic"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/FS_D0Q0S0"
                        @vector=[0,0,1]
                        @offset=[-10.835 0.0 0.0]
                        @offset_units="mm"
                      /AXIS_D0Q0S0A1_S
                        @transformation_type="translation"
                        @equipment_component="detector_asic"
                        
@depends_on="/entry/instrument/CSPAD_FRONT/transformations/FS_D0Q0S0A1"
                        @vector=[0,-1,0]
                        @offset=[10.670000,10.175000,0.0]
                        @offset_units="mm"
                      ...

                   /ELE_D0Q0S0A0:NXdetector
                       /data->/entry/ELE_D0Q0S0A0
                       
/depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0Q0S0A0_S"
                   /ELE_D0Q0S0A1:NXdetector_module
                       /data->/entry/ELE_D0Q0S0A1
                       
/depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0Q0S0A1_S"
                   /ELE_D0Q0S1A0:NXdetector_module
                       /data->/entry/ELE_D0Q0S1A0
                       
/depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0Q0S1A0_S"
                   /ELE_D0Q0S1A1:NXdetector_module
                       /data->/entry/ELE_D0Q0S1A1
                       
/depends_on="/entry/instrument/CSPAD_FRONT/transformations/AXIS_D0Q0S1A1_S"
                    ... for 64 elements

Sub-files:

     /entry/NXentry
         /ELE_D0Q0S0A0:NXdata
           /data=[...]
             @axes="FRAME:AXIS_D0Q0S0A0_S:AXIS_D0Q0S0A0_F"
             links for the actual axes back to the master file
         /ELE_D0Q0S0A1:NXdata
           /data=[...]
             @axes="FRAME:AXIS_D0Q0S0A1_S:AXIS_D0Q0S0A1_F"
             links for the actual axes back to the master file
           links for the actual axes back to the master file
         ...
         /sample:NXsample
           /beam:NXbeam
             /wavelength=[...]



C.  For the Pilatus 12M-DLS, we need to identify segments of arrays and 
handle them
similarly to the detector module data in case B.   The individual rows 
will have
their relevant blocks of pixels in the master full array of data 
identified by
fields in detector_module groups.

   /entry:NXentry
     /data:NXdata
       /data=[full data array] (may be a link to an external data file)
     /instrument:NXinstrument
       /detector:NXdetector
         /transformations:NXtransformations
            /DETECTOR_ROW_X_01=[0,0.172,0.344,0.516, ...]
              @transformation_type="translation"
              @equipment_component="detector_row_01"
              @depends_on="."
              @vector=[-1,0,0]
              @offset=[232.3,248.393254454976,-32.8941338427585]
              @offset_units="mm"
           /DETECTOR_ROW_Y_01=[0,0.172,0.344,0.516, ...]
              @transformation_type="translation"
              @equipment_component="detector_row_01"
              
@depends_on="/entry/instrument/detector/transformation/DETECTOR_ROW_X_01"
              @vector=[0,0.0646368093781044,0.997908854992989]
              @offset=[0,0,0]
              @offset_units="mm"
           /DETECTOR_ROW_X_02=[0,0.172,0.344,0.516, ...]
              @transformation_type="translation"
              @equipment_component="detector_row_02"
              @depends_on="."
              @vector=[-1,0,0]
              @offset=[232.3,250.537389446829,3.49991273718847]
              @offset_units="mm"
           /DETECTOR_ROW_Y_02=[0,0.172,0.344,0.516, ...]
              @transformation_type="translation"
              @equipment_component="detector_row_02"
              
@depends_on="/entry/instrument/detector/transformation/DETECTOR_ROW_X_02"
              @vector=[0,-0.0808599954289913,0.996725469293939]
              @offset=[0,0,0]
              @offset_units="mm"
           /DETECTOR_ROW_X_03=[0,0.172,0.344,0.516, ...]
              @transformation_type="translation"
              @equipment_component="detector_row_03"
              @depends_on="."
              @vector=[-1,0,0]
              @offset=[232.3,247.377467364147,39.8198636424143]
              @offset_units="mm"
           /DETECTOR_ROW_Y_03=[0,0.172,0.344,0.516, ...]
              @transformation_type="translation"
              @equipment_component="detector_row_03"
              
@depends_on="/entry/instrument/detector/transformation/DETECTOR_ROW_X_03\"
              @vector=[0,-0.22464493586427,0.974440687158812]
              @offset=[0,0,0]
              @offset_units="mm"
           ...

         /data->/entry/data/data
         /DETECTOR_ROW_01:NXdetector_module
           /data_origin=[0,0]
           /data_size=[2463,195]
           
/fast_pixel_direction->/entry/instrument/detector/transformation/DETECTOR_ROW_X_01
           
/slow_pixel_direction->/entry/instrument/detector/transformation/DETECTOR_ROW_Y_01
         /DETECTOR_ROW_02:NXdetector_module
           /data_origin=[0,212]
           /data_size=[2463,195]
           
/fast_pixel_direction->/entry/instrument/detector/transformation/DETECTOR_ROW_X_02
           
/slow_pixel_direction->/entry/instrument/detector/transformation/DETECTOR_ROW_Y_02
         /DETECTOR_ROW_03:NXdetector_module
           /data_origin=[0,424]
           /data_size=[2463,195]
           
/fast_pixel_direction->/entry/instrument/detector/transformation/DETECTOR_ROW_X_03
           
/slow_pixel_direction->/entry/instrument/detector/transformation/DETECTOR_ROW_Y_03
         ...



More information about the NeXus-tech mailing list