[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