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 - <