diff --git a/tests/data/dataconverter/readers/mpes/Ref_nexus_mpes.log b/tests/data/dataconverter/readers/mpes/Ref_nexus_mpes.log index 04dec42eb..9d8cb25de 100644 --- a/tests/data/dataconverter/readers/mpes/Ref_nexus_mpes.log +++ b/tests/data/dataconverter/readers/mpes/Ref_nexus_mpes.log @@ -70,12 +70,43 @@ DEBUG - NXentry.nxdl.xml:/collection_time@units [NX_TIME] DEBUG - ===== GROUP (//entry/data [NXmpes::/NXentry/NXdata]): DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/DATA): -DEBUG - +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/data): +DEBUG - + The default NXdata field containing a view on the measured data. + This NXdata field contains a collection of the main relevant fields (axes). + In NXmpes, it is required to provide an energy axis. + If you want to provide additional views on your data, you can additionally use + the generic NXdata group of NXentry. + The other data fields inside this NXdata group should be named according to conventions + to ensure compatibility. We recommened the following field names + for common data fields: + + - **kx**: Calibrated x axis in k-space. Unit category: NX_ANY (e.g., 1/Angström). + - **ky**: Calibrated y axis in k-space. Unit category: NX_ANY (1/Angström). + - **kz**: Calibrated z axis in k-space. Unit category: NX_ANY (1/Angström). + - **angular0**: Fast-axis angular coordinate (or second slow axis if angularly integrated). + Unit category: NX_ANGLE + - **angular1**: Slow-axis angular coordinate (or second fast axis if simultaneously dispersed in 2 dimensions) + Unit category: NX_ANGLE + - **spatial0**: Fast-axis spatial coordinate (or second slow axis if spatially integrated) + Unit category: NX_LENGTH + - **spatial1**: Slow-axis spatial coordinate (or second fast axis if simultaneously dispersed in 2 dimensions) + Unit category: NX_LENGTH + - **delay**: Calibrated delay time. Unit category: NX_TIME (s). + - **polarization_angle**: Linear polarization angle of the incoming or + outgoing beam. This could be a link to + /entry/instrument/beam/incident_polarization_angle or + /entry/instrument/beam/final_polarization_angle if they exist. + Unit category: NX_ANGLE (° or rad) + - **ellipticity**: Ellipticity of the incoming or outgoing beam. + Could be a link to /entry/instrument/beam/incident_ellipticity or + /entry/instrument/beam/final_ellipticity if they exist. + Unit category: NX_ANGLE (° or rad) + DEBUG - documentation (NXentry.nxdl.xml:/DATA): DEBUG - The data group @@ -107,121 +138,121 @@ DEBUG - DEBUG - documentation (NXdata.nxdl.xml:): DEBUG - - :ref:`NXdata` describes the plottable data and related dimension scales. - - .. index:: plotting - - It is strongly recommended that there is at least one :ref:`NXdata` - group in each :ref:`NXentry` group. - Note that the fields named ``AXISNAME`` and ``DATA`` - can be defined with different names. - (Upper case is used to indicate that the actual name is left to the user.) - The ``signal`` and ``axes`` attributes of the - ``data`` group define which items - are plottable data and which are *dimension scales*, respectively. - - :ref:`NXdata` is used to implement one of the basic motivations in NeXus, - to provide a default plot for the data of this :ref:`NXentry`. The actual data - might be stored in another group and (hard) linked to the :ref:`NXdata` group. - - * Each :ref:`NXdata` group will define one field as the default - plottable data. The value of the ``signal`` attribute names this field. - Additional fields may be used to describe the dimension scales and - uncertainities. - The ``auxiliary_signals`` attribute is a list of the other fields - to be plotted with the ``signal`` data. - * The plottable data may be of arbitrary rank up to a maximum - of ``NX_MAXRANK=32`` (for compatibility with backend file formats). - * The plottable data will be named as the value of - the group ``signal`` attribute, such as:: - - data:NXdata - @signal = "counts" - @axes = "mr" - @mr_indices = 0 - counts: float[100] --> the default dependent data - mr: float[100] --> the default independent data - - The field named in the ``signal`` attribute **must** exist, either - directly as a NeXus field or defined through a link. - - * The group ``axes`` attribute will name the - *dimension scale* associated with the plottable data. - - If available, the standard deviations of the data are to be - stored in a data set of the same rank and dimensions, with the name ``errors``. - - * For each data dimension, there should be a one-dimensional array - of the same length. - * These one-dimensional arrays are the *dimension scales* of the - data, *i.e*. the values of the independent variables at which the data - is measured, such as scattering angle or energy transfer. - - .. index:: link - .. index:: axes (attribute) - - The preferred method to associate each data dimension with - its respective dimension scale is to specify the field name - of each dimension scale in the group ``axes`` attribute as a string list. - Here is an example for a 2-D data set *data* plotted - against *time*, and *pressure*. (An additional *temperature* data set - is provided and could be selected as an alternate for the *pressure* axis.):: - - data_2d:NXdata - @signal="data" - @axes=["time", "pressure"] - @pressure_indices=1 - @temperature_indices=1 - @time_indices=0 - data: float[1000,20] - pressure: float[20] - temperature: float[20] - time: float[1000] - - .. rubric:: Old methods to identify the plottable data - - There are two older methods of associating - each data dimension to its respective dimension scale. - Both are now out of date and - should not be used when writing new data files. - However, client software should expect to see data files - written with any of these methods. - - * One method uses the ``axes`` - attribute to specify the names of each *dimension scale*. - - * The oldest method uses the ``axis`` attribute on each - *dimension scale* to identify - with an integer the axis whose value is the number of the dimension. - - .. index: !plot; axis label - plot, axis units - units - dimension scale - - Each axis of the plot may be labeled with information from the - dimension scale for that axis. The optional ``@long_name`` attribute - is provided as the axis label default. If ``@long_name`` is not - defined, then use the name of the dimension scale. A ``@units`` attribute, - if available, may be added to the axis label for further description. - See the section :ref:`Design-Units` for more information. - - .. index: !plot; axis title - - The optional ``title`` field, if available, provides a suggested - title for the plot. If no ``title`` field is found in the :ref:`NXdata` - group, look for a ``title`` field in the parent :ref:`NXentry` group, - with a fallback to displaying the path to the :ref:`NXdata` group. - - NeXus is about how to find and annotate the data to be plotted - but not to describe how the data is to be plotted. - (https://www.nexusformat.org/NIAC2018Minutes.html#nxdata-plottype--attribute) - + :ref:`NXdata` describes the plottable data and related dimension scales. + + .. index:: plotting + + It is strongly recommended that there is at least one :ref:`NXdata` + group in each :ref:`NXentry` group. + Note that the fields named ``AXISNAME`` and ``DATA`` + can be defined with different names. + (Upper case is used to indicate that the actual name is left to the user.) + The ``signal`` and ``axes`` attributes of the + ``data`` group define which items + are plottable data and which are *dimension scales*, respectively. + + :ref:`NXdata` is used to implement one of the basic motivations in NeXus, + to provide a default plot for the data of this :ref:`NXentry`. The actual data + might be stored in another group and (hard) linked to the :ref:`NXdata` group. + + * Each :ref:`NXdata` group will define one field as the default + plottable data. The value of the ``signal`` attribute names this field. + Additional fields may be used to describe the dimension scales and + uncertainities. + The ``auxiliary_signals`` attribute is a list of the other fields + to be plotted with the ``signal`` data. + * The plottable data may be of arbitrary rank up to a maximum + of ``NX_MAXRANK=32`` (for compatibility with backend file formats). + * The plottable data will be named as the value of + the group ``signal`` attribute, such as:: + + data:NXdata + @signal = "counts" + @axes = "mr" + @mr_indices = 0 + counts: float[100] --> the default dependent data + mr: float[100] --> the default independent data + + The field named in the ``signal`` attribute **must** exist, either + directly as a NeXus field or defined through a link. + + * The group ``axes`` attribute will name the + *dimension scale* associated with the plottable data. + + If available, the standard deviations of the data are to be + stored in a data set of the same rank and dimensions, with the name ``errors``. + + * For each data dimension, there should be a one-dimensional array + of the same length. + * These one-dimensional arrays are the *dimension scales* of the + data, *i.e*. the values of the independent variables at which the data + is measured, such as scattering angle or energy transfer. + + .. index:: link + .. index:: axes (attribute) + + The preferred method to associate each data dimension with + its respective dimension scale is to specify the field name + of each dimension scale in the group ``axes`` attribute as a string list. + Here is an example for a 2-D data set *data* plotted + against *time*, and *pressure*. (An additional *temperature* data set + is provided and could be selected as an alternate for the *pressure* axis.):: + + data_2d:NXdata + @signal="data" + @axes=["time", "pressure"] + @pressure_indices=1 + @temperature_indices=1 + @time_indices=0 + data: float[1000,20] + pressure: float[20] + temperature: float[20] + time: float[1000] + + .. rubric:: Old methods to identify the plottable data + + There are two older methods of associating + each data dimension to its respective dimension scale. + Both are now out of date and + should not be used when writing new data files. + However, client software should expect to see data files + written with any of these methods. + + * One method uses the ``axes`` + attribute to specify the names of each *dimension scale*. + + * The oldest method uses the ``axis`` attribute on each + *dimension scale* to identify + with an integer the axis whose value is the number of the dimension. + + .. index: !plot; axis label + plot, axis units + units + dimension scale + + Each axis of the plot may be labeled with information from the + dimension scale for that axis. The optional ``@long_name`` attribute + is provided as the axis label default. If ``@long_name`` is not + defined, then use the name of the dimension scale. A ``@units`` attribute, + if available, may be added to the axis label for further description. + See the section :ref:`Design-Units` for more information. + + .. index: !plot; axis title + + The optional ``title`` field, if available, provides a suggested + title for the plot. If no ``title`` field is found in the :ref:`NXdata` + group, look for a ``title`` field in the parent :ref:`NXentry` group, + with a fallback to displaying the path to the :ref:`NXdata` group. + + NeXus is about how to find and annotate the data to be plotted + but not to describe how the data is to be plotted. + (https://www.nexusformat.org/NIAC2018Minutes.html#nxdata-plottype--attribute) + DEBUG - ===== ATTRS (//entry/data@NX_class) DEBUG - value: NXdata DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: DEBUG - @NX_class [NX_CHAR] @@ -230,51 +261,51 @@ DEBUG - ===== ATTRS (//entry/data@axes) DEBUG - value: ['kx' 'ky' 'energy' 'delay'] DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: DEBUG - NXdata.nxdl.xml:@axes - [NX_CHAR] DEBUG - <> DEBUG - documentation (NXdata.nxdl.xml:/axes): DEBUG - - .. index:: plotting - - Array of strings holding the :ref:`names ` of - the independent data fields used in the default plot for all of - the dimensions of the :ref:`signal ` - as well as any :ref:`auxiliary signals `. - - One name is provided for every dimension in the *signal* or *auxiliary signal* fields. - - The *axes* values are the names of fields or links that *must* exist and be direct - children of this NXdata group. - - An axis slice is specified using a field named ``AXISNAME_indices`` - as described below (where the text shown here as ``AXISNAME`` is to be - replaced by the actual field name). - - When no default axis is available for a particular dimension - of the plottable data, use a "." in that position. - Such as:: - - @axes=["time", ".", "."] - - Since there are three items in the list, the *signal* field - must be a three-dimensional array (rank=3). The first dimension - is described by the values of a one-dimensional array named ``time`` - while the other two dimensions have no fields to be used as dimension scales. - - See examples provided on the NeXus wiki: - https://www.nexusformat.org/2014_axes_and_uncertainties.html - - If there are no axes at all (such as with a stack of images), - the axes attribute can be omitted. - + .. index:: plotting + + Array of strings holding the :ref:`names ` of + the independent data fields used in the default plot for all of + the dimensions of the :ref:`signal ` + as well as any :ref:`auxiliary signals `. + + One name is provided for every dimension in the *signal* or *auxiliary signal* fields. + + The *axes* values are the names of fields or links that *must* exist and be direct + children of this NXdata group. + + An axis slice is specified using a field named ``AXISNAME_indices`` + as described below (where the text shown here as ``AXISNAME`` is to be + replaced by the actual field name). + + When no default axis is available for a particular dimension + of the plottable data, use a "." in that position. + Such as:: + + @axes=["time", ".", "."] + + Since there are three items in the list, the *signal* field + must be a three-dimensional array (rank=3). The first dimension + is described by the values of a one-dimensional array named ``time`` + while the other two dimensions have no fields to be used as dimension scales. + + See examples provided on the NeXus wiki: + https://www.nexusformat.org/2014_axes_and_uncertainties.html + + If there are no axes at all (such as with a stack of images), + the axes attribute can be omitted. + DEBUG - ===== ATTRS (//entry/data@delay_indices) DEBUG - value: 3 DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: DEBUG - @delay_indices - IS NOT IN SCHEMA @@ -283,16 +314,18 @@ DEBUG - ===== ATTRS (//entry/data@energy_indices) DEBUG - value: 2 DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: -DEBUG - @energy_indices - IS NOT IN SCHEMA +DEBUG - NXmpes.nxdl.xml:/ENTRY/data@energy_indices - [NX_CHAR] +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/data/energy_indices): DEBUG - DEBUG - ===== ATTRS (//entry/data@kx_indices) DEBUG - value: 0 DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: DEBUG - @kx_indices - IS NOT IN SCHEMA @@ -301,7 +334,7 @@ DEBUG - ===== ATTRS (//entry/data@ky_indices) DEBUG - value: 1 DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: DEBUG - @ky_indices - IS NOT IN SCHEMA @@ -310,40 +343,40 @@ DEBUG - ===== ATTRS (//entry/data@signal) DEBUG - value: data DEBUG - classpath: ['NXentry', 'NXdata'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA +NXmpes.nxdl.xml:/ENTRY/data NXentry.nxdl.xml:/DATA NXdata.nxdl.xml: -DEBUG - NXmpes.nxdl.xml:/ENTRY/DATA@signal - [NX_CHAR] +DEBUG - NXmpes.nxdl.xml:/ENTRY/data@signal - [NX_CHAR] DEBUG - <> -DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/DATA/signal): +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/data/signal): DEBUG - -> data -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/DATA/signal): +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/data/signal): DEBUG - DEBUG - NXdata.nxdl.xml:@signal - [NX_CHAR] DEBUG - documentation (NXdata.nxdl.xml:/signal): DEBUG - - .. index:: find the default plottable data - .. index:: plotting - .. index:: signal attribute value - - Declares which NeXus field is the default. - The value is the :ref:`name ` of the data field to be plotted. - This field or link *must* exist and be a direct child of this NXdata group. - - It is recommended (as of NIAC2014) to use this attribute - rather than adding a signal attribute to the field. - See https://www.nexusformat.org/2014_How_to_find_default_data.html - for a summary of the discussion. - + .. index:: find the default plottable data + .. index:: plotting + .. index:: signal attribute value + + Declares which NeXus field is the default. + The value is the :ref:`name ` of the data field to be plotted. + This field or link *must* exist and be a direct child of this NXdata group. + + It is recommended (as of NIAC2014) to use this attribute + rather than adding a signal attribute to the field. + See https://www.nexusformat.org/2014_How_to_find_default_data.html + for a summary of the discussion. + DEBUG - ===== FIELD (//entry/data/data): DEBUG - value: [[[1.14760e+04 1.64560e+04 1.55440e+04 1.48940e+04 1.08810e+04] ... DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA/data +NXmpes.nxdl.xml:/ENTRY/data/data NXdata.nxdl.xml:/DATA DEBUG - <> DEBUG - Dataset referenced as NXdata SIGNAL -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/DATA/data): +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/data/data): DEBUG - Represents a measure of one- or more-dimensional photoemission counts, where the varied axis may be for example energy, momentum, spatial coordinate, pump-probe @@ -352,22 +385,22 @@ DEBUG - DEBUG - documentation (NXdata.nxdl.xml:/DATA): DEBUG - - .. index:: plotting - - This field contains the data values to be used as the - NeXus *plottable data*. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. - + .. index:: plotting + + This field contains the data values to be used as the + NeXus *plottable data*. + Client is responsible for defining the dimensions of the data. + The name of this field may be changed to fit the circumstances. + Standard NeXus client tools will use the attributes to determine + how to use this field. + DEBUG - ===== ATTRS (//entry/data/data@units) DEBUG - value: counts DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/DATA/data +NXmpes.nxdl.xml:/ENTRY/data/data NXdata.nxdl.xml:/DATA -DEBUG - NXmpes.nxdl.xml:/ENTRY/DATA/data@units [NX_ANY] +DEBUG - NXmpes.nxdl.xml:/ENTRY/data/data@units [NX_ANY] DEBUG - NXdata.nxdl.xml:/DATA@units - REQUIRED, but undefined unit category DEBUG - ===== FIELD (//entry/data/delay): DEBUG - value: [-2000. 125. 2250. 4375. 6500.] @@ -378,12 +411,12 @@ DEBUG - <> DEBUG - Dataset referenced as NXdata AXIS #3 DEBUG - documentation (NXdata.nxdl.xml:/AXISNAME): DEBUG - - Dimension scale defining an axis of the data. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. - + Dimension scale defining an axis of the data. + Client is responsible for defining the dimensions of the data. + The name of this field may be changed to fit the circumstances. + Standard NeXus client tools will use the attributes to determine + how to use this field. + DEBUG - ===== ATTRS (//entry/data/delay@units) DEBUG - value: ps DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -394,22 +427,49 @@ DEBUG - ===== FIELD (//entry/data/energy): > +DEBUG - <> DEBUG - Dataset referenced as NXdata AXIS #2 +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/data/energy): +DEBUG - + Calibrated energy axis. + + This could be a link to either + /entry/process/energy_calibration/calibrated_axis or + /entry/process/energy_correction/calibrated_axis. + DEBUG - documentation (NXdata.nxdl.xml:/AXISNAME): DEBUG - - Dimension scale defining an axis of the data. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. - + Dimension scale defining an axis of the data. + Client is responsible for defining the dimensions of the data. + The name of this field may be changed to fit the circumstances. + Standard NeXus client tools will use the attributes to determine + how to use this field. + +DEBUG - ===== ATTRS (//entry/data/energy@type) +DEBUG - value: binding +DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/data/energy +NXdata.nxdl.xml:/AXISNAME +DEBUG - NXmpes.nxdl.xml:/ENTRY/data/energy@type - [NX_CHAR] +DEBUG - <> +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/data/energy/type): +DEBUG - -> kinetic +DEBUG - -> binding +DEBUG - Dataset referenced as NXdata AXIS #2 +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/data/energy/type): +DEBUG - + The energy can be either stored as kinetic or as binding energy. + DEBUG - ===== ATTRS (//entry/data/energy@units) DEBUG - value: eV DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/data/energy NXdata.nxdl.xml:/AXISNAME +DEBUG - NXmpes.nxdl.xml:/ENTRY/data/energy@units [NX_ENERGY] DEBUG - NXdata.nxdl.xml:/AXISNAME@units - REQUIRED, but undefined unit category DEBUG - ===== FIELD (//entry/data/kx): DEBUG - value: [-1.5 -1.16666667 -0.83333333 -0.5 -0.16666667 0.16666667 ... @@ -420,12 +480,12 @@ DEBUG - <> DEBUG - Dataset referenced as NXdata AXIS #0 DEBUG - documentation (NXdata.nxdl.xml:/AXISNAME): DEBUG - - Dimension scale defining an axis of the data. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. - + Dimension scale defining an axis of the data. + Client is responsible for defining the dimensions of the data. + The name of this field may be changed to fit the circumstances. + Standard NeXus client tools will use the attributes to determine + how to use this field. + DEBUG - ===== ATTRS (//entry/data/kx@units) DEBUG - value: 1/A DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -441,12 +501,12 @@ DEBUG - <> DEBUG - Dataset referenced as NXdata AXIS #1 DEBUG - documentation (NXdata.nxdl.xml:/AXISNAME): DEBUG - - Dimension scale defining an axis of the data. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. - + Dimension scale defining an axis of the data. + Client is responsible for defining the dimensions of the data. + The name of this field may be changed to fit the circumstances. + Standard NeXus client tools will use the attributes to determine + how to use this field. + DEBUG - ===== ATTRS (//entry/data/ky@units) DEBUG - value: 1/A DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -516,8 +576,15 @@ DEBUG - ===== FIELD (//entry/end_time): > +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/end_time): +DEBUG - + Datetime of the end of the measurement. + Should be a ISO8601 date/time stamp. It is recommended to add an explicit time zone, + otherwise the local time zone is assumed per ISO8601. + DEBUG - documentation (NXentry.nxdl.xml:/end_time): DEBUG - Ending time of measurement @@ -571,6 +638,12 @@ NXinstrument.nxdl.xml: DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT): DEBUG - + Description of the MPES spectrometer and its individual parts. + + This concept is related to term `12.58`_ of the ISO 18115-1:2023 standard. + + .. _12.58: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:12.58 + DEBUG - documentation (NXentry.nxdl.xml:/INSTRUMENT): DEBUG - DEBUG - documentation (NXinstrument.nxdl.xml:): @@ -593,15 +666,12 @@ NXentry.nxdl.xml:/INSTRUMENT NXinstrument.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== GROUP (//entry/instrument/beam [NXmpes::/NXentry/NXinstrument/NXbeam]): +DEBUG - ===== GROUP (//entry/instrument/beam_probe [NXmpes::/NXentry/NXinstrument/NXbeam]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM NXinstrument.nxdl.xml:/BEAM NXbeam.nxdl.xml: -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM): -DEBUG - +DEBUG - <> DEBUG - documentation (NXinstrument.nxdl.xml:/BEAM): DEBUG - DEBUG - documentation (NXbeam.nxdl.xml:): @@ -622,32 +692,36 @@ DEBUG - To support these use cases, the explicit dimensionality of these fields is not specified, but it can be inferred by the presense of and shape of accompanying fields, such as incident_wavelength_weights for a polychromatic beam. -DEBUG - ===== ATTRS (//entry/instrument/beam@NX_class) +DEBUG - ===== ATTRS (//entry/instrument/beam_probe@NX_class) DEBUG - value: NXbeam DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM NXinstrument.nxdl.xml:/BEAM NXbeam.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/instrument/beam/distance): +DEBUG - ===== FIELD (//entry/instrument/beam_probe/associated_source): +DEBUG - value: b'/entry/instrument/source_probe' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/beam_probe/distance): DEBUG - value: 0.0 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance): +NXbeam.nxdl.xml:/distance +DEBUG - <> +DEBUG - documentation (NXbeam.nxdl.xml:/distance): DEBUG - - Distance of the point of evaluation of the beam from the sample surface. - -DEBUG - ===== ATTRS (//entry/instrument/beam/distance@units) + Distance from sample. Note, it is recommended to use NXtransformations instead. + +DEBUG - ===== ATTRS (//entry/instrument/beam_probe/distance@units) DEBUG - value: mm -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance@units [NX_LENGTH] -DEBUG - ===== FIELD (//entry/instrument/beam/extent): +NXbeam.nxdl.xml:/distance +DEBUG - NXbeam.nxdl.xml:/distance@units [NX_LENGTH] +DEBUG - ===== FIELD (//entry/instrument/beam_probe/extent): DEBUG - value: [ 80. 190.] DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: @@ -658,21 +732,18 @@ DEBUG - Size of the beam entering this component. Note this represents a rectangular beam aperture, and values represent FWHM -DEBUG - ===== ATTRS (//entry/instrument/beam/extent@units) +DEBUG - ===== ATTRS (//entry/instrument/beam_probe/extent@units) DEBUG - value: µm DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: NXbeam.nxdl.xml:/extent DEBUG - NXbeam.nxdl.xml:/extent@units [NX_LENGTH] -DEBUG - ===== FIELD (//entry/instrument/beam/incident_energy): +DEBUG - ===== FIELD (//entry/instrument/beam_probe/incident_energy): DEBUG - value: 21.7 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy NXbeam.nxdl.xml:/incident_energy -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy): -DEBUG - +DEBUG - <> DEBUG - documentation (NXbeam.nxdl.xml:/incident_energy): DEBUG - Energy carried by each particle of the beam on entering the beamline component. @@ -692,23 +763,18 @@ DEBUG - Note, variants are a good way to represent several of these use cases in a single dataset, e.g. if a calibrated, single-value energy value is available along with the original spectrum from which it was calibrated. -DEBUG - ===== ATTRS (//entry/instrument/beam/incident_energy@units) +DEBUG - ===== ATTRS (//entry/instrument/beam_probe/incident_energy@units) DEBUG - value: eV DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy NXbeam.nxdl.xml:/incident_energy -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy@units [NX_ENERGY] DEBUG - NXbeam.nxdl.xml:/incident_energy@units [NX_ENERGY] -DEBUG - ===== FIELD (//entry/instrument/beam/incident_energy_spread): +DEBUG - ===== FIELD (//entry/instrument/beam_probe/incident_energy_spread): DEBUG - value: 0.11 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread NXbeam.nxdl.xml:/incident_energy_spread -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread): -DEBUG - +DEBUG - <> DEBUG - documentation (NXbeam.nxdl.xml:/incident_energy_spread): DEBUG - The energy spread FWHM for the corresponding energy(ies) in incident_energy. In the case of shot-to-shot variation in @@ -716,37 +782,30 @@ DEBUG - (slow to fast) of the spreads of the corresponding wavelength in incident_wavelength. -DEBUG - ===== ATTRS (//entry/instrument/beam/incident_energy_spread@units) +DEBUG - ===== ATTRS (//entry/instrument/beam_probe/incident_energy_spread@units) DEBUG - value: eV DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread NXbeam.nxdl.xml:/incident_energy_spread -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread@units [NX_ENERGY] DEBUG - NXbeam.nxdl.xml:/incident_energy_spread@units [NX_ENERGY] -DEBUG - ===== FIELD (//entry/instrument/beam/incident_polarization): +DEBUG - ===== FIELD (//entry/instrument/beam_probe/incident_polarization): DEBUG - value: [1. 1. 0. 0.] DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization NXbeam.nxdl.xml:/incident_polarization -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization): -DEBUG - +DEBUG - <> DEBUG - documentation (NXbeam.nxdl.xml:/incident_polarization): DEBUG - Incident polarization as a Stokes vector on entering beamline component -DEBUG - ===== ATTRS (//entry/instrument/beam/incident_polarization@units) +DEBUG - ===== ATTRS (//entry/instrument/beam_probe/incident_polarization@units) DEBUG - value: V^2/mm^2 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization NXbeam.nxdl.xml:/incident_polarization -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization@units [NX_ANY] DEBUG - NXbeam.nxdl.xml:/incident_polarization@units [NX_ANY] -DEBUG - ===== FIELD (//entry/instrument/beam/pulse_duration): +DEBUG - ===== FIELD (//entry/instrument/beam_probe/pulse_duration): DEBUG - value: 20.0 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: @@ -756,21 +815,18 @@ DEBUG - documentation (NXbeam.nxdl.xml:/pulse_duration): DEBUG - FWHM duration of the pulses at the diagnostic point -DEBUG - ===== ATTRS (//entry/instrument/beam/pulse_duration@units) +DEBUG - ===== ATTRS (//entry/instrument/beam_probe/pulse_duration@units) DEBUG - value: fs DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: NXbeam.nxdl.xml:/pulse_duration DEBUG - NXbeam.nxdl.xml:/pulse_duration@units [NX_TIME] -DEBUG - ===== GROUP (//entry/instrument/beam_pump [NXmpes::/NXentry/NXinstrument/NXbeam]): +DEBUG - ===== GROUP (//entry/instrument/beam_pump [NXmpes::/NXentry/NXinstrument/NXbeam]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM NXinstrument.nxdl.xml:/BEAM NXbeam.nxdl.xml: -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM): -DEBUG - +DEBUG - <> DEBUG - documentation (NXinstrument.nxdl.xml:/BEAM): DEBUG - DEBUG - documentation (NXbeam.nxdl.xml:): @@ -795,11 +851,15 @@ DEBUG - ===== ATTRS (//entry/instrument/beam_pump@NX_class) DEBUG - value: NXbeam DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM NXinstrument.nxdl.xml:/BEAM NXbeam.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - +DEBUG - ===== FIELD (//entry/instrument/beam_pump/associated_source): +DEBUG - value: b'/entry/instrument/source_pump' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== FIELD (//entry/instrument/beam_pump/average_power): DEBUG - value: 444.0 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] @@ -818,20 +878,20 @@ NXbeam.nxdl.xml:/average_power DEBUG - NXbeam.nxdl.xml:/average_power@units [NX_POWER] DEBUG - ===== FIELD (//entry/instrument/beam_pump/distance): DEBUG - value: 0.0 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance): +NXbeam.nxdl.xml:/distance +DEBUG - <> +DEBUG - documentation (NXbeam.nxdl.xml:/distance): DEBUG - - Distance of the point of evaluation of the beam from the sample surface. - + Distance from sample. Note, it is recommended to use NXtransformations instead. + DEBUG - ===== ATTRS (//entry/instrument/beam_pump/distance@units) DEBUG - value: mm -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/distance@units [NX_LENGTH] +NXbeam.nxdl.xml:/distance +DEBUG - NXbeam.nxdl.xml:/distance@units [NX_LENGTH] DEBUG - ===== FIELD (//entry/instrument/beam_pump/extent): DEBUG - value: [155. 367.] DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] @@ -869,11 +929,8 @@ DEBUG - ===== FIELD (//entry/instrument/beam_pump/incident_energy): > -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy): -DEBUG - +DEBUG - <> DEBUG - documentation (NXbeam.nxdl.xml:/incident_energy): DEBUG - Energy carried by each particle of the beam on entering the beamline component. @@ -897,19 +954,14 @@ DEBUG - ===== ATTRS (//entry/instrument/beam_pump/incident_energy@units) DEBUG - value: eV DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy NXbeam.nxdl.xml:/incident_energy -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy@units [NX_ENERGY] DEBUG - NXbeam.nxdl.xml:/incident_energy@units [NX_ENERGY] DEBUG - ===== FIELD (//entry/instrument/beam_pump/incident_energy_spread): DEBUG - value: 0.05 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread NXbeam.nxdl.xml:/incident_energy_spread -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread): -DEBUG - +DEBUG - <> DEBUG - documentation (NXbeam.nxdl.xml:/incident_energy_spread): DEBUG - The energy spread FWHM for the corresponding energy(ies) in incident_energy. In the case of shot-to-shot variation in @@ -921,19 +973,14 @@ DEBUG - ===== ATTRS (//entry/instrument/beam_pump/incident_energy_spread@units) DEBUG - value: eV DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread NXbeam.nxdl.xml:/incident_energy_spread -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_energy_spread@units [NX_ENERGY] DEBUG - NXbeam.nxdl.xml:/incident_energy_spread@units [NX_ENERGY] DEBUG - ===== FIELD (//entry/instrument/beam_pump/incident_polarization): DEBUG - value: [1 1 0 0] DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization NXbeam.nxdl.xml:/incident_polarization -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization): -DEBUG - +DEBUG - <> DEBUG - documentation (NXbeam.nxdl.xml:/incident_polarization): DEBUG - Incident polarization as a Stokes vector @@ -943,9 +990,7 @@ DEBUG - ===== ATTRS (//entry/instrument/beam_pump/incident_polarization@units) DEBUG - value: V^2/mm^2 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_NUMBER'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization NXbeam.nxdl.xml:/incident_polarization -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/BEAM/incident_polarization@units [NX_ANY] DEBUG - NXbeam.nxdl.xml:/incident_polarization@units [NX_ANY] DEBUG - ===== FIELD (//entry/instrument/beam_pump/incident_wavelength): DEBUG - value: 1030.0 @@ -1026,7 +1071,7 @@ DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXbeam', 'NX_FLOAT'] DEBUG - classes: NXbeam.nxdl.xml:/pulse_energy DEBUG - NXbeam.nxdl.xml:/pulse_energy@units [NX_ENERGY] -DEBUG - ===== GROUP (//entry/instrument/electronanalyser [NXmpes::/NXentry/NXinstrument/NXelectronanalyser]): +DEBUG - ===== GROUP (//entry/instrument/electronanalyser [NXmpes::/NXentry/NXinstrument/NXelectronanalyser]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER @@ -1036,7 +1081,11 @@ DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER): DEBUG - DEBUG - documentation (NXelectronanalyser.nxdl.xml:): DEBUG - - Subclass of NXinstrument to describe a photoelectron analyser. + Basic class for describing a electron analyzer. + + This concept is related to term `12.59`_ of the ISO 18115-1:2023 standard. + + .. _12.59: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:12.59 DEBUG - ===== ATTRS (//entry/instrument/electronanalyser@NX_class) DEBUG - value: NXelectronanalyser @@ -2088,19 +2137,16 @@ DEBUG - The space projected in the angularly dispersive directions, real or reciprocal DEBUG - ===== FIELD (//entry/instrument/electronanalyser/collectioncolumn/scheme): -DEBUG - value: b'Momentum Microscope' +DEBUG - value: b'angular dispersive' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXcollectioncolumn', 'NX_CHAR'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/COLLECTIONCOLUMN/scheme NXcollectioncolumn.nxdl.xml:/scheme DEBUG - <> DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/COLLECTIONCOLUMN/scheme): -DEBUG - -> Standard -DEBUG - -> Angular dispersive -DEBUG - -> Selective area -DEBUG - -> Deflector -DEBUG - -> PEEM -DEBUG - -> Momentum Microscope +DEBUG - -> angular dispersive +DEBUG - -> spatial dispersive +DEBUG - -> non-dispersive DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/COLLECTIONCOLUMN/scheme): DEBUG - Scheme of the electron collection column. @@ -2134,8 +2180,8 @@ NXelectronanalyser.nxdl.xml:/depends_on DEBUG - <> DEBUG - documentation (NXelectronanalyser.nxdl.xml:/depends_on): DEBUG - - Refers to the last transformation specifying the positon of the manipulator in - the NXtransformations chain. + Refers to the last transformation specifying the position of the electron analyser + in the NXtransformations chain. DEBUG - ===== FIELD (//entry/instrument/electronanalyser/description): DEBUG - value: b'SPECS Metis 1000 Momentum Microscope' @@ -2274,31 +2320,153 @@ DEBUG - documentation (NXdetector.nxdl.xml:/sensor_pixels): DEBUG - Number of raw active elements in each dimension. Important for swept scans. -DEBUG - ===== FIELD (//entry/instrument/electronanalyser/energy_resolution): -DEBUG - value: 110.0 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/instrument/electronanalyser/device_information [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXfabrication]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXfabrication'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information +NXelectronanalyser.nxdl.xml:/FABRICATION +NXfabrication.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information): +DEBUG - +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/FABRICATION): +DEBUG - +DEBUG - documentation (NXfabrication.nxdl.xml:): +DEBUG - + Details about a component as it is defined by its manufacturer. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/device_information@NX_class) +DEBUG - value: NXfabrication +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXfabrication'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information +NXelectronanalyser.nxdl.xml:/FABRICATION +NXfabrication.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/device_information/model): +DEBUG - value: b'Metis 1000 Momentum Microscope' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXfabrication', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information/model +NXfabrication.nxdl.xml:/model +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information/model): +DEBUG - +DEBUG - documentation (NXfabrication.nxdl.xml:/model): +DEBUG - + Version or model of the component named by the manufacturer. + +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/device_information/vendor): +DEBUG - value: b'SPECS GmbH' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXfabrication', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information/vendor +NXfabrication.nxdl.xml:/vendor +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/device_information/vendor): +DEBUG - +DEBUG - documentation (NXfabrication.nxdl.xml:/vendor): +DEBUG - + Company name of the manufacturer. + +DEBUG - ===== GROUP (//entry/instrument/electronanalyser/energy_resolution [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution NXelectronanalyser.nxdl.xml:/energy_resolution +NXresolution.nxdl.xml: DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution): DEBUG - - Energy resolution of the analyser with the current setting. May be linked from a - NXcalibration. - DEBUG - documentation (NXelectronanalyser.nxdl.xml:/energy_resolution): DEBUG - - Energy resolution of the electron analyser (FWHM of gaussian broadening) + Energy resolution of the analyser with the current setting. May be linked from an + NXcalibration. + + This concept is related to term `10.24`_ of the ISO 18115-1:2023 standard. + + .. _10.24: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:10.24 -DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/energy_resolution@units) -DEBUG - value: meV -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_FLOAT'] +DEBUG - documentation (NXresolution.nxdl.xml:): +DEBUG - + Describes the resolution of a physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/energy_resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution NXelectronanalyser.nxdl.xml:/energy_resolution -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution@units [NX_ENERGY] -DEBUG - NXelectronanalyser.nxdl.xml:/energy_resolution@units [NX_ENERGY] -DEBUG - ===== GROUP (//entry/instrument/electronanalyser/energydispersion [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXenergydispersion]): +NXresolution.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/energy_resolution/physical_quantity): +DEBUG - value: b'energy' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/physical_quantity +NXelectronanalyser.nxdl.xml:/energy_resolution/physical_quantity +NXresolution.nxdl.xml:/physical_quantity +DEBUG - <> +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/physical_quantity): +DEBUG - -> energy +DEBUG - enumeration (NXelectronanalyser.nxdl.xml:/energy_resolution/physical_quantity): +DEBUG - -> energy +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/physical_quantity): +DEBUG - +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/energy_resolution/physical_quantity): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/physical_quantity): +DEBUG - + The physical quantity of the resolution, e.g., + energy, momentum, time, etc. + +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/energy_resolution/resolution): +DEBUG - value: 110.0 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/resolution +NXelectronanalyser.nxdl.xml:/energy_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/resolution): +DEBUG - +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/energy_resolution/resolution): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/resolution): +DEBUG - + The resolution of the physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/energy_resolution/resolution@units) +DEBUG - value: meV +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/resolution +NXelectronanalyser.nxdl.xml:/energy_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/resolution@units - REQUIRED, but undefined unit category +DEBUG - NXelectronanalyser.nxdl.xml:/energy_resolution/resolution@units [NX_ENERGY] +DEBUG - NXresolution.nxdl.xml:/resolution@units [NX_ANY] +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/energy_resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/type +NXresolution.nxdl.xml:/type +DEBUG - <> +DEBUG - enumeration (NXresolution.nxdl.xml:/type): +DEBUG - -> estimated +DEBUG - -> derived +DEBUG - -> calibrated +DEBUG - -> other +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/energy_resolution/type): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/type): +DEBUG - + The process by which the resolution was determined. + +DEBUG - ===== GROUP (//entry/instrument/electronanalyser/energydispersion [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXenergydispersion]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXenergydispersion'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/ENERGYDISPERSION @@ -2325,22 +2493,6 @@ NXelectronanalyser.nxdl.xml:/ENERGYDISPERSION NXenergydispersion.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/instrument/electronanalyser/energydispersion/energy_scan_mode): -DEBUG - value: b'fixed' -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXenergydispersion', 'NX_CHAR'] -DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/ENERGYDISPERSION/energy_scan_mode -NXenergydispersion.nxdl.xml:/energy_scan_mode -DEBUG - <> -DEBUG - enumeration (NXenergydispersion.nxdl.xml:/energy_scan_mode): -DEBUG - -> fixed -DEBUG - -> sweep -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/ENERGYDISPERSION/energy_scan_mode): -DEBUG - -DEBUG - documentation (NXenergydispersion.nxdl.xml:/energy_scan_mode): -DEBUG - - Way of scanning the energy axis (fixed or sweep). - DEBUG - ===== FIELD (//entry/instrument/electronanalyser/energydispersion/pass_energy): DEBUG - value: 30.0 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXenergydispersion', 'NX_FLOAT'] @@ -2354,6 +2506,10 @@ DEBUG - documentation (NXenergydispersion.nxdl.xml:/pass_energy): DEBUG - Energy of the electrons on the mean path of the analyser. Pass energy for hemispherics, drift energy for tofs. + + This concept is related to term `12.63`_ of the ISO 18115-1:2023 standard. + + .. _12.63: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:12.63 DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/energydispersion/pass_energy@units) DEBUG - value: eV @@ -2426,22 +2582,88 @@ DEBUG - Axes may be less abstract than this, i.e. ['detector_x', 'detector_y']. If energy_scan_mode=sweep, fast_axes: ['energy', 'kx']; slow_axes: ['energy'] is allowed. -DEBUG - ===== FIELD (//entry/instrument/electronanalyser/momentum_resolution): -DEBUG - value: 0.08 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/instrument/electronanalyser/momentum_resolution [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] DEBUG - classes: NXelectronanalyser.nxdl.xml:/momentum_resolution +NXresolution.nxdl.xml: DEBUG - <> DEBUG - documentation (NXelectronanalyser.nxdl.xml:/momentum_resolution): DEBUG - Momentum resolution of the electron analyser (FWHM) +DEBUG - documentation (NXresolution.nxdl.xml:): +DEBUG - + Describes the resolution of a physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/momentum_resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/momentum_resolution +NXresolution.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/momentum_resolution@units) DEBUG - value: 1/angstrom -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_FLOAT'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] DEBUG - classes: NXelectronanalyser.nxdl.xml:/momentum_resolution -DEBUG - NXelectronanalyser.nxdl.xml:/momentum_resolution@units [NX_WAVENUMBER] +NXresolution.nxdl.xml: +DEBUG - @units - IS NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/momentum_resolution/physical_quantity): +DEBUG - value: b'momentum' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/momentum_resolution/physical_quantity +NXresolution.nxdl.xml:/physical_quantity +DEBUG - <> +DEBUG - enumeration (NXelectronanalyser.nxdl.xml:/momentum_resolution/physical_quantity): +DEBUG - -> momentum +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/momentum_resolution/physical_quantity): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/physical_quantity): +DEBUG - + The physical quantity of the resolution, e.g., + energy, momentum, time, etc. + +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/momentum_resolution/resolution): +DEBUG - value: 0.08 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/momentum_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - <> +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/momentum_resolution/resolution): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/resolution): +DEBUG - + The resolution of the physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/momentum_resolution/resolution@units) +DEBUG - value: 1/angstrom +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/momentum_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - NXelectronanalyser.nxdl.xml:/momentum_resolution/resolution@units [NX_WAVENUMBER] +DEBUG - NXresolution.nxdl.xml:/resolution@units [NX_ANY] +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/momentum_resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXresolution.nxdl.xml:/type +DEBUG - <> +DEBUG - enumeration (NXresolution.nxdl.xml:/type): +DEBUG - -> estimated +DEBUG - -> derived +DEBUG - -> calibrated +DEBUG - -> other +DEBUG - documentation (NXresolution.nxdl.xml:/type): +DEBUG - + The process by which the resolution was determined. + DEBUG - ===== FIELD (//entry/instrument/electronanalyser/slow_axes): DEBUG - value: b'delay' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_CHAR'] @@ -2456,22 +2678,84 @@ DEBUG - List of the axes that are acquired by scanning a physical parameter, listed in order of decreasing speed. See fast_axes for examples. -DEBUG - ===== FIELD (//entry/instrument/electronanalyser/spatial_resolution): -DEBUG - value: 10.0 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/instrument/electronanalyser/spatial_resolution [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] DEBUG - classes: NXelectronanalyser.nxdl.xml:/spatial_resolution +NXresolution.nxdl.xml: DEBUG - <> DEBUG - documentation (NXelectronanalyser.nxdl.xml:/spatial_resolution): DEBUG - Spatial resolution of the electron analyser (Airy disk radius) + + This concept is related to term `10.15 ff.`_ of the ISO 18115-1:2023 standard. + + .. _10.15 ff.: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:10.15 -DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/spatial_resolution@units) -DEBUG - value: µm -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NX_FLOAT'] +DEBUG - documentation (NXresolution.nxdl.xml:): +DEBUG - + Describes the resolution of a physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/spatial_resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution'] DEBUG - classes: NXelectronanalyser.nxdl.xml:/spatial_resolution -DEBUG - NXelectronanalyser.nxdl.xml:/spatial_resolution@units [NX_LENGTH] +NXresolution.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/spatial_resolution/physical_quantity): +DEBUG - value: b'length' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/spatial_resolution/physical_quantity +NXresolution.nxdl.xml:/physical_quantity +DEBUG - <> +DEBUG - enumeration (NXelectronanalyser.nxdl.xml:/spatial_resolution/physical_quantity): +DEBUG - -> length +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/spatial_resolution/physical_quantity): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/physical_quantity): +DEBUG - + The physical quantity of the resolution, e.g., + energy, momentum, time, etc. + +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/spatial_resolution/resolution): +DEBUG - value: 10.0 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/spatial_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - <> +DEBUG - documentation (NXelectronanalyser.nxdl.xml:/spatial_resolution/resolution): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/resolution): +DEBUG - + The resolution of the physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/spatial_resolution/resolution@units) +DEBUG - value: µm +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/spatial_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - NXelectronanalyser.nxdl.xml:/spatial_resolution/resolution@units [NX_LENGTH] +DEBUG - NXresolution.nxdl.xml:/resolution@units [NX_ANY] +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/spatial_resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXresolution.nxdl.xml:/type +DEBUG - <> +DEBUG - enumeration (NXresolution.nxdl.xml:/type): +DEBUG - -> estimated +DEBUG - -> derived +DEBUG - -> calibrated +DEBUG - -> other +DEBUG - documentation (NXresolution.nxdl.xml:/type): +DEBUG - + The process by which the resolution was determined. + DEBUG - ===== GROUP (//entry/instrument/electronanalyser/transformations [NXmpes::/NXentry/NXinstrument/NXelectronanalyser/NXtransformations]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXtransformations'] DEBUG - classes: @@ -2484,7 +2768,7 @@ DEBUG - geometry of the electron analyser as a component in the instrument. Conventions from the NXtransformations base class are used. In principle, the McStas coordinate system is used. The first transformation has to point either to - another component of the system or . (for pointing to the reference frame) to + another component of the system or "." (for pointing to the reference frame) to relate it relative to the experimental setup. Typically, the components of a system should all be related relative to each other and only one component should relate to the reference coordinate system. @@ -2512,23 +2796,42 @@ DEBUG - * ``NX_UNITLESS`` for axes for which no transformation type is specified This class will usually contain all axes of a sample stage or goniometer or - a detector. The NeXus default McSTAS coordinate frame is assumed, but additional - useful coordinate axes may be defined by using axes for which no transformation - type has been specified. + a detector. The NeXus default :ref:`McSTAS coordinate frame` + is assumed, but additional useful coordinate axes may be defined by using axes for which + no transformation type has been specified. - The entry point (``depends_on``) will be outside of this class and point to a - field in here. Following the chain may also require following ``depends_on`` - links to transformations outside, for example to a common base table. If - a relative path is given, it is relative to the group enclosing the ``depends_on`` - specification. + **Transformation chain** + + The entry point of a chain of transformations is a field called ``depends_on`` + will be outside of this class and points to a field in here. Following the chain may + also require following ``depends_on`` links to transformations outside, for example + to a common base table. If a relative path is given, it is relative to the group + enclosing the ``depends_on`` specification. For a chain of three transformations, where :math:`T_1` depends on :math:`T_2` - and that in turn depends on :math:`T_3`, the final transformation :math:`T_f` is + which in turn depends on :math:`T_3`, the final *active* transformation + matrix :math:`T_f` is + + .. math:: T_f = T_3 . T_2 . T_1 - .. math:: T_f = T_3 T_2 T_1 + For example when positioning a flat detector, its pixel positions in the laboratory + reference frame (:ref:`McSTAS coordinate frame` by default) + can be calculated by - In explicit terms, the transformations are a subset of affine transformations - expressed as 4x4 matrices that act on homogeneous coordinates, :math:`w=(x,y,z,1)^T`. + .. math:: X_\text{lab} = T_f . X_\text{pixel} = T_3 . T_2 . T_1 . X_\text{pixel} + + Note that :math:`T_1` comes first in the *depends-on* chain and is also applied first + to the pixel coordinates. + + When we say transformation :math:`A` *depends on* transformation :math:`B` we mean that + the physical motor that realizes :math:`A` is *stacked on top of* the motor that realizes :math:`B`. + So the activate coordinate transformation :math:`A` needs to be applied to a coordinate + before applying :math:`B`. In other words :math:`X' = B . A . X`. + + **Transformation matrix** + + In explicit terms, the transformations are a subset of affine transformations expressed as + 4x4 active transformation matrices that act on homogeneous coordinates, :math:`X=[x,y,z,1]^T`. For rotation and translation, @@ -2542,8 +2845,8 @@ DEBUG - attribute multiplied by the field value, and :math:`R` is defined as a rotation about an axis in the direction of ``vector``, of angle of the field value. - NOTE - + **Usage** + One possible use of ``NXtransformations`` is to define the motors and transformations for a diffractometer (goniometer). Such use is mentioned in the ``NXinstrument`` base class. Use one ``NXtransformations`` group @@ -2551,8 +2854,7 @@ DEBUG - Collecting the motors of a sample table or xyz-stage in an NXtransformations group is equally possible. - - Following the section on the general dscription of axis in NXtransformations is a section which + Following the section on the general description of axis in NXtransformations is a section which documents the fields commonly used within NeXus for positioning purposes and their meaning. Whenever there is a need for positioning a beam line component please use the existing names. Use as many fields as needed in order to position the component. Feel free to add more axis if required. In the description @@ -2565,15 +2867,152 @@ DEBUG - * depends_on as needed. - -DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/transformations@NX_class) -DEBUG - value: NXtransformations -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXtransformations'] -DEBUG - classes: -NXelectronanalyser.nxdl.xml:/TRANSFORMATIONS -NXtransformations.nxdl.xml: -DEBUG - @NX_class [NX_CHAR] -DEBUG - + + **Example 1: goniometer** + + Position a sample mounted on a goniometer in the :ref:`McSTAS coordinate frame`. + + The sample is oriented as follows + + .. math:: X_\text{lab} = R(\vec{v}_\omega, \omega) . + T(\vec{v}_z, \text{sam}_z) . + T(\vec{v}_y, \text{sam}_y) . + T(\vec{v}_x, \text{sam}_x) . + R(\vec{v}_\chi, \chi) . + R(\vec{v}_\varphi, \varphi) . X_s + + where + + * :math:`R(\vec{v},a)` is a rotation around vector :math:`\vec{v}` with angle :math:`a` + * :math:`T(\vec{u},t)` is a translation along vector :math:`\vec{u}` over a distance :math:`t` + * :math:`X_s` a coordinate in the sample reference frame. + + .. code-block:: + + entry:NXentry + sample:NXsample + depends_on=transformations/phi + transformations:NXtransformations + phi=0 + @depends_on=chi + @transformation_type=rotation + @vector=[-1 -0.0037 -0.002] + @units=degrees + chi=0 + @depends_on=sam_x + @transformation_type=rotation + @vector=[0.0046 0.0372 0.9993] + @units=degrees + sam_x=0 + @depends_on=sam_y + @transformation_type=translation + @vector=[1 0 0] + @units=mm + sam_y=0 + @depends_on=sam_z + @transformation_type=translation + @vector=[0 1 0] + @units=mm + sam_z=0 + @depends_on=omega + @transformation_type=translation + @vector=[0 0 1] + @units=mm + omega=174 + @depends_on=. + @transformation_type=rotation + @vector=[-1 0 0] + @units=degrees + + **Example 2: different coordinate system** + + Define a laboratory reference frame with the X-axis along the beam and the Z-axis opposite to the direction of gravity. + Three point detectors are positioned in this reference: + + * *transmission*: + * point detector in the beam + * 20 cm downstream from the sample (the origin of the reference frame) + * *vertical*: + * point detector 10 cm downstream from the sample + * making an angle of 5 degrees with the beam w.r.t. the sample + * positioned in the XZ-plane above the XY-plane + * *horizontal*: + * point detector 11 cm downstream from the sample + * making an angle of 6 degrees with the beam w.r.t. the sample + * positioned in the XY-plane above the XZ-plane + + The coordinates of the point detectors in the laboratory reference frame are + + * *transmission*: :math:`X_\text{lab} = T_x(20) . X_d` + * *vertical*: :math:`X_\text{lab} = R_y(-5) . T_x(10) . X_d` + * *horizontal*: :math:`X_\text{lab} = R_x(-90) . R_y(-6) . T_x(11) . X_d` + + where + + * :math:`T_x`, :math:`T_y`, :math:`T_z`: active transformation matrices for translation along the X, Y and Z axes + * :math:`R_x`, :math:`R_y`, :math:`R_z`: active transformation matrices for rotation around the X, Y and Z axes + * :math:`X_d` is a coordinate in the detector reference frame. + + Note that as these are point detectors, we only have one coordinate :math:`X_d=[0,0,0,1]^T`. + + .. code-block:: + + entry:NXentry + instrument:NXinstrument + vertical:NXdetector + depends_on=position/distance + position:NXtransformations + distance=10 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=5 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=0 # stay in the vertical plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + horizontal:NXdetector + depends_on=position/distance + position:NXtransformations + distance=11 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=6 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=90 # rotate to the horizontal plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + transmission:NXdetector + depends_on=position/distance + position:NXtransformations + distance=20 # move downstream from the sample + @depends_on=/entry/coordinate_system/beam + @units=cm + @vector=[1 0 0] + coordinate_system:NXtransformations + beam=NaN # value is never used + @depends_on=gravity + @vector=[1 0 0] # X-axis points in the beam direction + gravity=NaN # value is never used + @depends_on=. # end of the chain + @vector=[0 0 -1] # Z-axis points up + + +DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/transformations@NX_class) +DEBUG - value: NXtransformations +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXtransformations'] +DEBUG - classes: +NXelectronanalyser.nxdl.xml:/TRANSFORMATIONS +NXtransformations.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - DEBUG - ===== FIELD (//entry/instrument/electronanalyser/transformations/rot_y): DEBUG - value: -115.0 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXtransformations', 'NX_NUMBER'] @@ -2602,7 +3041,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/transformations/rot_y@transformation_type) DEBUG - value: rotation @@ -2676,7 +3115,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/instrument/electronanalyser/transformations/trans_z@transformation_type) DEBUG - value: translation @@ -2722,28 +3161,96 @@ DEBUG - increasing displacement. For general axes, an appropriate direction should be chosen. -DEBUG - ===== FIELD (//entry/instrument/energy_resolution): -DEBUG - value: 140.0 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/instrument/energy_resolution [NXmpes::/NXentry/NXinstrument/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution -NXinstrument.nxdl.xml:/energy_resolution -DEBUG - <> +NXinstrument.nxdl.xml:/RESOLUTION +NXresolution.nxdl.xml: +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution): DEBUG - -DEBUG - documentation (NXinstrument.nxdl.xml:/energy_resolution): + Overall energy resolution of the MPES instrument + + This concept is related to term `10.7 ff.`_ of the ISO 18115-1:2023 standard. + + .. _10.7 ff.: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:10.7 + + This concept is related to term `10.24`_ of the ISO 18115-1:2023 standard. + + .. _10.24: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:10.24 + +DEBUG - documentation (NXinstrument.nxdl.xml:/RESOLUTION): DEBUG - - Energy resolution of the experiment (FWHM or gaussian broadening) - -DEBUG - ===== ATTRS (//entry/instrument/energy_resolution@units) -DEBUG - value: meV -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] +DEBUG - documentation (NXresolution.nxdl.xml:): +DEBUG - + Describes the resolution of a physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/energy_resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution -NXinstrument.nxdl.xml:/energy_resolution -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution@units [NX_ENERGY] -DEBUG - NXinstrument.nxdl.xml:/energy_resolution@units [NX_ENERGY] -DEBUG - ===== GROUP (//entry/instrument/manipulator [NXmpes::/NXentry/NXinstrument/NXmanipulator]): +NXinstrument.nxdl.xml:/RESOLUTION +NXresolution.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/energy_resolution/physical_quantity): +DEBUG - value: b'energy' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/physical_quantity +NXresolution.nxdl.xml:/physical_quantity +DEBUG - <> +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/physical_quantity): +DEBUG - -> energy +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/physical_quantity): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/physical_quantity): +DEBUG - + The physical quantity of the resolution, e.g., + energy, momentum, time, etc. + +DEBUG - ===== FIELD (//entry/instrument/energy_resolution/resolution): +DEBUG - value: 140.0 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/resolution): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/resolution): +DEBUG - + The resolution of the physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/energy_resolution/resolution@units) +DEBUG - value: meV +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/resolution +NXresolution.nxdl.xml:/resolution +DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/resolution@units [NX_ENERGY] +DEBUG - NXresolution.nxdl.xml:/resolution@units [NX_ANY] +DEBUG - ===== FIELD (//entry/instrument/energy_resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/type +NXresolution.nxdl.xml:/type +DEBUG - <> +DEBUG - enumeration (NXresolution.nxdl.xml:/type): +DEBUG - -> estimated +DEBUG - -> derived +DEBUG - -> calibrated +DEBUG - -> other +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/energy_resolution/type): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:/type): +DEBUG - + The process by which the resolution was determined. + +DEBUG - ===== GROUP (//entry/instrument/manipulator [NXmpes::/NXentry/NXinstrument/NXmanipulator]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR @@ -2777,50 +3284,243 @@ DEBUG - Refers to the last transformation specifying the positon of the manipulator in the NXtransformations chain. -DEBUG - ===== FIELD (//entry/instrument/manipulator/sample_bias): -DEBUG - value: 17.799719004221362 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/instrument/manipulator/pressure_gauge [NXmpes::/NXentry/NXinstrument/NXmanipulator/pressure_gauge]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/manipulator/pressure_gauge/measurement): +DEBUG - value: b'pressure' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/manipulator/pressure_gauge/name): +DEBUG - value: b'sample_chamber_pressure' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/manipulator/pressure_gauge/value): +DEBUG - value: 4.5599999999999996e-11 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== ATTRS (//entry/instrument/manipulator/pressure_gauge/value@units) +DEBUG - value: mbar +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== GROUP (//entry/instrument/manipulator/sample_bias_voltmeter [NXmpes::/NXentry/NXinstrument/NXmanipulator/NXsensor]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter +NXmanipulator.nxdl.xml:/sample_bias_voltmeter +NXsensor.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter): +DEBUG - +DEBUG - documentation (NXmanipulator.nxdl.xml:/sample_bias_voltmeter): +DEBUG - + Sensor measuring the voltage applied to sample and sample holder. + +DEBUG - documentation (NXsensor.nxdl.xml:): +DEBUG - + A sensor used to monitor an external condition + + The condition itself is described in :ref:`NXenvironment`. + +DEBUG - ===== ATTRS (//entry/instrument/manipulator/sample_bias_voltmeter@NX_class) +DEBUG - value: NXsensor +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter +NXmanipulator.nxdl.xml:/sample_bias_voltmeter +NXsensor.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/manipulator/sample_bias_voltmeter/measurement): +DEBUG - value: b'voltage' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias -NXmanipulator.nxdl.xml:/sample_bias +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/measurement +NXmanipulator.nxdl.xml:/sample_bias_voltmeter/measurement +NXsensor.nxdl.xml:/measurement +DEBUG - <> +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/measurement): +DEBUG - -> voltage +DEBUG - enumeration (NXmanipulator.nxdl.xml:/sample_bias_voltmeter/measurement): +DEBUG - -> voltage +DEBUG - enumeration (NXsensor.nxdl.xml:/measurement): +DEBUG - -> temperature +DEBUG - -> pH +DEBUG - -> magnetic_field +DEBUG - -> electric_field +DEBUG - -> current +DEBUG - -> conductivity +DEBUG - -> resistance +DEBUG - -> voltage +DEBUG - -> pressure +DEBUG - -> flow +DEBUG - -> stress +DEBUG - -> strain +DEBUG - -> shear +DEBUG - -> surface_pressure +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/measurement): +DEBUG - +DEBUG - documentation (NXmanipulator.nxdl.xml:/sample_bias_voltmeter/measurement): +DEBUG - +DEBUG - documentation (NXsensor.nxdl.xml:/measurement): +DEBUG - + name for measured signal + +DEBUG - ===== FIELD (//entry/instrument/manipulator/sample_bias_voltmeter/name): +DEBUG - value: b'sample_bias' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/name +NXsensor.nxdl.xml:/name DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias): +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/name): DEBUG - -DEBUG - documentation (NXmanipulator.nxdl.xml:/sample_bias): +DEBUG - documentation (NXsensor.nxdl.xml:/name): DEBUG - - Possible bias of the sample with trespect to analyser ground. This field may - also be found in NXsample if present. + Name for the sensor -DEBUG - ===== ATTRS (//entry/instrument/manipulator/sample_bias@units) +DEBUG - ===== FIELD (//entry/instrument/manipulator/sample_bias_voltmeter/value): +DEBUG - value: 17.799719004221362 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/value +NXmanipulator.nxdl.xml:/sample_bias_voltmeter/value +NXsensor.nxdl.xml:/value +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/value): +DEBUG - +DEBUG - documentation (NXmanipulator.nxdl.xml:/sample_bias_voltmeter/value): +DEBUG - + In case of a single or averaged bias measurement, this is the scalar voltage measured between + sample and sample holder. It can also be an 1D array of measured voltages (without time stamps). + +DEBUG - documentation (NXsensor.nxdl.xml:/value): +DEBUG - + nominal setpoint or average value + - need [n] as may be a vector + +DEBUG - ===== ATTRS (//entry/instrument/manipulator/sample_bias_voltmeter/value@units) DEBUG - value: V -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NX_FLOAT'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/value +NXmanipulator.nxdl.xml:/sample_bias_voltmeter/value +NXsensor.nxdl.xml:/value +DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias_voltmeter/value@units - REQUIRED, but undefined unit category +DEBUG - NXmanipulator.nxdl.xml:/sample_bias_voltmeter/value@units [NX_VOLTAGE] +DEBUG - NXsensor.nxdl.xml:/value@units [NX_ANY] +DEBUG - ===== GROUP (//entry/instrument/manipulator/temperature_sensor [NXmpes::/NXentry/NXinstrument/NXmanipulator/NXsensor]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor +NXmanipulator.nxdl.xml:/temperature_sensor +NXsensor.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor): +DEBUG - +DEBUG - documentation (NXmanipulator.nxdl.xml:/temperature_sensor): +DEBUG - + Temperature sensor measuring the sample temperature. + +DEBUG - documentation (NXsensor.nxdl.xml:): +DEBUG - + A sensor used to monitor an external condition + + The condition itself is described in :ref:`NXenvironment`. + +DEBUG - ===== ATTRS (//entry/instrument/manipulator/temperature_sensor@NX_class) +DEBUG - value: NXsensor +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias -NXmanipulator.nxdl.xml:/sample_bias -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_bias@units [NX_CURRENT] -DEBUG - NXmanipulator.nxdl.xml:/sample_bias@units [NX_CURRENT] -DEBUG - ===== FIELD (//entry/instrument/manipulator/sample_temperature): -DEBUG - value: 23.050763803680983 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NX_FLOAT'] +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor +NXmanipulator.nxdl.xml:/temperature_sensor +NXsensor.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/manipulator/temperature_sensor/measurement): +DEBUG - value: b'temperature' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_temperature -NXmanipulator.nxdl.xml:/sample_temperature +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/measurement +NXmanipulator.nxdl.xml:/temperature_sensor/measurement +NXsensor.nxdl.xml:/measurement +DEBUG - <> +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/measurement): +DEBUG - -> temperature +DEBUG - enumeration (NXmanipulator.nxdl.xml:/temperature_sensor/measurement): +DEBUG - -> temperature +DEBUG - enumeration (NXsensor.nxdl.xml:/measurement): +DEBUG - -> temperature +DEBUG - -> pH +DEBUG - -> magnetic_field +DEBUG - -> electric_field +DEBUG - -> current +DEBUG - -> conductivity +DEBUG - -> resistance +DEBUG - -> voltage +DEBUG - -> pressure +DEBUG - -> flow +DEBUG - -> stress +DEBUG - -> strain +DEBUG - -> shear +DEBUG - -> surface_pressure +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/measurement): +DEBUG - +DEBUG - documentation (NXmanipulator.nxdl.xml:/temperature_sensor/measurement): +DEBUG - +DEBUG - documentation (NXsensor.nxdl.xml:/measurement): +DEBUG - + name for measured signal + +DEBUG - ===== FIELD (//entry/instrument/manipulator/temperature_sensor/name): +DEBUG - value: b'sample_temperature' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/name +NXsensor.nxdl.xml:/name DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_temperature): +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/name): DEBUG - -DEBUG - documentation (NXmanipulator.nxdl.xml:/sample_temperature): +DEBUG - documentation (NXsensor.nxdl.xml:/name): DEBUG - - Temperature at the closest point to the sample. This field may also be found in - NXsample if present. + Name for the sensor -DEBUG - ===== ATTRS (//entry/instrument/manipulator/sample_temperature@units) -DEBUG - value: K -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NX_FLOAT'] +DEBUG - ===== FIELD (//entry/instrument/manipulator/temperature_sensor/value): +DEBUG - value: 23.050763803680983 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_temperature -NXmanipulator.nxdl.xml:/sample_temperature -DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/sample_temperature@units [NX_TEMPERATURE] -DEBUG - NXmanipulator.nxdl.xml:/sample_temperature@units [NX_TEMPERATURE] +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/value +NXmanipulator.nxdl.xml:/temperature_sensor/value +NXsensor.nxdl.xml:/value +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/value): +DEBUG - +DEBUG - documentation (NXmanipulator.nxdl.xml:/temperature_sensor/value): +DEBUG - + In case of a single or averaged temperature measurement, this is the scalar temperature measured + by the sample temperature sensor. It can also be a 1D array of measured temperatures + (without time stamps). + +DEBUG - documentation (NXsensor.nxdl.xml:/value): +DEBUG - + nominal setpoint or average value + - need [n] as may be a vector + +DEBUG - ===== ATTRS (//entry/instrument/manipulator/temperature_sensor/value@units) +DEBUG - value: K +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/value +NXmanipulator.nxdl.xml:/temperature_sensor/value +NXsensor.nxdl.xml:/value +DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/MANIPULATOR/temperature_sensor/value@units - REQUIRED, but undefined unit category +DEBUG - NXmanipulator.nxdl.xml:/temperature_sensor/value@units [NX_TEMPERATURE] +DEBUG - NXsensor.nxdl.xml:/value@units [NX_ANY] DEBUG - ===== GROUP (//entry/instrument/manipulator/transformations [NXmpes::/NXentry/NXinstrument/NXmanipulator/NXtransformations]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXmanipulator', 'NXtransformations'] DEBUG - classes: @@ -2861,23 +3561,42 @@ DEBUG - * ``NX_UNITLESS`` for axes for which no transformation type is specified This class will usually contain all axes of a sample stage or goniometer or - a detector. The NeXus default McSTAS coordinate frame is assumed, but additional - useful coordinate axes may be defined by using axes for which no transformation - type has been specified. + a detector. The NeXus default :ref:`McSTAS coordinate frame` + is assumed, but additional useful coordinate axes may be defined by using axes for which + no transformation type has been specified. - The entry point (``depends_on``) will be outside of this class and point to a - field in here. Following the chain may also require following ``depends_on`` - links to transformations outside, for example to a common base table. If - a relative path is given, it is relative to the group enclosing the ``depends_on`` - specification. + **Transformation chain** + + The entry point of a chain of transformations is a field called ``depends_on`` + will be outside of this class and points to a field in here. Following the chain may + also require following ``depends_on`` links to transformations outside, for example + to a common base table. If a relative path is given, it is relative to the group + enclosing the ``depends_on`` specification. For a chain of three transformations, where :math:`T_1` depends on :math:`T_2` - and that in turn depends on :math:`T_3`, the final transformation :math:`T_f` is + which in turn depends on :math:`T_3`, the final *active* transformation + matrix :math:`T_f` is + + .. math:: T_f = T_3 . T_2 . T_1 + + For example when positioning a flat detector, its pixel positions in the laboratory + reference frame (:ref:`McSTAS coordinate frame` by default) + can be calculated by - .. math:: T_f = T_3 T_2 T_1 + .. math:: X_\text{lab} = T_f . X_\text{pixel} = T_3 . T_2 . T_1 . X_\text{pixel} - In explicit terms, the transformations are a subset of affine transformations - expressed as 4x4 matrices that act on homogeneous coordinates, :math:`w=(x,y,z,1)^T`. + Note that :math:`T_1` comes first in the *depends-on* chain and is also applied first + to the pixel coordinates. + + When we say transformation :math:`A` *depends on* transformation :math:`B` we mean that + the physical motor that realizes :math:`A` is *stacked on top of* the motor that realizes :math:`B`. + So the activate coordinate transformation :math:`A` needs to be applied to a coordinate + before applying :math:`B`. In other words :math:`X' = B . A . X`. + + **Transformation matrix** + + In explicit terms, the transformations are a subset of affine transformations expressed as + 4x4 active transformation matrices that act on homogeneous coordinates, :math:`X=[x,y,z,1]^T`. For rotation and translation, @@ -2891,8 +3610,8 @@ DEBUG - attribute multiplied by the field value, and :math:`R` is defined as a rotation about an axis in the direction of ``vector``, of angle of the field value. - NOTE - + **Usage** + One possible use of ``NXtransformations`` is to define the motors and transformations for a diffractometer (goniometer). Such use is mentioned in the ``NXinstrument`` base class. Use one ``NXtransformations`` group @@ -2900,8 +3619,7 @@ DEBUG - Collecting the motors of a sample table or xyz-stage in an NXtransformations group is equally possible. - - Following the section on the general dscription of axis in NXtransformations is a section which + Following the section on the general description of axis in NXtransformations is a section which documents the fields commonly used within NeXus for positioning purposes and their meaning. Whenever there is a need for positioning a beam line component please use the existing names. Use as many fields as needed in order to position the component. Feel free to add more axis if required. In the description @@ -2914,6 +3632,143 @@ DEBUG - * depends_on as needed. + + **Example 1: goniometer** + + Position a sample mounted on a goniometer in the :ref:`McSTAS coordinate frame`. + + The sample is oriented as follows + + .. math:: X_\text{lab} = R(\vec{v}_\omega, \omega) . + T(\vec{v}_z, \text{sam}_z) . + T(\vec{v}_y, \text{sam}_y) . + T(\vec{v}_x, \text{sam}_x) . + R(\vec{v}_\chi, \chi) . + R(\vec{v}_\varphi, \varphi) . X_s + + where + + * :math:`R(\vec{v},a)` is a rotation around vector :math:`\vec{v}` with angle :math:`a` + * :math:`T(\vec{u},t)` is a translation along vector :math:`\vec{u}` over a distance :math:`t` + * :math:`X_s` a coordinate in the sample reference frame. + + .. code-block:: + + entry:NXentry + sample:NXsample + depends_on=transformations/phi + transformations:NXtransformations + phi=0 + @depends_on=chi + @transformation_type=rotation + @vector=[-1 -0.0037 -0.002] + @units=degrees + chi=0 + @depends_on=sam_x + @transformation_type=rotation + @vector=[0.0046 0.0372 0.9993] + @units=degrees + sam_x=0 + @depends_on=sam_y + @transformation_type=translation + @vector=[1 0 0] + @units=mm + sam_y=0 + @depends_on=sam_z + @transformation_type=translation + @vector=[0 1 0] + @units=mm + sam_z=0 + @depends_on=omega + @transformation_type=translation + @vector=[0 0 1] + @units=mm + omega=174 + @depends_on=. + @transformation_type=rotation + @vector=[-1 0 0] + @units=degrees + + **Example 2: different coordinate system** + + Define a laboratory reference frame with the X-axis along the beam and the Z-axis opposite to the direction of gravity. + Three point detectors are positioned in this reference: + + * *transmission*: + * point detector in the beam + * 20 cm downstream from the sample (the origin of the reference frame) + * *vertical*: + * point detector 10 cm downstream from the sample + * making an angle of 5 degrees with the beam w.r.t. the sample + * positioned in the XZ-plane above the XY-plane + * *horizontal*: + * point detector 11 cm downstream from the sample + * making an angle of 6 degrees with the beam w.r.t. the sample + * positioned in the XY-plane above the XZ-plane + + The coordinates of the point detectors in the laboratory reference frame are + + * *transmission*: :math:`X_\text{lab} = T_x(20) . X_d` + * *vertical*: :math:`X_\text{lab} = R_y(-5) . T_x(10) . X_d` + * *horizontal*: :math:`X_\text{lab} = R_x(-90) . R_y(-6) . T_x(11) . X_d` + + where + + * :math:`T_x`, :math:`T_y`, :math:`T_z`: active transformation matrices for translation along the X, Y and Z axes + * :math:`R_x`, :math:`R_y`, :math:`R_z`: active transformation matrices for rotation around the X, Y and Z axes + * :math:`X_d` is a coordinate in the detector reference frame. + + Note that as these are point detectors, we only have one coordinate :math:`X_d=[0,0,0,1]^T`. + + .. code-block:: + + entry:NXentry + instrument:NXinstrument + vertical:NXdetector + depends_on=position/distance + position:NXtransformations + distance=10 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=5 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=0 # stay in the vertical plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + horizontal:NXdetector + depends_on=position/distance + position:NXtransformations + distance=11 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=6 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=90 # rotate to the horizontal plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + transmission:NXdetector + depends_on=position/distance + position:NXtransformations + distance=20 # move downstream from the sample + @depends_on=/entry/coordinate_system/beam + @units=cm + @vector=[1 0 0] + coordinate_system:NXtransformations + beam=NaN # value is never used + @depends_on=gravity + @vector=[1 0 0] # X-axis points in the beam direction + gravity=NaN # value is never used + @depends_on=. # end of the chain + @vector=[0 0 -1] # Z-axis points up + DEBUG - ===== ATTRS (//entry/instrument/manipulator/transformations@NX_class) DEBUG - value: NXtransformations @@ -2951,7 +3806,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/instrument/manipulator/transformations/rot_x@transformation_type) DEBUG - value: rotation @@ -3025,7 +3880,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/instrument/manipulator/transformations/rot_z@transformation_type) DEBUG - value: rotation @@ -3099,7 +3954,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/instrument/manipulator/transformations/trans_z@transformation_type) DEBUG - value: translation @@ -3145,22 +4000,86 @@ DEBUG - increasing displacement. For general axes, an appropriate direction should be chosen. -DEBUG - ===== FIELD (//entry/instrument/momentum_resolution): -DEBUG - value: 0.08 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/instrument/momentum_resolution [NXmpes::/NXentry/NXinstrument/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] DEBUG - classes: -NXinstrument.nxdl.xml:/momentum_resolution +NXinstrument.nxdl.xml:/RESOLUTION +NXresolution.nxdl.xml: DEBUG - <> -DEBUG - documentation (NXinstrument.nxdl.xml:/momentum_resolution): +DEBUG - documentation (NXinstrument.nxdl.xml:/RESOLUTION): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:): DEBUG - - Momentum resolution of the experiment (FWHM) + Describes the resolution of a physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/momentum_resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - classes: +NXinstrument.nxdl.xml:/RESOLUTION +NXresolution.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/momentum_resolution/physical_quantity): +DEBUG - value: b'momentum' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXresolution.nxdl.xml:/physical_quantity +DEBUG - <> +DEBUG - documentation (NXresolution.nxdl.xml:/physical_quantity): +DEBUG - + The physical quantity of the resolution, e.g., + energy, momentum, time, etc. -DEBUG - ===== ATTRS (//entry/instrument/momentum_resolution@units) +DEBUG - ===== GROUP (//entry/instrument/momentum_resolution/resolution [NXmpes::/NXentry/NXinstrument/NXresolution/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== ATTRS (//entry/instrument/momentum_resolution/resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== ATTRS (//entry/instrument/momentum_resolution/resolution@units) DEBUG - value: 1/angstrom -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/momentum_resolution/resolution/physical_quantity): +DEBUG - value: b'momentum' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/momentum_resolution/resolution/resolution): +DEBUG - value: 0.08 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== ATTRS (//entry/instrument/momentum_resolution/resolution/resolution@units) +DEBUG - value: 1/angstrom +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/momentum_resolution/resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/momentum_resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_CHAR'] DEBUG - classes: -NXinstrument.nxdl.xml:/momentum_resolution -DEBUG - NXinstrument.nxdl.xml:/momentum_resolution@units [NX_WAVENUMBER] +NXresolution.nxdl.xml:/type +DEBUG - <> +DEBUG - enumeration (NXresolution.nxdl.xml:/type): +DEBUG - -> estimated +DEBUG - -> derived +DEBUG - -> calibrated +DEBUG - -> other +DEBUG - documentation (NXresolution.nxdl.xml:/type): +DEBUG - + The process by which the resolution was determined. + DEBUG - ===== FIELD (//entry/instrument/name): DEBUG - value: b'Time-of-flight momentum microscope equipped delay line detector, at the endstation of the high rep-rate HHG source at FHI' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_CHAR'] @@ -3182,36 +4101,35 @@ DEBUG - documentation (NXinstrument.nxdl.xml:/name/short_name): DEBUG - short name for instrument, perhaps the acronym -DEBUG - ===== GROUP (//entry/instrument/source [NXmpes::/NXentry/NXinstrument/NXsource]): +DEBUG - ===== GROUP (//entry/instrument/source_probe [NXmpes::/NXentry/NXinstrument/NXsource]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE NXinstrument.nxdl.xml:/SOURCE NXsource.nxdl.xml: -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE): -DEBUG - - The source used to generate the primary photons. Properties refer strictly to - parameters of the source, not of the output beam. For example, the energy of the - source is not the optical power of the beam, but the energy of the electron beam - in a synchrotron and so on. - +DEBUG - <> DEBUG - documentation (NXinstrument.nxdl.xml:/SOURCE): DEBUG - DEBUG - documentation (NXsource.nxdl.xml:): DEBUG - - The neutron or x-ray storage ring/facility. + Radiation source emitting a beam. + + Examples include particle sources (electrons, neutrons, protons) or sources for electromagnetic radiation (photons). + This base class can also be used to describe neutron or x-ray storage ring/facilities. -DEBUG - ===== ATTRS (//entry/instrument/source@NX_class) +DEBUG - ===== ATTRS (//entry/instrument/source_probe@NX_class) DEBUG - value: NXsource DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE NXinstrument.nxdl.xml:/SOURCE NXsource.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/instrument/source/frequency): +DEBUG - ===== FIELD (//entry/instrument/source_probe/associated_beam): +DEBUG - value: b'/entry/instrument/beam_probe' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/source_probe/frequency): DEBUG - value: 500.0 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] DEBUG - classes: @@ -3221,13 +4139,13 @@ DEBUG - documentation (NXsource.nxdl.xml:/frequency): DEBUG - Frequency of pulsed source -DEBUG - ===== ATTRS (//entry/instrument/source/frequency@units) +DEBUG - ===== ATTRS (//entry/instrument/source_probe/frequency@units) DEBUG - value: kHz DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] DEBUG - classes: NXsource.nxdl.xml:/frequency DEBUG - NXsource.nxdl.xml:/frequency@units [NX_FREQUENCY] -DEBUG - ===== FIELD (//entry/instrument/source/mode): +DEBUG - ===== FIELD (//entry/instrument/source_probe/mode): DEBUG - value: b'Single Bunch' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_CHAR'] DEBUG - classes: @@ -3240,20 +4158,17 @@ DEBUG - documentation (NXsource.nxdl.xml:/mode): DEBUG - source operating mode -DEBUG - ===== FIELD (//entry/instrument/source/name): +DEBUG - ===== FIELD (//entry/instrument/source_probe/name): DEBUG - value: b'HHG @ TR-ARPES @ FHI' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/name NXsource.nxdl.xml:/name -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/name): -DEBUG - +DEBUG - <> DEBUG - documentation (NXsource.nxdl.xml:/name): DEBUG - Name of source -DEBUG - ===== FIELD (//entry/instrument/source/photon_energy): +DEBUG - ===== FIELD (//entry/instrument/source_probe/photon_energy): DEBUG - value: 21.7 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] DEBUG - classes: @@ -3264,25 +4179,21 @@ DEBUG - The center photon energy of the source, before it is monochromatized or converted -DEBUG - ===== ATTRS (//entry/instrument/source/photon_energy@units) +DEBUG - ===== ATTRS (//entry/instrument/source_probe/photon_energy@units) DEBUG - value: eV DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] DEBUG - classes: NXsource.nxdl.xml:/photon_energy DEBUG - NXsource.nxdl.xml:/photon_energy@units [NX_ENERGY] -DEBUG - ===== FIELD (//entry/instrument/source/probe): -DEBUG - value: b'ultraviolet' +DEBUG - ===== FIELD (//entry/instrument/source_probe/probe): +DEBUG - value: b'photon' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe NXsource.nxdl.xml:/probe -DEBUG - <> -DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe): -DEBUG - -> x-ray -DEBUG - -> ultraviolet -DEBUG - -> visible light +DEBUG - <> DEBUG - enumeration (NXsource.nxdl.xml:/probe): DEBUG - -> neutron +DEBUG - -> photon DEBUG - -> x-ray DEBUG - -> muon DEBUG - -> electron @@ -3290,32 +4201,16 @@ DEBUG - -> ultraviolet DEBUG - -> visible light DEBUG - -> positron DEBUG - -> proton -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe): -DEBUG - - Type of probe. In photoemission it's always photons, so the full NIAC list is - restricted. - DEBUG - documentation (NXsource.nxdl.xml:/probe): DEBUG - type of radiation probe (pick one from the enumerated list and spell exactly) -DEBUG - ===== FIELD (//entry/instrument/source/type): +DEBUG - ===== FIELD (//entry/instrument/source_probe/type): DEBUG - value: b'HHG laser' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/type NXsource.nxdl.xml:/type -DEBUG - <> -DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/type): -DEBUG - -> Synchrotron X-ray Source -DEBUG - -> Rotating Anode X-ray -DEBUG - -> Fixed Tube X-ray -DEBUG - -> UV Laser -DEBUG - -> Free-Electron Laser -DEBUG - -> Optical Laser -DEBUG - -> UV Plasma Source -DEBUG - -> Metal Jet X-ray -DEBUG - -> HHG laser +DEBUG - <> DEBUG - enumeration (NXsource.nxdl.xml:/type): DEBUG - -> Spallation Neutron Source DEBUG - -> Pulsed Reactor Neutron Source @@ -3330,41 +4225,38 @@ DEBUG - -> Optical Laser DEBUG - -> Ion Source DEBUG - -> UV Plasma Source DEBUG - -> Metal Jet X-ray -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/type): -DEBUG - DEBUG - documentation (NXsource.nxdl.xml:/type): DEBUG - type of radiation source (pick one from the enumerated list and spell exactly) -DEBUG - ===== GROUP (//entry/instrument/source_pump [NXmpes::/NXentry/NXinstrument/NXsource]): +DEBUG - ===== GROUP (//entry/instrument/source_pump [NXmpes::/NXentry/NXinstrument/NXsource]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE NXinstrument.nxdl.xml:/SOURCE NXsource.nxdl.xml: -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE): -DEBUG - - The source used to generate the primary photons. Properties refer strictly to - parameters of the source, not of the output beam. For example, the energy of the - source is not the optical power of the beam, but the energy of the electron beam - in a synchrotron and so on. - +DEBUG - <> DEBUG - documentation (NXinstrument.nxdl.xml:/SOURCE): DEBUG - DEBUG - documentation (NXsource.nxdl.xml:): DEBUG - - The neutron or x-ray storage ring/facility. + Radiation source emitting a beam. + + Examples include particle sources (electrons, neutrons, protons) or sources for electromagnetic radiation (photons). + This base class can also be used to describe neutron or x-ray storage ring/facilities. DEBUG - ===== ATTRS (//entry/instrument/source_pump@NX_class) DEBUG - value: NXsource DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE NXinstrument.nxdl.xml:/SOURCE NXsource.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - +DEBUG - ===== FIELD (//entry/instrument/source_pump/associated_beam): +DEBUG - value: b'/entry/instrument/beam_pump' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== FIELD (//entry/instrument/source_pump/frequency): DEBUG - value: 500.0 DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] @@ -3398,11 +4290,8 @@ DEBUG - ===== FIELD (//entry/instrument/source_pump/name): > -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/name): -DEBUG - +DEBUG - <> DEBUG - documentation (NXsource.nxdl.xml:/name): DEBUG - Name of source @@ -3428,15 +4317,11 @@ DEBUG - ===== FIELD (//entry/instrument/source_pump/probe): > -DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe): -DEBUG - -> x-ray -DEBUG - -> ultraviolet -DEBUG - -> visible light +DEBUG - <> DEBUG - enumeration (NXsource.nxdl.xml:/probe): DEBUG - -> neutron +DEBUG - -> photon DEBUG - -> x-ray DEBUG - -> muon DEBUG - -> electron @@ -3444,11 +4329,6 @@ DEBUG - -> ultraviolet DEBUG - -> visible light DEBUG - -> positron DEBUG - -> proton -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe): -DEBUG - - Type of probe. In photoemission it's always photons, so the full NIAC list is - restricted. - DEBUG - documentation (NXsource.nxdl.xml:/probe): DEBUG - type of radiation probe (pick one from the enumerated list and spell exactly) @@ -3457,19 +4337,8 @@ DEBUG - ===== FIELD (//entry/instrument/source_pump/type): > -DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/type): -DEBUG - -> Synchrotron X-ray Source -DEBUG - -> Rotating Anode X-ray -DEBUG - -> Fixed Tube X-ray -DEBUG - -> UV Laser -DEBUG - -> Free-Electron Laser -DEBUG - -> Optical Laser -DEBUG - -> UV Plasma Source -DEBUG - -> Metal Jet X-ray -DEBUG - -> HHG laser +DEBUG - <> DEBUG - enumeration (NXsource.nxdl.xml:/type): DEBUG - -> Spallation Neutron Source DEBUG - -> Pulsed Reactor Neutron Source @@ -3484,35 +4353,79 @@ DEBUG - -> Optical Laser DEBUG - -> Ion Source DEBUG - -> UV Plasma Source DEBUG - -> Metal Jet X-ray -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/type): -DEBUG - DEBUG - documentation (NXsource.nxdl.xml:/type): DEBUG - type of radiation source (pick one from the enumerated list and spell exactly) -DEBUG - ===== FIELD (//entry/instrument/temporal_resolution): +DEBUG - ===== GROUP (//entry/instrument/temporal_resolution [NXmpes::/NXentry/NXinstrument/NXresolution]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - classes: +NXinstrument.nxdl.xml:/RESOLUTION +NXresolution.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXinstrument.nxdl.xml:/RESOLUTION): +DEBUG - +DEBUG - documentation (NXresolution.nxdl.xml:): +DEBUG - + Describes the resolution of a physical quantity. + +DEBUG - ===== ATTRS (//entry/instrument/temporal_resolution@NX_class) +DEBUG - value: NXresolution +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution'] +DEBUG - classes: +NXinstrument.nxdl.xml:/RESOLUTION +NXresolution.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/temporal_resolution/physical_quantity): +DEBUG - value: b'time' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_CHAR'] +DEBUG - classes: +NXresolution.nxdl.xml:/physical_quantity +DEBUG - <> +DEBUG - documentation (NXresolution.nxdl.xml:/physical_quantity): +DEBUG - + The physical quantity of the resolution, e.g., + energy, momentum, time, etc. + +DEBUG - ===== FIELD (//entry/instrument/temporal_resolution/resolution): DEBUG - value: 35.0 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_FLOAT'] DEBUG - classes: -NXinstrument.nxdl.xml:/temporal_resolution +NXresolution.nxdl.xml:/resolution DEBUG - <> -DEBUG - documentation (NXinstrument.nxdl.xml:/temporal_resolution): +DEBUG - documentation (NXresolution.nxdl.xml:/resolution): DEBUG - - Temporal resolution of the experiment (FWHM) + The resolution of the physical quantity. -DEBUG - ===== ATTRS (//entry/instrument/temporal_resolution@units) +DEBUG - ===== ATTRS (//entry/instrument/temporal_resolution/resolution@units) DEBUG - value: fs -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_FLOAT'] +DEBUG - classes: +NXresolution.nxdl.xml:/resolution +DEBUG - NXresolution.nxdl.xml:/resolution@units [NX_ANY] +DEBUG - ===== FIELD (//entry/instrument/temporal_resolution/type): +DEBUG - value: b'estimated' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXresolution', 'NX_CHAR'] DEBUG - classes: -NXinstrument.nxdl.xml:/temporal_resolution -DEBUG - NXinstrument.nxdl.xml:/temporal_resolution@units [NX_TIME] +NXresolution.nxdl.xml:/type +DEBUG - <> +DEBUG - enumeration (NXresolution.nxdl.xml:/type): +DEBUG - -> estimated +DEBUG - -> derived +DEBUG - -> calibrated +DEBUG - -> other +DEBUG - documentation (NXresolution.nxdl.xml:/type): +DEBUG - + The process by which the resolution was determined. + DEBUG - ===== GROUP (//entry/process [NXmpes::/NXentry/NXprocess]): DEBUG - classpath: ['NXentry', 'NXprocess'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/PROCESS NXentry.nxdl.xml:/PROCESS NXprocess.nxdl.xml: -DEBUG - <> +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/PROCESS): DEBUG - Document an event of data processing, reconstruction, or analysis for this data. @@ -3624,7 +4537,7 @@ DEBUG - .. _symmetry-guided distortion correction: https://www.sciencedirect.com/science/article/abs/pii/S0304399118303474?via%3Dihub -DEBUG - ===== GROUP (//entry/process/energy_calibration [NXmpes::/NXentry/NXprocess/NXcalibration]): +DEBUG - ===== GROUP (//entry/process/energy_calibration [NXmpes::/NXentry/NXprocess/NXcalibration]): DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/PROCESS/energy_calibration @@ -3633,6 +4546,13 @@ NXcalibration.nxdl.xml: DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/PROCESS/energy_calibration): DEBUG - + Calibration event on the energy axis. + + For XPS, the calibration should ideally be performed according to + `ISO 15472:2010`_ specification. + + .. _ISO 15472:2010: https://www.iso.org/standard/74811.html + DEBUG - documentation (NXprocess.nxdl.xml:/CALIBRATION): DEBUG - Describes the operations of calibration procedures, e.g. axis calibrations. @@ -3654,13 +4574,8 @@ DEBUG - ===== FIELD (//entry/process/energy_calibration/applied): > -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/PROCESS/energy_calibration/applied): -DEBUG - - Has an energy calibration been applied? - +DEBUG - <> DEBUG - documentation (NXcalibration.nxdl.xml:/applied): DEBUG - Has the calibration been applied? @@ -3680,6 +4595,18 @@ DEBUG - documentation (NXcalibration.nxdl.xml:/calibrated_axis): DEBUG - A vector representing the axis after calibration, matching the data length +DEBUG - ===== FIELD (//entry/process/energy_calibration/coefficients): +DEBUG - value: [ 6.33783929e-01 8.68180227e-07 -2.41647784e+01] +DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_FLOAT'] +DEBUG - classes: +NXcalibration.nxdl.xml:/coefficients +DEBUG - <> +DEBUG - documentation (NXcalibration.nxdl.xml:/coefficients): +DEBUG - + For non-linear energy calibrations, e.g. in a TOF, a polynomial function is fit + to a set of features (peaks) at well defined energy positions to determine + E(TOF). Here we can store the array of fit coefficients. + DEBUG - ===== FIELD (//entry/process/energy_calibration/fit_function): DEBUG - value: b'(a0/(x0-a1))**2 + a2' DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_CHAR'] @@ -3918,23 +4845,42 @@ DEBUG - * ``NX_UNITLESS`` for axes for which no transformation type is specified This class will usually contain all axes of a sample stage or goniometer or - a detector. The NeXus default McSTAS coordinate frame is assumed, but additional - useful coordinate axes may be defined by using axes for which no transformation - type has been specified. + a detector. The NeXus default :ref:`McSTAS coordinate frame` + is assumed, but additional useful coordinate axes may be defined by using axes for which + no transformation type has been specified. + + **Transformation chain** - The entry point (``depends_on``) will be outside of this class and point to a - field in here. Following the chain may also require following ``depends_on`` - links to transformations outside, for example to a common base table. If - a relative path is given, it is relative to the group enclosing the ``depends_on`` - specification. + The entry point of a chain of transformations is a field called ``depends_on`` + will be outside of this class and points to a field in here. Following the chain may + also require following ``depends_on`` links to transformations outside, for example + to a common base table. If a relative path is given, it is relative to the group + enclosing the ``depends_on`` specification. For a chain of three transformations, where :math:`T_1` depends on :math:`T_2` - and that in turn depends on :math:`T_3`, the final transformation :math:`T_f` is + which in turn depends on :math:`T_3`, the final *active* transformation + matrix :math:`T_f` is + + .. math:: T_f = T_3 . T_2 . T_1 + + For example when positioning a flat detector, its pixel positions in the laboratory + reference frame (:ref:`McSTAS coordinate frame` by default) + can be calculated by + + .. math:: X_\text{lab} = T_f . X_\text{pixel} = T_3 . T_2 . T_1 . X_\text{pixel} + + Note that :math:`T_1` comes first in the *depends-on* chain and is also applied first + to the pixel coordinates. + + When we say transformation :math:`A` *depends on* transformation :math:`B` we mean that + the physical motor that realizes :math:`A` is *stacked on top of* the motor that realizes :math:`B`. + So the activate coordinate transformation :math:`A` needs to be applied to a coordinate + before applying :math:`B`. In other words :math:`X' = B . A . X`. - .. math:: T_f = T_3 T_2 T_1 + **Transformation matrix** - In explicit terms, the transformations are a subset of affine transformations - expressed as 4x4 matrices that act on homogeneous coordinates, :math:`w=(x,y,z,1)^T`. + In explicit terms, the transformations are a subset of affine transformations expressed as + 4x4 active transformation matrices that act on homogeneous coordinates, :math:`X=[x,y,z,1]^T`. For rotation and translation, @@ -3948,8 +4894,8 @@ DEBUG - attribute multiplied by the field value, and :math:`R` is defined as a rotation about an axis in the direction of ``vector``, of angle of the field value. - NOTE - + **Usage** + One possible use of ``NXtransformations`` is to define the motors and transformations for a diffractometer (goniometer). Such use is mentioned in the ``NXinstrument`` base class. Use one ``NXtransformations`` group @@ -3957,8 +4903,7 @@ DEBUG - Collecting the motors of a sample table or xyz-stage in an NXtransformations group is equally possible. - - Following the section on the general dscription of axis in NXtransformations is a section which + Following the section on the general description of axis in NXtransformations is a section which documents the fields commonly used within NeXus for positioning purposes and their meaning. Whenever there is a need for positioning a beam line component please use the existing names. Use as many fields as needed in order to position the component. Feel free to add more axis if required. In the description @@ -3971,6 +4916,143 @@ DEBUG - * depends_on as needed. + + **Example 1: goniometer** + + Position a sample mounted on a goniometer in the :ref:`McSTAS coordinate frame`. + + The sample is oriented as follows + + .. math:: X_\text{lab} = R(\vec{v}_\omega, \omega) . + T(\vec{v}_z, \text{sam}_z) . + T(\vec{v}_y, \text{sam}_y) . + T(\vec{v}_x, \text{sam}_x) . + R(\vec{v}_\chi, \chi) . + R(\vec{v}_\varphi, \varphi) . X_s + + where + + * :math:`R(\vec{v},a)` is a rotation around vector :math:`\vec{v}` with angle :math:`a` + * :math:`T(\vec{u},t)` is a translation along vector :math:`\vec{u}` over a distance :math:`t` + * :math:`X_s` a coordinate in the sample reference frame. + + .. code-block:: + + entry:NXentry + sample:NXsample + depends_on=transformations/phi + transformations:NXtransformations + phi=0 + @depends_on=chi + @transformation_type=rotation + @vector=[-1 -0.0037 -0.002] + @units=degrees + chi=0 + @depends_on=sam_x + @transformation_type=rotation + @vector=[0.0046 0.0372 0.9993] + @units=degrees + sam_x=0 + @depends_on=sam_y + @transformation_type=translation + @vector=[1 0 0] + @units=mm + sam_y=0 + @depends_on=sam_z + @transformation_type=translation + @vector=[0 1 0] + @units=mm + sam_z=0 + @depends_on=omega + @transformation_type=translation + @vector=[0 0 1] + @units=mm + omega=174 + @depends_on=. + @transformation_type=rotation + @vector=[-1 0 0] + @units=degrees + + **Example 2: different coordinate system** + + Define a laboratory reference frame with the X-axis along the beam and the Z-axis opposite to the direction of gravity. + Three point detectors are positioned in this reference: + + * *transmission*: + * point detector in the beam + * 20 cm downstream from the sample (the origin of the reference frame) + * *vertical*: + * point detector 10 cm downstream from the sample + * making an angle of 5 degrees with the beam w.r.t. the sample + * positioned in the XZ-plane above the XY-plane + * *horizontal*: + * point detector 11 cm downstream from the sample + * making an angle of 6 degrees with the beam w.r.t. the sample + * positioned in the XY-plane above the XZ-plane + + The coordinates of the point detectors in the laboratory reference frame are + + * *transmission*: :math:`X_\text{lab} = T_x(20) . X_d` + * *vertical*: :math:`X_\text{lab} = R_y(-5) . T_x(10) . X_d` + * *horizontal*: :math:`X_\text{lab} = R_x(-90) . R_y(-6) . T_x(11) . X_d` + + where + + * :math:`T_x`, :math:`T_y`, :math:`T_z`: active transformation matrices for translation along the X, Y and Z axes + * :math:`R_x`, :math:`R_y`, :math:`R_z`: active transformation matrices for rotation around the X, Y and Z axes + * :math:`X_d` is a coordinate in the detector reference frame. + + Note that as these are point detectors, we only have one coordinate :math:`X_d=[0,0,0,1]^T`. + + .. code-block:: + + entry:NXentry + instrument:NXinstrument + vertical:NXdetector + depends_on=position/distance + position:NXtransformations + distance=10 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=5 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=0 # stay in the vertical plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + horizontal:NXdetector + depends_on=position/distance + position:NXtransformations + distance=11 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=6 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=90 # rotate to the horizontal plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + transmission:NXdetector + depends_on=position/distance + position:NXtransformations + distance=20 # move downstream from the sample + @depends_on=/entry/coordinate_system/beam + @units=cm + @vector=[1 0 0] + coordinate_system:NXtransformations + beam=NaN # value is never used + @depends_on=gravity + @vector=[1 0 0] # X-axis points in the beam direction + gravity=NaN # value is never used + @depends_on=. # end of the chain + @vector=[0 0 -1] # Z-axis points up + DEBUG - ===== ATTRS (//entry/process/registration/tranformations@NX_class) DEBUG - value: NXtransformations @@ -4008,7 +5090,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/process/registration/tranformations/rot_z@offset) DEBUG - value: [256. 256. 0.] @@ -4095,7 +5177,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/process/registration/tranformations/trans_x@transformation_type) DEBUG - value: translation @@ -4169,7 +5251,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/process/registration/tranformations/trans_y@transformation_type) DEBUG - value: translation @@ -4215,7 +5297,7 @@ DEBUG - increasing displacement. For general axes, an appropriate direction should be chosen. -DEBUG - ===== GROUP (//entry/sample [NXmpes::/NXentry/NXsample]): +DEBUG - ===== GROUP (//entry/sample [NXmpes::/NXentry/NXsample]): DEBUG - classpath: ['NXentry', 'NXsample'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE @@ -4243,34 +5325,132 @@ NXentry.nxdl.xml:/SAMPLE NXsample.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/sample/bias): -DEBUG - value: 17.799719004221362 -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/sample/bias [NXmpes::/NXentry/NXsample/NXenvironment]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias -DEBUG - <> +NXsample.nxdl.xml:/ENVIRONMENT +NXenvironment.nxdl.xml: +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias): DEBUG - - Voltage applied to sample and sample holder. + Bias of the sample with respect to analyser ground. + + This concept is related to term `8.41`_ of the ISO 18115-1:2023 standard. + + .. _8.41: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:8.41 -DEBUG - ===== ATTRS (//entry/sample/bias@units) -DEBUG - value: V -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_FLOAT'] +DEBUG - documentation (NXsample.nxdl.xml:/ENVIRONMENT): +DEBUG - + Any environmental or external stimuli/measurements. + These can include, among others: + applied pressure, surrounding gas phase and gas pressure, + external electric/magnetic/mechanical fields, temperature, ... + +DEBUG - documentation (NXenvironment.nxdl.xml:): +DEBUG - + Parameters for controlling external conditions + +DEBUG - ===== ATTRS (//entry/sample/bias@NX_class) +DEBUG - value: NXenvironment +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias -DEBUG - NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias@units [NX_VOLTAGE] +NXsample.nxdl.xml:/ENVIRONMENT +NXenvironment.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== GROUP (//entry/sample/bias/voltmeter [NXmpes::/NXentry/NXsample/NXenvironment/NXsensor]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias/voltmeter +NXenvironment.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias/voltmeter): +DEBUG - + Sensor measuring the applied voltage. + + This should be a link to /entry/instrument/manipulator/sample_bias_voltmeter. + +DEBUG - documentation (NXenvironment.nxdl.xml:/SENSOR): +DEBUG - + Any sensor used to monitor the environment. This can be linked to a sensor + defined in an NXinstrument instance. + +DEBUG - documentation (NXsensor.nxdl.xml:): +DEBUG - + A sensor used to monitor an external condition + + The condition itself is described in :ref:`NXenvironment`. + +DEBUG - ===== ATTRS (//entry/sample/bias/voltmeter@NX_class) +DEBUG - value: NXsensor +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/bias/voltmeter +NXenvironment.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/sample/bias/voltmeter/measurement): +DEBUG - value: b'voltage' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXsensor.nxdl.xml:/measurement +DEBUG - <> +DEBUG - enumeration (NXsensor.nxdl.xml:/measurement): +DEBUG - -> temperature +DEBUG - -> pH +DEBUG - -> magnetic_field +DEBUG - -> electric_field +DEBUG - -> current +DEBUG - -> conductivity +DEBUG - -> resistance +DEBUG - -> voltage +DEBUG - -> pressure +DEBUG - -> flow +DEBUG - -> stress +DEBUG - -> strain +DEBUG - -> shear +DEBUG - -> surface_pressure +DEBUG - documentation (NXsensor.nxdl.xml:/measurement): +DEBUG - + name for measured signal + +DEBUG - ===== FIELD (//entry/sample/bias/voltmeter/name): +DEBUG - value: b'sample_bias' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXsensor.nxdl.xml:/name +DEBUG - <> +DEBUG - documentation (NXsensor.nxdl.xml:/name): +DEBUG - + Name for the sensor + +DEBUG - ===== FIELD (//entry/sample/bias/voltmeter/value): +DEBUG - value: 17.799719004221362 +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXsensor.nxdl.xml:/value +DEBUG - <> +DEBUG - documentation (NXsensor.nxdl.xml:/value): +DEBUG - + nominal setpoint or average value + - need [n] as may be a vector + +DEBUG - ===== ATTRS (//entry/sample/bias/voltmeter/value@units) +DEBUG - value: V +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXsensor.nxdl.xml:/value +DEBUG - NXsensor.nxdl.xml:/value@units [NX_ANY] DEBUG - ===== FIELD (//entry/sample/chemical_formula): DEBUG - value: b'MoTe2' DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/SAMPLE/chemical_formula NXsample.nxdl.xml:/chemical_formula -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/chemical_formula): -DEBUG - - The chemical formula of the sample. For mixtures use the NXsample_component - group in NXsample instead. - +DEBUG - <> DEBUG - documentation (NXsample.nxdl.xml:/chemical_formula): DEBUG - The chemical formula specified using CIF conventions. @@ -4317,20 +5497,61 @@ DEBUG - documentation (NXsample.nxdl.xml:/description): DEBUG - Description of the sample -DEBUG - ===== FIELD (//entry/sample/gas_pressure): -DEBUG - value: 4.5599999999999996e-11 -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/sample/gas_pressure [NXmpes::/NXentry/NXsample/NXenvironment]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure -DEBUG - <> +NXsample.nxdl.xml:/ENVIRONMENT +NXenvironment.nxdl.xml: +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure): DEBUG - -DEBUG - ===== ATTRS (//entry/sample/gas_pressure@units) -DEBUG - value: mbar -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_FLOAT'] + Gas pressure surrounding the sample. + +DEBUG - documentation (NXsample.nxdl.xml:/ENVIRONMENT): +DEBUG - + Any environmental or external stimuli/measurements. + These can include, among others: + applied pressure, surrounding gas phase and gas pressure, + external electric/magnetic/mechanical fields, temperature, ... + +DEBUG - documentation (NXenvironment.nxdl.xml:): +DEBUG - + Parameters for controlling external conditions + +DEBUG - ===== ATTRS (//entry/sample/gas_pressure@NX_class) +DEBUG - value: NXenvironment +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure -DEBUG - NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure@units [NX_PRESSURE] +NXsample.nxdl.xml:/ENVIRONMENT +NXenvironment.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== GROUP (//entry/sample/gas_pressure/pressure_gauge [NXmpes::/NXentry/NXsample/NXenvironment/pressure_gauge]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/sample/gas_pressure/pressure_gauge/measurement): +DEBUG - value: b'pressure' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/sample/gas_pressure/pressure_gauge/name): +DEBUG - value: b'sample_chamber_pressure' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/sample/gas_pressure/pressure_gauge/value): +DEBUG - value: 4.5599999999999996e-11 +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== ATTRS (//entry/sample/gas_pressure/pressure_gauge/value@units) +DEBUG - value: mbar +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== FIELD (//entry/sample/name): DEBUG - value: b'MoTe2' DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] @@ -4344,103 +5565,74 @@ DEBUG - documentation (NXsample.nxdl.xml:/name): DEBUG - Descriptive name of sample +DEBUG - ===== FIELD (//entry/sample/physical_form): +DEBUG - value: b'thin film' +DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/physical_form +NXsample.nxdl.xml:/physical_form +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/physical_form): +DEBUG - +DEBUG - documentation (NXsample.nxdl.xml:/physical_form): +DEBUG - + Physical form of the sample material. + Examples include single crystal, foil, pellet, powder, thin film, disc, foam, gas, liquid, amorphous. + DEBUG - ===== FIELD (//entry/sample/preparation_date): DEBUG - value: b'2019-05-22T14:00:00+00:00' DEBUG - classpath: ['NXentry', 'NXsample', 'NX_DATE_TIME'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/SAMPLE/preparation_date NXsample.nxdl.xml:/preparation_date -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/preparation_date): -DEBUG - - Date of preparation of the sample for the XPS experiment (i.e. cleaving, last - annealing). - +DEBUG - <> DEBUG - documentation (NXsample.nxdl.xml:/preparation_date): DEBUG - Date of preparation of the sample -DEBUG - ===== GROUP (//entry/sample/preparation_description [NXmpes::/NXentry/NXsample/NXnote]): -DEBUG - classpath: ['NXentry', 'NXsample', 'NXnote'] -DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/SAMPLE/preparation_description -NXnote.nxdl.xml: -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/preparation_description): -DEBUG - - Description of the surface preparation technique for the XPS experiment, i.e. - UHV cleaving, in-situ growth, sputtering/annealing etc. Ideally, a full report - of the previous operations, in any format(NXnote allows to add pictures, audio, - movies). Alternatively, a reference to the location or a unique identifier or - other metadata file. In the case these are not available, free-text description. - -DEBUG - documentation (NXnote.nxdl.xml:): -DEBUG - - Any additional freeform information not covered by the other base classes. - - This class can be used to store additional information in a - NeXus file e.g. pictures, movies, audio, additional text logs - -DEBUG - ===== ATTRS (//entry/sample/preparation_description@NX_class) -DEBUG - value: NXnote -DEBUG - classpath: ['NXentry', 'NXsample', 'NXnote'] -DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/SAMPLE/preparation_description -NXnote.nxdl.xml: -DEBUG - @NX_class [NX_CHAR] -DEBUG - -DEBUG - ===== FIELD (//entry/sample/preparation_description/description): -DEBUG - value: b'Here should be a description of the preparation procedure.' -DEBUG - classpath: ['NXentry', 'NXsample', 'NXnote', 'NX_CHAR'] -DEBUG - classes: -NXnote.nxdl.xml:/description -DEBUG - <> -DEBUG - documentation (NXnote.nxdl.xml:/description): -DEBUG - Title of an image or other details of the note -DEBUG - ===== GROUP (//entry/sample/sample_history [NXmpes::/NXentry/NXsample/NXnote]): -DEBUG - classpath: ['NXentry', 'NXsample', 'NXnote'] +DEBUG - ===== GROUP (//entry/sample/sample_history [NXmpes::/NXentry/NXsample/NXsample_history]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXsample_history'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/sample_history -NXnote.nxdl.xml: +NXsample.nxdl.xml:/SAMPLE_HISTORY +NXsample_history.nxdl.xml: DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/sample_history): DEBUG - - A descriptor to keep track of the treatment of the sample before entering the - photoemission experiment. Ideally, a full report of the previous operations, in - any format (NXnote allows to add pictures, audio, movies). Alternatively, a - reference to the location or a unique identifier or other metadata file. In the - case these are not available, free-text description. + A set of activities that occurred to the sample prior to/during photoemission + experiment. -DEBUG - documentation (NXnote.nxdl.xml:): +DEBUG - documentation (NXsample.nxdl.xml:/SAMPLE_HISTORY): DEBUG - - Any additional freeform information not covered by the other base classes. - - This class can be used to store additional information in a - NeXus file e.g. pictures, movies, audio, additional text logs - + A set of physical processes that occurred to the sample prior/during experiment. + +DEBUG - documentation (NXsample_history.nxdl.xml:): +DEBUG - + A set of activities that occurred to the sample prior/during experiment. + + Ideally, a full report of the previous operations (or links to a chain of operations). + Alternatively, notes allow for additional descriptors in any format. + DEBUG - ===== ATTRS (//entry/sample/sample_history@NX_class) -DEBUG - value: NXnote -DEBUG - classpath: ['NXentry', 'NXsample', 'NXnote'] +DEBUG - value: NXsample_history +DEBUG - classpath: ['NXentry', 'NXsample', 'NXsample_history'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/sample_history -NXnote.nxdl.xml: +NXsample.nxdl.xml:/SAMPLE_HISTORY +NXsample_history.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/sample/sample_history/description): +DEBUG - ===== FIELD (//entry/sample/sample_history/notes): DEBUG - value: b'Cleaved' -DEBUG - classpath: ['NXentry', 'NXsample', 'NXnote', 'NX_CHAR'] -DEBUG - classes: -NXnote.nxdl.xml:/description -DEBUG - <> -DEBUG - documentation (NXnote.nxdl.xml:/description): -DEBUG - Title of an image or other details of the note +DEBUG - classpath: ['NXentry', 'NXsample', 'NXsample_history'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== FIELD (//entry/sample/situation): DEBUG - value: b'vacuum' DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/situation NXsample.nxdl.xml:/situation -DEBUG - <> +DEBUG - <> DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/SAMPLE/situation): DEBUG - -> vacuum DEBUG - -> inert atmosphere @@ -4462,32 +5654,121 @@ DEBUG - its details will be stored; the relevant components will be indicated by the entry in the sample_component member. -DEBUG - ===== FIELD (//entry/sample/temperature): -DEBUG - value: 23.050763803680983 -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_FLOAT'] +DEBUG - ===== GROUP (//entry/sample/substance [NXmpes::/NXentry/NXsample/substance]): +DEBUG - classpath: ['NXentry', 'NXsample'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== FIELD (//entry/sample/substance/molecular_formula_hill): +DEBUG - value: b'MoTe2' +DEBUG - classpath: ['NXentry', 'NXsample'] +DEBUG - NOT IN SCHEMA +DEBUG - +DEBUG - ===== GROUP (//entry/sample/temperature [NXmpes::/NXentry/NXsample/NXenvironment]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature -NXsample.nxdl.xml:/temperature -DEBUG - <> +NXenvironment.nxdl.xml: +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature): DEBUG - - In the case of a fixed temperature measurement this is the scalar temperature of - the sample. In the case of an experiment in which the temperature is changed and - recoded, this is an array of length m of temperatures. This should be a link to - /entry/instrument/manipulator/sample_temperature. + Sample temperature (either controlled or just measured). -DEBUG - documentation (NXsample.nxdl.xml:/temperature): +DEBUG - documentation (NXenvironment.nxdl.xml:): +DEBUG - + Parameters for controlling external conditions + +DEBUG - ===== ATTRS (//entry/sample/temperature@NX_class) +DEBUG - value: NXenvironment +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature +NXenvironment.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== GROUP (//entry/sample/temperature/temperature_sensor [NXmpes::/NXentry/NXsample/NXenvironment/NXsensor]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature/temperature_sensor +NXenvironment.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature/temperature_sensor): +DEBUG - + Temperature sensor measuring the sample temperature. + This should be a link to /entry/instrument/manipulator/temperature_sensor. + +DEBUG - documentation (NXenvironment.nxdl.xml:/SENSOR): +DEBUG - + Any sensor used to monitor the environment. This can be linked to a sensor + defined in an NXinstrument instance. + +DEBUG - documentation (NXsensor.nxdl.xml:): +DEBUG - + A sensor used to monitor an external condition + + The condition itself is described in :ref:`NXenvironment`. + +DEBUG - ===== ATTRS (//entry/sample/temperature/temperature_sensor@NX_class) +DEBUG - value: NXsensor +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature/temperature_sensor +NXenvironment.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/sample/temperature/temperature_sensor/measurement): +DEBUG - value: b'temperature' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXsensor.nxdl.xml:/measurement +DEBUG - <> +DEBUG - enumeration (NXsensor.nxdl.xml:/measurement): +DEBUG - -> temperature +DEBUG - -> pH +DEBUG - -> magnetic_field +DEBUG - -> electric_field +DEBUG - -> current +DEBUG - -> conductivity +DEBUG - -> resistance +DEBUG - -> voltage +DEBUG - -> pressure +DEBUG - -> flow +DEBUG - -> stress +DEBUG - -> strain +DEBUG - -> shear +DEBUG - -> surface_pressure +DEBUG - documentation (NXsensor.nxdl.xml:/measurement): +DEBUG - + name for measured signal + +DEBUG - ===== FIELD (//entry/sample/temperature/temperature_sensor/name): +DEBUG - value: b'sample_temperature' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXsensor.nxdl.xml:/name +DEBUG - <> +DEBUG - documentation (NXsensor.nxdl.xml:/name): +DEBUG - + Name for the sensor + +DEBUG - ===== FIELD (//entry/sample/temperature/temperature_sensor/value): +DEBUG - value: 23.050763803680983 +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXsensor.nxdl.xml:/value +DEBUG - <> +DEBUG - documentation (NXsensor.nxdl.xml:/value): DEBUG - - Sample temperature. This could be a scanned variable + nominal setpoint or average value + - need [n] as may be a vector -DEBUG - ===== ATTRS (//entry/sample/temperature@units) +DEBUG - ===== ATTRS (//entry/sample/temperature/temperature_sensor/value@units) DEBUG - value: K -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_FLOAT'] +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor', 'NX_FLOAT'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature -NXsample.nxdl.xml:/temperature -DEBUG - NXmpes.nxdl.xml:/ENTRY/SAMPLE/temperature@units [NX_TEMPERATURE] -DEBUG - NXsample.nxdl.xml:/temperature@units [NX_TEMPERATURE] +NXsensor.nxdl.xml:/value +DEBUG - NXsensor.nxdl.xml:/value@units [NX_ANY] DEBUG - ===== GROUP (//entry/sample/transformations [NXmpes::/NXentry/NXsample/NXtransformations]): DEBUG - classpath: ['NXentry', 'NXsample', 'NXtransformations'] DEBUG - classes: @@ -4524,23 +5805,42 @@ DEBUG - * ``NX_UNITLESS`` for axes for which no transformation type is specified This class will usually contain all axes of a sample stage or goniometer or - a detector. The NeXus default McSTAS coordinate frame is assumed, but additional - useful coordinate axes may be defined by using axes for which no transformation - type has been specified. + a detector. The NeXus default :ref:`McSTAS coordinate frame` + is assumed, but additional useful coordinate axes may be defined by using axes for which + no transformation type has been specified. + + **Transformation chain** - The entry point (``depends_on``) will be outside of this class and point to a - field in here. Following the chain may also require following ``depends_on`` - links to transformations outside, for example to a common base table. If - a relative path is given, it is relative to the group enclosing the ``depends_on`` - specification. + The entry point of a chain of transformations is a field called ``depends_on`` + will be outside of this class and points to a field in here. Following the chain may + also require following ``depends_on`` links to transformations outside, for example + to a common base table. If a relative path is given, it is relative to the group + enclosing the ``depends_on`` specification. For a chain of three transformations, where :math:`T_1` depends on :math:`T_2` - and that in turn depends on :math:`T_3`, the final transformation :math:`T_f` is + which in turn depends on :math:`T_3`, the final *active* transformation + matrix :math:`T_f` is + + .. math:: T_f = T_3 . T_2 . T_1 + + For example when positioning a flat detector, its pixel positions in the laboratory + reference frame (:ref:`McSTAS coordinate frame` by default) + can be calculated by + + .. math:: X_\text{lab} = T_f . X_\text{pixel} = T_3 . T_2 . T_1 . X_\text{pixel} + + Note that :math:`T_1` comes first in the *depends-on* chain and is also applied first + to the pixel coordinates. + + When we say transformation :math:`A` *depends on* transformation :math:`B` we mean that + the physical motor that realizes :math:`A` is *stacked on top of* the motor that realizes :math:`B`. + So the activate coordinate transformation :math:`A` needs to be applied to a coordinate + before applying :math:`B`. In other words :math:`X' = B . A . X`. - .. math:: T_f = T_3 T_2 T_1 + **Transformation matrix** - In explicit terms, the transformations are a subset of affine transformations - expressed as 4x4 matrices that act on homogeneous coordinates, :math:`w=(x,y,z,1)^T`. + In explicit terms, the transformations are a subset of affine transformations expressed as + 4x4 active transformation matrices that act on homogeneous coordinates, :math:`X=[x,y,z,1]^T`. For rotation and translation, @@ -4554,8 +5854,8 @@ DEBUG - attribute multiplied by the field value, and :math:`R` is defined as a rotation about an axis in the direction of ``vector``, of angle of the field value. - NOTE - + **Usage** + One possible use of ``NXtransformations`` is to define the motors and transformations for a diffractometer (goniometer). Such use is mentioned in the ``NXinstrument`` base class. Use one ``NXtransformations`` group @@ -4563,8 +5863,7 @@ DEBUG - Collecting the motors of a sample table or xyz-stage in an NXtransformations group is equally possible. - - Following the section on the general dscription of axis in NXtransformations is a section which + Following the section on the general description of axis in NXtransformations is a section which documents the fields commonly used within NeXus for positioning purposes and their meaning. Whenever there is a need for positioning a beam line component please use the existing names. Use as many fields as needed in order to position the component. Feel free to add more axis if required. In the description @@ -4577,6 +5876,143 @@ DEBUG - * depends_on as needed. + + **Example 1: goniometer** + + Position a sample mounted on a goniometer in the :ref:`McSTAS coordinate frame`. + + The sample is oriented as follows + + .. math:: X_\text{lab} = R(\vec{v}_\omega, \omega) . + T(\vec{v}_z, \text{sam}_z) . + T(\vec{v}_y, \text{sam}_y) . + T(\vec{v}_x, \text{sam}_x) . + R(\vec{v}_\chi, \chi) . + R(\vec{v}_\varphi, \varphi) . X_s + + where + + * :math:`R(\vec{v},a)` is a rotation around vector :math:`\vec{v}` with angle :math:`a` + * :math:`T(\vec{u},t)` is a translation along vector :math:`\vec{u}` over a distance :math:`t` + * :math:`X_s` a coordinate in the sample reference frame. + + .. code-block:: + + entry:NXentry + sample:NXsample + depends_on=transformations/phi + transformations:NXtransformations + phi=0 + @depends_on=chi + @transformation_type=rotation + @vector=[-1 -0.0037 -0.002] + @units=degrees + chi=0 + @depends_on=sam_x + @transformation_type=rotation + @vector=[0.0046 0.0372 0.9993] + @units=degrees + sam_x=0 + @depends_on=sam_y + @transformation_type=translation + @vector=[1 0 0] + @units=mm + sam_y=0 + @depends_on=sam_z + @transformation_type=translation + @vector=[0 1 0] + @units=mm + sam_z=0 + @depends_on=omega + @transformation_type=translation + @vector=[0 0 1] + @units=mm + omega=174 + @depends_on=. + @transformation_type=rotation + @vector=[-1 0 0] + @units=degrees + + **Example 2: different coordinate system** + + Define a laboratory reference frame with the X-axis along the beam and the Z-axis opposite to the direction of gravity. + Three point detectors are positioned in this reference: + + * *transmission*: + * point detector in the beam + * 20 cm downstream from the sample (the origin of the reference frame) + * *vertical*: + * point detector 10 cm downstream from the sample + * making an angle of 5 degrees with the beam w.r.t. the sample + * positioned in the XZ-plane above the XY-plane + * *horizontal*: + * point detector 11 cm downstream from the sample + * making an angle of 6 degrees with the beam w.r.t. the sample + * positioned in the XY-plane above the XZ-plane + + The coordinates of the point detectors in the laboratory reference frame are + + * *transmission*: :math:`X_\text{lab} = T_x(20) . X_d` + * *vertical*: :math:`X_\text{lab} = R_y(-5) . T_x(10) . X_d` + * *horizontal*: :math:`X_\text{lab} = R_x(-90) . R_y(-6) . T_x(11) . X_d` + + where + + * :math:`T_x`, :math:`T_y`, :math:`T_z`: active transformation matrices for translation along the X, Y and Z axes + * :math:`R_x`, :math:`R_y`, :math:`R_z`: active transformation matrices for rotation around the X, Y and Z axes + * :math:`X_d` is a coordinate in the detector reference frame. + + Note that as these are point detectors, we only have one coordinate :math:`X_d=[0,0,0,1]^T`. + + .. code-block:: + + entry:NXentry + instrument:NXinstrument + vertical:NXdetector + depends_on=position/distance + position:NXtransformations + distance=10 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=5 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=0 # stay in the vertical plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + horizontal:NXdetector + depends_on=position/distance + position:NXtransformations + distance=11 # move downstream from the sample + @depends_on=polar + @units=cm + @vector=[1 0 0] + polar=6 # title above the horizontal plane + @depends_on=azimuth + @units=degrees + @vector=[0 -1 0] + azimuth=90 # rotate to the horizontal plane + @depends_on=/entry/coordinate_system/beam + @units=degrees + @vector=[-1 0 0] + transmission:NXdetector + depends_on=position/distance + position:NXtransformations + distance=20 # move downstream from the sample + @depends_on=/entry/coordinate_system/beam + @units=cm + @vector=[1 0 0] + coordinate_system:NXtransformations + beam=NaN # value is never used + @depends_on=gravity + @vector=[1 0 0] # X-axis points in the beam direction + gravity=NaN # value is never used + @depends_on=. # end of the chain + @vector=[0 0 -1] # Z-axis points up + DEBUG - ===== ATTRS (//entry/sample/transformations@NX_class) DEBUG - value: NXtransformations @@ -4614,7 +6050,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/corrected_phi@transformation_type) DEBUG - value: rotation @@ -4688,7 +6124,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/rot_omg@transformation_type) DEBUG - value: rotation @@ -4762,7 +6198,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/rot_phi@transformation_type) DEBUG - value: rotation @@ -4836,7 +6272,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/rot_tht@transformation_type) DEBUG - value: rotation @@ -4910,7 +6346,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/trans_x@transformation_type) DEBUG - value: translation @@ -4984,7 +6420,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/trans_y@transformation_type) DEBUG - value: translation @@ -5058,7 +6494,7 @@ DEBUG - <> DEBUG - documentation (NXtransformations.nxdl.xml:/AXISNAME/depends_on): DEBUG - Points to the path to a field defining the axis on which this - depends or the string ".". + depends or the string "." when at the end of the chain. DEBUG - ===== ATTRS (//entry/sample/transformations/trans_z@transformation_type) DEBUG - value: translation @@ -5114,6 +6550,8 @@ DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/start_time): DEBUG - Datetime of the start of the measurement. + Should be a ISO8601 date/time stamp. It is recommended to add an explicit time zone, + otherwise the local time zone is assumed per ISO8601. DEBUG - documentation (NXentry.nxdl.xml:/start_time): DEBUG - @@ -5138,7 +6576,7 @@ DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/USER NXentry.nxdl.xml:/USER NXuser.nxdl.xml: -DEBUG - <> +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/USER): DEBUG - Contact information of at least the user of the instrument or the investigator @@ -5168,14 +6606,8 @@ DEBUG - ===== FIELD (//entry/user/address): > -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/USER/address): -DEBUG - - Full address (street, street number, ZIP, city, country) of the user's - affiliation. - +DEBUG - <> DEBUG - documentation (NXuser.nxdl.xml:/address): DEBUG - Address of user DEBUG - ===== FIELD (//entry/user/affiliation): @@ -5184,10 +6616,10 @@ DEBUG - classpath: ['NXentry', 'NXuser', 'NX_CHAR'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/USER/affiliation NXuser.nxdl.xml:/affiliation -DEBUG - <> +DEBUG - <> DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/USER/affiliation): DEBUG - - Name of the affiliation of the user at the point in time when the experiment was + Name of the affiliation of the user at the time when the experiment was performed. DEBUG - documentation (NXuser.nxdl.xml:/affiliation): @@ -5196,13 +6628,8 @@ DEBUG - ===== FIELD (//entry/user/email): > -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/USER/email): -DEBUG - - Email address of the user. - +DEBUG - <> DEBUG - documentation (NXuser.nxdl.xml:/email): DEBUG - Email of user DEBUG - ===== FIELD (//entry/user/name):