From 28314610790954f26efd21f38ea77c58b3761f40 Mon Sep 17 00:00:00 2001 From: Florian Dobener Date: Mon, 22 Jan 2024 09:39:41 +0100 Subject: [PATCH] MPES reader changes from mpes refactoring (#203) * Definitions upgraded to latest mpes-refactor * Adapt vscode settings and update definitions, again * Updates definitions * Updates config file * Use nested config file structure * flatten_json cleaned up * Updates definitions * Renames DATA[data] to just data * Use beam_TYPE and source_TYPE * Add flag to reatin link dicts for flatten_json * Properly resolve upper/lower case group fields * Fixes a lookup error when keys have been filled in template with a different name * Fixes the case where the reader sends back a template entry with the concept name included * Correct coeffs path for raw data file * Fix path in data dict test * Update mpes reference file * Updates reference nexus log * Fix nexus regression file * Don't use removeprefix to support py3.8 * Move pressure_gauge to correct location * Corrects link to pressure_gauge * Updates reference mpes test log * Updates path for eln mapping * Fixes eln mapping * Skip test for xps reader * Fix typos * Updates generated eln files * Fix undocumented @units if key is documented * Updates mpes reference file * Removed applied fields in calibrations * Removed photon_energies from source * Nest electronanalyser under instrument * Use momentum_resolution and spatial_resolution as named concepts * Fix eln mapping for spatial and momentum resolution in electronanalyser * Updates mpes reference file * Renamings * Renamings in NXsample * Properly deal with undocumented @units as discussed w/ @sherjeelshabih * Updates mpes reference file * Correctly map chemical formula * Adds additional mappings --------- Co-authored-by: Sherjeel Shabih --- .vscode/settings.json | 4 +- pynxtools/dataconverter/helpers.py | 36 +- .../dataconverter/readers/mpes/reader.py | 43 +- pynxtools/dataconverter/readers/utils.py | 100 +- pynxtools/definitions | 2 +- .../readers/mpes/Ref_nexus_mpes.log | 3147 ++++++++++++----- .../readers/mpes/config_file.json | 701 ++-- tests/data/eln_mapper/eln.yaml | 207 +- .../data/eln_mapper/mpes.scheme.archive.yaml | 1047 +++++- tests/data/nexus/Ref_nexus_test.log | 426 ++- tests/dataconverter/test_helpers.py | 7 +- tests/dataconverter/test_readers.py | 7 +- tests/nexus/test_nexus.py | 11 +- 13 files changed, 4139 insertions(+), 1599 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 48b73f9c2..13b89efa2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,8 +6,8 @@ "[python]": { "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.fixAll": true, - "source.organizeImports": true + "source.fixAll": "explicit", + "source.organizeImports": "explicit" }, "editor.defaultFormatter": "charliermarsh.ruff" }, diff --git a/pynxtools/dataconverter/helpers.py b/pynxtools/dataconverter/helpers.py index b051747b7..c7889e427 100644 --- a/pynxtools/dataconverter/helpers.py +++ b/pynxtools/dataconverter/helpers.py @@ -18,8 +18,8 @@ """Helper functions commonly used by the convert routine.""" import json -import re import logging +import re import xml.etree.ElementTree as ET from datetime import datetime, timezone from typing import Any, Callable, List, Optional, Tuple, Union @@ -386,11 +386,20 @@ def is_valid_data_field(value, nxdl_type, path): return value -def path_in_data_dict(nxdl_path: str, data: dict) -> Tuple[bool, str]: +def path_in_data_dict(nxdl_path: str, hdf_path: str, data: dict) -> Tuple[bool, str]: """Checks if there is an accepted variation of path in the dictionary & returns the path.""" + accepted_unfilled_key = None for key in data.keys(): - if nxdl_path == convert_data_converter_dict_to_nxdl_path(key): + if ( + nxdl_path == convert_data_converter_dict_to_nxdl_path(key) + or convert_data_dict_path_to_hdf5_path(key) == hdf_path + ): + if data[key] is None: + accepted_unfilled_key = key + continue return True, key + if accepted_unfilled_key: + return True, accepted_unfilled_key return False, None @@ -435,7 +444,12 @@ def all_required_children_are_set(optional_parent_path, data, nxdl_root): if ( nxdl_key[0 : nxdl_key.rfind("/")] == optional_parent_path and is_node_required(nxdl_key, nxdl_root) - and data[key] is None + and data[ + path_in_data_dict( + nxdl_key, convert_data_dict_path_to_hdf5_path(key), data + )[1] + ] + is None ): return False @@ -497,7 +511,9 @@ def ensure_all_required_fields_exist(template, data, nxdl_root): if entry_name == "@units": continue nxdl_path = convert_data_converter_dict_to_nxdl_path(path) - is_path_in_data_dict, renamed_path = path_in_data_dict(nxdl_path, data) + is_path_in_data_dict, renamed_path = path_in_data_dict( + nxdl_path, convert_data_dict_path_to_hdf5_path(path), data + ) renamed_path = path if renamed_path is None else renamed_path if path in template["lone_groups"]: @@ -529,6 +545,16 @@ def try_undocumented(data, nxdl_root: ET.Element): nxdl_path = convert_data_converter_dict_to_nxdl_path(path) if entry_name == "@units": + field_path = path.rsplit("/", 1)[0] + if field_path in data.get_documented() and path in data.undocumented: + field_requiredness = get_required_string( + nexus.get_node_at_nxdl_path( + nxdl_path=convert_data_converter_dict_to_nxdl_path(field_path), + elem=nxdl_root, + ) + ) + data[field_requiredness][path] = data.undocumented[path] + del data.undocumented[path] continue if entry_name[0] == "@" and "@" in nxdl_path: diff --git a/pynxtools/dataconverter/readers/mpes/reader.py b/pynxtools/dataconverter/readers/mpes/reader.py index 9adfc4e75..4bec171d9 100644 --- a/pynxtools/dataconverter/readers/mpes/reader.py +++ b/pynxtools/dataconverter/readers/mpes/reader.py @@ -17,18 +17,20 @@ # """MPES reader implementation for the DataConverter.""" import errno -import json import os from functools import reduce -from typing import Any -from typing import Tuple +from typing import Any, Tuple import h5py import xarray as xr import yaml from pynxtools.dataconverter.readers.base.reader import BaseReader -from pynxtools.dataconverter.readers.utils import flatten_and_replace, FlattenSettings +from pynxtools.dataconverter.readers.utils import ( + FlattenSettings, + flatten_and_replace, + parse_flatten_json, +) DEFAULT_UNITS = { "X": "step", @@ -160,19 +162,35 @@ def iterate_dictionary(dic, key_string): "Instrument": "INSTRUMENT[instrument]", "Analyzer": "ELECTRONANALYSER[electronanalyser]", "Manipulator": "MANIPULATOR[manipulator]", - "Beam": "BEAM[beam]", + "Beam": "beam_TYPE[beam]", "unit": "@units", "Sample": "SAMPLE[sample]", - "Source": "SOURCE[source]", + "Source": "source_TYPE[source]", "User": "USER[user]", + "energy_resolution": "energy_resolution/resolution", + "momentum_resolution": "RESOLUTION[momentum_resolution]/resolution", + "temporal_resolution": "RESOLUTION[temporal_resolution]/resolution", + "spatial_resolution": "RESOLUTION[spatial_resolution]/resolution", + "sample_temperature": "temperature_sensor/value", } REPLACE_NESTED = { - "SOURCE[source]/Probe": "SOURCE[source]", - "SOURCE[source]/Pump": "SOURCE[source_pump]", - "BEAM[beam]/Probe": "BEAM[beam]", - "BEAM[beam]/Pump": "BEAM[beam_pump]", - "sample_history": "sample_history/description", + "SAMPLE[sample]/chemical_formula": "SAMPLE[sample]/SUBSTANCE[substance]/molecular_formula_hill", + "source_TYPE[source]/Probe": "source_TYPE[source_probe]", + "source_TYPE[source]/Pump": "source_TYPE[source_pump]", + "beam_TYPE[beam]/Probe": "beam_TYPE[beam_probe]", + "beam_TYPE[beam]/Pump": "beam_TYPE[beam_pump]", + "sample_history": "sample_history/notes", + "ELECTRONANALYSER[electronanalyser]/RESOLUTION[momentum_resolution]": ( + "ELECTRONANALYSER[electronanalyser]/momentum_resolution" + ), + "ELECTRONANALYSER[electronanalyser]/RESOLUTION[spatial_resolution]": ( + "ELECTRONANALYSER[electronanalyser]/spatial_resolution" + ), + "SAMPLE[sample]/gas_pressure": "INSTRUMENT[instrument]/pressure_gauge/value", + "SAMPLE[sample]/temperature": ( + "INSTRUMENT[instrument]/MANIPULATOR[manipulator]/temperature_sensor/value" + ), } @@ -208,8 +226,7 @@ def handle_h5_and_json_file(file_paths, objects): if file_extension == ".h5": x_array_loaded = h5_to_xarray(file_path) elif file_extension == ".json": - with open(file_path, encoding="utf-8") as file: - config_file_dict = json.load(file) + config_file_dict = parse_flatten_json(file_path) elif file_extension in [".yaml", ".yml"]: with open(file_path, encoding="utf-8") as feln: eln_data_dict = flatten_and_replace( diff --git a/pynxtools/dataconverter/readers/utils.py b/pynxtools/dataconverter/readers/utils.py index f40f98be0..2ccd8accc 100644 --- a/pynxtools/dataconverter/readers/utils.py +++ b/pynxtools/dataconverter/readers/utils.py @@ -16,11 +16,13 @@ # limitations under the License. # """Utility functions for the NeXus reader classes.""" +import json import logging -from dataclasses import dataclass, replace -from typing import List, Any, Dict, Optional, Tuple +import re from collections.abc import Mapping -import json +from dataclasses import dataclass, replace +from typing import Any, Dict, List, Optional, Tuple + import yaml logger = logging.getLogger(__name__) @@ -197,6 +199,83 @@ def parse_yml( ) +short_notation_regex = re.compile(r"\*\{([\w,]+)\}") + + +def flatten_json( + json_data: Dict[str, Any], + base_key: Optional[str] = None, + replacement_key: Optional[str] = None, + dont_flatten_link_dict: bool = False, +) -> Dict[str, Any]: + """ + Flattens a json dict into a flat dictionary of absolute paths. + + Args: + json_data (Dict[str, Any]): The dictionary read from the json file. + base_key (Optional[str], optional): + A base key to prefix to all keys. + Defaults to None. + replacement_key (Optional[str], optional): + A replacement key which replaces all occurences of * with this string. + Defaults to None. + dont_flatten_link_dict (bool): + If true, the dict will not be flattened if it only contains a link key. + Defaults to False. + + Returns: + Dict[str, Any]: The flattened dict + """ + if ( + dont_flatten_link_dict + and base_key is not None + and len(json_data) == 1 + and "link" in json_data + ): + return {base_key: json_data} + + flattened_config = {} + + def update_config(key, value, rkey): + if isinstance(value, dict): + flattened_config.update( + flatten_json( + value, + base_key=key, + replacement_key=rkey, + dont_flatten_link_dict=dont_flatten_link_dict, + ) + ) + elif isinstance(value, str) and value.startswith("@link:"): + flattened_config[key] = {"link": value[6:]} + else: + flattened_config[key] = value + + for key, value in json_data.items(): + if base_key is not None: + key = f"{base_key}/{key}" + + if replacement_key is not None: + key = key.replace("*", replacement_key) + if isinstance(value, str): + value = value.replace("*", replacement_key) + + expand_match = short_notation_regex.search(key) + if replacement_key is None and expand_match is not None: + expand_keys = expand_match.group(1).split(",") + for ekey in expand_keys: + rkey = key.replace(expand_match.group(0), ekey) + + if isinstance(value, str): + value = value.replace("*", ekey) + + update_config(rkey, value, ekey) + continue + + update_config(key, value, None) + return flattened_config + + def parse_json(file_path: str) -> Dict[str, Any]: """Parses a metadata json file into a dictionary. @@ -210,6 +289,21 @@ def parse_json(file_path: str) -> Dict[str, Any]: return json.load(file) +def parse_flatten_json(file_path: str) -> Dict[str, Any]: + """ + Parses a metadata json file into a dictionary and + flattens it into a flat dictionary of absolute paths. + + Args: + file_path (str): The file path of the json file. + + Returns: + Dict[str, Any]: + The flattened dictionary containing the data readout from the json. + """ + return flatten_json(parse_json(file_path)) + + def handle_objects(objects: Tuple[Any]) -> Dict[str, Any]: """Handle objects and generate template entries from them""" if objects is None: diff --git a/pynxtools/definitions b/pynxtools/definitions index 615ff37cb..9e5722e35 160000 --- a/pynxtools/definitions +++ b/pynxtools/definitions @@ -1 +1 @@ -Subproject commit 615ff37cbafd2ca017fb61c119c0f5c0cf052a34 +Subproject commit 9e5722e3524571fe659e1a82d3ff7b5ac73c9061 diff --git a/tests/data/dataconverter/readers/mpes/Ref_nexus_mpes.log b/tests/data/dataconverter/readers/mpes/Ref_nexus_mpes.log index 04dec42eb..8bfb6e7fd 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 @@ -562,7 +629,7 @@ DEBUG - documentation (NXentry.nxdl.xml:/experiment_laboratory): DEBUG - Name of the laboratory or beamline -DEBUG - ===== GROUP (//entry/instrument [NXmpes::/NXentry/NXinstrument]): +DEBUG - ===== GROUP (//entry/instrument [NXmpes::/NXentry/NXinstrument]): DEBUG - classpath: ['NXentry', 'NXinstrument'] DEBUG - classes: NXmpes.nxdl.xml:/ENTRY/INSTRUMENT @@ -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 @@ -2058,16 +2107,13 @@ DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXcollecti DEBUG - classes: NXlens_em.nxdl.xml:/voltage DEBUG - NXlens_em.nxdl.xml:/voltage@units [NX_VOLTAGE] -DEBUG - ===== FIELD (//entry/instrument/electronanalyser/collectioncolumn/mode): +DEBUG - ===== FIELD (//entry/instrument/electronanalyser/collectioncolumn/lens_mode): DEBUG - value: b'6kV_kmodem2.0_30VTOF_MoTe2_2340VMCP.sav' DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXelectronanalyser', 'NXcollectioncolumn', 'NX_CHAR'] DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/COLLECTIONCOLUMN/mode -NXcollectioncolumn.nxdl.xml:/mode -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/COLLECTIONCOLUMN/mode): -DEBUG - -DEBUG - documentation (NXcollectioncolumn.nxdl.xml:/mode): +NXcollectioncolumn.nxdl.xml:/lens_mode +DEBUG - <> +DEBUG - documentation (NXcollectioncolumn.nxdl.xml:/lens_mode): DEBUG - Labelling of the lens setting in use. @@ -2088,19 +2134,17 @@ 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'momentum 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 - -> momentum dispersive +DEBUG - -> non-dispersive DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/ELECTRONANALYSER/COLLECTIONCOLUMN/scheme): DEBUG - Scheme of the electron collection column. @@ -2134,8 +2178,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 +2318,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 +2491,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 +2504,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 +2580,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 +2676,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 +2766,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 +2794,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:: 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, @@ -2542,8 +2843,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 +2852,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,12 +2865,149 @@ 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 + + **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 - @@ -2602,7 +3039,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 +3113,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,27 +3159,95 @@ 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] +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: @@ -2777,50 +3282,219 @@ 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/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 +3535,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:: 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, @@ -2891,8 +3584,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 +3593,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 +3606,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 +3780,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 +3854,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 +3928,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 +3974,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 - - Momentum resolution of the experiment (FWHM) +DEBUG - documentation (NXresolution.nxdl.xml:): +DEBUG - + 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 +4075,131 @@ 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/pressure_gauge [NXmpes::/NXentry/NXinstrument/NXsensor]): +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge +NXinstrument.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge): +DEBUG - + Device to measure the gas pressure around the sample. + +DEBUG - documentation (NXinstrument.nxdl.xml:/SENSOR): +DEBUG - +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/pressure_gauge@NX_class) +DEBUG - value: NXsensor +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge +NXinstrument.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/instrument/pressure_gauge/measurement): +DEBUG - value: b'pressure' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/measurement +NXsensor.nxdl.xml:/measurement +DEBUG - <> +DEBUG - enumeration (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/measurement): +DEBUG - -> pressure +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/pressure_gauge/measurement): +DEBUG - +DEBUG - documentation (NXsensor.nxdl.xml:/measurement): +DEBUG - + name for measured signal + +DEBUG - ===== FIELD (//entry/instrument/pressure_gauge/name): +DEBUG - value: b'sample_chamber_pressure' +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsensor', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/name +NXsensor.nxdl.xml:/name +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/name): +DEBUG - +DEBUG - documentation (NXsensor.nxdl.xml:/name): +DEBUG - + Name for the sensor + +DEBUG - ===== FIELD (//entry/instrument/pressure_gauge/value): +DEBUG - value: 4.5599999999999996e-11 +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/value +NXsensor.nxdl.xml:/value +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/value): +DEBUG - + In case of a single or averaged gas pressure measurement, this is the scalar gas pressure around + the sample. It can also be an 1D array of measured pressures (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/pressure_gauge/value@units) +DEBUG - value: mbar +DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsensor', 'NX_FLOAT'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/value +NXsensor.nxdl.xml:/value +DEBUG - NXmpes.nxdl.xml:/ENTRY/INSTRUMENT/pressure_gauge/value@units [NX_PRESSURE] +DEBUG - NXsensor.nxdl.xml:/value@units [NX_ANY] +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 +4209,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,49 +4228,25 @@ 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 - value: 21.7 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] -DEBUG - classes: -NXsource.nxdl.xml:/photon_energy -DEBUG - <> -DEBUG - documentation (NXsource.nxdl.xml:/photon_energy): -DEBUG - - The center photon energy of the source, before it is - monochromatized or converted - -DEBUG - ===== ATTRS (//entry/instrument/source/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 +4254,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,8 +4278,6 @@ 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) @@ -3339,32 +4285,31 @@ DEBUG - 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,45 +4343,21 @@ 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 -DEBUG - ===== FIELD (//entry/instrument/source_pump/photon_energy): -DEBUG - value: 1.2 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXsource', 'NX_FLOAT'] -DEBUG - classes: -NXsource.nxdl.xml:/photon_energy -DEBUG - <> -DEBUG - documentation (NXsource.nxdl.xml:/photon_energy): -DEBUG - - The center photon energy of the source, before it is - monochromatized or converted - -DEBUG - ===== ATTRS (//entry/instrument/source_pump/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_pump/probe): DEBUG - value: b'visible light' 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 @@ -3444,11 +4365,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 +4373,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 +4389,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: -NXinstrument.nxdl.xml:/temporal_resolution -DEBUG - NXinstrument.nxdl.xml:/temporal_resolution@units [NX_TIME] +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: +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. @@ -3534,7 +4483,7 @@ NXentry.nxdl.xml:/PROCESS NXprocess.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== GROUP (//entry/process/distortion [NXmpes::/NXentry/NXprocess/NXdistortion]): +DEBUG - ===== GROUP (//entry/process/distortion [NXmpes::/NXentry/NXprocess/NXdistortion]): DEBUG - classpath: ['NXentry', 'NXprocess', 'NXdistortion'] DEBUG - classes: NXprocess.nxdl.xml:/DISTORTION @@ -3556,16 +4505,6 @@ NXprocess.nxdl.xml:/DISTORTION NXdistortion.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/process/distortion/applied): -DEBUG - value: True -DEBUG - classpath: ['NXentry', 'NXprocess', 'NXdistortion', 'NX_BOOLEAN'] -DEBUG - classes: -NXdistortion.nxdl.xml:/applied -DEBUG - <> -DEBUG - documentation (NXdistortion.nxdl.xml:/applied): -DEBUG - - Has the distortion correction been applied? - DEBUG - ===== FIELD (//entry/process/distortion/cdeform_field): DEBUG - value: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ... DEBUG - classpath: ['NXentry', 'NXprocess', 'NXdistortion', 'NX_FLOAT'] @@ -3633,6 +4572,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. @@ -3650,21 +4596,6 @@ NXprocess.nxdl.xml:/CALIBRATION NXcalibration.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/process/energy_calibration/applied): -DEBUG - value: True -DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_BOOLEAN'] -DEBUG - classes: -NXmpes.nxdl.xml:/ENTRY/PROCESS/energy_calibration/applied -NXcalibration.nxdl.xml:/applied -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/PROCESS/energy_calibration/applied): -DEBUG - - Has an energy calibration been applied? - -DEBUG - documentation (NXcalibration.nxdl.xml:/applied): -DEBUG - - Has the calibration been applied? - DEBUG - ===== FIELD (//entry/process/energy_calibration/calibrated_axis): DEBUG - value: [ 5.22069940e+01 5.10746894e+01 4.99673811e+01 4.88843387e+01 ... DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_FLOAT'] @@ -3680,6 +4611,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'] @@ -3713,7 +4656,7 @@ DEBUG - documentation (NXcalibration.nxdl.xml:/original_axis): DEBUG - Vector containing the data coordinates in the original uncalibrated axis -DEBUG - ===== GROUP (//entry/process/kx_calibration [NXmpes::/NXentry/NXprocess/NXcalibration]): +DEBUG - ===== GROUP (//entry/process/kx_calibration [NXmpes::/NXentry/NXprocess/NXcalibration]): DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration'] DEBUG - classes: NXprocess.nxdl.xml:/CALIBRATION @@ -3735,16 +4678,6 @@ NXprocess.nxdl.xml:/CALIBRATION NXcalibration.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/process/kx_calibration/applied): -DEBUG - value: True -DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_BOOLEAN'] -DEBUG - classes: -NXcalibration.nxdl.xml:/applied -DEBUG - <> -DEBUG - documentation (NXcalibration.nxdl.xml:/applied): -DEBUG - - Has the calibration been applied? - DEBUG - ===== FIELD (//entry/process/kx_calibration/calibrated_axis): DEBUG - value: [-2.68021375 -2.66974416 -2.65927458 -2.64880499 -2.63833541 -2.62786582 ... DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_FLOAT'] @@ -3777,7 +4710,7 @@ DEBUG - For linear calibration. Scaling parameter. This should yield the relation `calibrated_axis` = `scaling` * `original_axis` + `offset`. -DEBUG - ===== GROUP (//entry/process/ky_calibration [NXmpes::/NXentry/NXprocess/NXcalibration]): +DEBUG - ===== GROUP (//entry/process/ky_calibration [NXmpes::/NXentry/NXprocess/NXcalibration]): DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration'] DEBUG - classes: NXprocess.nxdl.xml:/CALIBRATION @@ -3799,16 +4732,6 @@ NXprocess.nxdl.xml:/CALIBRATION NXcalibration.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/process/ky_calibration/applied): -DEBUG - value: True -DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_BOOLEAN'] -DEBUG - classes: -NXcalibration.nxdl.xml:/applied -DEBUG - <> -DEBUG - documentation (NXcalibration.nxdl.xml:/applied): -DEBUG - - Has the calibration been applied? - DEBUG - ===== FIELD (//entry/process/ky_calibration/calibrated_axis): DEBUG - value: [-2.68021375 -2.66974416 -2.65927458 -2.64880499 -2.63833541 -2.62786582 ... DEBUG - classpath: ['NXentry', 'NXprocess', 'NXcalibration', 'NX_FLOAT'] @@ -3841,7 +4764,7 @@ DEBUG - For linear calibration. Scaling parameter. This should yield the relation `calibrated_axis` = `scaling` * `original_axis` + `offset`. -DEBUG - ===== GROUP (//entry/process/registration [NXmpes::/NXentry/NXprocess/NXregistration]): +DEBUG - ===== GROUP (//entry/process/registration [NXmpes::/NXentry/NXprocess/NXregistration]): DEBUG - classpath: ['NXentry', 'NXprocess', 'NXregistration'] DEBUG - classes: NXprocess.nxdl.xml:/REGISTRATION @@ -3863,16 +4786,6 @@ NXprocess.nxdl.xml:/REGISTRATION NXregistration.nxdl.xml: DEBUG - @NX_class [NX_CHAR] DEBUG - -DEBUG - ===== FIELD (//entry/process/registration/applied): -DEBUG - value: True -DEBUG - classpath: ['NXentry', 'NXprocess', 'NXregistration', 'NX_BOOLEAN'] -DEBUG - classes: -NXregistration.nxdl.xml:/applied -DEBUG - <> -DEBUG - documentation (NXregistration.nxdl.xml:/applied): -DEBUG - - Has the registration been applied? - DEBUG - ===== FIELD (//entry/process/registration/depends_on): DEBUG - value: b'/entry/process/registration/tranformations/rot_z' DEBUG - classpath: ['NXentry', 'NXprocess', 'NXregistration', 'NX_CHAR'] @@ -3918,23 +4831,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:: 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, @@ -3948,8 +4880,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 +4889,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 +4902,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 +5076,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 +5163,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 +5237,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 +5283,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,55 +5311,126 @@ 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] -DEBUG - ===== FIELD (//entry/sample/chemical_formula): -DEBUG - value: b'MoTe2' -DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] +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/chemical_formula -NXsample.nxdl.xml:/chemical_formula -DEBUG - <> -DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/chemical_formula): +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 - - The chemical formula of the sample. For mixtures use the NXsample_component - group in NXsample instead. - -DEBUG - documentation (NXsample.nxdl.xml:/chemical_formula): + Sensor measuring the applied voltage. + + This should be a link to /entry/instrument/manipulator/sample_bias_voltmeter. + +DEBUG - documentation (NXenvironment.nxdl.xml:/SENSOR): DEBUG - - The chemical formula specified using CIF conventions. - Abbreviated version of CIF standard: - - * Only recognized element symbols may be used. - * Each element symbol is followed by a 'count' number. A count of '1' may be omitted. - * A space or parenthesis must separate each cluster of (element symbol + count). - * Where a group of elements is enclosed in parentheses, the multiplier for the - group must follow the closing parentheses. That is, all element and group - multipliers are assumed to be printed as subscripted numbers. - * Unless the elements are ordered in a manner that corresponds to their chemical - structure, the order of the elements within any group or moiety depends on - whether or not carbon is present. - * If carbon is present, the order should be: - - - C, then H, then the other elements in alphabetical order of their symbol. - - If carbon is not present, the elements are listed purely in alphabetic order of their symbol. - - * This is the *Hill* system used by Chemical Abstracts. + 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/depends_on): DEBUG - value: b'/entry/sample/transformations/corrected_phi' DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] @@ -4317,20 +5456,122 @@ 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/NXsensor]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure/pressure_gauge +NXenvironment.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure/pressure_gauge): +DEBUG - + Gauge measuring the gas pressure. + + This should be a link to /entry/instrument/pressure_gauge. + +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/gas_pressure/pressure_gauge@NX_class) +DEBUG - value: NXsensor +DEBUG - classpath: ['NXentry', 'NXsample', 'NXenvironment', 'NXsensor'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/gas_pressure/pressure_gauge +NXenvironment.nxdl.xml:/SENSOR +NXsensor.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/sample/gas_pressure/pressure_gauge/measurement): +DEBUG - value: b'pressure' +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/gas_pressure/pressure_gauge/name): +DEBUG - value: b'sample_chamber_pressure' +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/gas_pressure/pressure_gauge/value): +DEBUG - value: 4.5599999999999996e-11 +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/gas_pressure/pressure_gauge/value@units) +DEBUG - value: mbar +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/name): DEBUG - value: b'MoTe2' DEBUG - classpath: ['NXentry', 'NXsample', 'NX_CHAR'] @@ -4348,99 +5589,56 @@ DEBUG - ===== FIELD (//entry/sample/preparation_date): > -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 +5660,175 @@ 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/NXsubstance]): +DEBUG - classpath: ['NXentry', 'NXsample', 'NXsubstance'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/SUBSTANCE +NXsample.nxdl.xml:/SUBSTANCE +NXsubstance.nxdl.xml: +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/SUBSTANCE): +DEBUG - + For samples containing a single pure substance. For mixtures use the + NXsample_component_set and NXsample_component group in NXsample instead. + +DEBUG - documentation (NXsample.nxdl.xml:/SUBSTANCE): +DEBUG - + If the sample is made from a pure substance and cannot be further divided using + NXsample_component. + +DEBUG - documentation (NXsubstance.nxdl.xml:): +DEBUG - + A form of matter with a constant, definite chemical composition. + + Examples can be single chemical elements, chemical compunds, or alloys. + For further information, see https://en.wikipedia.org/wiki/Chemical_substance. + +DEBUG - ===== ATTRS (//entry/sample/substance@NX_class) +DEBUG - value: NXsubstance +DEBUG - classpath: ['NXentry', 'NXsample', 'NXsubstance'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/SUBSTANCE +NXsample.nxdl.xml:/SUBSTANCE +NXsubstance.nxdl.xml: +DEBUG - @NX_class [NX_CHAR] +DEBUG - +DEBUG - ===== FIELD (//entry/sample/substance/molecular_formula_hill): +DEBUG - value: b'MoTe2' +DEBUG - classpath: ['NXentry', 'NXsample', 'NXsubstance', 'NX_CHAR'] +DEBUG - classes: +NXmpes.nxdl.xml:/ENTRY/SAMPLE/SUBSTANCE/molecular_formula_hill +NXsubstance.nxdl.xml:/molecular_formula_hill +DEBUG - <> +DEBUG - documentation (NXmpes.nxdl.xml:/ENTRY/SAMPLE/SUBSTANCE/molecular_formula_hill): +DEBUG - + The chemical formula of the sample (using CIF conventions). + +DEBUG - documentation (NXsubstance.nxdl.xml:/molecular_formula_hill): +DEBUG - + The chemical formula specified using CIF conventions. + Abbreviated version of CIF standard:107 + This is the *Hill* system used by Chemical Abstracts. + + * Only recognized element symbols may be used. + * Each element symbol is followed by a 'count' number. A count of '1' may be omitted. + * A space or parenthesis must separate each cluster of (element symbol + count). + * Where a group of elements is enclosed in parentheses, the multiplier for the + group must follow the closing parentheses. That is, all element and group + multipliers are assumed to be printed as subscripted numbers. + * Unless the elements are ordered in a manner that corresponds to their chemical + structure, the order of the elements within any group or moiety depends on + whether or not carbon is present. + * If carbon is present, the order should be: + - C, then H, then the other elements in alphabetical order of their symbol. + - If carbon is not present, the elements are listed purely in alphabetic order of their symbol. + +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 +5865,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:: X_\text{lab} = T_f . X_\text{pixel} = T_3 . T_2 . T_1 . X_\text{pixel} - .. math:: T_f = T_3 T_2 T_1 + Note that :math:`T_1` comes first in the *depends-on* chain and is also applied first + to the pixel coordinates. - 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`. + 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, @@ -4554,8 +5914,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 +5923,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 +5936,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 +6110,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 +6184,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 +6258,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 +6332,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 +6406,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 +6480,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 +6554,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 +6610,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 +6636,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 +6666,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 +6676,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 +6688,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): diff --git a/tests/data/dataconverter/readers/mpes/config_file.json b/tests/data/dataconverter/readers/mpes/config_file.json index 125243397..a43d282fa 100644 --- a/tests/data/dataconverter/readers/mpes/config_file.json +++ b/tests/data/dataconverter/readers/mpes/config_file.json @@ -14,328 +14,387 @@ "/ENTRY[entry]/duration/@units": "s", "/ENTRY[entry]/collection_time": "@attrs:metadata/timing/collection_time", "/ENTRY[entry]/collection_time/@units": "s", - "/ENTRY[entry]/USER[user]/name": "@attrs:metadata/user0/name", - "/ENTRY[entry]/USER[user]/role": "@attrs:metadata/user0/role", - "/ENTRY[entry]/USER[user]/affiliation": "@attrs:metadata/user0/affiliation", - "/ENTRY[entry]/USER[user]/address": "@attrs:metadata/user0/address", - "/ENTRY[entry]/USER[user]/email": "@attrs:metadata/user0/email", - "/ENTRY[entry]/INSTRUMENT[instrument]/name": "Time-of-flight momentum microscope equipped delay line detector, at the endstation of the high rep-rate HHG source at FHI", - "/ENTRY[entry]/INSTRUMENT[instrument]/name/@short_name": "TR-ARPES @ FHI", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": 140.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "meV", - "/ENTRY[entry]/INSTRUMENT[instrument]/temporal_resolution": 35.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/temporal_resolution/@units": "fs", - "/ENTRY[entry]/INSTRUMENT[instrument]/momentum_resolution": { - "link": "/entry/instrument/electronanalyser/momentum_resolution" + "/ENTRY[entry]/USER[user]": { + "name": "@attrs:metadata/user0/name", + "role": "@attrs:metadata/user0/role", + "affiliation": "@attrs:metadata/user0/affiliation", + "address": "@attrs:metadata/user0/address", + "email": "@attrs:metadata/user0/email" }, - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/momentum_resolution": "@attrs:metadata/instrument/analyzer/momentum_resolution", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/momentum_resolution/@units": "1/angstrom", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "SPECS Metis 1000 Momentum Microscope", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": 110.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "meV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/spatial_resolution": "@attrs:metadata/instrument/analyzer/spatial_resolution", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/spatial_resolution/@units": "µm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": [ - "kx", - "ky", - "E" - ], - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "@attrs:metadata/instrument/analyzer/slow_axes", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "@attrs:metadata/instrument/analyzer/projection", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "Momentum Microscope", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "@attrs:metadata/instrument/analyzer/lens_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/extractor_voltage": "@attrs:metadata/file/KTOF:Lens:Extr:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/extractor_voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/extractor_current": "@attrs:metadata/file/KTOF:Lens:Extr:I", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/extractor_current/@units": "µA", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/working_distance": 4.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/working_distance/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_A]/name": "A", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_A]/voltage": "@attrs:metadata/file/KTOF:Lens:A:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_A]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_B]/name": "B", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_B]/voltage": "@attrs:metadata/file/KTOF:Lens:B:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_B]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_C]/name": "C", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_C]/voltage": "@attrs:metadata/file/KTOF:Lens:C:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_C]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_D]/name": "D", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_D]/voltage": "@attrs:metadata/file/KTOF:Lens:D:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_D]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_E]/name": "E", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_E]/voltage": "@attrs:metadata/file/KTOF:Lens:E:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_E]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_F]/name": "F", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_F]/voltage": "@attrs:metadata/file/KTOF:Lens:F:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_F]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_G]/name": "G", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_G]/voltage": "@attrs:metadata/file/KTOF:Lens:G:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_G]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_H]/name": "H", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_H]/voltage": "@attrs:metadata/file/KTOF:Lens:H:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_H]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_I]/name": "I", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_I]/voltage": "@attrs:metadata/file/KTOF:Lens:I:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_I]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_UCA]/name": "UCA", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_UCA]/voltage": "@attrs:metadata/file/KTOF:Lens:UCA:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_UCA]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_UFA]/name": "UFA", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_UFA]/voltage": "@attrs:metadata/file/KTOF:Lens:UFA:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_UFA]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_Foc]/name": "Foc", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_Foc]/voltage": "@attrs:metadata/file/KTOF:Lens:Foc:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[lens_Foc]/voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/shape": "@attrs:metadata/instrument/analyzer/fa_shape", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/size": "@attrs:metadata/instrument/analyzer/fa_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/size/@units": "µm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/POSITIONER[fa_m1]/value": "@attrs:metadata/file/KTOF:Apertures:m1.RBV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/POSITIONER[fa_m1]/value/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/POSITIONER[fa_m2]/value": "@attrs:metadata/file/KTOF:Apertures:m2.RBV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture/POSITIONER[fa_m2]/value/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture/shape": "@attrs:metadata/instrument/analyzer/ca_shape", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture/size": "@attrs:metadata/instrument/analyzer/ca_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture/size/@units": "µm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture/POSITIONER[ca_m3]/value": "@attrs:metadata/file/KTOF:Apertures:m3.RBV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture/POSITIONER[ca_m3]/value/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "fixed", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@attrs:metadata/file/KTOF:Lens:TOF:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "tof", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/tof_distance": 0.9, - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/tof_distance/@units": "m", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "MCP", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "DLD", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/sensor_pixels": [ - 1800, - 1800 - ], - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_bias": "@attrs:metadata/file/KTOF:Lens:MCPfront:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_bias/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_voltage": "@attrs:metadata/file/KTOF:Lens:MCPback:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_voltage": "@attrs:metadata/file/KTOF:Lens:UDLD:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/depends_on": "/entry/instrument/electronanalyser/transformations/trans_z", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@depends_on": "rot_y", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]": 4.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@transformation_type": "translation", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@vector": [ - 0, - 0, - 1 - ], - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[rot_y]/@depends_on": ".", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[rot_y]": -115.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[rot_y]/@transformation_type": "rotation", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[rot_y]/@units": "degrees", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/TRANSFORMATIONS[transformations]/AXISNAME[rot_y]/@vector": [ - 0, - 1, - 0 - ], - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "HHG @ TR-ARPES @ FHI", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "ultraviolet", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "HHG laser", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/mode": "Single Bunch", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/frequency": "@attrs:metadata/instrument/beam/probe/frequency", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/frequency/@units": "kHz", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/photon_energy": "@attrs:metadata/instrument/beam/probe/incident_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/photon_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": 0.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@attrs:metadata/instrument/beam/probe/incident_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "@attrs:metadata/instrument/beam/probe/incident_energy_spread", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/pulse_duration": "@attrs:metadata/instrument/beam/probe/pulse_duration", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/pulse_duration/@units": "fs", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "@attrs:metadata/instrument/beam/probe/incident_polarization", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "V^2/mm^2", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/extent": "@attrs:metadata/instrument/beam/probe/extent", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/extent/@units": "µm", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/name": "OPCPA @ TR-ARPES @ FHI", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/probe": "visible light", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/type": "Optical Laser", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/mode": "Single Bunch", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/frequency": "@attrs:metadata/instrument/beam/pump/frequency", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/frequency/@units": "kHz", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/photon_energy": "@attrs:metadata/instrument/beam/pump/incident_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source_pump]/photon_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/distance": 0.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/distance/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_energy": "@attrs:metadata/instrument/beam/pump/incident_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_energy_spread": "@attrs:metadata/instrument/beam/pump/incident_energy_spread", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_energy_spread/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_wavelength": "@attrs:metadata/instrument/beam/pump/incident_wavelength", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_wavelength/@units": "nm", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/pulse_duration": "@attrs:metadata/instrument/beam/pump/pulse_duration", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/pulse_duration/@units": "fs", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_polarization": "@attrs:metadata/instrument/beam/pump/incident_polarization", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/incident_polarization/@units": "V^2/mm^2", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/pulse_energy": "@attrs:metadata/instrument/beam/pump/pulse_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/pulse_energy/@units": "µJ", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/average_power": "@attrs:metadata/instrument/beam/pump/average_power", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/average_power/@units": "mW", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/extent": "@attrs:metadata/instrument/beam/pump/extent", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/extent/@units": "µm", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/fluence": "@attrs:metadata/instrument/beam/pump/fluence", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam_pump]/fluence/@units": "mJ/cm^2", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "@attrs:metadata/file/trARPES:Carving:TEMP_RBV", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "K", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "@attrs:metadata/file/KTOF:Lens:Sample:V", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/depends_on": "/entry/instrument/manipulator/transformations/trans_z", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@depends_on": "rot_z", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]": -0.32, - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@transformation_type": "translation", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@units": "m", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@vector": [ - 0, - 0, - 1 - ], - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_z]/@depends_on": "rot_x", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_z]": -25.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_z]/@transformation_type": "rotation", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_z]/@units": "degrees", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_z]/@vector": [ - 0, - 0, - 1 - ], - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_x]/@depends_on": ".", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_x]": -90.0, - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_x]/@transformation_type": "rotation", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_x]/@units": "degrees", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/TRANSFORMATIONS[transformations]/AXISNAME[rot_x]/@vector": [ - 1, - 0, - 0 - ], - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "@attrs:metadata/sample/preparation_date", - "/ENTRY[entry]/SAMPLE[sample]/sample_history/description": "@attrs:metadata/sample/sample_history", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description/description": "Here should be a description of the preparation procedure.", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "@attrs:metadata/sample/chemical_formula", - "/ENTRY[entry]/SAMPLE[sample]/description": "@attrs:metadata/sample/chemical_formula", - "/ENTRY[entry]/SAMPLE[sample]/name": "@attrs:metadata/sample/chemical_formula", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "@attrs:metadata/file/trARPES:XGS600:PressureAC:P_RD", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "mbar", - "/ENTRY[entry]/SAMPLE[sample]/situation": "vacuum", - "/ENTRY[entry]/SAMPLE[sample]/temperature": { - "link": "/entry/instrument/manipulator/sample_temperature" + "/ENTRY[entry]/INSTRUMENT[instrument]": { + "name": "Time-of-flight momentum microscope equipped delay line detector, at the endstation of the high rep-rate HHG source at FHI", + "name/@short_name": "TR-ARPES @ FHI", + "energy_resolution": { + "resolution": 140.0, + "resolution/@units": "meV", + "physical_quantity": "energy", + "type": "estimated" + }, + "RESOLUTION[temporal_resolution]": { + "resolution": 35.0, + "resolution/@units": "fs", + "physical_quantity": "time", + "type": "estimated" + }, + "RESOLUTION[momentum_resolution]": { + "resolution": "@link:/entry/instrument/electronanalyser/momentum_resolution", + "resolution/@units": "1/angstrom", + "physical_quantity": "momentum", + "type": "estimated" + }, + "pressure_gauge": { + "name": "sample_chamber_pressure", + "measurement": "pressure", + "value": "@attrs:metadata/file/trARPES:XGS600:PressureAC:P_RD", + "value/@units": "mbar" + }, + "ELECTRONANALYSER[electronanalyser]": { + "description": "SPECS Metis 1000 Momentum Microscope", + "device_information": { + "vendor": "SPECS GmbH", + "model": "Metis 1000 Momentum Microscope" + }, + "fast_axes": [ + "kx", + "ky", + "E" + ], + "slow_axes": "@attrs:metadata/instrument/analyzer/slow_axes", + "energy_resolution": { + "resolution": 110.0, + "resolution/@units": "meV", + "physical_quantity": "energy", + "type": "estimated" + }, + "momentum_resolution": { + "resolution": "@attrs:metadata/instrument/analyzer/momentum_resolution", + "resolution/@units": "1/angstrom", + "physical_quantity": "momentum", + "type": "estimated" + }, + "spatial_resolution": { + "resolution": "@attrs:metadata/instrument/analyzer/spatial_resolution", + "resolution/@units": "µm", + "physical_quantity": "length", + "type": "estimated" + }, + "depends_on": "/entry/instrument/electronanalyser/transformations/trans_z", + "TRANSFORMATIONS[transformations]": { + "AXISNAME[trans_z]": 4.0, + "AXISNAME[trans_z]/@depends_on": "rot_y", + "AXISNAME[trans_z]/@transformation_type": "translation", + "AXISNAME[trans_z]/@units": "mm", + "AXISNAME[trans_z]/@vector": [ + 0, + 0, + 1 + ], + "AXISNAME[rot_y]": -115.0, + "AXISNAME[rot_y]/@depends_on": ".", + "AXISNAME[rot_y]/@transformation_type": "rotation", + "AXISNAME[rot_y]/@units": "degrees", + "AXISNAME[rot_y]/@vector": [ + 0, + 1, + 0 + ] + } + } }, - "/ENTRY[entry]/SAMPLE[sample]/bias": { - "link": "/entry/instrument/manipulator/sample_bias" + "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]": { + "projection": "@attrs:metadata/instrument/analyzer/projection", + "scheme": "momentum dispersive", + "lens_mode": "@attrs:metadata/instrument/analyzer/lens_mode", + "extractor_voltage": "@attrs:metadata/file/KTOF:Lens:Extr:V", + "extractor_voltage/@units": "V", + "extractor_current": "@attrs:metadata/file/KTOF:Lens:Extr:I", + "extractor_current/@units": "µA", + "working_distance": 4.0, + "working_distance/@units": "mm", + "LENS_EM[lens_*{A,B,C,D,E,F,G,H,I,UCA,UFA,Foc}]": { + "name": "*", + "voltage": "@attrs:metadata/file/KTOF:Lens:*:V", + "voltage/@units": "V" + }, + "field_aperture": { + "shape": "@attrs:metadata/instrument/analyzer/fa_shape", + "size": "@attrs:metadata/instrument/analyzer/fa_size", + "size/@units": "µm", + "POSITIONER[fa_m1]": { + "value": "@attrs:metadata/file/KTOF:Apertures:m1.RBV", + "value/@units": "mm" + }, + "POSITIONER[fa_m2]": { + "value": "@attrs:metadata/file/KTOF:Apertures:m2.RBV", + "value/@units": "mm" + } + }, + "contrast_aperture": { + "shape": "@attrs:metadata/instrument/analyzer/ca_shape", + "size": "@attrs:metadata/instrument/analyzer/ca_size", + "size/@units": "µm", + "POSITIONER[ca_m3]": { + "value": "@attrs:metadata/file/KTOF:Apertures:m3.RBV", + "value/@units": "mm" + } + } }, - "/ENTRY[entry]/SAMPLE[sample]/depends_on": "/entry/sample/transformations/corrected_phi", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[corrected_phi]/@depends_on": "rot_omg", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[corrected_phi]": 90.0, - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[corrected_phi]/@units": "degrees", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[corrected_phi]/@transformation_type": "rotation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[corrected_phi]/@vector": [ - 0, - 1, - 0 - ], - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_omg]/@depends_on": "rot_phi", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_omg]": "@attrs:metadata/file/trARPES:Carving:OMG.RBV", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_omg]/@units": "degrees", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_omg]/@transformation_type": "rotation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_omg]/@vector": [ - 1, - 0, - 0 - ], - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_phi]/@depends_on": "rot_tht", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_phi]": "@attrs:metadata/file/trARPES:Carving:PHI.RBV", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_phi]/@units": "degrees", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_phi]/@transformation_type": "rotation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_phi]/@vector": [ - 0, - 1, - 0 - ], - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_tht]/@depends_on": "trans_z", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_tht]": "@attrs:metadata/file/trARPES:Carving:THT.RBV", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_tht]/@units": "degrees", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_tht]/@transformation_type": "rotation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[rot_tht]/@vector": [ - 0, - 0, - 1 - ], - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@depends_on": "trans_y", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]": "@attrs:metadata/file/trARPES:Carving:TRZ.RBV", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@units": "mm", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@transformation_type": "translation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_z]/@vector": [ - 0, - 0, - 1 - ], - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_y]/@depends_on": "trans_x", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_y]": "@attrs:metadata/file/trARPES:Carving:TRY.RBV", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_y]/@units": "mm", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_y]/@transformation_type": "translation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_y]/@vector": [ - 0, - 1, - 0 - ], - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_x]/@depends_on": "/entry/instrument/manipulator/transformations/trans_z", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_x]": "@attrs:metadata/file/trARPES:Carving:TRX.RBV", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_x]/@units": "mm", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_x]/@transformation_type": "translation", - "/ENTRY[entry]/SAMPLE[sample]/TRANSFORMATIONS[transformations]/AXISNAME[trans_x]/@vector": [ - 1, - 0, - 0 - ], - "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]/applied": true, - "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]/symmetry": "@attrs:metadata/momentum_correction/rotsym", - "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]/original_centre": "@attrs:metadata/momentum_correction/pcent", - "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]/original_points": "@attrs:metadata/momentum_correction/pouter", - "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]/cdeform_field": "@attrs:metadata/momentum_correction/cdeform_field", - "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]/rdeform_field": "@attrs:metadata/momentum_correction/rdeform_field", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/applied": true, - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/depends_on": "/entry/process/registration/tranformations/rot_z", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_x]": "@attrs:metadata/momentum_correction/adjust_params/xtrans", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_x]/@transformation_type": "translation", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_x]/@units": "pixels", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_x]/@vector": "@attrs:metadata/momentum_correction/adjust_params/x_vector", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_x]/@depends_on": ".", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_y]": "@attrs:metadata/momentum_correction/adjust_params/ytrans", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_y]/@units": "pixels", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_y]/@transformation_type": "translation", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_y]/@vector": "@attrs:metadata/momentum_correction/adjust_params/y_vector", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[trans_y]/@depends_on": "trans_x", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[rot_z]": "@attrs:metadata/momentum_correction/adjust_params/angle", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[rot_z]/@units": "degrees", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[rot_z]/@transformation_type": "rotation", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[rot_z]/@offset": "@attrs:metadata/momentum_correction/adjust_params/offset", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[rot_z]/@vector": "@attrs:metadata/momentum_correction/adjust_params/rotation_vector", - "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]/TRANSFORMATIONS[tranformations]/AXISNAME[rot_z]/@depends_on": "trans_y", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": true, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/coefficients": "@attrs:metadata/energy_correction/calibration/coefficients", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/fit_function": "@attrs:metadata/energy_correction/calibration/fit_function", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/original_axis": "@attrs:metadata/energy_correction/tof", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@attrs:metadata/energy_correction/calibration/axis", - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[kx_calibration]/applied": true, - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[kx_calibration]/scaling": "@attrs:metadata/momentum_correction/calibration/scale_kx", - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[kx_calibration]/offset": "@attrs:metadata/momentum_correction/offset_kx", - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[kx_calibration]/calibrated_axis": "@attrs:metadata/momentum_correction/calibration/axis_kx", - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[ky_calibration]/applied": true, - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[ky_calibration]/scaling": "@attrs:metadata/momentum_correction/calibration/scale_ky", - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[ky_calibration]/offset": "@attrs:metadata/momentum_correction/offset_ky", - "/ENTRY[entry]/PROCESS[process]/CALIBRATION[ky_calibration]/calibrated_axis": "@attrs:metadata/momentum_correction/calibration/axis_ky", - "/ENTRY[entry]/DATA[data]/@axes": "@data:dims", - "/ENTRY[entry]/DATA[data]/AXISNAME_indices[@*_indices]": "@data:*.index", - "/ENTRY[entry]/DATA[data]/@signal": "data", - "/ENTRY[entry]/DATA[data]/data": "@data:data", - "/ENTRY[entry]/DATA[data]/data/@units": "counts", - "/ENTRY[entry]/DATA[data]/AXISNAME[*]": "@data:*.data", - "/ENTRY[entry]/DATA[data]/AXISNAME[*]/@units": "@data:*.unit" + "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]": { + "pass_energy": "@attrs:metadata/file/KTOF:Lens:TOF:V", + "pass_energy/@units": "eV", + "scheme": "tof", + "tof_distance": 0.9, + "tof_distance/@units": "m" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]": { + "amplifier_type": "MCP", + "detector_type": "DLD", + "sensor_pixels": [ + 1800, + 1800 + ], + "amplifier_bias": "@attrs:metadata/file/KTOF:Lens:MCPfront:V", + "amplifier_bias/@units": "V", + "amplifier_voltage": "@attrs:metadata/file/KTOF:Lens:MCPback:V", + "amplifier_voltage/@units": "V", + "detector_voltage": "@attrs:metadata/file/KTOF:Lens:UDLD:V", + "detector_voltage/@units": "V" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]/source_TYPE[source_probe]": { + "name": "HHG @ TR-ARPES @ FHI", + "probe": "photon", + "type": "HHG laser", + "mode": "Single Bunch", + "frequency": "@attrs:metadata/instrument/beam/probe/frequency", + "frequency/@units": "kHz", + "associated_beam": "/entry/instrument/beam_probe" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]/beam_TYPE[beam_probe]": { + "distance": 0.0, + "distance/@units": "mm", + "incident_energy": "@attrs:metadata/instrument/beam/probe/incident_energy", + "incident_energy/@units": "eV", + "incident_energy_spread": "@attrs:metadata/instrument/beam/probe/incident_energy_spread", + "incident_energy_spread/@units": "eV", + "pulse_duration": "@attrs:metadata/instrument/beam/probe/pulse_duration", + "pulse_duration/@units": "fs", + "incident_polarization": "@attrs:metadata/instrument/beam/probe/incident_polarization", + "incident_polarization/@units": "V^2/mm^2", + "extent": "@attrs:metadata/instrument/beam/probe/extent", + "extent/@units": "µm", + "associated_source": "/entry/instrument/source_probe" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]/source_TYPE[source_pump]": { + "name": "OPCPA @ TR-ARPES @ FHI", + "probe": "visible light", + "type": "Optical Laser", + "mode": "Single Bunch", + "frequency": "@attrs:metadata/instrument/beam/pump/frequency", + "frequency/@units": "kHz", + "associated_beam": "/entry/instrument/beam_pump" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]/beam_TYPE[beam_pump]": { + "distance": 0.0, + "distance/@units": "mm", + "incident_energy": "@attrs:metadata/instrument/beam/pump/incident_energy", + "incident_energy/@units": "eV", + "incident_energy_spread": "@attrs:metadata/instrument/beam/pump/incident_energy_spread", + "incident_energy_spread/@units": "eV", + "incident_wavelength": "@attrs:metadata/instrument/beam/pump/incident_wavelength", + "incident_wavelength/@units": "nm", + "pulse_duration": "@attrs:metadata/instrument/beam/pump/pulse_duration", + "pulse_duration/@units": "fs", + "incident_polarization": "@attrs:metadata/instrument/beam/pump/incident_polarization", + "incident_polarization/@units": "V^2/mm^2", + "pulse_energy": "@attrs:metadata/instrument/beam/pump/pulse_energy", + "pulse_energy/@units": "µJ", + "average_power": "@attrs:metadata/instrument/beam/pump/average_power", + "average_power/@units": "mW", + "extent": "@attrs:metadata/instrument/beam/pump/extent", + "extent/@units": "µm", + "fluence": "@attrs:metadata/instrument/beam/pump/fluence", + "fluence/@units": "mJ/cm^2", + "associated_source": "/entry/instrument/source_pump" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]": { + "temperature_sensor": { + "name": "sample_temperature", + "measurement": "temperature", + "value": "@attrs:metadata/file/trARPES:Carving:TEMP_RBV", + "value/@units": "K" + }, + "sample_bias_voltmeter": { + "name": "sample_bias", + "measurement": "voltage", + "value": "@attrs:metadata/file/KTOF:Lens:Sample:V", + "value/@units": "V" + }, + "depends_on": "/entry/instrument/manipulator/transformations/trans_z", + "TRANSFORMATIONS[transformations]": { + "AXISNAME[trans_z]": -0.32, + "AXISNAME[trans_z]/@depends_on": "rot_z", + "AXISNAME[trans_z]/@transformation_type": "translation", + "AXISNAME[trans_z]/@units": "m", + "AXISNAME[trans_z]/@vector": [ + 0, + 0, + 1 + ], + "AXISNAME[rot_z]/@depends_on": "rot_x", + "AXISNAME[rot_z]": -25.0, + "AXISNAME[rot_z]/@transformation_type": "rotation", + "AXISNAME[rot_z]/@units": "degrees", + "AXISNAME[rot_z]/@vector": [ + 0, + 0, + 1 + ], + "AXISNAME[rot_x]/@depends_on": ".", + "AXISNAME[rot_x]": -90.0, + "AXISNAME[rot_x]/@transformation_type": "rotation", + "AXISNAME[rot_x]/@units": "degrees", + "AXISNAME[rot_x]/@vector": [ + 1, + 0, + 0 + ] + } + }, + "/ENTRY[entry]/SAMPLE[sample]": { + "preparation_date": "@attrs:metadata/sample/preparation_date", + "sample_history/notes": "@attrs:metadata/sample/sample_history", + "description": "@attrs:metadata/sample/chemical_formula", + "name": "@attrs:metadata/sample/chemical_formula", + "situation": "vacuum", + "SUBSTANCE[substance]/molecular_formula_hill": "@attrs:metadata/sample/chemical_formula", + "temperature": { + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor" + }, + "gas_pressure": { + "pressure_gauge": "@link:/entry/instrument/pressure_gauge" + }, + "bias": { + "voltmeter": "@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "depends_on": "/entry/sample/transformations/corrected_phi", + "TRANSFORMATIONS[transformations]": { + "AXISNAME[corrected_phi]/@depends_on": "rot_omg", + "AXISNAME[corrected_phi]": 90.0, + "AXISNAME[corrected_phi]/@units": "degrees", + "AXISNAME[corrected_phi]/@transformation_type": "rotation", + "AXISNAME[corrected_phi]/@vector": [ + 0, + 1, + 0 + ], + "AXISNAME[rot_omg]/@depends_on": "rot_phi", + "AXISNAME[rot_omg]": "@attrs:metadata/file/trARPES:Carving:OMG.RBV", + "AXISNAME[rot_omg]/@units": "degrees", + "AXISNAME[rot_omg]/@transformation_type": "rotation", + "AXISNAME[rot_omg]/@vector": [ + 1, + 0, + 0 + ], + "AXISNAME[rot_phi]/@depends_on": "rot_tht", + "AXISNAME[rot_phi]": "@attrs:metadata/file/trARPES:Carving:PHI.RBV", + "AXISNAME[rot_phi]/@units": "degrees", + "AXISNAME[rot_phi]/@transformation_type": "rotation", + "AXISNAME[rot_phi]/@vector": [ + 0, + 1, + 0 + ], + "AXISNAME[rot_tht]/@depends_on": "trans_z", + "AXISNAME[rot_tht]": "@attrs:metadata/file/trARPES:Carving:THT.RBV", + "AXISNAME[rot_tht]/@units": "degrees", + "AXISNAME[rot_tht]/@transformation_type": "rotation", + "AXISNAME[rot_tht]/@vector": [ + 0, + 0, + 1 + ], + "AXISNAME[trans_z]/@depends_on": "trans_y", + "AXISNAME[trans_z]": "@attrs:metadata/file/trARPES:Carving:TRZ.RBV", + "AXISNAME[trans_z]/@units": "mm", + "AXISNAME[trans_z]/@transformation_type": "translation", + "AXISNAME[trans_z]/@vector": [ + 0, + 0, + 1 + ], + "AXISNAME[trans_y]/@depends_on": "trans_x", + "AXISNAME[trans_y]": "@attrs:metadata/file/trARPES:Carving:TRY.RBV", + "AXISNAME[trans_y]/@units": "mm", + "AXISNAME[trans_y]/@transformation_type": "translation", + "AXISNAME[trans_y]/@vector": [ + 0, + 1, + 0 + ], + "AXISNAME[trans_x]/@depends_on": "/entry/instrument/manipulator/transformations/trans_z", + "AXISNAME[trans_x]": "@attrs:metadata/file/trARPES:Carving:TRX.RBV", + "AXISNAME[trans_x]/@units": "mm", + "AXISNAME[trans_x]/@transformation_type": "translation", + "AXISNAME[trans_x]/@vector": [ + 1, + 0, + 0 + ] + } + }, + "/ENTRY[entry]/PROCESS[process]/DISTORTION[distortion]": { + "symmetry": "@attrs:metadata/momentum_correction/rotsym", + "original_centre": "@attrs:metadata/momentum_correction/pcent", + "original_points": "@attrs:metadata/momentum_correction/pouter", + "cdeform_field": "@attrs:metadata/momentum_correction/cdeform_field", + "rdeform_field": "@attrs:metadata/momentum_correction/rdeform_field" + }, + "/ENTRY[entry]/PROCESS[process]/REGISTRATION[registration]": { + "depends_on": "/entry/process/registration/tranformations/rot_z", + "TRANSFORMATIONS[tranformations]": { + "AXISNAME[trans_x]": "@attrs:metadata/momentum_correction/adjust_params/xtrans", + "AXISNAME[trans_x]/@transformation_type": "translation", + "AXISNAME[trans_x]/@units": "pixels", + "AXISNAME[trans_x]/@vector": "@attrs:metadata/momentum_correction/adjust_params/x_vector", + "AXISNAME[trans_x]/@depends_on": ".", + "AXISNAME[trans_y]": "@attrs:metadata/momentum_correction/adjust_params/ytrans", + "AXISNAME[trans_y]/@units": "pixels", + "AXISNAME[trans_y]/@transformation_type": "translation", + "AXISNAME[trans_y]/@vector": "@attrs:metadata/momentum_correction/adjust_params/y_vector", + "AXISNAME[trans_y]/@depends_on": "trans_x", + "AXISNAME[rot_z]": "@attrs:metadata/momentum_correction/adjust_params/angle", + "AXISNAME[rot_z]/@units": "degrees", + "AXISNAME[rot_z]/@transformation_type": "rotation", + "AXISNAME[rot_z]/@offset": "@attrs:metadata/momentum_correction/adjust_params/offset", + "AXISNAME[rot_z]/@vector": "@attrs:metadata/momentum_correction/adjust_params/rotation_vector", + "AXISNAME[rot_z]/@depends_on": "trans_y" + } + }, + "/ENTRY[entry]/PROCESS[process]/energy_calibration":{ + "coefficients": "@attrs:metadata/energy_correction/calibration/coeffs", + "fit_function": "@attrs:metadata/energy_correction/calibration/fit_function", + "original_axis": "@attrs:metadata/energy_correction/tof", + "calibrated_axis": "@attrs:metadata/energy_correction/calibration/axis" + }, + "/ENTRY[entry]/PROCESS[process]/CALIBRATION[kx_calibration]": { + "scaling": "@attrs:metadata/momentum_correction/calibration/scale_kx", + "offset": "@attrs:metadata/momentum_correction/offset_kx", + "calibrated_axis": "@attrs:metadata/momentum_correction/calibration/axis_kx" + }, + "/ENTRY[entry]/PROCESS[process]/CALIBRATION[ky_calibration]": { + "scaling": "@attrs:metadata/momentum_correction/calibration/scale_ky", + "offset": "@attrs:metadata/momentum_correction/offset_ky", + "calibrated_axis": "@attrs:metadata/momentum_correction/calibration/axis_ky" + }, + "/ENTRY[entry]/data": { + "@axes": "@data:dims", + "AXISNAME_indices[@*_indices]": "@data:*.index", + "@signal": "data", + "data": "@data:data", + "data/@units": "counts", + "AXISNAME[*]": "@data:*.data", + "AXISNAME[*]/@units": "@data:*.unit", + "energy/@type": "binding" + } } \ No newline at end of file diff --git a/tests/data/eln_mapper/eln.yaml b/tests/data/eln_mapper/eln.yaml index 6a6884017..ec01ea424 100644 --- a/tests/data/eln_mapper/eln.yaml +++ b/tests/data/eln_mapper/eln.yaml @@ -1,36 +1,33 @@ -Data: - '@signal': null - data: - value: null - unit: null Instrument: - Beam: - distance: - value: null - unit: null - incident_energy: - value: null - unit: null - incident_energy_spread: - value: null - unit: null - incident_polarization: - value: null - unit: null Electronanalyser: Collectioncolumn: + angular_acceptance: null contrast_aperture: null + device_information: + identifier: null + model: null + vendor: null field_aperture: null + iris: null mode: null projection: null scheme: null + spatial_acceptance: null Detector: - Data: - '@signal': null - raw: null amplifier_type: null detector_type: null + device_information: + identifier: null + model: null + vendor: null + raw_data: + '@signal': null + raw: null Energydispersion: + device_information: + identifier: null + model: null + vendor: null energy_scan_mode: null entrance_slit: null exit_slit: null @@ -39,65 +36,181 @@ Instrument: unit: null scheme: null description: null + device_information: + identifier: null + model: null + vendor: null energy_resolution: - value: null - unit: null + physical_quantity: null + resolution: null + type: null fast_axes: null slow_axes: null + transmission_function: null + work_function: + value: null + unit: null Manipulator: - drain_current: + cryostat: + Pid: + setpoint: null + name: null + physical_quantity: null + type: null + device_information: + identifier: null + model: null + vendor: null + drain_current_amperemeter: + measurement: null + name: null + type: null + value: null + sample_bias_potentiostat: + Pid: + setpoint: null + name: null + physical_quantity: null + type: null + sample_bias_voltmeter: + measurement: null + name: null + type: null + value: null + sample_heater: + Pid: + setpoint: null + heater_power: null + name: null + physical_quantity: null + type: null + temperature_sensor: + measurement: null + name: null + type: null + value: null + beam_TYPE: + associated_source: null + distance: + value: null + unit: null + extent: null + incident_energy: value: null unit: null - sample_bias: + incident_energy_spread: value: null unit: null - sample_temperature: + incident_polarization: value: null unit: null - Source: + device_information: + identifier: null + model: null + vendor: null + energy_resolution: + physical_quantity: null + resolution: + value: null + unit: null + type: null + flood_gun: + current: + value: null + unit: null + current_log: + value: + value: null + unit: null + name: null + physical_quantity: null + type: null + pressure_gauge: + measurement: null + name: null + type: null + value: + value: null + unit: null + value_log: + value: + value: null + unit: null + source_TYPE: + associated_beam: null + device_information: + identifier: null + model: null + vendor: null name: null probe: null type: null - energy_resolution: - value: null - unit: null + type_other: null Process: angular_calibration: - applied: null calibrated_axis: null energy_calibration: - applied: null calibrated_axis: null + energy_referencing: + binding_energy: null + calibrated_axis: null + level: null + offset: null + reference_peak: null momentum_calibration: - applied: null calibrated_axis: null spatial_calibration: - applied: null calibrated_axis: null + transmission_correction: + transmission_function: + '@axes': null + '@signal': null + kinetic_energy: + value: null + unit: null + relative_intensity: null Sample: + Substance: + molecular_formula_hill: null atom_types: null bias: - value: null - unit: null - chemical_formula: null + potentiostat: null + voltmeter: null + drain_current: + amperemeter: null + flood_gun_current: + flood_gun: null gas_pressure: - value: null - unit: null + pressure_gauge: null name: null - preparation_date: null - preparation_description: null - sample_history: null + physical_form: null + sample_history: + sample_preparation: + end_time: null + method: null + start_time: null situation: null temperature: - value: null - unit: null + cryostat: null + sample_heater: null + temperature_sensor: null User: - address: null affiliation: null - email: null name: null - orcid: null +data: + '@energy_depends': null + '@energy_indices': null + '@signal': null + data: + value: null + unit: null + energy: + '@type': null + value: null + unit: null definition: '@version': null +end_time: null +method: null start_time: null title: null diff --git a/tests/data/eln_mapper/mpes.scheme.archive.yaml b/tests/data/eln_mapper/mpes.scheme.archive.yaml index 0f704ced9..7c7f12d7a 100644 --- a/tests/data/eln_mapper/mpes.scheme.archive.yaml +++ b/tests/data/eln_mapper/mpes.scheme.archive.yaml @@ -12,6 +12,13 @@ definitions: eln: hide: [] quantities: + definition: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' title: type: str m_annotations: @@ -25,14 +32,36 @@ definitions: eln: component: DateTimeEditQuantity defaultDisplayUnit: - description: ' Datetime of the start of the measurement. ' - definition: + description: ' 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. ' + end_time: + type: Datetime + m_annotations: + eln: + component: DateTimeEditQuantity + defaultDisplayUnit: + description: ' 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. ' + method: type: str m_annotations: eln: component: StringEditQuantity defaultDisplayUnit: - description: '' + description: ' Name of the experimental method. If applicable, this name + should match the terms given by `Clause 11`_ of the `ISO 18115-1:2023`_ + specification. Examples include: * X-ray photoelectron spectroscopy (XPS) + * angle-resolved X-ray photoelectron spectroscopy (ARXPS) * ultraviolet + photoelectron spectroscopy (UPS) * angle-resolved photoelectron spectroscopy + (ARPES) * hard X-ray photoemission spectroscopy (HAXPES) * near ambient + pressure X-ray photoelectron spectroscopy (NAPXPS) * photoelectron emission + microscopy (PEEM) * electron spectroscopy for chemical analysis (ESCA) + * time-resolved angle-resolved X-ray photoelectron spectroscopy (trARPES) + * spin-resolved angle-resolved X-ray photoelectron spectroscopy (spin-ARPES) + * momentum microscopy .. _ISO 18115-1:2023: https://www.iso.org/standard/74811.html + .. _Clause 11: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:sec:11 ' sub_sections: User: section: @@ -53,47 +82,71 @@ definitions: eln: component: StringEditQuantity defaultDisplayUnit: - description: ' Name of the affiliation of the user at the point in - time when the experiment was performed. ' - address: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: - description: ' Full address (street, street number, ZIP, city, country) - of the user''s affiliation. ' - email: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: - description: ' Email address of the user. ' - orcid: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: - description: ' Author ID defined by https://orcid.org/. ' + description: ' Name of the affiliation of the user at the time when + the experiment was performed. ' Instrument: section: m_annotations: eln: overview: true - quantities: - energy_resolution: - type: np.float64 - unit: '' - value: - m_annotations: - eln: - component: NumberEditQuantity - defaultDisplayUnit: - description: '' sub_sections: - Source: + Energy_resolution: + section: + m_annotations: + eln: + overview: true + quantities: + physical_quantity: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + resolution: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Device_information: + section: + m_annotations: + eln: + overview: true + quantities: + vendor: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + Source_type: section: m_annotations: eln: @@ -106,6 +159,13 @@ definitions: component: StringEditQuantity defaultDisplayUnit: description: '' + type_other: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: ' Specification of type, may also go to name. ' name: type: str m_annotations: @@ -119,9 +179,41 @@ definitions: eln: component: StringEditQuantity defaultDisplayUnit: - description: ' Type of probe. In photoemission it''s always - photons, so the full NIAC list is restricted. ' - Beam: + description: '' + sub_sections: + Device_information: + section: + m_annotations: + eln: + overview: true + quantities: + vendor: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + Associated_beam: + section: + m_annotations: + eln: + overview: true + Beam_type: section: m_annotations: eln: @@ -135,8 +227,11 @@ definitions: eln: component: NumberEditQuantity defaultDisplayUnit: - description: ' Distance of the point of evaluation of the beam - from the sample surface. ' + description: ' Distance between the point where the current + NXbeam instance is evaluating the beam properties and the + point where the beam interacts with the sample. For photoemission, + the latter is the point where the the centre of the beam touches + the sample surface. ' incident_energy: type: np.float64 unit: '' @@ -164,44 +259,84 @@ definitions: component: NumberEditQuantity defaultDisplayUnit: description: '' - Electronanalyser: - section: - m_annotations: - eln: - overview: true - quantities: - description: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: - description: '' - energy_resolution: + extent: type: np.float64 - unit: '' - value: m_annotations: eln: component: NumberEditQuantity defaultDisplayUnit: - description: ' Energy resolution of the analyser with the current - setting. May be linked from a NXcalibration. ' - fast_axes: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: - description: '' - slow_axes: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: description: '' sub_sections: + Associated_source: + section: + m_annotations: + eln: + overview: true + Electronanalyser: + section: + m_annotations: + eln: + overview: true + sub_sections: + Device_information: + section: + m_annotations: + eln: + overview: true + quantities: + vendor: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + Energy_resolution: + section: + m_annotations: + eln: + overview: true + quantities: + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + physical_quantity: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + resolution: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Transmission_function: + section: + m_annotations: + eln: + overview: true Collectioncolumn: section: m_annotations: @@ -229,6 +364,20 @@ definitions: component: StringEditQuantity defaultDisplayUnit: description: '' + angular_acceptance: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + spatial_acceptance: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' sub_sections: Field_aperture: section: @@ -240,6 +389,38 @@ definitions: m_annotations: eln: overview: true + Iris: + section: + m_annotations: + eln: + overview: true + Device_information: + section: + m_annotations: + eln: + overview: true + quantities: + vendor: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' Energydispersion: section: m_annotations: @@ -280,6 +461,33 @@ definitions: m_annotations: eln: overview: true + Device_information: + section: + m_annotations: + eln: + overview: true + quantities: + vendor: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' Detector: section: m_annotations: @@ -302,44 +510,427 @@ definitions: defaultDisplayUnit: description: ' Description of the detector type. ' sub_sections: - Data: + Device_information: section: m_annotations: eln: overview: true quantities: - raw: - type: np.float64 + vendor: + type: str m_annotations: eln: - component: NumberEditQuantity + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + Raw_data: + section: + m_annotations: + eln: + overview: true + quantities: + raw: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity defaultDisplayUnit: description: ' Raw data before calibration. ' + quantities: + description: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + work_function: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + fast_axes: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + slow_axes: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' Manipulator: + section: + m_annotations: + eln: + overview: true + sub_sections: + Temperature_sensor: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + measurement: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + value: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Sample_heater: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + physical_quantity: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + heater_power: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + sub_sections: + Pid: + section: + m_annotations: + eln: + overview: true + quantities: + setpoint: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Cryostat: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + physical_quantity: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + sub_sections: + Pid: + section: + m_annotations: + eln: + overview: true + quantities: + setpoint: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Drain_current_amperemeter: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + measurement: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + value: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Sample_bias_voltmeter: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + measurement: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + value: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Sample_bias_potentiostat: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + physical_quantity: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + sub_sections: + Pid: + section: + m_annotations: + eln: + overview: true + quantities: + setpoint: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: '' + Device_information: + section: + m_annotations: + eln: + overview: true + quantities: + vendor: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + model: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + identifier: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + Pressure_gauge: section: m_annotations: eln: overview: true quantities: - sample_temperature: - type: np.float64 - unit: '' - value: + name: + type: str m_annotations: eln: - component: NumberEditQuantity + component: StringEditQuantity + defaultDisplayUnit: + description: '' + measurement: + type: str + m_annotations: + eln: + component: StringEditQuantity defaultDisplayUnit: description: '' - drain_current: + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + value: type: np.float64 - unit: '' + unit: '' value: m_annotations: eln: component: NumberEditQuantity defaultDisplayUnit: + description: ' In case of a single or averaged gas pressure + measurement, this is the scalar gas pressure around the sample. + It can also be an 1D array of measured pressures (without + time stamps). ' + sub_sections: + Value_log: + section: + m_annotations: + eln: + overview: true + quantities: + value: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' In the case of an experiment in which the + gas pressure changes and is recorded, this is an array + of length m of gas pressures. ' + Flood_gun: + section: + m_annotations: + eln: + overview: true + quantities: + name: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + physical_quantity: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: '' + type: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: description: '' - sample_bias: + current: type: np.float64 unit: '' value: @@ -347,7 +938,27 @@ definitions: eln: component: NumberEditQuantity defaultDisplayUnit: - description: '' + description: ' In case of a fixed or averaged electron current, + this is the scalar current. It can also be an 1D array of + output current (without time stamps). ' + sub_sections: + Current_log: + section: + m_annotations: + eln: + overview: true + quantities: + value: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' In the case of an experiment in which the + electron current is changed and recorded with time stamps, + this is an array of length m of current setpoints. ' Process: section: m_annotations: @@ -360,13 +971,6 @@ definitions: eln: overview: true quantities: - applied: - type: bool - m_annotations: - eln: - component: BoolEditQuantity - defaultDisplayUnit: - description: ' Has an energy calibration been applied? ' calibrated_axis: type: np.float64 m_annotations: @@ -381,13 +985,6 @@ definitions: eln: overview: true quantities: - applied: - type: bool - m_annotations: - eln: - component: BoolEditQuantity - defaultDisplayUnit: - description: ' Has an angular calibration been applied? ' calibrated_axis: type: np.float64 m_annotations: @@ -402,13 +999,6 @@ definitions: eln: overview: true quantities: - applied: - type: bool - m_annotations: - eln: - component: BoolEditQuantity - defaultDisplayUnit: - description: ' Has an spatial calibration been applied? ' calibrated_axis: type: np.float64 m_annotations: @@ -423,21 +1013,92 @@ definitions: eln: overview: true quantities: - applied: - type: bool + calibrated_axis: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' This is the momentum axis to be used for data + plotting. ' + Energy_referencing: + section: + m_annotations: + eln: + overview: true + sub_sections: + Level: + section: + m_annotations: + eln: + overview: true + quantities: + reference_peak: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: ' Reference peak that was used for the calibration. For + example: adventitious carbon | C-C | metallic Au | elemental + Si | Fermi edge | vacuum level ' + binding_energy: + type: np.float64 + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' The binding energy (in units of eV) that the + specified emission line appeared at, after adjusting the binding + energy scale. This concept is related to term `12.16_ ff.`_ + of the ISO 18115-1:2023 standard. .. _12.16_ ff.: https://www.iso.org/obp/ui/en/#iso:std:iso:18115:-1:ed-3:v1:en:term:12.16 ' + offset: + type: np.float64 m_annotations: eln: - component: BoolEditQuantity + component: NumberEditQuantity defaultDisplayUnit: - description: ' Has an momentum calibration been applied? ' + description: ' Offset between measured binding energy and calibrated + binding energy of the emission line. ' calibrated_axis: type: np.float64 m_annotations: eln: component: NumberEditQuantity defaultDisplayUnit: - description: ' This is the momentum axis to be used for data - plotting. ' + description: ' This is the calibrated energy axis to be used + for data plotting. This should link to /entry/data/energy. ' + Transmission_correction: + section: + m_annotations: + eln: + overview: true + sub_sections: + Transmission_function: + section: + m_annotations: + eln: + overview: true + quantities: + kinetic_energy: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' Kinetic energy values ' + relative_intensity: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' Relative transmission efficiency for the + given kinetic energies ' Sample: section: m_annotations: @@ -451,14 +1112,6 @@ definitions: component: StringEditQuantity defaultDisplayUnit: description: '' - chemical_formula: - type: str - m_annotations: - eln: - component: StringEditQuantity - defaultDisplayUnit: - description: ' The chemical formula of the sample. For mixtures use - the NXsample_component group in NXsample instead. ' atom_types: type: str m_annotations: @@ -469,53 +1122,139 @@ definitions: table that are contained in the sample. If the sample substance has multiple components, all elements from each component must be included in `atom_types`. ' - preparation_date: - type: Datetime - m_annotations: - eln: - component: DateTimeEditQuantity - defaultDisplayUnit: - description: ' Date of preparation of the sample for the XPS experiment - (i.e. cleaving, last annealing). ' - temperature: - type: np.float64 - unit: '' - value: - m_annotations: - eln: - component: NumberEditQuantity - defaultDisplayUnit: - description: ' 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. ' - situation: + physical_form: type: str m_annotations: eln: component: StringEditQuantity defaultDisplayUnit: description: '' - gas_pressure: - type: np.float64 - unit: '' - value: + situation: + type: str m_annotations: eln: - component: NumberEditQuantity + component: StringEditQuantity defaultDisplayUnit: description: '' sub_sections: + Substance: + section: + m_annotations: + eln: + overview: true + quantities: + molecular_formula_hill: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: ' The chemical formula of the sample (using CIF + conventions). ' Sample_history: section: m_annotations: eln: overview: true - Preparation_description: + sub_sections: + Sample_preparation: + section: + m_annotations: + eln: + overview: true + quantities: + start_time: + type: Datetime + m_annotations: + eln: + component: DateTimeEditQuantity + defaultDisplayUnit: + description: '' + end_time: + type: Datetime + m_annotations: + eln: + component: DateTimeEditQuantity + defaultDisplayUnit: + description: '' + method: + type: str + m_annotations: + eln: + component: StringEditQuantity + defaultDisplayUnit: + description: ' Details about the method of sample preparation + before the MPES experiment. ' + Temperature: + section: + m_annotations: + eln: + overview: true + sub_sections: + Temperature_sensor: + section: + m_annotations: + eln: + overview: true + Sample_heater: + section: + m_annotations: + eln: + overview: true + Cryostat: + section: + m_annotations: + eln: + overview: true + Gas_pressure: + section: + m_annotations: + eln: + overview: true + sub_sections: + Pressure_gauge: + section: + m_annotations: + eln: + overview: true + Bias: + section: + m_annotations: + eln: + overview: true + sub_sections: + Voltmeter: + section: + m_annotations: + eln: + overview: true + Potentiostat: + section: + m_annotations: + eln: + overview: true + Drain_current: + section: + m_annotations: + eln: + overview: true + sub_sections: + Amperemeter: + section: + m_annotations: + eln: + overview: true + Flood_gun_current: section: m_annotations: eln: overview: true + sub_sections: + Flood_gun: + section: + m_annotations: + eln: + overview: true Data: section: m_annotations: @@ -535,3 +1274,13 @@ definitions: spatial coordinate, pump-probe delay, spin index, temperature, etc. The axes traces should be linked to the actual encoder position in NXinstrument or calibrated axes in NXprocess. ' + energy: + type: np.float64 + unit: '' + value: + m_annotations: + eln: + component: NumberEditQuantity + defaultDisplayUnit: + description: ' Calibrated energy axis. This could be a link to either + /entry/process/energy_calibration/calibrated_axis or /entry/process/energy_correction/calibrated_axis. ' diff --git a/tests/data/nexus/Ref_nexus_test.log b/tests/data/nexus/Ref_nexus_test.log index ec7214cc4..478888afb 100644 --- a/tests/data/nexus/Ref_nexus_test.log +++ b/tests/data/nexus/Ref_nexus_test.log @@ -80,116 +80,116 @@ 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'] @@ -210,39 +210,39 @@ 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@signal) DEBUG - value: data DEBUG - classpath: ['NXentry', 'NXdata'] @@ -254,19 +254,19 @@ DEBUG - NXdata.nxdl.xml:@signal - [NX_CHAR] DEBUG - <> 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/angles): DEBUG - value: [-1.96735314 -1.91500657 -1.86266001 -1.81031344 -1.75796688 -1.70562031 ... DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -276,12 +276,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/angles@target) DEBUG - value: /entry/instrument/analyser/angles DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -304,15 +304,15 @@ DEBUG - <> DEBUG - Dataset referenced as NXdata SIGNAL 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@target) DEBUG - value: /entry/instrument/analyser/data DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -335,12 +335,12 @@ DEBUG - <> DEBUG - Dataset referenced as NXdata AXIS #2 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/delays@target) DEBUG - value: /entry/instrument/analyser/delays DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -363,12 +363,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/energies@target) DEBUG - value: /entry/instrument/analyser/energies DEBUG - classpath: ['NXentry', 'NXdata', 'NX_NUMBER'] @@ -1116,20 +1116,14 @@ DEBUG - NOT IN SCHEMA DEBUG - DEBUG - ===== FIELD (//entry/instrument/energy_resolution): DEBUG - value: 100 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] -DEBUG - classes: -NXinstrument.nxdl.xml:/energy_resolution -DEBUG - <> -DEBUG - documentation (NXinstrument.nxdl.xml:/energy_resolution): +DEBUG - classpath: ['NXentry', 'NXinstrument'] +DEBUG - NOT IN SCHEMA 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 - classes: -NXinstrument.nxdl.xml:/energy_resolution -DEBUG - NXinstrument.nxdl.xml:/energy_resolution@units [NX_ENERGY] +DEBUG - classpath: ['NXentry', 'NXinstrument'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== GROUP (//entry/instrument/manipulator [NXarpes::/NXentry/NXinstrument/NXpositioner]): DEBUG - classpath: ['NXentry', 'NXinstrument', 'NXpositioner'] DEBUG - classes: @@ -1351,7 +1345,10 @@ 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 - value: NXsource @@ -1526,6 +1523,7 @@ DEBUG - enumeration (NXarpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe): DEBUG - -> x-ray DEBUG - enumeration (NXsource.nxdl.xml:/probe): DEBUG - -> neutron +DEBUG - -> photon DEBUG - -> x-ray DEBUG - -> muon DEBUG - -> electron @@ -1589,7 +1587,10 @@ 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 @@ -1720,6 +1721,7 @@ DEBUG - enumeration (NXarpes.nxdl.xml:/ENTRY/INSTRUMENT/SOURCE/probe): DEBUG - -> x-ray DEBUG - enumeration (NXsource.nxdl.xml:/probe): DEBUG - -> neutron +DEBUG - -> photon DEBUG - -> x-ray DEBUG - -> muon DEBUG - -> electron @@ -1772,36 +1774,24 @@ DEBUG - DEBUG - ===== FIELD (//entry/instrument/spatial_resolution): DEBUG - value: 500 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] -DEBUG - classes: -NXinstrument.nxdl.xml:/spatial_resolution -DEBUG - <> -DEBUG - documentation (NXinstrument.nxdl.xml:/spatial_resolution): +DEBUG - classpath: ['NXentry', 'NXinstrument'] +DEBUG - NOT IN SCHEMA DEBUG - - Spatial resolution of the experiment (Airy disk radius) - DEBUG - ===== ATTRS (//entry/instrument/spatial_resolution@units) DEBUG - value: um -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] -DEBUG - classes: -NXinstrument.nxdl.xml:/spatial_resolution -DEBUG - NXinstrument.nxdl.xml:/spatial_resolution@units [NX_LENGTH] +DEBUG - classpath: ['NXentry', 'NXinstrument'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== FIELD (//entry/instrument/temporal_resolution): DEBUG - value: 100 -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] -DEBUG - classes: -NXinstrument.nxdl.xml:/temporal_resolution -DEBUG - <> -DEBUG - documentation (NXinstrument.nxdl.xml:/temporal_resolution): +DEBUG - classpath: ['NXentry', 'NXinstrument'] +DEBUG - NOT IN SCHEMA DEBUG - - Temporal resolution of the experiment (FWHM) - DEBUG - ===== ATTRS (//entry/instrument/temporal_resolution@units) DEBUG - value: fs -DEBUG - classpath: ['NXentry', 'NXinstrument', 'NX_FLOAT'] -DEBUG - classes: -NXinstrument.nxdl.xml:/temporal_resolution -DEBUG - NXinstrument.nxdl.xml:/temporal_resolution@units [NX_TIME] +DEBUG - classpath: ['NXentry', 'NXinstrument'] +DEBUG - NOT IN SCHEMA +DEBUG - DEBUG - ===== FIELD (//entry/run_cycle): DEBUG - value: b'2018 User Run Block 2' DEBUG - classpath: ['NXentry', 'NX_CHAR'] diff --git a/tests/dataconverter/test_helpers.py b/tests/dataconverter/test_helpers.py index 1c0bd6aca..5542dd703 100644 --- a/tests/dataconverter/test_helpers.py +++ b/tests/dataconverter/test_helpers.py @@ -428,7 +428,12 @@ def test_validate_data_dict( ) def test_path_in_data_dict(nxdl_path, expected, template): """Unit test for helper function to check if an NXDL path exists in the reader dictionary.""" - assert helpers.path_in_data_dict(nxdl_path, template) == expected + assert ( + helpers.path_in_data_dict( + nxdl_path, helpers.convert_data_dict_path_to_hdf5_path(nxdl_path), template + ) + == expected + ) def test_atom_type_extractor_and_hill_conversion(): diff --git a/tests/dataconverter/test_readers.py b/tests/dataconverter/test_readers.py index 00cdcf603..a777e5182 100644 --- a/tests/dataconverter/test_readers.py +++ b/tests/dataconverter/test_readers.py @@ -19,18 +19,18 @@ import glob import os -from typing import List import xml.etree.ElementTree as ET +from typing import List import pytest from _pytest.mark.structures import ParameterSet -from pynxtools.dataconverter.readers.base.reader import BaseReader from pynxtools.dataconverter.convert import get_names_of_all_readers, get_reader from pynxtools.dataconverter.helpers import ( - validate_data_dict, generate_template_from_nxdl, + validate_data_dict, ) +from pynxtools.dataconverter.readers.base.reader import BaseReader from pynxtools.dataconverter.template import Template @@ -59,6 +59,7 @@ def get_all_readers() -> List[ParameterSet]: "EmOmReader", "EmSpctrscpyReader", "EmNionReader", + "XPSReader", ): readers.append( pytest.param( diff --git a/tests/nexus/test_nexus.py b/tests/nexus/test_nexus.py index b7daa0505..656c27e29 100644 --- a/tests/nexus/test_nexus.py +++ b/tests/nexus/test_nexus.py @@ -19,8 +19,8 @@ # limitations under the License. # -import os import logging +import os import xml.etree.ElementTree as ET from pynxtools.nexus import nexus @@ -53,13 +53,12 @@ def test_nexus(tmp_path): """ The nexus test function """ - local_dir = os.path.abspath(os.path.dirname(__file__)) - example_data = os.path.join(local_dir, "../data/nexus/201805_WSe2_arpes.nxs") - + dirpath = os.path.join(os.path.dirname(__file__), "../data/nexus") + example_data = os.path.join(dirpath, "201805_WSe2_arpes.nxs") logger.setLevel(logging.DEBUG) handler = logging.FileHandler(os.path.join(tmp_path, "nexus_test.log"), "w") - handler.setLevel(logging.DEBUG) formatter = logging.Formatter("%(levelname)s - %(message)s") + handler.setLevel(logging.DEBUG) handler.setFormatter(formatter) logger.addHandler(handler) nexus_helper = nexus.HandleNexus(logger, example_data, None, None) @@ -70,7 +69,7 @@ def test_nexus(tmp_path): ) as logfile: log = logfile.readlines() with open( - os.path.join(local_dir, "../data/nexus/Ref_nexus_test.log"), + os.path.join(dirpath, "Ref_nexus_test.log"), "r", encoding="utf-8", ) as reffile: