diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml new file mode 100644 index 000000000..0c9f5d64e --- /dev/null +++ b/.github/workflows/build_docs.yml @@ -0,0 +1,27 @@ +name: build_docs +on: + push: + branches: [master] +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Git Credentials + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV + - uses: actions/cache@v3 + with: + key: mkdocs-material-${{ env.cache_id }} + path: .cache + restore-keys: | + mkdocs-material- + - run: pip install -r mkdocs-requirements.txt + - run: mkdocs gh-deploy --force \ No newline at end of file diff --git a/.github/workflows/check_nexus_version.yml b/.github/workflows/check_nexus_version.yml new file mode 100644 index 000000000..6b89e30c3 --- /dev/null +++ b/.github/workflows/check_nexus_version.yml @@ -0,0 +1,24 @@ +name: nexus version check + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + linting: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Generate nexus git version + run: | + git submodule sync --recursive + git submodule update --init --recursive --jobs=4 + git submodule foreach --recursive 'git fetch --tags' + cd pynxtools/definitions + git describe --dirty --tags --long --match "*[0-9]*" > ../nexus-ref.txt + cd ../ + - name: Diff + run: | + diff -w pynxtools/nexus-version.txt pynxtools/nexus-ref.txt \ No newline at end of file diff --git a/.gitignore b/.gitignore index 31863deff..d75a6ed60 100644 --- a/.gitignore +++ b/.gitignore @@ -203,6 +203,8 @@ cython_debug/ !dev-requirements.txt !pynxtools/dataconverter/units/default_en.txt !pynxtools/dataconverter/units/constants_en.txt +!mkdocs-requirements.txt +!pynxtools/nexus-version.txt build/ nexusparser.egg-info/PKG-INFO .python-version diff --git a/.gitmodules b/.gitmodules index 13255c151..304dc9b2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "pynxtools/definitions"] path = pynxtools/definitions - url = https://github.com/FAIRmat-NFDI/nexus_definitions.git + url = https://github.com/FAIRmat-NFDI/nexus_definitions.git \ No newline at end of file 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/README.md b/README.md index 26a96f86a..9772aa6c2 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,10 @@ data into the NeXus standard and visualising the files content. - [**dataconverter**](https://github.com/FAIRmat-NFDI/pynxtools/blob/master/pynxtools/dataconverter/README.md): Creates compliant instances of NeXus/HDF5 files to [NeXus schemas](https://nexusformat.org). - [**read_nexus**](https://github.com/FAIRmat-NFDI/pynxtools/blob/master/pynxtools/nexus/README.md): Outputs a debug log for a given NeXus file. +- [**generate_eln**](https://github.com/FAIRmat-NFDI/pynxtools/blob/master/pynxtools/eln_mapper/README.md): Outputs ELN files that can be used to add metadata to the dataconverter routine. + +# Documentation +Documentation for the different tools can be found [here](https://fairmat-nfdi.github.io/pynxtools/). # Contributing diff --git a/docs/how-tos/transformations.md b/docs/how-tos/transformations.md new file mode 100644 index 000000000..000e5b411 --- /dev/null +++ b/docs/how-tos/transformations.md @@ -0,0 +1,5 @@ +# Storing experimental geometries + +!!! danger "Work in progress" + + This part of the documentation is still being written and it might be confusing or incomplete. \ No newline at end of file diff --git a/docs/how-tos/using-multiple-appdefs.md b/docs/how-tos/using-multiple-appdefs.md new file mode 100644 index 000000000..8473a0b69 --- /dev/null +++ b/docs/how-tos/using-multiple-appdefs.md @@ -0,0 +1,5 @@ +# Storing data following multiple appdefs + +!!! danger "Work in progress" + + This part of the documentation is still being written and it might be confusing or incomplete. diff --git a/docs/how-tos/writing-an-appdef.md b/docs/how-tos/writing-an-appdef.md new file mode 100644 index 000000000..808b18451 --- /dev/null +++ b/docs/how-tos/writing-an-appdef.md @@ -0,0 +1,26 @@ +# Writing a Simple Application Definition + +!!! danger "Work in progress" + + This part of the documentation is still being written and it might be confusing or incomplete. + +Concept of this How-to: + +Create an example file NXdouble_slit + +NXslit_experiments --> NXdouble_slit +NXslit_experiments --> NXsingle_slit + +They should learn the basic principles of how nexus works, the different path notations +- Principles of nexus + - concepts + - appdefs + - base classes +- Inheritance of application definitions and base classes +- Connection of concept paths and instance paths +- Description of appdef/base class notation (upper and lower case) +- Basic tools for creation (pynxtools) and verification (pynxtools?) of nexus files + +Additional information (i.e., not in this tutorial but linked to this): +- Creating a reader in pynxtools +- Reading/writing nexus data in nomad \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..7b9e44a08 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,62 @@ +--- +hide: toc +--- + +# FAIRmat NeXus documentation + + + + + + + + + +
+
+ +### Tutorial + +A series of tutorials giving you an overview on how to store or convert your data to NeXus compliant files. + +- [Converting your data to NeXus](tutorial/converting-data-to-nexus.md) +- [Uploading NeXus data to NOMAD](tutorial/nexus-to-nomad.md) + +
+
+ +### How-to guides + +How-to guides provide step-by-step instructions for a wide range of tasks: + +- [Writing an application definition](how-tos/writing-an-appdef.md) +- [Storing data in multiple application definitions](how-tos/using-multiple-appdefs.md) +- [Representing experimental geometries](how-tos/transformations.md) + +
+ +
+ +### Learn + +An introduction to NeXus and its design principles. + +- [An introduction to NeXus](learn/nexus-primer.md) +- [The concept of multiple application definitions](learn/multiple-appdefs.md) + + + +
+
+ +### Reference + +[Here](reference/definitions.md), you find the detailed list of application definitions and base classes and their respective fields. + +Or go directly to the [official NIAC](https://manual.nexusformat.org/classes/index.html) + or [latest FAIRmat](https://fairmat-nfdi.github.io/nexus_definitions/) definitions. + +
+
+ +

Project and community

diff --git a/docs/learn/multiple-appdefs.md b/docs/learn/multiple-appdefs.md new file mode 100644 index 000000000..166ebcd64 --- /dev/null +++ b/docs/learn/multiple-appdefs.md @@ -0,0 +1,27 @@ +# Multiple Application Definitions in NeXus + +!!! danger "Work in progress" + + This part of the documentation is still being written and it might be confusing or incomplete. + +This tutorial showcases how to employ multiple application definitions in NeXus for creating a file that conforms to various definitions simultaneously. + +!!! info "Prerequisites" + + Familiarity with the basics of NeXus and its application definitions is required. For an introduction to NeXus, please refer to the [basic documentation](nexus-primer.md). + +In a laboratory setting, the data we collect can vary significantly depending on the experiment's specific setup. Consider, for instance, an experiment characterized using the `NXexperiment` application definition. Suppose we want to enhance this experiment by incorporating energy resolution details. A straightforward approach might involve creating a specialized sub-application definition, like `NXexperiment_energy_resolved`, to include metadata about the experiment's energy resolution. + +While this method is effective for initial expansions of the metadata, it becomes cumbersome when trying to merge multiple enhancements into a single application definition. Imagine we wish to integrate additional elements that provide time resolution data for our experiment. +We need to create three sub application definitions to reflect all combinations: `NXexperiment_time_resolved`, `NXexperiment_energy_resolved` and `NXexperiment_energy_time_resolved`. +For three experimental facets we already need 7 sub application definitions. An additional problem is that we have to repeat the whole procedure for all experiments we like to add the specific traits to. So if we have three different parent application definitions we already need to create 9 sub application definitions just to add energy and time resolution. + +The solution for this problem is to specify multiple application definitions while writing a NeXus file to follow different traits of the experiment. This allows us to simply create `NXtime_resolved` and `NXenergy_resolved` and combine it with any experiment we want to use it with. +This comes, however, with a few drawbacks. One of them is that it is currently not possible to write a file which wants to use two different application definitions which have conflicting fields. While this is generally possible in the framework of NeXus, since every application definition creates their own namespace, this is not supported when the paths are reduced to entry path notation. + +ToDo: +- Make an example of NXexperiment, NXtime_resolved and NXenergy_resolved and show how it is combined into the instance path. +- Also show this for a conflict. Compare concept path (no problem) to instance path (colliding). +- Write a part how it is described in the file that it follows two appdefs `/entry/definitions` as array containing both appdefs. +- Explain that this is no problem with the expanded concept path notation but fails when we only use the instance path. +- Explain the reader concept: One reader for one appdef, then pynxtools will figure out how to combine them (this is domain knowledge for the FAIRmat reader -> will be different when a read/write tool is written somewhere else). diff --git a/docs/learn/nexus-primer.md b/docs/learn/nexus-primer.md new file mode 100644 index 000000000..32c908753 --- /dev/null +++ b/docs/learn/nexus-primer.md @@ -0,0 +1,38 @@ +# A primer on NeXus + +!!! danger "Work in progress" + + This part of the documentation is still being written and it might be confusing or incomplete. + +NeXus is is a description of a common data exchange format initially developed for neutron, X-ray, and muon experiments. Within FAIRmat we extensively extended the format to cover a range of experiments with major support for APM, ARPES, XPS, and optical spectroscpy but we also give advice and guidance for developing standards for other formats as well. + +!!! info "NeXus as a tool for FAIR data" + + NeXus is supported be the research data management platform NOMAD. + Experimental data following an NeXus application definition can easily be uploaded and is recognized by NOMAD's search system. + If you want to learn more about uploading NeXus data to NOMAD, please refer to the [NeXus to nomad](../tutorial/nexus-to-nomad.md) tutorial + of this documentation. + Accordingly, if you want to build data according to the FAIR principles, you can think of NeXus fulfilling the interoperability and + reproducibility part and a research data management platform like NOMAD the findable and accessible part. + +## What is NeXus? + +Sometimes, NeXus is seen as writing data to some form of file in hdf5 format. +While this is partly true, NeXus is independent of the actual storage format but is typically written into an hdf5 file. + +But what is NeXus then? It is the conceptual layer above the file structure. +It is a contract on which data has to be present and how to name them in a given dataset. +Hence, using NeXus participates in making data FAIR. +It especially covers the interoperability and reproducibility part of research data. + +!!! info "NeXus path notations" + + There are several methods for referencing concepts or data paths within NeXus: + + - **Concept Path Notation:** This notation describes the hierarchical structure of NeXus concepts using class names. For example, `NXexperiment:/NXentry/NXinstrument/NXdetector` indicates the creation of a new NXdetector class within the NXexperiment concept. This path typically forms automatically when an application definition extends a base class's fields. + + - **Instance Path Notation:** It represents the actual location of a field or group in a NeXus data instance (e.g., an HDF5 file). An example is `my_file.nxs:/entry/instrument/detector`. + + - **Combined Notation:** This combines concept and instance paths. For example, `NXexperiment:/NXentry[my_file.nxs:entry]/NXinstrument[instrument]/NXdetector[detector]`. Here, concept paths are outside and instance paths within square brackets. The leftmost entries may include the NeXus class or file reference. + + - **Appdef Notation:** This format is used in application definitions, where uppercase indicates a selectable name and lowercase a fixed name. Examples include `NXexperiment:ENTRY[my_experiment.nxs:entry]/INSTRUMENT[instrument]/DETECTOR[detector]` and `NXexperiment:ENTRY[my_experiment.nxs:entry]/my_INSTRUMENT[my_instrument]/DETECTOR[detector]`. diff --git a/docs/macros.py b/docs/macros.py new file mode 100644 index 000000000..b9deb16ba --- /dev/null +++ b/docs/macros.py @@ -0,0 +1,17 @@ +""" +MKdocs macros for the documentation +""" + + +def define_env(env): + """ + This is the hook for defining variables, macros and filters + + - variables: the dictionary that contains the environment variables + - macro: a decorator function, to declare a macro. + - filter: a function with one of more arguments, + used to perform a transformation + """ + + # add to the dictionary of variables available to markdown pages: + env.variables["version"] = "2023.10" # Figure out from setuptools-scm eventually diff --git a/docs/reference/definitions.md b/docs/reference/definitions.md new file mode 100644 index 000000000..0e47943c4 --- /dev/null +++ b/docs/reference/definitions.md @@ -0,0 +1,12 @@ +# NeXus definitions + +We link two references here. +The first links to the official definitions by the [NIAC](http://www.nexusformat.org) and the second one links to latest FAIRmat definitions. + +- [Official NIAC definitions](https://manual.nexusformat.org/classes/index.html) +- [Latest FAIRmat definitions](https://fairmat-nfdi.github.io/nexus_definitions/) + +The FAIRmat definitions are regularly contributed to NIAC (around every 6 months) but generally reflect +a state which is still under development and may contain new or improved application definitions or base classes. +Consider it as the public review stage of these application definitions. +However, there might be some parts which are still under discussion and will be subject to change. diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 000000000..321e08706 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,69 @@ + +.md-header__button.md-logo :where(img,svg) { + width: 100%; + height: 30px; +} + +.md-header, .md-header__inner { + background-color: #fff; + color: #2A4CDF; +} + +.md-header[data-md-state=shadow] { + box-shadow: 0px 2px 4px -1px rgb(0 0 0 / 20%), 0px 4px 5px 0px rgb(0 0 0 / 14%), 0px 1px 10px 0px rgb(0 0 0 / 12%); + transition: box-shadow 200ms linear; +} + +.md-header__inner { + height: 80px; +} + +.md-header__topic { + font-size: 24px; +} + +.md-footer { + background-color: #2A4CDF; +} + +.md-search__form:hover { + background-color: rgba(0,0,0,.13); +} + +.md-typeset h1 { + color: black; + font-weight: 700; +} + +.youtube { + position: relative; + width: 100%; + height: 0; + padding-bottom: 56.25%; +} + +.youtube iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.home-grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-column-gap: 24px; + row-gap: 24px; +} + +.home-grid div { + border-radius: 4px; + padding: 24px; + background-color: #f3e9d9; +} + +.home-grid h3 { + margin-top: 0; + font-weight: 700; +} \ No newline at end of file diff --git a/docs/tutorial/converting-data-to-nexus.md b/docs/tutorial/converting-data-to-nexus.md new file mode 100644 index 000000000..4ae9b74cf --- /dev/null +++ b/docs/tutorial/converting-data-to-nexus.md @@ -0,0 +1,63 @@ +# Converting research data to NeXus + +## Who is this tutorial for? + +The document is for people who want to standardize their research data by converting their research data into +a NeXus standardized format. +We cover the basic principles and common principles of NeXus, here. +For a more detailed description on the general principles of NeXus we recommend reading our +[learning page for NeXus](../learn/nexus-primer.md) or the [official NeXus user manual](https://manual.nexusformat.org/user_manual.html). + +## What should you should know before this tutorial? + +- You should have a basic understanding of NeXus - [A primer on NeXus](../learn/nexus-primer.md) +- You should have a basic understanding of [FAIR data](https://www.nature.com/articles/sdata201618) + +## What you will know at the end of this tutorial? + +You will have + +- a basic understanding how to use the NeXus data converter from the pynxtools package + +## Setup + +We use a Python tool to make converting our research data easier. This has a number of [readers](https://github.com/FAIRmat-NFDI/pynxtools/tree/master/pynxtools/dataconverter/readers) that support multiple file formats. You can browse the separate folders to find the reader that might work for you. A generic reader is the [JSON Map Reader](https://github.com/FAIRmat-NFDI/pynxtools/tree/master/pynxtools/dataconverter/readers/json_map). + +We will use the [XPS Reader](https://github.com/FAIRmat-NFDI/pynxtools/tree/master/pynxtools/dataconverter/readers/xps) with a [SpecsLabProdigy](https://www.specs-group.com/nc/specs/products/detail/prodigy/) file (.sle) as an example. + +#### Steps + +1. Download the example files from here: [Example files](https://download-directory.github.io/?url=https%3A%2F%2Fgithub.com%2FFAIRmat-NFDI%2Fpynxtools%2Ftree%2Fdocumentation%2Fexamples%2Fxps) +2. **Extract** the zip and copy the files in your current working directory. You can find the working directory by typing the following in your terminal: +```console +pwd +``` +3. Install [pynxtools](https://github.com/FAIRmat-NFDI/pynxtools/tree/master?tab=readme-ov-file#installation) +```console +pip install git+https://github.com/FAIRmat-NFDI/pynxtools.git +``` +4. Verify you can run the ```dataconverter``` in a terminal window. Open a terminal with the Python environment where you installed ```pynxtools```. Then type the following: +```console +dataconverter --help +``` + +## Converting the example files + +Once you have your files copied into the working directory. Your directory structure should look like this: +``` +├── README.md +├── EX439_S718_Au.sle +├── params.yaml +└── eln_data_sle.yaml +``` + +Next, you will run the conversion routine from your Python environment: +```console +dataconverter --params-file params.yaml +``` + +Here we use a params.yaml parameter file to configure the converter. You can try out [other examples from pynxtools](https://github.com/FAIRmat-NFDI/pynxtools/tree/documentation/examples) + +This will create a file called ```Au_25_mbar_O2_no_align.nxs``` in your current directory. + +**Congrats! You now have a FAIR NeXus file!** diff --git a/docs/tutorial/media/create-new-upload.gif b/docs/tutorial/media/create-new-upload.gif new file mode 100644 index 000000000..6807834b6 Binary files /dev/null and b/docs/tutorial/media/create-new-upload.gif differ diff --git a/docs/tutorial/media/data-tab.gif b/docs/tutorial/media/data-tab.gif new file mode 100644 index 000000000..30f2228d5 Binary files /dev/null and b/docs/tutorial/media/data-tab.gif differ diff --git a/docs/tutorial/media/go-to-entry-page.gif b/docs/tutorial/media/go-to-entry-page.gif new file mode 100644 index 000000000..090261eed Binary files /dev/null and b/docs/tutorial/media/go-to-entry-page.gif differ diff --git a/docs/tutorial/media/login-register.gif b/docs/tutorial/media/login-register.gif new file mode 100644 index 000000000..f0721044a Binary files /dev/null and b/docs/tutorial/media/login-register.gif differ diff --git a/docs/tutorial/media/nexus-file-processed.png b/docs/tutorial/media/nexus-file-processed.png new file mode 100644 index 000000000..857c8eea4 Binary files /dev/null and b/docs/tutorial/media/nexus-file-processed.png differ diff --git a/docs/tutorial/media/overview.png b/docs/tutorial/media/overview.png new file mode 100644 index 000000000..d2ba88526 Binary files /dev/null and b/docs/tutorial/media/overview.png differ diff --git a/docs/tutorial/media/upload-file.gif b/docs/tutorial/media/upload-file.gif new file mode 100644 index 000000000..7866b2c0c Binary files /dev/null and b/docs/tutorial/media/upload-file.gif differ diff --git a/docs/tutorial/media/upload-processing.gif b/docs/tutorial/media/upload-processing.gif new file mode 100644 index 000000000..a5750c321 Binary files /dev/null and b/docs/tutorial/media/upload-processing.gif differ diff --git a/docs/tutorial/media/uploads.gif b/docs/tutorial/media/uploads.gif new file mode 100644 index 000000000..01cb63720 Binary files /dev/null and b/docs/tutorial/media/uploads.gif differ diff --git a/docs/tutorial/nexus-to-nomad.md b/docs/tutorial/nexus-to-nomad.md new file mode 100644 index 000000000..8c06703f2 --- /dev/null +++ b/docs/tutorial/nexus-to-nomad.md @@ -0,0 +1,62 @@ +# Uploading NeXus files to NOMAD + +Great choice! [Nomad](https://nomad-lab.eu/nomad-lab/tutorials.html) makes it easier than ever to work with your research data. At this point you are probably have an idea of what [FAIR data](https://www.nature.com/articles/sdata201618) is. Even if you don't, it doesn't matter. Nomad provides a simple graphical interface that let's you collect and have your data ready for publication. + +In this tutorial, we will go through how one can upload their NeXus files to Nomad. + +Nomad, as a FAIR data platform, supports NeXus and allows users to upload their NeXus (.nxs) files directly. These files get interpreted and added to your Nomad account with complete control on how you would like to present and publish them alongside your research. + +## Create an account + +The very first thing you need to do is get a Nomad account. +If you don't have one you can register [here](https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/login-actions/registration?client_id=nomad_public&tab_id=eWM6kat9MPc). + +1. Navigate to [nomad-lab.eu](https://nomad-lab.eu/prod/v1/gui/about/information) +2. Click on ```Login / Register``` on the top right corner. + + + +## Create an Upload + +Nomad allows you to have a draft working space called an **upload**. This allows you to test and prepare how your data will look in Nomad before you publish it. + +Go to ```Publish -> Uploads``` + + + +
+ +Click ```Create a new upload``` + + + +## Upload your NeXus file + +Now we can upload your FAIR NeXus file and let Nomad interpret it for us. + +Click the ```Drop files here...``` button and choose your NeXus file from your device. + + +Once Nomad has interpreted your data, this is what your screen will look like. + + + +## Browsing your NeXus data + +You can find the Nomad interpretation of your data under entries. If you click on this arrow, you will be able to see an Overview of your NeXus file. + + + +
+ +On the Overview page you will be presented with ```H5Web``` that let's you browse the data in your ```NeXus``` file directly. + + + +
+ +Nomad also interprets and ```normalizes``` this data to make it interoperable with other corners of Material's research. To browse this ```normalized``` data you can browse the ```DATA``` tab. Here you see all the information Nomad has picked up and made available for search and comparison with synthesis, experimental, and computational materials data. + + + +Feel free to explore more! diff --git a/examples/xps/EX439_S718_Au.sle b/examples/xps/EX439_S718_Au.sle new file mode 100644 index 000000000..2dc4a411d Binary files /dev/null and b/examples/xps/EX439_S718_Au.sle differ diff --git a/examples/xps/README.md b/examples/xps/README.md new file mode 100644 index 000000000..2ffe911d8 --- /dev/null +++ b/examples/xps/README.md @@ -0,0 +1,22 @@ +# XPS Reader + +## What is this reader? + +This reader supports converting X-ray photoelectron spectroscopy into a NeXus formatted file. The application definiton it follows is [NXmpes](https://fairmat-nfdi.github.io/nexus_definitions/classes/contributed_definitions/NXmpes.html#nxmpes). + +## Supported file formats +The reader decides which parser to use based on the file extension of the files provided. For the main XPS files, the following file extensions are supported: +- .sle: [SpecsLabProdigy](https://www.specs-group.com/nc/specs/products/detail/prodigy/) files, propietary format of SPECS GmbH (v1.6) +- .xml: SpecsLab 2files, XML format from SPECS GmbH (v1.6) +- .vms: VAMAS files, ISO standard data transfer format ([ISO 14976](https://www.iso.org/standard/24269.html)), both in regular and irregular format +- .xy: SpecsLabProdigy export format in XY format (including all export settings) +- .txt: + - exported by [Scienta Omicron](https://scientaomicron.com/en) instruments + - exported by [CasaXPS](https://www.casaxps.com/) analysis software + +```console +user@box:~$ dataconverter --params-file params.yaml +``` + +## Contact person in FAIRmat for this reader +Lukas Pielsticker \ No newline at end of file diff --git a/examples/xps/eln_data_sle.yaml b/examples/xps/eln_data_sle.yaml new file mode 100644 index 000000000..53656c001 --- /dev/null +++ b/examples/xps/eln_data_sle.yaml @@ -0,0 +1,165 @@ +definition: + value: NXmpes + version: 1.0 +title: EX439_S718_Au in 25 mbar O2 +start_time: 2022-04-08T11:47:02.0200Z +end_time: 2022-04-08T14:52:26.0400Z +entry_identifier: EX439 +experiment_institution: Max Planck Institute for Chemical Energy Conversion +experiment_facility: Surface and Interface Analysis Group +experiment_laboratory: Near-Ambient Pressure XPS Lab +program_name: SpecsLabProdigy +user: + name: Lukas Pielsticker + affiliation: Max Planck Institute for Chemical Energy Conversion + address: Lukas Pielsticker + orcid: 0000-0001-9361-8333 + email: lukas.pielsticker@cec.mpg.de +Instrument: + device_information: + vendor: SPECS GmbH + model: Custom NAP-XPS instrument + identifier: null + energy_resolution: + type: calibrated + resolution: + value: 0.2 + unit: eV + source_probe: + type: Fixed Tube X-ray + probe: photon + device_information: + vendor: SPECS GmbH + model: µFOCUS 500 + identifier: null + beam_probe: + distance: + value: 0.0 + unit: mm + Electronanalyser: + description: hemispherical + device_information: + vendor: SPECS GmbH + model: PHOIBOS 150 NAP + identifier: null + Collectioncolumn: + scheme: angular dispersive + device_information: + vendor: SPECS GmbH + model: PHOIBOS 150 NAP + identifier: null + Energydispersion: + scheme: hemispherical + diameter: + unit: mm + value: 150 + device_information: + vendor: SPECS GmbH + model: PHOIBOS 150 + identifier: null + Detector: + amplifier_type: channeltron + detector_type: Multi-anode + device_information: + vendor: Surface Concept GmbH + model: 1D-DLD detector + identifier: null + Manipulator: + device_information: + vendor: SPECS GmbH + model: 5-axis manipulator + identifier: null + temperature_sensor: + name: type K thermocouple + measurement: temperature + attached_to: sample + type: type K thermocouple + value: + value: 298.0 + unit: K + sample_heater: + name: Coherent Compact Evolution IR Diode LASER (DILAS) + physical_quantity: temperature + type: IR diode laser + heater_power: + value: 0.0 + unit: W + Pid: + setpoint: + value: 298.0 + unit: K + cryostat: + name: null + physical_quantity: null + type: null + Pid: + setpoint: null + drain_current_amperemeter: + name: Amperemeter 1.0 + measurement: current + type: wire + value: + value: 0.1 + unit: nA + sample_bias_voltmeter: + name: XPS sample voltmeter + measurement: voltage + attached_to: sample + type: oscilloscope + value: + value: 0.0 + unit: V + sample_bias_potentiostat: + name: XPS sample potentiostat + physical_quantity: voltage + type: potentiostat + Pid: + setpoint: + value: 0.0 + unit: V + pressure_gauge: + name: Atmion + measurement: pressure + type: hot-filament ionization gauge + value: + value: 0.000000001 + unit: mbar + value_log: + value: + value: null + unit: null + flood_gun: + name: FG 22/35 + physical_quantity: current + type: low energy electron source + current: + value: 0.0 + unit: A + current_log: + value: + value: null + unit: null +Sample: + name: Polycristalline Au foil + sample_id: S718 + atom_types: Au + physical_form: foil + situation: vacuum + Substance: + name: Au + molecular_mass: + value: 196.96657 + unit: g/mol + cas_number: 7440-57-5 + molecular_formula_hill: Au + sample_history: + sample_preparation: + start_time: 2022-04-08T11:25:00.200Z + end_time: 2022-04-08T11:45:00.200Z + description: sputter cleaned with Ar ions for 20 min + method: Ar sputtering + PHYSICAL_PROCESS[sample_loading]: + start_time: 2022-04-08T11:02:00.0200Z + end_time: 2022-04-08T11:03:00.0200Z + description: loaded in the endstation and transferred to analysis chamber + method: vacuum transfer diff --git a/examples/xps/params.yaml b/examples/xps/params.yaml new file mode 100644 index 000000000..789e2730e --- /dev/null +++ b/examples/xps/params.yaml @@ -0,0 +1,8 @@ +dataconverter: + reader: xps + nxdl: NXmpes + input-file: + - EX439_S718_Au.sle + - eln_data_sle.yaml + remove_align: True + output: Au_25_mbar_O2_no_align.nxs \ No newline at end of file diff --git a/mkdocs-requirements.txt b/mkdocs-requirements.txt new file mode 100644 index 000000000..798f6c303 --- /dev/null +++ b/mkdocs-requirements.txt @@ -0,0 +1,4 @@ +mkdocs +mkdocs-material +mkdocs-material-extensions +mkdocs-macros-plugin \ No newline at end of file diff --git a/mkdocs.yaml b/mkdocs.yaml new file mode 100644 index 000000000..f02641f6a --- /dev/null +++ b/mkdocs.yaml @@ -0,0 +1,49 @@ +site_name: FAIRmat NeXus +site_description: | + The documentation the FAIRmat flavor of the NeXus definitions & pynxtools +site_author: The FAIRmat authors +nav: + - Home: index.md + - Tutorials: + - tutorial/converting-data-to-nexus.md + - tutorial/nexus-to-nomad.md + - How-tos: + - how-tos/using-multiple-appdefs.md + - how-tos/transformations.md + - Learn: + - learn/nexus-primer.md + - learn/multiple-appdefs.md + - Reference: + - reference/definitions.md +theme: + name: material + features: + - content.code.copy + - content.code.annotate +markdown_extensions: + - attr_list + - md_in_html + - admonition + - pymdownx.details + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - toc: + permalink: True + - pymdownx.arithmatex: + generic: true + - pymdownx.emoji + - pymdownx.extra + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format +use_directory_urls: false +plugins: + - search + - macros: + module_name: docs/macros +extra_css: + - stylesheets/extra.css \ No newline at end of file diff --git a/pynxtools/dataconverter/convert.py b/pynxtools/dataconverter/convert.py index a03a9e909..c3adaaa8a 100644 --- a/pynxtools/dataconverter/convert.py +++ b/pynxtools/dataconverter/convert.py @@ -34,6 +34,9 @@ from pynxtools.dataconverter.template import Template from pynxtools.nexus import nexus +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + if sys.version_info >= (3, 10): from importlib.metadata import entry_points else: @@ -48,12 +51,6 @@ def entry_points(group): return [] -logger = logging.getLogger(__name__) # pylint: disable=C0103 -UNDOCUMENTED = 9 -logger.setLevel(logging.INFO) -logger.addHandler(logging.StreamHandler(sys.stdout)) - - def get_reader(reader_name) -> BaseReader: """Helper function to get the reader object from it's given name""" path_prefix = ( @@ -146,7 +143,11 @@ def get_nxdl_root_and_path(nxdl: str): def transfer_data_into_template( - input_file, reader, nxdl_name, nxdl_root: Optional[ET.Element] = None, **kwargs + input_file, + reader, + nxdl_name, + nxdl_root: Optional[ET.Element] = None, + **kwargs, ): """Transfer parse and merged data from input experimental file, config file and eln. @@ -181,9 +182,8 @@ def transfer_data_into_template( bulletpoint = "\n\u2022 " logger.info( - "Using %s reader to convert the given files: %s ", - reader, - bulletpoint.join((" ", *input_file)), + f"Using {reader} reader to convert the given files:" + f" {bulletpoint.join((' ', *input_file))}" ) data_reader = get_reader(reader) @@ -201,7 +201,7 @@ def transfer_data_into_template( return data -# pylint: disable=too-many-arguments,too-many-locals +# pylint: disable=too-many-arguments,too-many-locals,W1203 def convert( input_file: Tuple[str, ...], reader: str, @@ -238,11 +238,10 @@ def convert( """ nxdl_root, nxdl_f_path = get_nxdl_root_and_path(nxdl) - if generate_template: template = Template() helpers.generate_template_from_nxdl(nxdl_root, template) - logger.info(template) + print(template) return data = transfer_data_into_template( @@ -252,26 +251,24 @@ def convert( nxdl_root=nxdl_root, **kwargs, ) - if undocumented: - logger.setLevel(UNDOCUMENTED) + if fair and data.undocumented.keys(): logger.warning( "There are undocumented paths in the template. This is not acceptable!" ) return + if undocumented: + for path in data.undocumented.keys(): + if "/@default" in path: + continue + logger.info( + f"NO DOCUMENTATION: The path, {path}, is being written but has no documentation." + ) - for path in data.undocumented.keys(): - if "/@default" in path: - continue - logger.log( - UNDOCUMENTED, - "The path, %s, is being written but has no documentation.", - path, - ) helpers.add_default_root_attributes(data=data, filename=os.path.basename(output)) Writer(data=data, nxdl_f_path=nxdl_f_path, output_path=output).write() - logger.info("The output file generated: %s", output) + logger.info(f"The output file generated: {output}.") def parse_params_file(params_file): @@ -347,6 +344,7 @@ def convert_cli( mapping: str, ): """The CLI entrypoint for the convert function""" + logger.addHandler(logging.StreamHandler()) if params_file: try: convert(**parse_params_file(params_file)) diff --git a/pynxtools/dataconverter/helpers.py b/pynxtools/dataconverter/helpers.py index b1b4b68b0..53ad30b23 100644 --- a/pynxtools/dataconverter/helpers.py +++ b/pynxtools/dataconverter/helpers.py @@ -39,6 +39,7 @@ logger.addHandler(logging.StreamHandler(sys.stdout)) logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) def is_a_lone_group(xml_element) -> bool: @@ -410,11 +411,20 @@ def is_valid_unit(unit: str, nx_category: str) -> bool: return ureg(unit).check(f"{nx_category}") -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 @@ -459,7 +469,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 @@ -513,11 +528,14 @@ def does_group_exist(path_to_group, data): return False +# pylint: disable=W1203 def ensure_all_required_fields_exist(template, data, nxdl_root): """Checks whether all the required fields are in the returned data object.""" for path in template["required"]: 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"]: @@ -526,18 +544,18 @@ def ensure_all_required_fields_exist(template, data, nxdl_root): if does_group_exist(opt_parent, data) and not does_group_exist( renamed_path, data ): - raise ValueError( + logger.warning( f"The required group, {path}, hasn't been supplied" - f" while its optional parent, {path}, is supplied." + f" while its optional parent, {opt_parent}, is supplied." ) continue if not does_group_exist(renamed_path, data): - raise ValueError(f"The required group, {path}, hasn't been supplied.") - continue + logger.warning(f"The required group, {path}, hasn't been supplied.") + continue if not is_path_in_data_dict or data[renamed_path] is None: - raise ValueError( + logger.warning( f"The data entry corresponding to {path} is required " - f"and hasn't been supplied by the reader." + f"and hasn't been supplied by the reader.", ) @@ -549,6 +567,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: @@ -613,7 +641,7 @@ def get_xml_node(nxdl_path: str) -> ET.Element: # otherwise we just pass it along if ( elem is not None - and elem.attrib["name"] == entry_name + and elem.attrib.get("name") == entry_name and remove_namespace_from_tag(elem.tag) in ("field", "attribute") ): check_optionality_based_on_parent_group( @@ -693,11 +721,8 @@ def add_default_root_attributes(data, filename): def update_and_warn(key: str, value: str): if key in data and data[key] != value: logger.warning( - "The NXroot entry '%s' (value: %s) should not be populated by the reader. " - "This is overwritten by the actually used value '%s'", - key, - data[key], - value, + f"The NXroot entry '{key}' (value: {data[key]}) should not be populated by " + f"the reader. This is overwritten by the actually used value '{value}'" ) data[key] = value 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..1eecc99ef 100644 --- a/pynxtools/dataconverter/readers/utils.py +++ b/pynxtools/dataconverter/readers/utils.py @@ -16,11 +16,14 @@ # 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 pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union + import yaml logger = logging.getLogger(__name__) @@ -197,7 +200,84 @@ def parse_yml( ) -def parse_json(file_path: str) -> Dict[str, Any]: +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: Union[str, Path]) -> Dict[str, Any]: """Parses a metadata json file into a dictionary. Args: @@ -210,6 +290,21 @@ def parse_json(file_path: str) -> Dict[str, Any]: return json.load(file) +def parse_flatten_json(file_path: Union[str, Path]) -> Dict[str, Any]: + """ + Parses a metadata json file into a dictionary and + flattens it into a flat dictionary of absolute paths. + + Args: + file_path (Union[str, Path]): 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/dataconverter/readers/xps/config/config_sle_specs.json b/pynxtools/dataconverter/readers/xps/config/config_sle_specs.json index 39ddb7d2a..06d406c17 100644 --- a/pynxtools/dataconverter/readers/xps/config/config_sle_specs.json +++ b/pynxtools/dataconverter/readers/xps/config/config_sle_specs.json @@ -1,109 +1,321 @@ { - "/ENTRY[entry]/DATA[data]/@signal": "", - "/ENTRY[entry]/DATA[data]/data": "@data:cycle", - "/ENTRY[entry]/DATA[data]/data/@units": "CPS", - "/ENTRY[entry]/DATA[data]/energy": "@data:energy", - "/ENTRY[entry]/DATA[data]/energy/@type": "binding energy", - "/ENTRY[entry]/DATA[data]/energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@xps_token:beam/excitation_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "@xps_token:collectioncolumn/lens_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/transmission_function": "@xps_token:collectioncolumn/transmission_function/data", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/transmission_function/@units": "", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/transmission_function/@file": "@xps_token:collectioncolumn/transmission_function/file", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[L1]/name": "Lens 1", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[L1]/voltage": "@xps_token:collectioncolumn/lens1_voltage", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[L1]/voltage/@units": "@xps_token:collectioncolumn/lens1_voltage/@units", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[L2]/name": "Lens 2", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[L2]/voltage": "@xps_token:collectioncolumn/lens2_voltage", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[L2]/voltage/@units": "@xps_token:collectioncolumn/lens2_voltage/@units", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[coil]/name": "Coil", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[coil]/current": "@xps_token:collectioncolumn/coil_current", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[coil]/current/@units": "@xps_token:collectioncolumn/coil_current/@units", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Pre Defl X]/name": "Pre-Deflector X", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Pre Defl X]/current": "@xps_token:collectioncolumn/pre_deflector_x_current", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Pre Defl X]/current/@units": "@xps_token:collectioncolumn/pre_deflector_x_current/@units", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Pre Defl Y]/name": "Pre-Deflector Y", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Pre Defl Y]/current": "@xps_token:collectioncolumn/pre_deflector_y_current", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Pre Defl Y]/current/@units": "@xps_token:collectioncolumn/pre_deflector_y_current/@units", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Focus Displacement 1]/name": "Focus Displacement", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Focus Displacement 1]/current": "@xps_token:collectioncolumn/focus_displacement_current", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/LENS_EM[Focus Displacement 1]/current/@units": "@xps_token:collectioncolumn/focus_displacement_current/@units", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "@detector_data:cycles/Cycle_", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "counts", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "channeltron", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "DLD", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "@xps_token:energydispersion/scan_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/entrance_slit": "@xps_token:energydispersion/entrance_slit", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/exit_slit": "@xps_token:energydispersion/exit_slit", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/iris": "@xps_token:energydispersion/iris_diameter", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/analyzer_radius": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/analyzer_radius/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@xps_token:energydispersion/pass_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/name": "@xps_token:analyser/name", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "@xps_token:source/name", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function": "@xps_token:instrument/workfunction", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/manufacturer": "SPECS GmbH", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": true, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibration_file": "@xps_token:detector/calibration_file", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@data:energy", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/intensity_calibration/applied": true, - "/ENTRY[entry]/PROCESS[process]/intensity_calibration/transmission_function": "@xps_token:collectioncolumn/transmission_function/data", - "/ENTRY[entry]/PROCESS[process]/intensity_calibration/transmission_function/@units": "", - "/ENTRY[entry]/PROCESS[process]/intensity_calibration/transmission_function/@file": "@xps_token:collectioncolumn/transmission_function/file", - "/ENTRY[entry]/SAMPLE[sample]/bias": "None", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "None", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/name": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "None", - "/ENTRY[entry]/SAMPLE[sample]/situation": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "@eln", - "/ENTRY[entry]/USER[user]/address": "@eln", - "/ENTRY[entry]/USER[user]/affiliation": "@eln", - "/ENTRY[entry]/USER[user]/email": "@eln", - "/ENTRY[entry]/USER[user]/name": "@eln", - "/ENTRY[entry]/USER[user]/orcid": "@eln", - "/ENTRY[entry]/definition": "@eln", - "/ENTRY[entry]/definition/@version": "@eln", - "/ENTRY[entry]/end_time": "@eln", - "/ENTRY[entry]/start_time": "@eln", - "/ENTRY[entry]/title": "@eln" -} + "/@default":"entry", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"@eln", + "definition/@version":"@eln", + "title":"@eln", + "start_time":"@eln", + "end_time":"@eln", + "experiment_institution":"@eln", + "experiment_facility":"@eln", + "experiment_laboratory":"@eln", + "entry_identifier":"@eln", + "duration":"None", + "duration/@units":"s", + "method":"@xps_token:region/analysis_method", + "program_name":"@eln" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"@eln", + "affiliation":"@eln", + "address":"@eln", + "orcid":"@eln", + "email":"@eln" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"@eln", + "resolution":"@eln", + "resolution/@units":"@eln" + }, + "source_TYPE[source_probe]":{ + "type":"@eln", + "name":"@xps_token:source/name", + "probe":"@eln", + "current":"@xps_token:source/emission_current", + "current/@units":"@xps_token:source/emission_current/@units", + "voltage":"@xps_token:source/source_voltage", + "voltage/@units":"@xps_token:source/source_voltage/@units", + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "associated_beam":"@link:/entry/instrument/beam_probe" + }, + "beam_TYPE[beam_probe]":{ + "distance":"@eln", + "distance/@units":"@eln", + "incident_energy":"@xps_token:beam/excitation_energy", + "incident_energy/@units":"@xps_token:beam/excitation_energy/@units", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"@link:/entry/instrument/source_probe" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "detector0", + "name":"@xps_token:analyser/name", + "description":"@eln", + "voltage_energy_range":"@xps_token:analyser/voltage_energy_range", + "voltage_energy_range/@units":"@xps_token:analyser/voltage_energy_range/@units", + "work_function":"@xps_token:analyser/work_function", + "work_function/@units":"@xps_token:analyser/work_function/@units", + "fast_axes":"None", + "slow_axes":"energy", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"estimated", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"@xps_token:data/step_size/@units" + }, + "transmission_function":{ + "@default":"relative_intensity", + "@signal":"relative_intensity", + "@axes":["kinetic_energy"], + "kinetic_energy":"@xps_token:transmission_function/kinetic_energy", + "kinetic_energy/@units":"@xps_token:transmission_function/kinetic_energy/@units", + "relative_intensity":"@xps_token:collectioncolumn/transmission_function/relative_intensity" + }, + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"@eln", + "lens_mode":"@xps_token:collectioncolumn/lens_mode", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "iris":{ + "size":"@xps_token:collectioncolumn/iris_diameter", + "size/@units":"@xps_token:collectioncolumn/iris_diameter/@units" + }, + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "LENS_EM[L1]":{ + "name":"Lens 1", + "voltage":"@xps_token:collectioncolumn/lens1_voltage", + "voltage/@units":"@xps_token:collectioncolumn/lens1_voltage/@units" + }, + "LENS_EM[L2]":{ + "name":"Lens 2", + "voltage":"@xps_token:collectioncolumn/lens2_voltage", + "voltage/@units":"@xps_token:collectioncolumn/lens2_voltage/@units" + }, + "LENS_EM[coil]":{ + "name":"Coil", + "current":"@xps_token:collectioncolumn/coil_current", + "current/@units":"@xps_token:collectioncolumn/coil_current/@units" + }, + "LENS_EM[Pre Defl X]":{ + "name":"Pre-Deflector X", + "current":"@xps_token:collectioncolumn/pre_deflector_x_current", + "current/@units":"@xps_token:collectioncolumn/pre_deflector_x_current/@units" + }, + "LENS_EM[Pre Defl Y]":{ + "name":"Pre-Deflector Y", + "current":"@xps_token:collectioncolumn/pre_deflector_y_current", + "current/@units":"@xps_token:collectioncolumn/pre_deflector_y_current/@units" + }, + "LENS_EM[Focus Displacement]":{ + "name":"Focus Displacement", + "current":"@xps_token:collectioncolumn/focus_displacement_current", + "current/@units":"@xps_token:collectioncolumn/focus_displacement_current/@units" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"@eln", + "pass_energy":"@xps_token:energydispersion/pass_energy", + "pass_energy/@units":"@xps_token:energydispersion/pass_energy/@units", + "energy_scan_mode":"@xps_token:energydispersion/scan_mode", + "entrance_slit/description":"@xps_token:energydispersion/entrance_slit", + "exit_slit/description":"@xps_token:energydispersion/exit_slit", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "diameter":"@eln", + "diameter/@units":"@eln" + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"@eln", + "detector_type":"@eln", + "detector_voltage":"@xps_token:detector/detector_voltage", + "detector_voltage/@units":"@xps_token:detector/detector_voltage/@units", + "amplifier_bias":"@xps_token:detector/bias_voltage_electrons", + "amplifier_bias/@units":"@xps_token:detector/bias_voltage_electrons/@units", + "count_time":"@xps_token:detector/dwell_time", + "count_time/@units":"@xps_token:detector/dwell_time/@units", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "raw_data":{ + "@signal":"raw", + "@default":"raw", + "raw":"@detector_data:cycles/Cycle_", + "raw/@units":"@xps_token:detector/raw_data/raw/@units" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "temperature_sensor":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "attached_to":"@eln", + "value":"@eln" + }, + "sample_heater":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "heater_power":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_potentiostat":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "PID[pid]/setpoint":"@eln" + } + }, + "pressure_gauge":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln", + "value_log/value":"@eln" + }, + "flood_gun":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "current":"@eln", + "current_log/value":"@eln" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "energy_calibration":{ + "calibrated_axis":"@xps_token:process/energy_calibration/energy", + "calibrated_axis/@units":"@xps_token:process/energy_calibration/energy/@units", + "calibration_object":{ + "type":"file", + "path":"@xps_token:process/energy_calibration/calibration_file/path" + } + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + }, + "transmission_correction":{ + "transmission_function":"@link:/entry/instrument/electronanalyser/transmission_function", + "calibration_object":{ + "type":"file", + "path":"@xps_token:process/transmission_correction/transmission_function/file" + } + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"@eln", + "sample_id":"@eln", + "atom_types":"@eln", + "physical_form":"@eln", + "situation":"@eln", + "SUBSTANCE[substance]":{ + "name":"@eln", + "molecular_mass":"@eln", + "cas_number":"@eln", + "molecular_formula_hill":"@eln" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + }, + "PHYSICAL_PROCESS[sample_loading]":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + } + }, + "temperature":{ + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor", + "sample_heater":"@link:/entry/instrument/manipulator/sample_heater", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"@link:/entry/instrument/pressure_gauge" + }, + "bias":{ + "potentiostat":"@link:/entry/instrument/manipulator/sample_bias_potentiostat", + "voltmeter":"@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "drain_current":{ + "amperemeter":"@link:/entry/instrument/manipulator/drain_current_amperemeter" + }, + "flood_gun_current":{ + "flood_gun":"@link:/entry/instrument/flood_gun" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"@data:cycle", + "data/@units":"@xps_token:data/intensity/@units", + "energy":"@link:/entry/process/energy_calibration/calibrated_axis", + "energy/@type":"@xps_token:data/energy/@type", + "energy/@units":"@xps_token:data/energy/@units", + "@energy_indices":"None", + "@energy_depends":"None" + } +} \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/config/config_specs_xy.json b/pynxtools/dataconverter/readers/xps/config/config_specs_xy.json index 19f9c95b0..814ed84d3 100644 --- a/pynxtools/dataconverter/readers/xps/config/config_specs_xy.json +++ b/pynxtools/dataconverter/readers/xps/config/config_specs_xy.json @@ -1,85 +1,286 @@ -{ - "/ENTRY[entry]/DATA[data]/@signal": "", - "/ENTRY[entry]/DATA[data]/data": "@data:cycle", - "/ENTRY[entry]/DATA[data]/data/@units": "@xps_token:data/y_units", - "/ENTRY[entry]/DATA[data]/energy": "@data:energy", - "/ENTRY[entry]/DATA[data]/energy/@type": "@xps_token:data/x_units", - "/ENTRY[entry]/DATA[data]/energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@xps_token:beam/excitation_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "@xps_token:collectioncolumn/lens_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "raw", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "@detector_data:cycles/Cycle_", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "counts", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time": "@xps_token:region/dwell_time", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time/@units": "s", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_voltage": "@xps_token:detector/detector_voltage", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "@xps_token:energydispersion/scan_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/entrance_slit": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/exit_slit": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@xps_token:energydispersion/pass_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/name": "@xps_token:analyser/analyser_name", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/target_bias/": "@xps_token:analyser/target_bias", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/target_bias/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "@xps_token:source/source_label", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "photon", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/": "@xps_token:instrument/work_function", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": "@eln", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@data:energy", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": false, - "/ENTRY[entry]/SAMPLE[sample]/bias": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "V", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/name": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/situation": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "@eln", - "/ENTRY[entry]/USER[user]/address": "@eln", - "/ENTRY[entry]/USER[user]/affiliation": "@eln", - "/ENTRY[entry]/USER[user]/email": "@eln", - "/ENTRY[entry]/USER[user]/name": "@eln", - "/ENTRY[entry]/USER[user]/orcid": "@eln", - "/ENTRY[entry]/method": "@xps_token:region/analysis_method", - "/ENTRY[entry]/definition": "@eln", - "/ENTRY[entry]/definition/@version": "@eln", - "/ENTRY[entry]/start_time": "@eln", - "/ENTRY[entry]/title": "@eln" -} +{ + "/@default":"None", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"@eln", + "definition/@version":"@eln", + "title":"@eln", + "start_time":"@xps_token:time_stamp", + "end_time":"@eln", + "method":"@xps_token:region/analysis_method", + "experiment_institution":"@eln", + "experiment_facility":"@eln", + "experiment_laboratory":"@eln", + "entry_identifier":"@eln", + "data_file": "@xps_token:file_info/data_file", + "sequence_file": "@xps_token:file_info/sequence_file" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"@eln", + "affiliation":"@eln", + "address":"@eln", + "orcid":"@eln", + "email":"@eln" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "device_information":{ + "vendor":"None", + "identifier":"None", + "model":"None" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"derived", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"eV" + }, + "source_TYPE[source_probe]":{ + "type":"@eln", + "name": "@xps_token:source/source_label", + "probe":"photon", + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "associated_beam":"@link:/entry/instrument/beam_probe" + }, + "beam_TYPE[beam_probe]":{ + "distance":"@eln", + "distance/@units":"@eln", + "incident_energy":"@xps_token:beam/excitation_energy", + "incident_energy/@units":"eV", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"@link:/entry/instrument/source_probe" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "None", + "description":"@eln", + "name": "@eln", + "work_function":"@eln", + "work_function/@units":"@eln", + "fast_axes":"None", + "slow_axes":"energy", + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"@xps_token:data/step_size", + "resolution":"eV" + }, + "transmission_function":"None", + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"@eln", + "lens_mode":"@xps_token:collectioncolumn/lens_mode", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "iris":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"@eln", + "pass_energy":"@xps_token:energydispersion/pass_energy", + "pass_energy/@units":"eV", + "energy_scan_mode":"@xps_token:energydispersion/acquisition_mode", + "entrance_slit":{ + "description":"@eln", + "shape":"@eln", + "size":"@eln", + "size/@units": "@eln" + }, + "exit_slit":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"@eln", + "count_time": "@xps_token:region/dwell_time", + "count_time/@units": "@xps_token:region/dwell_time/time", + "detector_type":"@eln", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "raw_data":{ + "@signal":"None", + "@default":"raw", + "raw":"@detector_data:cycles/Cycle_", + "raw/@units":"counts" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "temperature_sensor":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "attached_to":"@eln", + "value":"@eln" + }, + "sample_heater":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "heater_power":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_potentiostat":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "POSITIONER[positioner_x]":{ + "value": "@eln", + "value/@units": "@eln" + }, + "POSITIONER[positioner_y]":{ + "value": "@eln", + "value/@units": "@eln" + }, + "POSITIONER[positioner_z]":{ + "value": "@eln", + "value/@units": "@eln" + }, + "POSITIONER[positioner_phi]":{ + "value": "@eln", + "value/@units": "@eln" + }, + }, + "pressure_gauge":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln", + "value_log/value":"@eln" + }, + "flood_gun":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "current":"@eln", + "current_log/value":"@eln" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "energy_calibration":{ + "calibrated_axis":"@data:energy", + "calibrated_axis/@units": "eV" + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + }, + "transmission_correction":{ + "transmission_function":{ + "@axes":"None", + "@signal":"None", + "kinetic_energy":"None", + "kinetic_energy/@units":"None", + "relative_intensity":"None" + } + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"@eln", + "sample_id":"@eln", + "atom_types":"@eln", + "physical_form":"@eln", + "situation":"@eln", + "SUBSTANCE[substance]":{ + "name":"@eln", + "molecular_mass":"@eln", + "cas_number":"@eln", + "molecular_formula_hill":"@eln" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + }, + "PHYSICAL_PROCESS[sample_loading]":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + } + }, + "temperature":{ + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor", + "sample_heater":"@link:/entry/instrument/manipulator/sample_heater", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"@link:/entry/instrument/pressure_gauge" + }, + "bias":{ + "potentiostat":"@link:/entry/instrument/manipulator/sample_bias_potentiostat", + "voltmeter":"@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "drain_current":{ + "amperemeter":"@link:/entry/instrument/manipulator/drain_current_amperemeter" + }, + "flood_gun_current":{ + "flood_gun":"@link:/entry/instrument/flood_gun" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"@data:cycle", + "data/@units":"@xps_token:data/y_units", + "energy":"@data:energy", + "energy/@units":"eV", + "energy/@typex":"@xps_token:data/x_units", + "@energy_indices":"None", + "@energy_depends":"None" + } + } \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/config/config_txt_scienta.json b/pynxtools/dataconverter/readers/xps/config/config_txt_scienta.json index 9c6fc6be9..7d7a63b4c 100644 --- a/pynxtools/dataconverter/readers/xps/config/config_txt_scienta.json +++ b/pynxtools/dataconverter/readers/xps/config/config_txt_scienta.json @@ -1,93 +1,282 @@ -{ - "/ENTRY[entry]/DATA[data]/@signal": "", - "/ENTRY[entry]/DATA[data]/data": "@data:cycle", - "/ENTRY[entry]/DATA[data]/data/@units": "CPS", - "/ENTRY[entry]/DATA[data]/energy": "@data:energy", - "/ENTRY[entry]/DATA[data]/energy/@type": "@xps_token:data/energy_type", - "/ENTRY[entry]/DATA[data]/energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@xps_token:beam/excitation_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "@xps_token:collectioncolumn/lens_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "raw", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "@detector_data:cycles/Cycle_", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "counts", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time": "@xps_token:region/dwell_time", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time/@units": "@xps_token:region/dwell_time/time", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "@xps_token:energydispersion/acquisition_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/APERTURE[entrance_slit]/description": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/APERTURE[entrance_slit]/shape": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/APERTURE[entrance_slit]/size": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/APERTURE[entrance_slit]/size/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@xps_token:energydispersion/pass_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/name": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_x]/value": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_x]/value/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_y]/value": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_y]/value/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_z]/value": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_z]/value/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_phi]/value": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/POSITIONER[positioner_phi]/value/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "photon", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/name": "@xps_token:instrument/instrument_name", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": "@eln", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@data:energy", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": false, - "/ENTRY[entry]/SAMPLE[sample]/bias": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "V", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/name": "@xps_token:sample/sample_name", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/situation": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "@eln", - "/ENTRY[entry]/USER[user]/address": "@eln", - "/ENTRY[entry]/USER[user]/affiliation": "@eln", - "/ENTRY[entry]/USER[user]/email": "@eln", - "/ENTRY[entry]/USER[user]/name": "@eln", - "/ENTRY[entry]/USER[user]/initials": "xps_token:user/user_initials", - "/ENTRY[entry]/USER[user]/orcid": "@eln", - "/ENTRY[entry]/method": "@eln", - "/ENTRY[entry]/sequence_file": "@xps_token:file_info/sequence_file", - "/ENTRY[entry]/data_file": "@xps_token:file_info/data_file", - "/ENTRY[entry]/definition": "@eln", - "/ENTRY[entry]/definition/@version": "@eln", - "/ENTRY[entry]/start_time": "@xps_token:time_stamp", - "/ENTRY[entry]/title": "@eln" -} \ No newline at end of file +{ + "/@default":"None", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"@eln", + "definition/@version":"@eln", + "title":"@eln", + "start_time":"@xps_token:time_stamp", + "end_time":"@eln", + "method":"@xps_token:region/analysis_method", + "experiment_institution":"@eln", + "experiment_facility":"@eln", + "experiment_laboratory":"@eln", + "entry_identifier":"@eln", + "data_file": "@xps_token:file_info/data_file", + "sequence_file": "@xps_token:file_info/sequence_file" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"@eln", + "affiliation":"@eln", + "address":"@eln", + "orcid":"@eln", + "email":"@eln", + "initials": "xps_token:user/user_initials" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "name": "@xps_token:instrument/instrument_name", + "device_information":{ + "vendor":"None", + "identifier":"None", + "model":"None" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"derived", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"eV" + }, + "source_TYPE[source_probe]":{ + "type":"@", + "name": "@eln", + "probe":"photon", + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "associated_beam":"@link:/entry/instrument/beam_probe" + }, + "beam_TYPE[beam_probe]":{ + "distance":"@eln", + "distance/@units":"@eln", + "incident_energy":"@xps_token:beam/excitation_energy", + "incident_energy/@units":"eV", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"@link:/entry/instrument/source_probe" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "None", + "description":"@eln", + "name": "@eln", + "work_function":"@eln", + "work_function/@units":"@eln", + "fast_axes":"None", + "slow_axes":"energy", + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"@xps_token:data/step_size", + "resolution":"eV" + }, + "transmission_function":"None", + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"@eln", + "lens_mode":"@xps_token:collectioncolumn/lens_mode", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "iris":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"@eln", + "pass_energy":"@xps_token:energydispersion/pass_energy", + "pass_energy/@units":"eV", + "energy_scan_mode":"@xps_token:energydispersion/acquisition_mode", + "entrance_slit":{ + "description":"@eln", + "shape":"@eln", + "size":"@eln", + "size/@units": "@eln" + }, + "exit_slit":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"@eln", + "count_time": "@xps_token:region/dwell_time", + "count_time/@units": "@xps_token:region/dwell_time/time", + "detector_type":"@eln", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "raw_data":{ + "@signal":"None", + "@default":"raw", + "raw":"@detector_data:cycles/Cycle_", + "raw/@units":"counts" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "temperature_sensor":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "attached_to":"@eln", + "value":"@eln" + }, + "sample_heater":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "heater_power":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_potentiostat":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "POSITIONER[positioner_x]":{ + "value": "@eln", + "value/@units": "@eln" + }, + "POSITIONER[positioner_y]":{ + "value": "@eln", + "value/@units": "@eln" + }, + "POSITIONER[positioner_z]":{ + "value": "@eln", + "value/@units": "@eln" + }, + "POSITIONER[positioner_phi]":{ + "value": "@eln", + "value/@units": "@eln" + } + }, + "pressure_gauge":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln", + "value_log/value":"@eln" + }, + "flood_gun":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "current":"@eln", + "current_log/value":"@eln" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "energy_calibration":{ + "calibrated_axis":"@data:energy", + "calibrated_axis/@units": "eV" + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + }, + "transmission_correction":{ + "transmission_function":{ + "@axes":"None", + "@signal":"None", + "kinetic_energy":"None", + "kinetic_energy/@units":"None", + "relative_intensity":"None" + } + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"@xps_token:sample/sample_name", + "sample_id":"@eln", + "atom_types":"@eln", + "physical_form":"@eln", + "situation":"@eln", + "SUBSTANCE[substance]":{ + "name":"@eln", + "molecular_mass":"@eln", + "cas_number":"@eln", + "molecular_formula_hill":"@eln" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + } + }, + "temperature":{ + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor", + "sample_heater":"@link:/entry/instrument/manipulator/sample_heater", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"@link:/entry/instrument/pressure_gauge" + }, + "bias":{ + "potentiostat":"@link:/entry/instrument/manipulator/sample_bias_potentiostat", + "voltmeter":"@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "drain_current":{ + "amperemeter":"@link:/entry/instrument/manipulator/drain_current_amperemeter" + }, + "flood_gun_current":{ + "flood_gun":"@link:/entry/instrument/flood_gun" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"@data:cycle", + "data/@units":"counts_per_second", + "energy":"@data:energy", + "energy/@units":"eV", + "energy/@type":"@xps_token:data/energy_type", + "@energy_indices":"None", + "@energy_depends":"None" + } + } \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/config/config_txt_vamas_export.json b/pynxtools/dataconverter/readers/xps/config/config_txt_vamas_export.json index 9900402aa..6de354d50 100644 --- a/pynxtools/dataconverter/readers/xps/config/config_txt_vamas_export.json +++ b/pynxtools/dataconverter/readers/xps/config/config_txt_vamas_export.json @@ -1,81 +1,259 @@ { - "/ENTRY[entry]/DATA[data]/@signal": "", - "/ENTRY[entry]/DATA[data]/data": "@data:cycle", - "/ENTRY[entry]/DATA[data]/data/@units": "@xps_token:data/y_units", - "/ENTRY[entry]/DATA[data]/energy": "@data:energy", - "/ENTRY[entry]/DATA[data]/energy/@type": "@xps_token:data/x_units", - "/ENTRY[entry]/DATA[data]/energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@xps_token:beam/excitation_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "@xps_token:beam/excitation_energy/units", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "raw", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "@detector_data:cycles/Scan_", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "counts", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time": "@xps_token:region/dwell_time", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time/@units": "@xps_token:region/dwell_time/time", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/entrance_slit": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/exit_slit": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/name": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "photon", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": "@eln", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@data:energy", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": false, - "/ENTRY[entry]/SAMPLE[sample]/bias": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "V", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/name": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/situation": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "@eln", - "/ENTRY[entry]/USER[user]/address": "@eln", - "/ENTRY[entry]/USER[user]/affiliation": "@eln", - "/ENTRY[entry]/USER[user]/email": "@eln", - "/ENTRY[entry]/USER[user]/name": "@eln", - "/ENTRY[entry]/USER[user]/orcid": "@eln", - "/ENTRY[entry]/method": "@eln", - "/ENTRY[entry]/definition": "@eln", - "/ENTRY[entry]/definition/@version": "@eln", - "/ENTRY[entry]/start_time": "@eln", - "/ENTRY[entry]/title": "@eln" -} \ No newline at end of file + "/@default":"entry", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"@eln", + "definition/@version":"@eln", + "title":"@eln", + "start_time":"@eln", + "end_time":"@eln", + "experiment_institution":"@eln", + "experiment_facility":"@eln", + "experiment_laboratory":"@eln", + "entry_identifier":"@eln", + "duration":"@eln", + "duration/@units":"@eln", + "method":"@eln", + "program_name":"@eln" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"@eln", + "affiliation":"@eln", + "address":"@eln", + "orcid":"@eln", + "email":"@eln" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"@eln", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"@eln" + }, + "source_TYPE[source_probe]":{ + "type":"@eln", + "name":"@eln", + "probe":"photon", + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "associated_beam":"@link:/entry/instrument/beam_probe" + }, + "beam_TYPE[beam_probe]":{ + "distance":"@eln", + "distance/@units":"@eln", + "incident_energy":"@xps_token:beam/excitation_energy", + "incident_energy/@units":"@xps_token:beam/excitation_energy/units", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"@link:/entry/instrument/source_probe" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "None", + "name":"@eln", + "description":"@eln", + "work_function":"@eln", + "work_function/@units":"@eln", + "fast_axes":"None", + "slow_axes":"energy", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"@eln", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"@eln" + }, + "transmission_function":"None", + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"@eln", + "lens_mode":"@eln", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"@eln", + "pass_energy":"@eln", + "pass_energy/@units":"@eln", + "energy_scan_mode":"@eln", + "entrance_slit":"@eln", + "exit_slit":"@eln", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"@eln", + "detector_type":"@eln", + "count_time":"@xps_token:detector/dwell_time", + "count_time/@units":"@xps_token:detector/dwell_time/units", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "raw_data":{ + "@signal":"raw", + "@default":"raw", + "raw":"@detector_data:cycles/Scan_", + "raw/@units":"counts" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "temperature_sensor":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "attached_to":"@eln", + "value":"@eln" + }, + "sample_heater":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "heater_power":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_potentiostat":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "PID[pid]/setpoint":"@eln" + } + }, + "pressure_gauge":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln", + "value_log/value":"@eln" + }, + "flood_gun":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "current":"@eln", + "current_log/value":"@eln" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "energy_calibration":{ + "calibrated_axis":"@data:energy", + "calibrated_axis/@units":"eV" + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"@xps_token:parameters/Group", + "sample_id":"@eln", + "atom_types":"@eln", + "physical_form":"@eln", + "situation":"@eln", + "SUBSTANCE[substance]":{ + "name":"@eln", + "molecular_mass":"@eln", + "cas_number":"@eln", + "molecular_formula_hill":"@eln" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + }, + "PHYSICAL_PROCESS[sample_loading]":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + } + }, + "temperature":{ + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor", + "sample_heater":"@link:/entry/instrument/manipulator/sample_heater", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"@link:/entry/instrument/pressure_gauge" + }, + "bias":{ + "potentiostat":"@link:/entry/instrument/manipulator/sample_bias_potentiostat", + "voltmeter":"@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "drain_current":{ + "amperemeter":"@link:/entry/instrument/manipulator/drain_current_amperemeter" + }, + "flood_gun_current":{ + "flood_gun":"@link:/entry/instrument/flood_gun" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"@data:cycle", + "data/@units":"@xps_token:data/y_units", + "energy":"@link:/entry/process/energy_calibration/calibrated_axis", + "energy/@type":"@xps_token:data/x_units", + "energy/@units":"eV", + "@energy_indices":"None", + "@energy_depends":"None" + } + } + + \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/config/config_vms.json b/pynxtools/dataconverter/readers/xps/config/config_vms.json index 78dbe4ec9..fabe167d2 100644 --- a/pynxtools/dataconverter/readers/xps/config/config_vms.json +++ b/pynxtools/dataconverter/readers/xps/config/config_vms.json @@ -1,95 +1,289 @@ { - "/ENTRY[entry]/DATA[data]/@signal": "", - "/ENTRY[entry]/DATA[data]/data": "@data:cycle", - "/ENTRY[entry]/DATA[data]/data/@units": "@xps_token:data/y_units_1", - "/ENTRY[entry]/DATA[data]/energy": "@data:energy", - "/ENTRY[entry]/DATA[data]/energy/@type": "@xps_token:data/x_units_1", - "/ENTRY[entry]/DATA[data]/energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@xps_token:beam/excitation_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "@xps_token:collectioncolumn/lens_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "raw", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "@detector_data:cycles/Cycle_", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "counts", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time": "@xps_token:region/dwell_time", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time/@units": "s", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/signal_mode": "@xps_token:detector/signal_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_voltage": "@xps_token:detector/detector_voltage", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_voltage/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "@xps_token:energydispersion/scan_mode", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/entrance_slit": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/exit_slit": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@xps_token:energydispersion/pass_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/name": "@xps_token:analyser/analyser_name", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analyzer_take_off_azimuth/": "@xps_token:analyser/analyzer_take_off_azimuth", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analyzer_take_off_azimuth/@units": "degree", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analyzer_take_off_polar/": "@xps_token:analyser/analyzer_take_off_polar", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analyzer_take_off_polar/@units": "degree", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analysis_width_x/": "@xps_token:analyser/analysis_width_x", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analysis_width_x/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analysis_width_y/": "@xps_token:analyser/analysis_width_y", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/analysis_width_y/@units": "mm", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/target_bias/": "@xps_token:analyser/target_bias", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/target_bias/@units": "V", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "@xps_token:source/source_label", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "photon", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/source_analyzer_angle": "@xps_token:source/source_analyzer_angle", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/source_analyzer_angle/@units": "degree", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "@xps_token:data/step_size", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/": "@xps_token:instrument/work_function", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": "@eln", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@data:energy", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": false, - "/ENTRY[entry]/SAMPLE[sample]/bias": "@xps_token:sample/target_bias", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "V", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/name": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/situation": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "@eln", - "/ENTRY[entry]/USER[user]/address": "@eln", - "/ENTRY[entry]/USER[user]/affiliation": "@eln", - "/ENTRY[entry]/USER[user]/email": "@eln", - "/ENTRY[entry]/USER[user]/name": "@eln", - "/ENTRY[entry]/USER[user]/orcid": "@eln", - "/ENTRY[entry]/method": "@xps_token:region/analysis_method", - "/ENTRY[entry]/definition": "@eln", - "/ENTRY[entry]/definition/@version": "@eln", - "/ENTRY[entry]/start_time": "@xps_token:region/time_stamp", - "/ENTRY[entry]/title": "@eln" -} \ No newline at end of file + "/@default":"entry", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"@eln", + "definition/@version":"@eln", + "title":"@eln", + "start_time":"@xps_token:region/time_stamp", + "end_time":"@eln", + "experiment_institution":"@eln", + "experiment_facility":"@eln", + "experiment_laboratory":"@eln", + "entry_identifier":"@eln", + "duration":"None", + "duration/@units":"s", + "method":"@xps_token:region/analysis_method", + "program_name":"@eln" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"@eln", + "affiliation":"@eln", + "address":"@eln", + "orcid":"@eln", + "email":"@eln" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"derived", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"eV" + }, + "source_TYPE[source_probe]":{ + "type":"@eln", + "name":"@xps_token:source/source_label", + "probe":"photon", + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "associated_beam":"@link:/entry/instrument/beam_probe", + "source_analyzer_angle": "source_analyzer_angle", + "source_analyzer_angle/@units": "degree" + }, + "beam_TYPE[beam_probe]":{ + "distance":"@eln", + "distance/@units":"@eln", + "incident_energy":"@xps_token:beam/excitation_energy", + "incident_energy/@units":"eV", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"@link:/entry/instrument/source_probe" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "detector0", + "name":"@xps_token:analyser/analyser_name", + "description":"@eln", + "work_function":"@xps_token:analyser/work_function", + "work_function/@units":"eV", + "fast_axes":"None", + "slow_axes":"energy", + "analyzer_take_off_azimuth": "@xps_token:analyser/analyzer_take_off_azimuth", + "analyzer_take_off_azimuth/@units": "degree", + "analyzer_take_off_polar/": "@xps_token:analyser/analyzer_take_off_polar", + "analyzer_take_off_polar/@units": "degree", + "analysis_width_x": "@xps_token:analyser/analysis_width_x", + "analysis_width_x/@units": "mm", + "analysis_width_y": "@xps_token:analyser/analysis_width_y", + "analysis_width_y/@units": "mm", + "target_bias": "@xps_token:analyser/target_bias", + "target_bias/@units": "V", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"estimated", + "resolution":"@xps_token:data/step_size", + "resolution/@units":"eV" + }, + "transmission_function":{ + "@default":"relative_intensity", + "@signal":"relative_intensity", + "@axes":["kinetic_energy"], + "kinetic_energy":"@xps_token:transmission_function/kinetic_energy", + "kinetic_energy/@units":"@xps_token:transmission_function/kinetic_energy/@units", + "relative_intensity":"@xps_token:collectioncolumn/transmission_function/relative_intensity" + }, + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"@eln", + "lens_mode":"@xps_token:collectioncolumn/lens_mode", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"@eln", + "pass_energy":"@xps_token:energydispersion/pass_energy", + "pass_energy/@units":"@xps_token:energydispersion/pass_energy/@units", + "energy_scan_mode":"@xps_token:energydispersion/scan_mode", + "entrance_slit":"@eln", + "exit_slit":"@eln", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"@eln", + "detector_type":"@eln", + "detector_voltage": "@xps_token:detector/detector_voltage", + "detector_voltage/@units": "V", + "count_time":"@xps_token:detector/dwell_time", + "count_time/@units":"s", + "acquisition_mode": "@xps_token:detector/signal_mode", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "raw_data":{ + "@signal":"raw", + "@default":"raw", + "raw":"@detector_data:cycles/Cycle_", + "raw/@units":"counts" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "temperature_sensor":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "attached_to":"@eln", + "value":"@eln" + }, + "sample_heater":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "heater_power":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@xps_token:sample/target_bias", + "value/@units": "V" + }, + "sample_bias_potentiostat":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "PID[pid]/setpoint":"@eln" + } + }, + "pressure_gauge":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln", + "value_log/value":"@eln" + }, + "flood_gun":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "current":"@eln", + "current_log/value":"@eln" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "energy_calibration":{ + "calibrated_axis":"@data:energy", + "calibrated_axis/@units":"eV", + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + }, + "transmission_correction":{ + "transmission_function":{ + "@axes":"None", + "@signal":"None", + "kinetic_energy":"None", + "kinetic_energy/@units":"None", + "relative_intensity":"None" + } + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"@eln", + "sample_id":"@eln", + "atom_types":"@eln", + "physical_form":"@eln", + "situation":"@eln", + "SUBSTANCE[substance]":{ + "name":"@eln", + "molecular_mass":"@eln", + "cas_number":"@eln", + "molecular_formula_hill":"@eln" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + }, + "PHYSICAL_PROCESS[sample_loading]":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + } + }, + "temperature":{ + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor", + "sample_heater":"@link:/entry/instrument/manipulator/sample_heater", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"@link:/entry/instrument/pressure_gauge" + }, + "bias":{ + "potentiostat":"@link:/entry/instrument/manipulator/sample_bias_potentiostat", + "voltmeter":"@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "drain_current":{ + "amperemeter":"@link:/entry/instrument/manipulator/drain_current_amperemeter" + }, + "flood_gun_current":{ + "flood_gun":"@link:/entry/instrument/flood_gun" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"@data:cycle", + "data/@units":"@xps_token:data/y_units_1", + "energy": "@data:energy", + "energy/@type":"@xps_token:data/x_units_1", + "energy/@units":"eV", + "@energy_indices":"None", + "@energy_depends":"None" + } + } \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/config/config_xml_specs.json b/pynxtools/dataconverter/readers/xps/config/config_xml_specs.json index 9bee088c6..1bc5df069 100644 --- a/pynxtools/dataconverter/readers/xps/config/config_xml_specs.json +++ b/pynxtools/dataconverter/readers/xps/config/config_xml_specs.json @@ -1,73 +1,249 @@ { - "/ENTRY[entry]/DATA[data]/@signal": "data", - "/ENTRY[entry]/DATA[data]/data": "@data:cycles/Cycle_", - "/ENTRY[entry]/DATA[data]/data/@units": "counts", - "/ENTRY[entry]/DATA[data]/binding_energy": "counts", - "/ENTRY[entry]/DATA[data]/binding_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "@xps_token:region/excitation_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "raw", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "@detector_data:cycles/Cycle_", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "counts", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "channeltron", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "@xps_token:region/scan_mode/name", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/entrance_slit": "@xps_token:region/analyzer_slit", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/exit_slit": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "@xps_token:region/pass_energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "@xps_token:analyzer_info/name", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "@xps_token:region/scan_delta", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "eV", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "energy", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "@xps_token:source_info/name", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "@eln", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "@xps_token:region/scan_delta", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": true, - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "@data:energy", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "eV", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": false, - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": false, - "/ENTRY[entry]/SAMPLE[sample]/bias": "None", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "None", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "None", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "None", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "None", - "/ENTRY[entry]/SAMPLE[sample]/name": "@xps_token:parameters/Group", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "None", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "None", - "/ENTRY[entry]/SAMPLE[sample]/situation": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "@eln", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "@eln", - "/ENTRY[entry]/USER[user]/address": "None", - "/ENTRY[entry]/USER[user]/affiliation": "None", - "/ENTRY[entry]/USER[user]/email": "@eln", - "/ENTRY[entry]/USER[user]/name": "@eln", - "/ENTRY[entry]/USER[user]/orcid": "None", - "/ENTRY[entry]/definition": "@eln", - "/ENTRY[entry]/definition/@version": "@eln", - "/ENTRY[entry]/start_time": "@eln", - "/ENTRY[entry]/title": "@eln" -} + "/@default":"entry", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"@eln", + "definition/@version":"@eln", + "title":"@eln", + "start_time":"@eln", + "end_time":"@eln", + "experiment_institution":"@eln", + "experiment_facility":"@eln", + "experiment_laboratory":"@eln", + "entry_identifier":"@eln", + "method":"@xps_token:region/analysis_method", + "program_name":"@eln" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"@eln", + "affiliation":"@eln", + "address":"@eln", + "orcid":"@eln", + "email":"@eln" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"@eln", + "resolution":"@xps_token:region/scan_delta", + "resolution/@units":"eV" + }, + "source_TYPE[source_probe]":{ + "type":"@eln", + "name":"@xps_token:source_info/name", + "probe":"@eln", + "device_information":{ + "vendor":"@eln", + "identifier":"@eln", + "model":"@eln" + }, + "associated_beam":"@link:/entry/instrument/beam_probe" + }, + "beam_TYPE[beam_probe]":{ + "distance":"@eln", + "distance/@units":"@eln", + "incident_energy":"@xps_token:beam/excitation_energy", + "incident_energy/@units":"eV", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"@link:/entry/instrument/source_probe" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "None", + "name":"@xps_token:analyzer_info/name", + "description":"@eln", + "work_function":"@eln", + "work_function/@units":"@eln", + "fast_axes":"None", + "slow_axes":"energy", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"estimated", + "resolution":"@xps_token:region/scan_delta", + "resolution/@units":"eV" + }, + "transmission_function":"None", + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"@eln", + "lens_mode":"@xps_token:collectioncolumn/lens_mode", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"@eln", + "pass_energy":"@xps_token:region/pass_energy", + "pass_energy/@units":"eV", + "energy_scan_mode":"@xps_token:region/scan_mode/name", + "entrance_slit/description":"@xps_token:region/analyzer_slit", + "exit_slit/description":"None", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "diameter":"@eln", + "diameter/@units":"@eln" + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"@eln", + "detector_type":"@eln", + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "raw_data":{ + "@signal":"raw", + "@default":"raw", + "raw":"@detector_data:cycles/Cycle_", + "raw/@units":"counts" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"@eln", + "model":"@eln", + "identifier":"@eln" + }, + "temperature_sensor":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "attached_to":"@eln", + "value":"@eln" + }, + "sample_heater":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "heater_power":"@eln", + "PID[pid]/setpoint":"@eln" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_potentiostat":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "PID[pid]/setpoint":"@eln" + } + }, + "pressure_gauge":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln", + "value_log/value":"@eln" + }, + "flood_gun":{ + "name":"@eln", + "physical_quantity":"@eln", + "type":"@eln", + "current":"@eln", + "current_log/value":"@eln" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "energy_calibration":{ + "calibrated_axis":"@data:energy", + "calibrated_axis/@units":"eV" + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"@xps_token:parameters/Group", + "sample_id":"@eln", + "atom_types":"@eln", + "physical_form":"@eln", + "situation":"@eln", + "SUBSTANCE[substance]":{ + "name":"@eln", + "molecular_mass":"@eln", + "cas_number":"@eln", + "molecular_formula_hill":"@eln" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"@eln", + "end_time":"@eln", + "description":"@eln", + "method":"@eln" + } + }, + "temperature":{ + "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor", + "sample_heater":"@link:/entry/instrument/manipulator/sample_heater", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"@link:/entry/instrument/pressure_gauge" + }, + "bias":{ + "potentiostat":"@link:/entry/instrument/manipulator/sample_bias_potentiostat", + "voltmeter":"@link:/entry/instrument/manipulator/sample_bias_voltmeter" + }, + "drain_current":{ + "amperemeter":"@link:/entry/instrument/manipulator/drain_current_amperemeter" + }, + "flood_gun_current":{ + "flood_gun":"@link:/entry/instrument/flood_gun" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"@data:cycle", + "data/@units":"counts", + "energy":"@link:/entry/process/energy_calibration/calibrated_axis", + "energy/@type":"kinetic", + "energy/@units":"eV", + "@energy_indices":"None", + "@energy_depends":"None" + } + } \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/config/template.json b/pynxtools/dataconverter/readers/xps/config/template.json index c35a10a1f..478b4a999 100644 --- a/pynxtools/dataconverter/readers/xps/config/template.json +++ b/pynxtools/dataconverter/readers/xps/config/template.json @@ -1,81 +1,251 @@ { - "/ENTRY[entry]/DATA[data]/@signal": "None", - "/ENTRY[entry]/DATA[data]/data": "None", - "/ENTRY[entry]/DATA[data]/data/@units": "None", - "/ENTRY[entry]/DATA[data]/energy": "None", - "/ENTRY[entry]/DATA[data]/energy/@type": "None", - "/ENTRY[entry]/DATA[data]/energy/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/distance/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_energy_spread/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/BEAM[beam]/incident_polarization/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/contrast_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/field_aperture": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/mode": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/projection": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]/scheme": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/@signal": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/DATA[data]/raw/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/amplifier_type": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/detector_type": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]/count_time/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/energy_scan_mode": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/entrance_slit": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/exit_slit": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/pass_energy/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]/scheme": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/description": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/energy_resolution/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/fast_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/slow_axes": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/name": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/drain_current/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_bias/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/MANIPULATOR[manipulator]/sample_temperature/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/name": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/probe": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/SOURCE[source]/type": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/energy_resolution/@units": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/": "None", - "/ENTRY[entry]/INSTRUMENT[instrument]/work_function/@units": "None", - "/ENTRY[entry]/PROCESS[process]/angular_calibration/applied": "None", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/applied": "None", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis": "None", - "/ENTRY[entry]/PROCESS[process]/energy_calibration/calibrated_axis/@units": "None", - "/ENTRY[entry]/PROCESS[process]/momentum_calibration/applied": "None", - "/ENTRY[entry]/PROCESS[process]/spatial_calibration/applied": "None", - "/ENTRY[entry]/SAMPLE[sample]/bias": "None", - "/ENTRY[entry]/SAMPLE[sample]/bias/@units": "None", - "/ENTRY[entry]/SAMPLE[sample]/chemical_formula": "None", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure": "None", - "/ENTRY[entry]/SAMPLE[sample]/gas_pressure/@units": "None", - "/ENTRY[entry]/SAMPLE[sample]/name": "None", - "/ENTRY[entry]/SAMPLE[sample]/preparation_date": "None", - "/ENTRY[entry]/SAMPLE[sample]/preparation_description": "None", - "/ENTRY[entry]/SAMPLE[sample]/sample_history": "None", - "/ENTRY[entry]/SAMPLE[sample]/situation": "None", - "/ENTRY[entry]/SAMPLE[sample]/temperature": "None", - "/ENTRY[entry]/SAMPLE[sample]/temperature/@units": "None", - "/ENTRY[entry]/USER[user]/address": "None", - "/ENTRY[entry]/USER[user]/affiliation": "None", - "/ENTRY[entry]/USER[user]/email": "None", - "/ENTRY[entry]/USER[user]/name": "None", - "/ENTRY[entry]/USER[user]/orcid": "None", - "/ENTRY[entry]/method": "None", - "/ENTRY[entry]/definition": "None", - "/ENTRY[entry]/definition/@version": "None", - "/ENTRY[entry]/start_time": "None", - "/ENTRY[entry]/title": "None" -} \ No newline at end of file + "/@default":"None", + "/ENTRY[entry]":{ + "@default":"data", + "definition":"None", + "definition/@version":"None", + "title":"None", + "start_time":"None", + "end_time":"None", + "method":"None" + }, + "/ENTRY[entry]/USER[user]":{ + "name":"None", + "affiliation":"None" + }, + "/ENTRY[entry]/INSTRUMENT[instrument]":{ + "device_information":{ + "vendor":"None", + "identifier":"None", + "model":"None" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"None", + "resolution":"None", + "resolution/@units":"None" + }, + "source_TYPE[source_probe]":{ + "type":"None", + "type_other":"None", + "name":"None", + "probe":"None", + "device_information":{ + "vendor":"None", + "identifier":"None", + "model":"None" + }, + "associated_beam":"None" + }, + "beam_TYPE[beam_probe]":{ + "distance":"None", + "distance/@units":"None", + "incident_energy":"None", + "incident_energy/@units":"None", + "incident_energy_spread":"None", + "incident_energy_spread/@units":"None", + "incident_polarization":"None", + "incident_polarization/@units":"None", + "extent":"None", + "associated_source":"None" + }, + "ELECTRONANALYSER[electronanalyser]":{ + "@default": "None", + "description":"None", + "work_function":"None", + "work_function/@units":"None", + "fast_axes":"None", + "slow_axes":"None", + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + }, + "energy_resolution":{ + "physical_quantity":"energy", + "type":"None", + "resolution":"None" + }, + "transmission_function":"None", + "COLLECTIONCOLUMN[collectioncolumn]":{ + "scheme":"None", + "lens_mode":"None", + "projection":"None", + "angular_acceptance":"None", + "spatial_acceptance":"None", + "field_aperture":"None", + "contrast_aperture":"None", + "iris":"None", + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + } + }, + "ENERGYDISPERSION[energydispersion]":{ + "scheme":"None", + "pass_energy":"None", + "pass_energy/@units":"None", + "energy_scan_mode":"None", + "entrance_slit":"None", + "exit_slit":"None", + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + } + }, + "DETECTOR[detector]":{ + "@default":"raw_data", + "amplifier_type":"None", + "detector_type":"None", + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + }, + "raw_data":{ + "@signal":"None", + "@default":"raw", + "raw":"None" + } + } + }, + "MANIPULATOR[manipulator]":{ + "device_information":{ + "vendor":"None", + "model":"None", + "identifier":"None" + }, + "temperature_sensor":{ + "name":"None", + "measurement":"None", + "type":"None", + "value":"None" + }, + "sample_heater":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "heater_power":"None", + "PID[pid]/setpoint":"None" + }, + "cryostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + }, + "drain_current_amperemeter":{ + "name":"None", + "measurement":"None", + "type":"None", + "value":"None" + }, + "sample_bias_voltmeter":{ + "name":"@eln", + "measurement":"@eln", + "type":"@eln", + "value":"@eln" + }, + "sample_bias_potentiostat":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "PID[pid]/setpoint":"None" + } + }, + "pressure_gauge":{ + "name":"None", + "measurement":"None", + "type":"None", + "value":"None", + "value_log/value":"None" + }, + "flood_gun":{ + "name":"None", + "physical_quantity":"None", + "type":"None", + "current":"None", + "current/@units":"None", + "current_log/value":"None", + "current_log/value/@units":"None" + } + }, + "/ENTRY[entry]/PROCESS[process]":{ + "angular_calibration":{ + "calibrated_axis":"None" + }, + "energy_calibration":{ + "calibrated_axis":"None" + }, + "energy_referencing":{ + "level":"None", + "reference_peak":"None", + "binding_energy":"None", + "offset":"None", + "calibrated_axis":"None" + }, + "momentum_calibration":{ + "calibrated_axis":"None" + }, + "spatial_calibration":{ + "calibrated_axis":"None" + }, + "transmission_correction":{ + "transmission_function":{ + "@axes":"None", + "@signal":"None", + "kinetic_energy":"None", + "kinetic_energy/@units":"None", + "relative_intensity":"None" + } + } + }, + "/ENTRY[entry]/SAMPLE[sample]":{ + "name":"None", + "atom_types":"@eln", + "physical_form":"None", + "situation":"None", + "SUBSTANCE[substance]":{ + "molecular_formula_hill":"None" + }, + "sample_history":{ + "sample_preparation":{ + "start_time":"None", + "end_time":"None", + "method":"None" + } + }, + "temperature":{ + "temperature_sensor": "None", + "sample_heater":"None", + "cryostat":"None" + }, + "gas_pressure":{ + "pressure_gauge":"None" + }, + "bias":{ + "potentiostat":"None", + "voltmeter":"None" + }, + "drain_current":{ + "amperemeter":"None" + }, + "flood_gun_current":{ + "flood_gun":"@None" + } + }, + "/ENTRY[entry]/data":{ + "@signal":"data", + "@default":"data", + "@axes":["energy"], + "data":"None", + "data/@units":"None", + "energy":"None", + "energy/@type":"None", + "energy/@units":"None", + "@energy_indices":"None", + "@energy_depends":"None" + } + } \ No newline at end of file diff --git a/pynxtools/dataconverter/readers/xps/file_parser.py b/pynxtools/dataconverter/readers/xps/file_parser.py index cc40323a2..0b302e113 100644 --- a/pynxtools/dataconverter/readers/xps/file_parser.py +++ b/pynxtools/dataconverter/readers/xps/file_parser.py @@ -57,11 +57,11 @@ class XpsDataFileParser: } __file_err_msg__ = ( - "Need a xps data file with the following extension: " f"{__prmt_file_ext__}" + "Need an XPS data file with the following extension: " f"{__prmt_file_ext__}" ) __vndr_err_msg__ = ( - "Need a xps data file from the following vendors: " f"{__vendors__}" + "Need an XPSdata file from the following vendors: " f"{__vendors__}" ) def __init__(self, file_paths: List) -> None: diff --git a/pynxtools/dataconverter/readers/xps/reader.py b/pynxtools/dataconverter/readers/xps/reader.py index 513b3f80a..79b36e5fa 100644 --- a/pynxtools/dataconverter/readers/xps/reader.py +++ b/pynxtools/dataconverter/readers/xps/reader.py @@ -2,6 +2,9 @@ A generic reader for loading XPS (X-ray Photoelectron Spectroscopy) data file into mpes nxdl (NeXus Definition Language) template. """ +import datetime +import sys + # Copyright The NOMAD Authors. # # This file is part of NOMAD. See https://nomad-lab.eu for further info. @@ -19,19 +22,21 @@ # limitations under the License. # from pathlib import Path -from typing import Any, Dict, Set, List -from typing import Tuple -import sys -import json +from typing import Any, Dict, List, Set, Tuple -import yaml import numpy as np +import yaml +from pynxtools.dataconverter.helpers import extract_atom_types from pynxtools.dataconverter.readers.base.reader import BaseReader +from pynxtools.dataconverter.readers.utils import ( + FlattenSettings, + flatten_and_replace, + parse_flatten_json, +) from pynxtools.dataconverter.readers.xps.file_parser import XpsDataFileParser -from pynxtools.dataconverter.readers.utils import flatten_and_replace, FlattenSettings +from pynxtools.dataconverter.readers.xps.reader_utils import construct_entry_name from pynxtools.dataconverter.template import Template -from pynxtools.dataconverter.helpers import extract_atom_types np.set_printoptions(threshold=sys.maxsize) @@ -39,6 +44,9 @@ XPS_DATA_TOKEN = "@data:" XPS_DETECTOR_TOKEN = "@detector_data:" ELN_TOKEN = "@eln" +LINK_TOKEN = "link" +TOKEN_SET = {XPS_TOKEN, XPS_DATA_TOKEN, XPS_DETECTOR_TOKEN, ELN_TOKEN} + # Track entries for using for eln data ENTRY_SET: Set[str] = set() DETECTOR_SET: Set[str] = set() @@ -48,41 +56,25 @@ CONVERT_DICT = { "unit": "@units", "version": "@version", - "User": "USER[user]", - "Instrument": "INSTRUMENT[instrument]", - "Source": "SOURCE[source]", - "Beam": "BEAM[beam]", - "Analyser": "ELECTRONANALYSER[electronanalyser]", - "Collectioncolumn": "COLLECTIONCOLUMN[collectioncolumn]", - "Energydispersion": "ENERGYDISPERSION[energydispersion]", - "Detector": "DETECTOR[detector]", - "Manipulator": "MANIPULATOR[manipulator]", - "Process": "PROCESS[process]", - "Sample": "SAMPLE[sample]", - "Data": "DATA[data]", + "user": "USER[user]", + "instrument": "INSTRUMENT[instrument]", + "source_probe": "source_TYPE[source_probe]", + "beam_probe": "beam_TYPE[beam_probe]", + "analyser": "ELECTRONANALYSER[electronanalyser]", + "collectioncolumn": "COLLECTIONCOLUMN[collectioncolumn]", + "energydispersion": "ENERGYDISPERSION[energydispersion]", + "detector": "DETECTOR[detector]", + "manipulator": "MANIPULATOR[manipulator]", + "pid": "PID[pid]", + "process": "PROCESS[process]", + "sample": "SAMPLE[sample]", + "substance": "SUBSTANCE[substance]", + # "Data": "DATA[data]", } REPLACE_NESTED: Dict[str, str] = {} -def construct_entry_name(key): - """Construct entry name from vendor, sample_name and region name""" - - components = key.split("/") - try: - # entry: vendor__sample__name_of_scan_rerion - entry_name = ( - f"{components[2]}" - f"__" - f'{components[3].split("_", 1)[1]}' - f"__" - f'{components[5].split("_", 1)[1]}' - ) - except IndexError: - entry_name = "" - return entry_name - - def find_entry_and_value(xps_data_dict, key_part, dt_typ): """Construct the entry name and pick up the corresponding data for that for that entry. @@ -91,7 +83,7 @@ def find_entry_and_value(xps_data_dict, key_part, dt_typ): entries_values = {} if dt_typ == XPS_TOKEN: for key, val in xps_data_dict.items(): - if key_part in key: + if key.endswith(key_part): entry = construct_entry_name(key) entries_values[entry] = val @@ -102,204 +94,246 @@ def find_entry_and_value(xps_data_dict, key_part, dt_typ): return entries_values +def get_entries_and_detectors(config_dict, xps_data_dict): + """Get all entries in the xps_data_dict""" + for key, value in config_dict.items(): + for token in [XPS_DATA_TOKEN, XPS_DETECTOR_TOKEN, XPS_TOKEN]: + try: + key_part = value.split(token)[-1] + entries_values = find_entry_and_value( + xps_data_dict, key_part, dt_typ=token + ) + + for entry, data in entries_values.items(): + if entry: + ENTRY_SET.add(entry) + if token == XPS_DETECTOR_TOKEN: + chan_count = "_chan" + # Iteration over scan + for data_var in data.data_vars: + if chan_count in data_var: + detector_num = data_var.split("_chan_")[-1] + detector_nm = f"detector{detector_num}" + DETECTOR_SET.add(detector_nm) + except AttributeError: + continue + + # pylint: disable=too-many-locals # pylint: disable=too-many-statements -def fill_data_group(key, entries_values, config_dict, template, entry_set): - """Fill out fileds and attributes for NXdata""" +def fill_data_group(key, key_part, entries_values, config_dict, template): + """Fill out fields and attributes for NXdata""" survey_count_ = 0 count = 0 for entry, xr_data in entries_values.items(): - entry_set.add(entry) - modified_key = key.replace("entry", entry) - modified_key = modified_key.replace("[data]/data", "[data]") root = key[0] - modifid_entry = key[0:13] - modifid_entry = modifid_entry.replace("entry", entry) - - template[f"{modifid_entry}/@default"] = "data" # Set first Survey as default for .nxs file if "Survey" in entry and survey_count_ == 0: - survey_count_ = survey_count_ + 1 + survey_count_ += 1 template[f"{root}@default"] = entry # If no Survey set any scan for default if survey_count_ == 0 and count == 0: - count = count + 1 + count += 1 template[f"{root}@default"] = entry - binding_energy_coord = None - chan_count = "_chan" - for data_var in xr_data.data_vars: - scan = data_var - # Collecting only accumulated counts - # indivisual channeltron counts goes to detector data section - if chan_count not in scan: - key_indv_scn_dt = f"{modified_key}/{scan}" - - key_indv_scn_dt_unit = f"{key_indv_scn_dt}/@units" - - coord_nm = list(xr_data[data_var].coords)[0] - binding_energy_coord = np.array(xr_data[data_var][coord_nm]) - template[key_indv_scn_dt] = xr_data[data_var].data - template[key_indv_scn_dt_unit] = config_dict[f"{key}/@units"] - - key_data = f"{modified_key}/data" - key_data_unit = f"{key_data}/@units" - - key_signal = f"{modified_key}/@signal" - - be_nm = "BE" - be_index = 0 - key_be = f"{modified_key}/{be_nm}" - key_be_unit = f"{key_be}/@units" - key_be_axes = f"{modified_key}/@axes" - key_be_ind = f"{modified_key}/@{be_nm}_indices" - - # setting up AXISNAME - axisname = "AXISNAME[axisname]" - long_name = "Binding Energy" - key_ax_mn = f"{modified_key}/{axisname}" - key_ax_ln_nm = f"{modified_key}/{axisname}/@long_name" - - key_nxclass = f"{modified_key}/@NX_class" - - template[key_signal] = "data" - template[key_data] = np.mean( - [ - xr_data[x_arr].data - for x_arr in xr_data.data_vars - if "_chan" not in x_arr - ], - axis=0, - ) - - template[f"{key_data}_errors"] = np.std( - [ - xr_data[x_arr].data - for x_arr in xr_data.data_vars - if "_chan" not in x_arr - ], - axis=0, - ) - - template[key_data_unit] = config_dict[f"{key}/@units"] - template[key_be_unit] = "eV" - template[key_be] = binding_energy_coord - template[key_be_axes] = be_nm - template[key_be_ind] = be_index - template[key_nxclass] = "NXdata" - template[key_ax_ln_nm] = long_name - template[key_ax_mn] = be_index - - -def fill_detector_group(key, entries_values, config_dict, template, entry_set): + data_field_key = key.replace("entry", entry) + data_group_key = data_field_key.rsplit("/data", 1)[0] + + if key_part == "energy": + energy_field_key = f"{data_group_key}/energy" + energy = np.array(xr_data.coords["energy"].values) + print(energy) + template[energy_field_key] = energy + + else: + # Define energy axis and energy_indices + template[f"{data_group_key}/energy/@long_name"] = "energy" + template[f"{data_group_key}/@energy_indices"] = 0 + + units = "counts_per_second" + + chan_count = "_chan" + scan_count = "_scan" + for data_var in xr_data.data_vars: + cycle_scan = data_var + # Collecting only accumulated counts + # indivisual channeltron counts goes to detector data section + if chan_count not in cycle_scan and scan_count in cycle_scan: + indv_scan_key = f"{data_group_key}/{cycle_scan}" + indv_scan_key_unit = f"{indv_scan_key}/@units" + template[indv_scan_key] = xr_data[data_var].data + template[indv_scan_key_unit] = units + + template[data_field_key] = np.mean( + [ + xr_data[x_arr].data + for x_arr in xr_data.data_vars + if (chan_count not in x_arr and scan_count in x_arr) + ], + axis=0, + ) + + template[f"{data_field_key}_errors"] = np.std( + [ + xr_data[x_arr].data + for x_arr in xr_data.data_vars + if (chan_count not in x_arr and scan_count in x_arr) + ], + axis=0, + ) + + template[f"{data_field_key}/@long_name"] = "XPS intensity" + + +def fill_detector_group(key, entries_values, config_dict, xps_data_dict, template): """Fill out fileds and attributes for NXdetector/NXdata""" for entry, xr_data in entries_values.items(): - entry_set.add(entry) - chan_count = "_chan" + # unit_key = config_dict[f"{key}/@units"] + # units = find_entry_and_value(xps_data_dict, unit_key, XPS_TOKEN) + units = "counts_per_second" + # Iteration over scan - for data_var in xr_data.data_vars: + data_vars = [ + data_var for data_var in xr_data.data_vars if chan_count in data_var + ] + + detector_scans = {detector: [] for detector in DETECTOR_SET} + + for data_var in data_vars: if chan_count in data_var: - detector_num = data_var.split("_chan")[-1] + detector_num = data_var.split("_chan_")[-1] detector_nm = f"detector{detector_num}" - DETECTOR_SET.add(detector_nm) - scan_num = data_var.split("_scan")[-1].split("_chan")[0] - scan_nm = f"scan_{scan_num}" + detector_scans[detector_nm] += [xr_data[data_var].data] + cycle_scan_num = data_var.split(chan_count)[0] modified_key = key.replace("entry", entry) modified_key = modified_key.replace("[detector]", f"[{detector_nm}]") - modified_key = modified_key.replace("[data]", f"[{scan_nm}]") - modified_key_unit = modified_key + "/@units" + cycle_scan_key = modified_key.replace( + "raw_data/raw", f"raw_data/{cycle_scan_num}" + ) + template[cycle_scan_key] = xr_data[data_var].data + template[f"{cycle_scan_key}/@units"] = units - template[modified_key] = xr_data[data_var].data - key_indv_chan_sginal = modified_key.replace("/raw", "/@signal") - template[key_indv_chan_sginal] = "raw" - template[modified_key_unit] = config_dict[f"{key}/@units"] + # Add multi-dimensional `raw`array for each detector + for detector_nm, value in detector_scans.items(): + modified_key = key.replace("entry", entry) + modified_key = modified_key.replace("[detector]", f"[{detector_nm}]") + template[modified_key] = np.array(value) -def fill_template_with_xps_data(config_dict, xps_data_dict, template, entry_set): +def fill_template_with_value(key, value, template): + """ + Fill NeXus template with a key-value pair. + + Parameters + ---------- + key : str + DESCRIPTION. + value : + Any value coming from the XPS, config, or ELN file. + template : Template + A NeXus template. + + """ + if value is None or str(value) == "None": + return + + # Do for all entry names + for entry in ENTRY_SET: + atom_types: List = [] + if "chemical_formula" in key: + atom_types = list(extract_atom_types(value)) + + if isinstance(value, datetime.datetime): + value = value.isoformat() + + elif isinstance(value, dict) and LINK_TOKEN in value: + link_text = value[LINK_TOKEN] + link_text = link_text.replace("entry", f"{entry}") + value = {LINK_TOKEN: link_text} + + modified_key = key.replace("[entry]", f"[{entry}]") + + # Do for all detectors + if "[detector]" in key: + for detector in DETECTOR_SET: + detr_key = modified_key.replace("[detector]", f"[{detector}]") + template[detr_key] = value + + if isinstance(value, dict) and LINK_TOKEN in value: + link_text = value[LINK_TOKEN] + if "/detector/" in link_text: + # Only replace if generic detector is given in + # link. + link_text = link_text.replace("detector", f"{detector}") + value = {LINK_TOKEN: link_text} + + template[detr_key] = value + else: + template[modified_key] = value + + if atom_types: + modified_key = modified_key.replace("chemical_formula", "atom_types") + template[modified_key] = ", ".join(atom_types) + + +def fill_template_with_xps_data(config_dict, xps_data_dict, template): """Collect the xps data from xps_data_dict and store them into template. We use searching_keys for separating the data from xps_data_dict. """ - for key, value in config_dict.items(): - if XPS_DATA_TOKEN in str(value): - key_part = value.split(XPS_DATA_TOKEN)[-1] - entries_values = find_entry_and_value( - xps_data_dict, key_part, dt_typ=XPS_DATA_TOKEN - ) - - fill_data_group(key, entries_values, config_dict, template, entry_set) + for key, config_value in config_dict.items(): + if isinstance(config_value, str) and any( + token in config_value for token in TOKEN_SET + ): + if XPS_DATA_TOKEN in str(config_value): + key_part = config_value.split(XPS_DATA_TOKEN)[-1] + entries_values = find_entry_and_value( + xps_data_dict, key_part, dt_typ=XPS_DATA_TOKEN + ) + fill_data_group(key, key_part, entries_values, config_dict, template) + + elif XPS_DETECTOR_TOKEN in str(config_value): + key_part = config_value.split(XPS_DATA_TOKEN)[-1] + entries_values = find_entry_and_value( + xps_data_dict, key_part, dt_typ=XPS_DETECTOR_TOKEN + ) + + fill_detector_group( + key, entries_values, config_dict, xps_data_dict, template + ) + + elif XPS_TOKEN in str(config_value): + key_part = config_value.split(XPS_TOKEN)[-1] + entries_values = find_entry_and_value( + xps_data_dict, key_part, dt_typ=XPS_TOKEN + ) + for entry, ent_value in entries_values.items(): + modified_key = key.replace("[entry]", f"[{entry}]") + fill_template_with_value(modified_key, ent_value, template) - if XPS_DETECTOR_TOKEN in str(value): - key_part = value.split(XPS_DATA_TOKEN)[-1] - entries_values = find_entry_and_value( - xps_data_dict, key_part, dt_typ=XPS_DETECTOR_TOKEN - ) + else: + fill_template_with_value(key, config_value, template) - fill_detector_group(key, entries_values, config_dict, template, entry_set) - elif XPS_TOKEN in str(value): - token = value.split(XPS_TOKEN)[-1] - entries_values = find_entry_and_value( - xps_data_dict, token, dt_typ=XPS_TOKEN - ) - for entry, ent_value in entries_values.items(): - entry_set.add(entry) - modified_key = key.replace("[entry]", f"[{entry}]") - template[modified_key] = ent_value - try: - template[f"{modified_key}/@units"] = config_dict[f"{key}/@units"] - except KeyError: - pass - - -# pylint: disable=too-many-branches -def fill_template_with_eln_data(eln_data_dict, config_dict, template, entry_set): +def fill_template_with_eln_data(eln_data_dict, config_dict, template): """Fill the template from provided eln data""" - - def fill_atom_types(key): - atom_types: List = [] - field_value = eln_data_dict[key] - - if "chemical_formula" in key: - atom_types = list(extract_atom_types(field_value)) - - if field_value is None: - return - - for entry in entry_set: - modified_key = key.replace("[entry]", f"[{entry}]") - template[modified_key] = field_value - if atom_types: - modified_key = modified_key.replace("chemical_formula", "atom_types") - template[modified_key] = ", ".join(atom_types) - - def fill_from_value(key): - field_value = eln_data_dict[key] - if not field_value: - return - # Do for all entry name - for entry in entry_set: - modified_key = key.replace("[entry]", f"[{entry}]") - # Do for all detector - if "[detector]" in key: - for detector in DETECTOR_SET: - detr_key = modified_key.replace("[detector]", f"[{detector}]") - template[detr_key] = field_value - else: - template[modified_key] = field_value - - for key, val in config_dict.items(): - if ELN_TOKEN in str(val): - fill_atom_types(key) - elif key in list(eln_data_dict.keys()): - fill_from_value(key) + for key, config_value in config_dict.items(): + if ELN_TOKEN in str(config_value): + try: + field_value = eln_data_dict[key] + fill_template_with_value(key, field_value, template) + except KeyError: + pass + elif key in eln_data_dict: + field_value = eln_data_dict[key] + fill_template_with_value(key, field_value, template) def concatenate_values(value1, value2): @@ -382,12 +416,15 @@ def read( if "config" in file: config_file = Path(file) - with open(config_file, encoding="utf-8", mode="r") as cfile: - config_dict = json.load(cfile) + config_dict = parse_flatten_json(config_file) + + get_entries_and_detectors(config_dict, xps_data_dict) + fill_template_with_xps_data(config_dict, xps_data_dict, template) - fill_template_with_xps_data(config_dict, xps_data_dict, template, ENTRY_SET) if eln_data_dict: - fill_template_with_eln_data(eln_data_dict, config_dict, template, ENTRY_SET) + # Filling in ELN metadata and overwriting the common + # paths by giving preference to the ELN metadata + fill_template_with_eln_data(eln_data_dict, config_dict, template) else: raise ValueError( "Eln file must be submited with some required fields and attributes." diff --git a/pynxtools/dataconverter/readers/xps/sle/sle_specs.py b/pynxtools/dataconverter/readers/xps/sle/sle_specs.py index 16f12d6a1..664c0ff88 100644 --- a/pynxtools/dataconverter/readers/xps/sle/sle_specs.py +++ b/pynxtools/dataconverter/readers/xps/sle/sle_specs.py @@ -63,6 +63,22 @@ def __init__(self): self.sql_connection = None + self.units = { + "analyser/work_function": "eV", + "beam/excitation_energy": "eV", + "collectioncolumn/iris_diameter": "mm", + "data/step_size": "eV", + "detector/detector_voltage": "V", + "detector/dwell_time": "s", + "detector/raw_data/raw": "counts_per_second ", + "instrument/polar_angle": "degree ", + "instrument/azimuth_angle": "degree", + "energydispersion/pass_energy": "eV", + "region/start_energy": "eV", + "source/emission_current": "A", + "source/source_voltage": "V", + "transmission_function/kinetic_energy": "eV", + } super().__init__() def _select_parser(self): @@ -107,9 +123,6 @@ def construct_data(self): key_map = { "user": [], "instrument": [ - "workfunction", - "bias_voltage_ions [V]", - "bias_voltage_electrons [V]", "polar_angle", "azimuth_angle", ], @@ -120,7 +133,11 @@ def construct_data(self): "emission_current", ], "beam": ["excitation_energy"], - "analyser": [], + "analyser": [ + "voltage_range", + "voltage_range/@units", + "work_function", + ], "collectioncolumn": [ "lens1_voltage [nU]", "lens2_voltage [nU]", @@ -128,35 +145,44 @@ def construct_data(self): "pre_deflector_x_current [nU]", "pre_deflector_y_current [nU]", "focus_displacement_current [nU]", - "transmission_function/data", - "transmission_function/file", + "iris_diameter", "lens_mode", + "transmission_function/relative_intensity", + "transmission_function/file", ], "energydispersion": [ - "scan_mode", + "energy_scan_mode", "entrance_slit", "exit_slit", - "iris_diameter", "pass_energy", ], "detector": [ - "calibration_file/dir", - "calibration_file", + "bias_voltage_electrons [V]", + "bias_voltage_ions [V]", "detector_voltage [V]", - "detector_voltage_range", + "dwell_time", ], "manipulator": [], - "calibration": [ - "transmission_function/data", - "transmission_function/file", + "process/energy_calibration": [ "calibration_file/dir", - "calibration_file", + "calibration_file/path", + "energy/@units", + ], + "process/transmission_correction": [ + "transmission_function/kinetic_energy", + "transmission_function/relative_intensity", + "transmission_function/file", + ], + "data": [ + "energy/@type", + "energy/@units", + "intensity/@units", + "n_values", + "step_size", ], - "data": ["x_units", "y_units", "n_values", "step_size", "dwell_time"], "region": [ "analysis_method", "start_energy", - "dwell_time", "spectrum_comment", "time_stamp", "total_scans", @@ -187,23 +213,23 @@ def _update_xps_dict_with_spectrum(self, spectrum, key_map): "energydispersion": f"{analyser_parent}/energydispersion", "detector": f"{analyser_parent}/detector", "manipulator": f"{instrument_parent}/manipulator", - "calibration": f"{instrument_parent}/calibration", + "process/energy_calibration": f"{region_parent}/process/energy_calibration", + "process/transmission_correction": f"{region_parent}/process/transmission_correction", "sample": f"{region_parent}/sample", "data": f"{region_parent}/data", - "region": f"{region_parent}", + "region": f"{region_parent}/region", } for grouping, spectrum_keys in key_map.items(): root = path_map[str(grouping)] for spectrum_key in spectrum_keys: - try: - units = re.search(r"\[([A-Za-z0-9_]+)\]", spectrum_key).group(1) - mpes_key = spectrum_key.rsplit(" ", 1)[0] + mpes_key = spectrum_key.rsplit(" ", 1)[0] + self._xps_dict[f"{root}/{mpes_key}"] = spectrum[spectrum_key] + + unit_key = f"{grouping}/{spectrum_key}" + units = self._get_units_for_key(unit_key) + if units: self._xps_dict[f"{root}/{mpes_key}/@units"] = units - self._xps_dict[f"{root}/{mpes_key}"] = spectrum[spectrum_key] - except AttributeError: - mpes_key = spectrum_key - self._xps_dict[f"{root}/{mpes_key}"] = spectrum[spectrum_key] self._xps_dict[f'{path_map["analyser"]}/name'] = spectrum["devices"][0] self._xps_dict[f'{path_map["source"]}/name'] = spectrum["devices"][1] @@ -214,6 +240,9 @@ def _update_xps_dict_with_spectrum(self, spectrum, key_map): detector_data_key_child = construct_detector_data_key(spectrum) energy = np.array(spectrum["data"]["x"]) + # Add energy axis to energy_calibration + calib_energy_key = f'{path_map["process/energy_calibration"]}/energy' + self._xps_dict[calib_energy_key] = energy # If multiple spectra exist to entry, only create a new # xr.Dataset if the entry occurs for the first time. @@ -263,6 +292,36 @@ def _update_xps_dict_with_spectrum(self, spectrum, key_map): data=cps, coords={"energy": energy} ) + # Add unit for detector data + detector_data_unit_key = f"{path_map['detector']}/raw_data/raw/@units" + self._xps_dict[detector_data_unit_key] = self._get_units_for_key( + "detector/raw_data/raw" + ) + + def _get_units_for_key(self, unit_key): + """ + Get correct units for a given key. + + Parameters + ---------- + unit_key : str + Key of type :, e.g. + detector/detector_voltage + + Returns + ------- + str + Unit for that unit_key. + + """ + try: + return re.search(r"\[([A-Za-z0-9_]+)\]", unit_key).group(1) + except AttributeError: + try: + return self.units[unit_key] + except KeyError: + return "" + class SleProdigyParser(ABC): """ @@ -282,9 +341,9 @@ def __init__(self): "ElectronEnergy": "start_energy", "SpectrumID": "spectrum_id", "EpassOrRR": "pass_energy", - "EnergyType": "x_units", + "EnergyType": "energy/@type", "Samples": "n_values", - "Wf": "workfunction", + "Wf": "work_function", "Step": "step", "Ubias": "electron_bias", "DwellTime": "dwell_time", @@ -293,8 +352,8 @@ def __init__(self): "Timestamp": "time_stamp", "Entrance": "entrance_slit", "Exit": "exit_slit", - "ScanMode": "scan_mode", - "VoltageRange": "detector_voltage_range", + "ScanMode": "energy_scan_mode", + "VoltageRange": "voltage_range", } spectrometer_setting_map = { @@ -322,9 +381,9 @@ def __init__(self): } self.sql_metadata_map = { - "EnergyType": "x_units", + "EnergyType": "energy/@type", "EpassOrRR": "pass_energy", - "Wf": "workfunction", + "Wf": "work_function", "Timestamp": "time_stamp", "Samples": "n_values", "ElectronEnergy": "start_energy", @@ -339,8 +398,10 @@ def __init__(self): ] self.value_map = { - "x_units": self._change_energy_type, + "energy/@type": self._change_energy_type, + "excitation_energy": self._convert_excitation_energy, "time_stamp": self._convert_date_time, + "energy_scan_mode": self._convert_energy_scan_mode, } self.keys_to_drop = [ @@ -351,6 +412,21 @@ def __init__(self): self.measurement_types = ["XPS", "UPS", "ElectronSpectroscopy"] + self.measurement_types_map = { + "XPS": "X-ray photoelectron spectroscopy (XPS)", + "UPS": "ultraviolet photoelectron spectroscopy (UPS)", + "ElectronSpectroscopy": "electron spectroscopy for chemical analysis (ESCA)", + "NAPXPS": "near ambient pressure X-ray photoelectron spectroscopy (NAPXPS)", + "ARXPS": "angle-resolved X-ray photoelectron spectroscopy (ARXPS)", + } + + self.energy_scan_mode_map = { + "FixedAnalyzerTransmission": "fixed_analyser_transmission", + "FixedRetardationRatio": "fixed_retardation_ratio", + "FixedEnergies": "fixed_energy", + "Snapshot": "snapshot", + } + def initiate_file_connection(self, filepath): """Set the filename of the file to be opened.""" sql_connection = filepath @@ -464,7 +540,9 @@ def _append_scan_data(self): scan["cps_calib"] = copy.copy(scan["cps_ch_0"]) # Add transmission function - scan["transmission_function/data"] = np.array(transmission_data) + scan["transmission_function/relative_intensity"] = np.array( + transmission_data + ) # add metadata including scan, loop no and datetime scan_metadata = self._get_scan_metadata(raw_ids[scan_no]) @@ -554,7 +632,7 @@ def _separate_channels(self, data, n_channels): # mcd_head = int(raw_data["mcd_head"]) # mcd_tail = int(raw_data["mcd_tail"]) # excitation_energy = raw_data["excitation_energy"] - # scan_mode = raw_data["scan_mode"] + # energy_scan_mode = raw_data["energy_scan_mode"] # kinetic_energy = raw_data["kinetic_energy"] # scan_delta = raw_data["scan_delta"] # pass_energy = raw_data["pass_energy"] @@ -617,7 +695,7 @@ def _separate_channels(self, data, n_channels): # # "scan" in individual CountsSeq # scan_counts = raw_data["scans"][scan_nm] # - # if scan_mode == "FixedAnalyzerTransmission": + # if energy_scan_mode == "fixed_analyser_transmission": # for row in np.arange(mcd_num): # # count_on_row = scan_counts[row::mcd_num] @@ -700,7 +778,7 @@ def _separate_channels(self, data, n_channels): # # "scan" in individual CountsSeq # scan_counts = raw_data["scans"][scan_nm] # - # if scan_mode == "FixedAnalyzerTransmission": + # if energy_scan_mode == "fixed_analyser_transmission": # for row in np.arange(mcd_num): # # count_on_row = scan_counts[row::mcd_num] @@ -997,7 +1075,7 @@ def _get_spectrum_metadata_from_sql(self): cur.execute(query) results = ET.fromstring(cur.fetchall()[0][0]) for i in results.iter("AnalyzerSpectrumParameters"): - spectrum["workfunction"] = i.attrib["Workfunction"] + spectrum["work_function"] = i.attrib["Workfunction"] spectrum["step_size"] = float(i.attrib["ScanDelta"]) def _get_scan_metadata(self, raw_id): @@ -1151,12 +1229,12 @@ def _get_energy_data(self, spectrum): List of uniformly separated energy values. """ - if spectrum["x_units"] == "binding energy": + if spectrum["energy/@type"] == "binding": start = spectrum["start_energy"] step = spectrum["step_size"] points = spectrum["n_values"] energy = [start - i * step for i in range(points)] - elif spectrum["x_units"] == "kinetic energy": + elif spectrum["energy/@type"] == "kinetic": start = spectrum["start_energy"] step = spectrum["step_size"] points = spectrum["n_values"] @@ -1209,16 +1287,6 @@ def _close_con(self): """ self.con.close() - def _convert_date_time(self, timestamp): - """ - Convert the native time format to the one we decide to use. - Returns datetime string in the format '%Y-%b-%d %H:%M:%S.%f'. - - """ - date_time = datetime.strptime(timestamp, "%Y-%b-%d %H:%M:%S.%f") - date_time = datetime.strftime(date_time, "%Y-%m-%d %H:%M:%S.%f") - return date_time - def _re_map_keys(self, dictionary, key_map): """ Map the keys returned from the SQL table to the preferred keys for @@ -1251,17 +1319,46 @@ def _drop_unused_keys(self, dictionary, keys_to_drop): if key in dictionary.keys(): dictionary.pop(key) - def _change_energy_type(self, energy): + def _change_energy_type(self, energy_type): """ Change the strings for energy type to the preferred format. """ - if energy == "Binding": - return "binding energy" - if energy == "Kinetic": - return "kinetic energy" + if energy_type == "Binding": + return "binding" + elif energy_type == "Kinetic": + return "kinetic" return None + def _convert_excitation_energy(self, excitation_energy): + """ + Convert the excitation_energy to a float. + + """ + return float(excitation_energy) + + def _convert_date_time(self, timestamp): + """ + Convert the native time format to the one we decide to use. + Returns datetime string in the format '%Y-%b-%d %H:%M:%S.%f'. + + """ + date_time = datetime.strptime(timestamp, "%Y-%b-%d %H:%M:%S.%f") + date_time = datetime.strftime(date_time, "%Y-%m-%d %H:%M:%S.%f") + return date_time + + def _convert_energy_scan_mode(self, energy_scan_mode): + """ + Convert the native names for the energy scan modes to the ones + used in NXmpes. + + """ + try: + energy_scan_mode = self.energy_scan_mode_map[energy_scan_mode] + except KeyError: + pass + return energy_scan_mode + def _re_map_values(self, dictionary): """ Map the values returned from the SQL table to the preferred format. @@ -1389,14 +1486,25 @@ def _convert_to_common_format(self): for channel_key in channels: spec.pop(channel_key) - spec["y_units"] = "Counts per Second" + spec["energy/@units"] = "eV" + spec["intensity/@units"] = "counts_per_second" + + # Add energy axis for TF data. + if spec["energy/@type"] == "binding": + tf_energy = np.array( + [spec["excitation_energy"] - x for x in spec["data"]["x"]] + ) + elif spec["energy/@type"] == "kinetic": + tf_energy = spec["data"]["x"] + + spec["transmission_function/kinetic_energy"] = tf_energy def _remove_fixed_energies(self): """ Remove spectra measured with the scan mode FixedEnergies. """ self.spectra = [ - spec for spec in self.spectra if spec["scan_mode"] != "FixedEnergies" + spec for spec in self.spectra if spec["energy_scan_mode"] != "fixed_energy" ] def _remove_syntax(self): @@ -1413,7 +1521,7 @@ def _remove_snapshot(self): Remove spectra required in Snapshot mode. """ self.spectra = [ - spec for spec in self.spectra if "Snapshot" not in spec["scan_mode"] + spec for spec in self.spectra if "snapshot" not in spec["energy_scan_mode"] ] def get_sle_version(self): @@ -1459,7 +1567,12 @@ def _flatten_xml(self, xml): for measurement_type in self.measurement_types: for group in xml.iter(measurement_type): data = {} - data["analysis_method"] = measurement_type + try: + data["analysis_method"] = self.measurement_types_map[ + measurement_type + ] + except KeyError: + data["analysis_method"] = measurement_type data["devices"] = [] for device in group.iter("DeviceCommand"): @@ -1526,15 +1639,23 @@ def _extract_comm_settings(self, comm_settings): common_spectrum_settings = {} for setting in comm_settings.iter(): if setting.tag == "ScanMode": - common_spectrum_settings[setting.tag] = setting.attrib["Name"] + energy_scan_mode = self.energy_scan_mode_map[setting.attrib["Name"]] + common_spectrum_settings[setting.tag] = energy_scan_mode elif setting.tag == "SlitInfo": for key, val in setting.attrib.items(): common_spectrum_settings[key] = val elif setting.tag == "Lens": - common_spectrum_settings.update(setting.attrib) + voltage_range = setting.attrib["VoltageRange"] + split_text = re.split(r"([A-Z])", voltage_range, 1) + val = split_text[0] + unit = "".join(split_text[1:]) + common_spectrum_settings["voltage_range"] = float(val) + common_spectrum_settings["voltage_range/@units"] = unit elif setting.tag == "EnergyChannelCalibration": common_spectrum_settings["calibration_file/dir"] = setting.attrib["Dir"] - common_spectrum_settings["calibration_file"] = setting.attrib["File"] + common_spectrum_settings["calibration_file/path"] = setting.attrib[ + "File" + ] elif setting.tag == "Transmission": common_spectrum_settings["transmission_function/file"] = setting.attrib[ "File" @@ -1629,7 +1750,12 @@ def _flatten_xml(self, xml): for measurement_type in self.measurement_types: for group in xml.iter(measurement_type): data = {} - data["analysis_method"] = measurement_type + try: + data["analysis_method"] = self.measurement_types_map[ + measurement_type + ] + except KeyError: + data["analysis_method"] = measurement_type data["devices"] = [] data["device_group_id"] = group.attrib["ID"] @@ -1695,15 +1821,24 @@ def _extract_comm_settings(self, comm_settings): common_spectrum_settings = {} for setting in comm_settings.iter(): if setting.tag == "ScanMode": - common_spectrum_settings[setting.tag] = setting.attrib["Name"] + energy_scan_mode = self.energy_scan_mode_map[setting.attrib["Name"]] + common_spectrum_settings[setting.tag] = energy_scan_mode elif setting.tag == "SlitInfo": for key, val in setting.attrib.items(): common_spectrum_settings[key] = val elif setting.tag == "Lens": - common_spectrum_settings.update(setting.attrib) + voltage_range = setting.attrib["VoltageRange"] + voltage_range = "400V" + split_text = re.split(r"([A-Z])", voltage_range, 1) + val = split_text[0] + unit = "".join(split_text[1:]) + common_spectrum_settings["voltage_range"] = float(val) + common_spectrum_settings["voltage_range/@units"] = unit elif setting.tag == "EnergyChannelCalibration": common_spectrum_settings["calibration_file/dir"] = setting.attrib["Dir"] - common_spectrum_settings["calibration_file"] = setting.attrib["File"] + common_spectrum_settings["calibration_file/path"] = setting.attrib[ + "File" + ] elif setting.tag == "Transmission": common_spectrum_settings["transmission_function/file"] = setting.attrib[ "File" diff --git a/pynxtools/dataconverter/readers/xps/vms/vamas.py b/pynxtools/dataconverter/readers/xps/vms/vamas.py index 8a9ceb59b..8af1dd027 100644 --- a/pynxtools/dataconverter/readers/xps/vms/vamas.py +++ b/pynxtools/dataconverter/readers/xps/vms/vamas.py @@ -94,9 +94,7 @@ def construct_data(self): key_map = { "user": [], - "instrument": [ - "work_function", - ], + "instrument": [], "source": [ "source_label", "source_analyzer_angle", @@ -108,13 +106,17 @@ def construct_data(self): "analysis_width_x", "analysis_width_y", "target_bias", + "work_function", ], "collectioncolumn": [], "energydispersion": [ "scan_mode", "pass_energy", ], - "detector": ["signal_mode"], + "detector": [ + "signal_mode", + "dwell_time", + ], "manipulator": [], "sample": [], "calibration": [], @@ -128,12 +130,10 @@ def construct_data(self): "n_values", "start_energy", "step_size", - "dwell_time", ], "region": [ "analysis_method", "spectrum_type", - "dwell_time", "comments", "spectrum_id", "time_stamp", diff --git a/pynxtools/dataconverter/readers/xps/xml/xml_specs.py b/pynxtools/dataconverter/readers/xps/xml/xml_specs.py index 7e9d07ed7..f519bcadb 100644 --- a/pynxtools/dataconverter/readers/xps/xml/xml_specs.py +++ b/pynxtools/dataconverter/readers/xps/xml/xml_specs.py @@ -31,23 +31,6 @@ ) -def _construct_entry_name_xml(key): - """Construction entry name.""" - key_parts = key.split("/") - try: - # entry example : vendor__sample__name_of_scan_region - entry_name = ( - f"{key_parts[2]}" - f"__" - f'{key_parts[3].split("_", 1)[1]}' - f"__" - f'{key_parts[5].split("_", 1)[1]}' - ) - except IndexError: - entry_name = "" - return entry_name - - class XmlMapperSpecs(XPSMapper): """ Class for restructuring xml data file from @@ -180,13 +163,14 @@ def construct_data(self): f"{scan_nm}_chan_{row}" ] = xr.DataArray( data=channel_counts[row + 1, :], - coords={"BE": binding_energy}, + coords={"energy": binding_energy}, ) # Storing callibrated and after accumulated each scan counts if row == mcd_num - 1: self._xps_dict["data"][entry][scan_nm] = xr.DataArray( - data=channel_counts[0, :], coords={"BE": binding_energy} + data=channel_counts[0, :], + coords={"energy": binding_energy}, ) else: for row in np.arange(mcd_num): @@ -203,13 +187,14 @@ def construct_data(self): f"{scan_nm}_chan{row}" ] = xr.DataArray( data=channel_counts[row + 1, :], - coords={"BE": binding_energy}, + coords={"energy": binding_energy}, ) # Storing callibrated and after accumulated each scan counts if row == mcd_num - 1: self._xps_dict["data"][entry][scan_nm] = xr.DataArray( - data=channel_counts[0, :], coords={"BE": binding_energy} + data=channel_counts[0, :], + coords={"energy": binding_energy}, ) @@ -699,6 +684,7 @@ def collect_raw_data_to_construct_data(self): self.entry_to_data[entry]["raw_data"]["excitation_energy"] = val elif "region/scan_mode/name" in key: + val = self._convert_energy_scan_mode(val) self.entry_to_data[entry]["raw_data"]["scan_mode"] = val elif "region/kinetic_energy" in key: @@ -748,3 +734,22 @@ def collect_raw_data_to_construct_data(self): scan_name = f"cycle{cycle_num}_scan{scan_num}" self.entry_to_data[entry]["raw_data"]["scans"][scan_name] = val + + def _convert_energy_scan_mode(self, energy_scan_mode): + """ + Convert the native names for the energy scan modes to the ones + used in NXmpes. + + """ + energy_scan_mode_map = { + "FixedAnalyzerTransmission": "fixed_analyser_transmission", + "FixedRetardationRatio": "fixed_retardation_ratio", + "FixedEnergies": "fixed_energy", + "Snapshot": "snapshot", + } + + try: + energy_scan_mode = energy_scan_mode_map[energy_scan_mode] + except KeyError: + pass + return energy_scan_mode diff --git a/pynxtools/dataconverter/writer.py b/pynxtools/dataconverter/writer.py index 82ca21198..6532724e0 100644 --- a/pynxtools/dataconverter/writer.py +++ b/pynxtools/dataconverter/writer.py @@ -33,7 +33,6 @@ logger = logging.getLogger(__name__) # pylint: disable=C0103 logger.setLevel(logging.INFO) -logger.addHandler(logging.StreamHandler(sys.stdout)) def does_path_exist(path, h5py_obj) -> bool: diff --git a/pynxtools/eln_mapper/README.md b/pynxtools/eln_mapper/README.md index 13f759466..e5f9cefee 100644 --- a/pynxtools/eln_mapper/README.md +++ b/pynxtools/eln_mapper/README.md @@ -1,19 +1,24 @@ # ELN generator -This is a helper tool for generating eln -- The simple eln generator that can be used in a console or jupyter-notebook -- Scheme based eln generator that can be used in NOMAD and the eln can be used as a custom scheme in NOMAD. +This is a helper tool for generating ELN files that can be used to add metadata to the dataconverter routine. +Two types of ELN are supported (by passing the flag `eln-type`): +- **eln**: The simple ELN generator that can be used in a console or jupyter-notebook. +- **scheme_eln**: Scheme based ELN generator that can be used in NOMAD and the ELN can be used as a custom scheme in NOMAD. ``` -$ eln_generator --options +user@box:~$ generate_eln --help +Usage: generate_eln [OPTIONS] + + Helper tool for generating ELN files in YAML format. Options: --nxdl TEXT Name of NeXus definition without extension (.nxdl.xml). [required] - --skip-top-levels INTEGER To skip upto a level of parent hierarchical structure. + --skip-top-levels INTEGER To skip the level of parent hierarchy level. E.g. for default 1 the part Entry[ENTRY] from /Entry[ENTRY]/Instrument[INSTRUMENT]/... will be skiped. [default: 1] - --output-file TEXT Name of output file. - --eln-type [eln|scheme_eln] Choose a type from the eln or scheme_eln. [required] + --output-file TEXT Name of file that is neede to generated output + file. + --eln-type [eln|scheme_eln] Choose a type of ELN output (eln or + scheme_eln). [required] --help Show this message and exit. -``` diff --git a/pynxtools/eln_mapper/eln_mapper.py b/pynxtools/eln_mapper/eln_mapper.py index b1b3cb5d0..983ed3627 100755 --- a/pynxtools/eln_mapper/eln_mapper.py +++ b/pynxtools/eln_mapper/eln_mapper.py @@ -34,7 +34,7 @@ type=int, show_default=True, help=( - "To skip the level of parent hierarchy level. E.g. for default 1 the part" + "To skip the level of parent hierarchy level. E.g. for default 1 the part " "Entry[ENTRY] from /Entry[ENTRY]/Instrument[INSTRUMENT]/... will be skiped." ), ) @@ -49,20 +49,10 @@ required=True, type=click.Choice(["eln", "scheme_eln"], case_sensitive=False), default="eln", + help=("Choose a type of ELN output (eln or scheme_eln)."), ) def get_eln(nxdl: str, skip_top_levels: int, output_file: str, eln_type: str): - """To generate ELN in yaml file format. - - Parameters - ---------- - - nxdl : str - Name of NeXus definition e.g. NXmpes - skip_top_levels : int - To skip hierarchical levels - output_file : str - Name of the output file. - """ + """Helper tool for generating ELN files in YAML format.""" eln_type = eln_type.lower() if eln_type == "eln": generate_eln(nxdl, output_file, skip_top_levels) diff --git a/pynxtools/nexus-version.txt b/pynxtools/nexus-version.txt new file mode 100644 index 000000000..9c1048b1b --- /dev/null +++ b/pynxtools/nexus-version.txt @@ -0,0 +1 @@ +v2020.10-1452-gd2fdad4f \ No newline at end of file diff --git a/pynxtools/nexus/README.md b/pynxtools/nexus/README.md index 0762bc4e5..ac6a889d1 100644 --- a/pynxtools/nexus/README.md +++ b/pynxtools/nexus/README.md @@ -1,28 +1,35 @@ +# NeXus file reader and debugger + This utility outputs a debug log for a given NeXus file by annotating the data and metadata entries with the schema definitions from the respective NeXus base classes and application definitions to which the file refers to. -``` -Options: - -f, --nexus-file : Name of nexus output file (.nxs) to enquiry. - -d, --documentation : Definition path in nexus output (.nxs) file. Returns debug - log relavent with that definition path. - Example: /entry/data/delays - -c, --concept : Concept path from application definition file (.nxdl,xml). Finds out - all the available concept definition (IS-A realation) for rendered - concept path. - Example: /NXarpes/ENTRY/INSTRUMENT/analyser - --help : To get the documentaion above - NOTE: Only one option from (-d and -c) is acceptable. - -In console: - -read_nexus [Options] - +```console +user@box:~$ read_nexus --help +Usage: read_nexus [OPTIONS] + The main function to call when used as a script. +Options: + -f, --nexus-file TEXT NeXus file with extension .nxs to learn NeXus + different concept documentation and concept. + -d, --documentation TEXT Definition path in nexus output (.nxs) file. + Returns debuglog relavent with that definition + path. Example: /entry/data/delays + -c, --concept TEXT Concept path from application definition file + (.nxdl,xml). Finds outall the available concept + definition (IS-A realation) for renderedconcept + path. Example: /NXarpes/ENTRY/INSTRUMENT/analyser + --help Show this message and exit. + +NOTE: Only one option from (-d and -c) is acceptable. ``` +The following example dataset can be used to test the `read_nexus` module: `tests/data/nexus/201805_WSe2_arpes.nxs`. +This is an angular-resolved photoelectron spectroscopy (ARPES) dataset and it is formatted according to +the [NXarpes application definition of NeXus](https://manual.nexusformat.org/classes/applications/NXarpes.html#nxarpes). + +## Using a different set of NeXus definitions _The environmental variable called "NEXUS_DEF_PATH" can be set to a directory, which contains the NeXus definitions as XML files. If this environmental variable is not defined, the module will use the definitions in its bundle._ @@ -33,6 +40,11 @@ An environmental variable can be set as follows: export 'NEXUS_DEF_PATH'= ``` -Following example dataset can be used to test `read_nexus` module `tests/data/nexus/201805_WSe2_arpes.nxs`. -This is an angular-resolved photoelectron spectroscopy (ARPES) dataset and it is formatted according to -the [NXarpes application definition of NEXUS](https://manual.nexusformat.org/classes/applications/NXarpes.html#nxarpes). \ No newline at end of file +## A note to Windows users +If you run `read_nexus` from `git bash`, you need to set the environmental variable +`MSYS_NO_PATHCONV` to avoid the [path translation in Windows Git MSys](https://stackoverflow.com/questions/7250130/how-to-stop-mingw-and-msys-from-mangling-path-names-given-at-the-command-line#34386471). +The easiest way is to prefix the `read_nexus` call with `MSYS_NO_PATHCONV=1`: + +``` +MSYS_NO_PATHCONV=1 read_nexus -c /NXarpes/ENTRY/INSTRUMENT/analyser +``` \ No newline at end of file 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/dataconverter/readers/xps/eln_data.yaml b/tests/data/dataconverter/readers/xps/eln_data.yaml index 58e81f99e..5abaeca11 100644 --- a/tests/data/dataconverter/readers/xps/eln_data.yaml +++ b/tests/data/dataconverter/readers/xps/eln_data.yaml @@ -1,51 +1,146 @@ -Instrument: - Analyser: - Collectioncolumn: - scheme: "Angular dispersive" - mode: "Unknown" - description: "hemispherical" - name: null - Energydispersion: - entrance_slit: "Unknown" - scheme: "hemispherical" - energy_scan_mode: "fixed" - pass_energy: - unit: null - Detector: - amplifier_type: "channeltron" - detector_type: "Multi-anode" - Beam: +definition: + value: NXmpes + version: 1.0 +title: XPS Experiment +start_time: 2022-04-08T11:47:02.0200Z +end_time: 2022-04-08T12:32:06.0200Z +experiment_institution: BESSY II +program_name: SpecsLab 2 +user: + name: Lukas Pielsticker + email: lukas.pielsticker@cec.mpg.de +instrument: + device_information: + vendor: SPECS GmbH + model: XPS setup + identifier: null + energy_resolution: + type: calibrated + resolution: + value: 0.2 + unit: eV + source_probe: + type: Synchrotron X-ray Source + probe: x-ray + device_information: + vendor: null + model: null + identifier: null + beam_probe: distance: - unit: "mm" value: 0.0 - energy_resolution: - unit: null - value: null - Source: - type: "Synchrotron X-ray Source" - probe: "x-ray" -Sample: - name: "PBTTT" - chemical_formula: "(C42H62S4)n" - preparation_description: "From third party" - temperature: - unit: "K" - value: 298.0 - situation: "vacuum" - gas_pressure: - unit: "Pa" - value: 101325.0 - density: null - description: "A polymer material called PBTTT with chemical name poly[2,5-bis(3-dodecylthiophen-2-yl)thieno[3,2-b]thiophene]." -title: "XPS Experiment" -start_time: "2022-04-08T11:47:02.0200Z" -definition: - value: "NXmpes" - version: "1.0" -User: - name: "Ahmed Mansour" - email: "amansour@physik.hu-berlin.de" -Data: - BE: - unit: null - + unit: mm + analyser: + description: hemispherical + name: PHOIBOS 150 + device_information: + vendor: SPECS GmbH + model: PHOIBOS 150 + identifier: null + collectioncolumn: + scheme: angular dispersive + device_information: + vendor: null + model: null + identifier: null + energydispersion: + scheme: hemispherical + entrance_slit: unknown + energy_scan_mode: fixed_analyser_transmission + diameter: + unit: mm + value: 150 + device_information: + vendor: null + model: null + identifier: null + detector: + amplifier_type: channeltron + detector_type: Multi-anode + manipulator: + device_information: + vendor: SPECS GmbH + model: 5-axis manipulator + identifier: null + temperature_sensor: + name: type K thermocouple + measurement: temperature + attached_to: sample + type: type K thermocouple + value: + value: 298.0 + unit: K + sample_heater: + name: Coherent Compact Evolution IR Diode LASER (DILAS) + physical_quantity: temperature + type: IR diode laser + heater_power: + value: 0.0 + unit: W + pid: + setpoint: + value: 298.0 + unit: K + cryostat: + name: null + physical_quantity: null + type: null + pid: + setpoint: null + drain_current_amperemeter: + name: Amperemeter 1.0 + measurement: current + type: wire + value: + value: 0.0 + unit: A + sample_bias_voltmeter: + name: XPS sample voltmeter + measurement: voltage + attached_to: sample + type: oscilloscope + value: + value: 0.0 + unit: V + sample_bias_potentiostat: + name: XPS sample potentiostat + physical_quantity: voltage + type: potentiostat + pid: + setpoint: + value: 0.0 + unit: V + pressure_gauge: + name: Atmion + measurement: pressure + type: hot-filament ionization gauge + value: + value: 0.000000001 + unit: mbar + value_log: + value: + value: null + unit: null + flood_gun: + name: FG 22/35 + physical_quantity: current + type: low energy electron source + current: + value: 0.0 + unit: A + current_log: + value: + value: null + unit: null +sample: + description: A polymer material called PBTTT with chemical name poly[2,5-bis(3-dodecylthiophen-2-yl)thieno[3,2-b]thiophene]. + substance: + molecular_formula_hill: (C42H62S4)n + situation: vacuum + sample_history: + sample_preparation: + start_time: 2022-04-08T11:02:38.0200Z + end_time: 2022-04-08T11:06:42.200Z + description: From third party + method: null + \ 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_convert.py b/tests/dataconverter/test_convert.py index 0612f47fb..a49cc59a5 100644 --- a/tests/dataconverter/test_convert.py +++ b/tests/dataconverter/test_convert.py @@ -120,7 +120,7 @@ def test_cli(caplog, cli_inputs): result = runner.invoke(dataconverter.convert_cli, cli_inputs) if "--generate-template" in cli_inputs: assert result.exit_code == 0 - assert '"/ENTRY[entry]/NXODD_name/int_value": "None",' in caplog.text + assert '"/ENTRY[entry]/NXODD_name/int_value": "None",' in result.stdout elif "--input-file" in cli_inputs: assert "test_input" in caplog.text elif result.exit_code == 2: diff --git a/tests/dataconverter/test_helpers.py b/tests/dataconverter/test_helpers.py index 21f41586d..5542dd703 100644 --- a/tests/dataconverter/test_helpers.py +++ b/tests/dataconverter/test_helpers.py @@ -17,12 +17,13 @@ # """Test cases for the helper functions used by the DataConverter.""" -import xml.etree.ElementTree as ET -import os import logging -from setuptools import distutils -import pytest +import os +import xml.etree.ElementTree as ET + import numpy as np +import pytest +from setuptools import distutils from pynxtools.dataconverter import helpers from pynxtools.dataconverter.template import Template @@ -213,6 +214,7 @@ def fixture_filled_test_data(template, tmp_path): TEMPLATE["optional"]["/@default"] = "Some NXroot attribute" +# pylint: disable=too-many-arguments @pytest.mark.parametrize( "data_dict,error_message", [ @@ -354,9 +356,9 @@ def fixture_filled_test_data(template, tmp_path): TEMPLATE, "/ENTRY[my_entry]/required_group/description" ), "/ENTRY[my_entry]/required_group", - {}, + None, ), - (""), + "The required group, /ENTRY[entry]/required_group, hasn't been supplied.", id="allow-required-and-empty-group", ), pytest.param( @@ -367,8 +369,7 @@ def fixture_filled_test_data(template, tmp_path): ), ( "The required group, /ENTRY[entry]/optional_parent/req_group_in_opt_group, hasn't been " - "supplied while its optional parent, /ENTRY[entry]/optional_parent/" - "req_group_in_opt_group, is supplied." + "supplied while its optional parent, /ENTRY[entry]/optional_parent, is supplied." ), id="req-group-in-opt-parent-removed", ), @@ -377,8 +378,10 @@ def fixture_filled_test_data(template, tmp_path): ), ], ) -def test_validate_data_dict(data_dict, error_message, template, nxdl_root, request): - """Unit test for the data validation routine""" +def test_validate_data_dict( + caplog, data_dict, error_message, template, nxdl_root, request +): + """Unit test for the data validation routine.""" if request.node.callspec.id in ( "valid-data-dict", "lists", @@ -388,10 +391,22 @@ def test_validate_data_dict(data_dict, error_message, template, nxdl_root, reque "no-child-provided-optional-parent", "int-instead-of-chars", "link-dict-instead-of-bool", - "allow-required-and-empty-group", "opt-group-completely-removed", ): helpers.validate_data_dict(template, data_dict, nxdl_root) + # Missing required fields caught by logger with warning + elif request.node.callspec.id in ( + "empty-required-field", + "allow-required-and-empty-group", + "req-group-in-opt-parent-removed", + "missing-empty-yet-required-group", + "missing-empty-yet-required-group2", + ): + assert "" == caplog.text + # logger records + captured_logs = caplog.records + helpers.validate_data_dict(template, data_dict, nxdl_root) + assert any(error_message in rec.message for rec in captured_logs) else: with pytest.raises(Exception) as execinfo: helpers.validate_data_dict(template, data_dict, nxdl_root) @@ -413,7 +428,12 @@ def test_validate_data_dict(data_dict, error_message, template, nxdl_root, reque ) 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..2dfed9947 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 diff --git a/tests/nexus/test_nexus.py b/tests/nexus/test_nexus.py index efdb3dfa6..656c27e29 100644 --- a/tests/nexus/test_nexus.py +++ b/tests/nexus/test_nexus.py @@ -19,12 +19,14 @@ # limitations under the License. # -import os import logging +import os import xml.etree.ElementTree as ET from pynxtools.nexus import nexus +logger = logging.getLogger(__name__) + def test_get_nexus_classes_units_attributes(): """Check the correct parsing of a separate list for: @@ -51,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") - logger = logging.getLogger(__name__) + 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) @@ -68,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: @@ -194,7 +195,7 @@ def test_c_option(tmp_path): path_to_ref_files = os.path.join(local_path, "../data/nexus/") ref_file = path_to_ref_files + "Ref1_c_option_test.log" tmp_file = os.path.join(tmp_path, "c_option_1_test.log") - logger = logging.getLogger(__name__) + logger.setLevel(logging.INFO) handler = logging.FileHandler(tmp_file, "w") @@ -247,7 +248,7 @@ def test_d_option(tmp_path): """ tmp_file = os.path.join(tmp_path, "d_option_1_test.log") - logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) handler = logging.FileHandler(tmp_file, "w")