[NeXus-tech] Hopefully Final draft on CSPAD and Pilatus 12M-DLS
Herbert J. Bernstein
yayahjb at gmail.com
Thu Jun 5 19:02:02 BST 2014
To: Interested Parties
From: H. J. Bernstein
Re: Proposed resolution 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 and a discussion with N. Sauter, A.
Brewster, G. Winter and T. Richter on 5 Jun 2014.
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 multiple 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 minima, 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.
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_000001 -> <subfile_name>/entry/ELE_D0Q0S0A0
/ELE_D0Q0S0A1_000001 -> <subfile_name>/entry/ELE_D0Q0S0A1
...
/ELE_D0Q0S0A0_000002 -> <subfile_name>/entry/ELE_D0Q0S0A0
/ELE_D0Q0S0A1_000002 -> <subfile_name>/entry/ELE_D0Q0S0A1
...
(prepopulated with external links to subfiles before they
are actually created. Some links may remain open indefinitely.)
/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: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/AXIS_D0_Z"
@vector=[0,1,0]
/AXIS_D0_X
@transformation_type="translation"
@equipment_component="detector_arm"
@depends_on="/entry/instrument/CSPAD_FRONT/AXIS_D0_Y
@vector=[-1,0,0]
/AXIS_D0_R
@transformation_type="rotation"
@equipment_component="detector_arm"
@depends_on="/entry/instrument/CSPAD_FRONT/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/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/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/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/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/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/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/FS_D0Q0S0A1"
@vector=[0,-1,0]
@offset=[10.670000,10.175000,0.0]
@offset_units="mm"
...
/ELE_D0Q0S0A0:NXdetector
/data_000001->/entry/ELE_D0Q0S0A0_000001
/data_000002->/entry/ELE_D0Q0S0A0_000002
/data_000003->/entry/ELE_D0Q0S0A0_000003
...
/depends_on="/entry/instrument/CSPAD_FRONT/AXIS_D0Q0S0A0_S"
/ELE_D0Q0S0A1:NXdetector
/data_000001->/entry/ELE_D0Q0S0A1_000001
/data_000002->/entry/ELE_D0Q0S0A1_000002
/data_000003->/entry/ELE_D0Q0S0A1_000003
...
/depends_on="/entry/instrument/CSPAD_FRONT/AXIS_D0Q0S0A1_S"
/ELE_D0Q0S1A0:NXdetector
/data_000001->/entry/ELE_D0Q0S1A0_000001
/data_000002->/entry/ELE_D0Q0S1A0_000002
/data_000003->/entry/ELE_D0Q0S1A0_000003
....
/depends_on="/entry/instrument/CSPAD_FRONT/AXIS_D0Q0S1A0_S"
/ELE_D0Q0S1A1:NXdetector
/data_000001->/entry/ELE_D0Q0S1A1_000001
/data_000002->/entry/ELE_D0Q0S1A1_000002
/data_000003->/entry/ELE_D0Q0S1A1_000003
....
/depends_on="/entry/instrument/CSPAD_FRONT/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 NXdetector_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