From 9a8e27762297664da77200a064ad751c3f4715ef Mon Sep 17 00:00:00 2001 From: rettigl Date: Mon, 24 Mar 2025 13:00:42 +0100 Subject: [PATCH 1/6] use LUT data for delay as well --- pyproject.toml | 2 +- src/specsscan/helpers.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 22e74e2..44e7fdb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dependencies = [ "numpy>=1.21.6", "opencv-python>=4.8.1.78", "pynxtools-mpes>=0.2.1", - "pynxtools>=0.9.3", + "pynxtools>=0.10.0", "python-dateutil>=2.8.2", "pyyaml>=6.0", "xarray>=0.20.2", diff --git a/src/specsscan/helpers.py b/src/specsscan/helpers.py index 4677bfe..8dd17e3 100644 --- a/src/specsscan/helpers.py +++ b/src/specsscan/helpers.py @@ -348,9 +348,6 @@ def parse_info_to_dict(path: Path) -> dict: except FileNotFoundError as exc: raise FileNotFoundError("info.txt file not found.") from exc - if "DelayStage" in info_dict and "TimeZero" in info_dict: - info_dict["delay"] = mm_to_fs(info_dict["DelayStage"], info_dict["TimeZero"]) - return info_dict @@ -411,6 +408,13 @@ def handle_meta( complete_dictionary(scan_info, lut_meta), ) # merging dictionaries + # Store delay info + if "DelayStage" in metadata["scan_info"] and "TimeZero" in metadata["scan_info"]: + metadata["scan_info"]["delay"] = mm_to_fs( + metadata["scan_info"]["DelayStage"], + metadata["scan_info"]["TimeZero"], + ) + # store program version metadata["scan_info"]["program_name"] = "specsanalyzer" metadata["scan_info"]["program_version"] = importlib.metadata.version("specsanalyzer") From 9a153b3af5abe73649da443c8de503a91b422017 Mon Sep 17 00:00:00 2001 From: rettigl Date: Mon, 24 Mar 2025 13:03:53 +0100 Subject: [PATCH 2/6] update config and example --- .cspell/custom-dictionary.txt | 3 +- src/specsscan/config/NXmpes_arpes_config.json | 434 +++++++++--------- .../3_specsscan_conversion_to_NeXus.ipynb | 17 +- 3 files changed, 235 insertions(+), 219 deletions(-) mode change 100755 => 100644 src/specsscan/config/NXmpes_arpes_config.json diff --git a/.cspell/custom-dictionary.txt b/.cspell/custom-dictionary.txt index 6ac077a..c31708e 100644 --- a/.cspell/custom-dictionary.txt +++ b/.cspell/custom-dictionary.txt @@ -45,7 +45,7 @@ Ekin elab elabapi elabid -electronanalyser +electronanalyzer elems endstation energydispersion @@ -142,6 +142,7 @@ toctree tomlkit topfloor tqdm +trarpes typehints TZCYXS undoc diff --git a/src/specsscan/config/NXmpes_arpes_config.json b/src/specsscan/config/NXmpes_arpes_config.json old mode 100755 new mode 100644 index 6e6eb3f..2df10fb --- a/src/specsscan/config/NXmpes_arpes_config.json +++ b/src/specsscan/config/NXmpes_arpes_config.json @@ -1,28 +1,26 @@ { "/@default": "entry", "/ENTRY/@default": "data", - "/ENTRY/title": "['@eln:/ENTRY/title', '@attrs:metadata/entry_title']", + "/ENTRY/title": "['@eln:/ENTRY/title', '@attrs:metadata/entry_title', '@attrs:metadata/elabFTW/scan/title']", "/ENTRY/start_time": "@attrs:metadata/timing/acquisition_start", "/ENTRY/experiment_institution": "Fritz Haber Institute - Max Planck Society", "/ENTRY/experiment_facility": "Time Resolved ARPES", "/ENTRY/experiment_laboratory": "Clean Room 4", - "/ENTRY/entry_identifier": { - "identifier":"@attrs:metadata/loader/scan_path" - }, + "/ENTRY/identifierNAME[entry_identifier]": "@attrs:metadata/loader/scan_path", "/ENTRY/end_time": "@attrs:metadata/timing/acquisition_stop", "/ENTRY/duration": "@attrs:metadata/timing/acquisition_duration", "/ENTRY/duration/@units": "s", "/ENTRY/collection_time": "@attrs:metadata/timing/collection_time", "/ENTRY/collection_time/@units": "s", "/ENTRY/USER[user]": { - "name": "!['@eln:/ENTRY/User/name', '@attrs:metadata/user0/name']", - "role": "['@eln:/ENTRY/User/role', '@attrs:metadata/user0/role']", - "affiliation": "!['@eln:/ENTRY/User/affiliation', '@attrs:metadata/user0/affiliation']", - "address": "['@eln:/ENTRY/User/address', '@attrs:metadata/user0/address']", - "email": "['@eln:/ENTRY/User/email', '@attrs:metadata/user0/email']" + "name": "!['@eln:/ENTRY/User/name', '@attrs:metadata/user0/name', '@attrs:metadata/elabFTW/user/name']", + "role": "['@eln:/ENTRY/User/role', '@attrs:metadata/user0/role', 'Principal Investigator']", + "affiliation": "['@eln:/ENTRY/User/affiliation', '@attrs:metadata/user0/affiliation', 'Fritz Haber Institute of the Max Planck Society']", + "address": "['@eln:/ENTRY/User/address', '@attrs:metadata/user0/address', 'Faradayweg 4-6, 14195 Berlin, Germany']", + "email": "['@eln:/ENTRY/User/email', '@attrs:metadata/user0/email', '@attrs:metadata/elabFTW/user/email']" }, - "/ENTRY/geometries/COORDINATE_SYSTEM[arpes_geometry]": { - "depends_on": "/entry/geometries/arpes_geometry/transformations/rot_y", + "/ENTRY/COORDINATE_SYSTEM[arpes_geometry]": { + "depends_on": "/entry/arpes_geometry/transformations/rot_y", "TRANSFORMATIONS[transformations]": { "AXISNAME[rot_y]/@depends_on": ".", "AXISNAME[rot_y]": 140.0, @@ -35,19 +33,19 @@ "name": "Phoibos detector, at the endstation of the high rep-rate HHG source at FHI", "name/@short_name": "TR-ARPES @ FHI", "energy_resolution": { - "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/energy_resolution', '@attrs:metadata/instrument/energy_resolution']", + "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/energy_resolution', '@attrs:metadata/instrument/energy_resolution', '@attrs:metadata/elabFTW/trarpes_phoibos/energy_resolution']", "resolution/@units": "meV", "physical_quantity": "energy", "type": "estimated" }, "RESOLUTION[temporal_resolution]": { - "resolution": 35.0, + "resolution": "!['@attrs:metadata/elabFTW/laser_status/temporal_resolution', '35.0']", "resolution/@units": "fs", "physical_quantity": "time", "type": "estimated" }, "RESOLUTION[angular_resolution]": { - "resolution": "@link:/entry/instrument/electronanalyser/angular_resolution/resolution", + "resolution": "@link:/entry/instrument/electronanalyzer/angular_resolution/resolution", "resolution/@units": "deg", "physical_quantity": "angle", "type": "derived" @@ -57,207 +55,205 @@ "measurement": "pressure", "value": "!['@eln:/ENTRY/Sample/gas_pressure', '@attrs:metadata/scan_info/trARPES:XGS600:PressureAC:P_RD']", "value/@units": "mbar" - } - }, - "/ENTRY/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]": { - "description": "SPECS Phoibos 150 Hemispherical Energy Analyzer", - "device_information": { - "vendor": "SPECS GmbH", - "model": "Phoibos 150 CCD Hemispherical Analyzer" }, - "work_function": 4.55, - "work_function/@units": "eV", - "fast_axes": "@attrs:metadata/scan_info/fast_axes", - "slow_axes": "@attrs:metadata/scan_info/slow_axes", - "energy_resolution": { - "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/energy_resolution', '@attrs:metadata/instrument/electronanalyser/energy_resolution']", - "resolution/@units": "meV", - "physical_quantity": "energy", - "type": "derived" + "ELECTRONANALYZER[electronanalyzer]": { + "description": "SPECS Phoibos 150 Hemispherical Energy Analyzer", + "device_information": { + "vendor": "SPECS GmbH", + "model": "Phoibos 150 CCD Hemispherical Analyzer" + }, + "work_function": "@attrs:metadata/conversion_parameters/work_function", + "work_function/@units": "eV", + "fast_axes": "@attrs:metadata/scan_info/fast_axes", + "slow_axes": "@attrs:metadata/scan_info/slow_axes", + "energy_resolution": { + "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/energy_resolution', '@attrs:metadata/instrument/electronanalyzer/energy_resolution', '@attrs:metadata/elabFTW/trarpes_phoibos/energy_resolution']", + "resolution/@units": "meV", + "physical_quantity": "energy", + "type": "derived" + }, + "angular_resolution": { + "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/angular_resolution', '@attrs:metadata/instrument/electronanalyzer/angular_resolution', '@attrs:metadata/elabFTW/trarpes_phoibos/angular_resolution']", + "resolution/@units": "deg", + "physical_quantity": "angle", + "type": "derived" + }, + "spatial_resolution": { + "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/spatial_resolution', '@attrs:metadata/instrument/electronanalyzer/spatial_resolution', '@attrs:metadata/elabFTW/trarpes_phoibos/spatial_resolution']", + "resolution/@units": "µm", + "physical_quantity": "length", + "type": "estimated" + }, + "depends_on": "/entry/instrument/electronanalyzer/transformations/trans_z", + "TRANSFORMATIONS[transformations]": { + "AXISNAME[trans_z]/@depends_on": "analyzer_elevation", + "AXISNAME[trans_z]": 40.0, + "AXISNAME[trans_z]/@transformation_type": "translation", + "AXISNAME[trans_z]/@units": "mm", + "AXISNAME[trans_z]/@vector": [0, 0, 1], + "analyzer_dispersion/@depends_on": "analyzer_rotation", + "analyzer_dispersion": "@data:angular1.data", + "analyzer_dispersion/@transformation_type": "rotation", + "analyzer_dispersion/@units": "degrees", + "analyzer_dispersion/@vector": [1, 0, 0], + "analyzer_elevation/@depends_on": "analyzer_dispersion", + "analyzer_elevation": 0, + "analyzer_elevation/@transformation_type": "rotation", + "analyzer_elevation/@units": "degrees", + "analyzer_elevation/@vector": [0, 1, 0], + "analyzer_rotation/@depends_on": "rot_y", + "analyzer_rotation": 0, + "analyzer_rotation/@transformation_type": "rotation", + "analyzer_rotation/@units": "degrees", + "analyzer_rotation/@vector": [0, 0, 1], + "AXISNAME[rot_y]/@depends_on": ".", + "AXISNAME[rot_y]": 140.0, + "AXISNAME[rot_y]/@transformation_type": "rotation", + "AXISNAME[rot_y]/@units": "degrees", + "AXISNAME[rot_y]/@vector": [0, 1, 0] + }, + "COLLECTIONCOLUMN[collectioncolumn]": { + "projection": "@attrs:metadata/scan_info/projection", + "scheme": "@attrs:metadata/scan_info/scheme", + "lens_mode": "@attrs:metadata/scan_info/LensMode", + "working_distance": 40.0, + "working_distance/@units": "mm" + }, + "ENERGYDISPERSION[energydispersion]": { + "energy_scan_mode": "@attrs:metadata/scan_info/energy_scan_mode", + "pass_energy": "@attrs:metadata/scan_info/PassEnergy", + "pass_energy/@units": "eV", + "center_energy": "@attrs:metadata/scan_info/KineticEnergy", + "center_energy/@units": "eV", + "scheme": "hemispherical", + "diameter": 300.0, + "diameter/@units": "mm", + "entrance_slit": { + "shape": "['@eln:/ENTRY/Instrument/Analyzer/slit_shape', '@attrs:metadata/instrument/electronanalyzer/slit_shape', '@attrs:metadata/elabFTW/trarpes_phoibos/entrance_slit_shape', 'curved slit']", + "size": "['@eln:/ENTRY/Instrument/Analyzer/slit_size', '@attrs:metadata/instrument/electronanalyzer/slit_size', '@attrs:metadata/elabFTW/trarpes_phoibos/entrance_slit_size', '1.0']", + "size/@units": "mm" + }, + "exit_slit": { + "shape": "['@attrs:metadata/elabFTW/trarpes_phoibos/exit_slit_type', 'grid']" + } + }, + "ELECTRON_DETECTOR[detector]": { + "amplifier_type": "MCP", + "detector_type": "Phosphor+CCD", + "amplifier_bias": "@attrs:metadata/scan_info/ConversionVoltage", + "amplifier_bias/@units": "V", + "amplifier_voltage": "@attrs:metadata/scan_info/DetectorVoltage", + "amplifier_voltage/@units": "V", + "detector_voltage": "@attrs:metadata/scan_info/ScreenVoltage", + "detector_voltage/@units": "V" + } }, - "angular_resolution": { - "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/angular_resolution', '@attrs:metadata/instrument/electronanalyser/angular_resolution']", - "resolution/@units": "deg", - "physical_quantity": "angle", - "type": "derived" + "source_probe": { + "name": "HHG @ TR-ARPES @ FHI", + "probe": "photon", + "type": "HHG laser", + "mode": "Single Bunch", + "frequency": "!['@eln:/ENTRY/Instrument/Source/Probe/frequency', '@attrs:metadata/instrument/beam/probe/frequency', '@attrs:metadata/elabFTW/laser_status/probe_repetition_rate']", + "frequency/@units": "kHz", + "associated_beam": "/entry/instrument/beam_probe" }, - "spatial_resolution": { - "resolution": "!['@eln:/ENTRY/Instrument/Analyzer/spatial_resolution', '@attrs:metadata/instrument/electronanalyser/spatial_resolution']", - "resolution/@units": "µm", - "physical_quantity": "length", - "type": "estimated" + "beam_probe": { + "distance": 0.0, + "distance/@units": "mm", + "incident_energy": "!['@eln:/ENTRY/Instrument/Beam/Probe/incident_energy', '@attrs:metadata/instrument/beam/probe/incident_energy', '@attrs:metadata/elabFTW/laser_status/probe_photon_energy']", + "incident_energy/@units": "eV", + "incident_energy_spread": "['@eln:/ENTRY/Instrument/Beam/Probe/incident_energy_spread', '@attrs:metadata/instrument/beam/probe/incident_energy_spread', '@attrs:metadata/elabFTW/laser_status/probe_photon_energy_spread']", + "incident_energy_spread/@units": "eV", + "pulse_duration": "['@eln:/ENTRY/Instrument/Beam/Probe/pulse_duration', '@attrs:metadata/instrument/beam/probe/pulse_duration', '@attrs:metadata/elabFTW/laser_status/probe_pulse_duration']", + "pulse_duration/@units": "fs", + "incident_polarization": "['@eln:/ENTRY/Instrument/Beam/Probe/incident_polarization', '@attrs:metadata/instrument/beam/probe/incident_polarization', '@attrs:metadata/elabFTW/scan/probe_polarization', '@attrs:metadata/scan_info/trARPES:HHG:wp']", + "incident_polarization/@units": "V^2/mm^2", + "extent": "['@eln:/ENTRY/Instrument/Beam/Probe/extent', '@attrs:metadata/instrument/beam/probe/extent', '@attrs:metadata/elabFTW/laser_status/probe_profile']", + "extent/@units": "µm", + "associated_source": "/entry/instrument/source_probe" }, - - - "depends_on": "/entry/instrument/electronanalyser/transformations/trans_z", - "TRANSFORMATIONS[transformations]": { - "AXISNAME[trans_z]/@depends_on": "analyzer_elevation", - "AXISNAME[trans_z]": 40.0, - "AXISNAME[trans_z]/@transformation_type": "translation", - "AXISNAME[trans_z]/@units": "mm", - "AXISNAME[trans_z]/@vector": [0, 0, 1], - "analyzer_dispersion/@depends_on": "analyzer_rotation", - "analyzer_dispersion": "@data:angular1.data", - "analyzer_dispersion/@transformation_type": "rotation", - "analyzer_dispersion/@units": "degrees", - "analyzer_dispersion/@vector": [1, 0, 0], - "analyzer_elevation/@depends_on": "analyzer_dispersion", - "analyzer_elevation": 0, - "analyzer_elevation/@transformation_type": "rotation", - "analyzer_elevation/@units": "degrees", - "analyzer_elevation/@vector": [0, 1, 0], - "analyzer_rotation/@depends_on": "rot_y", - "analyzer_rotation": 0, - "analyzer_rotation/@transformation_type": "rotation", - "analyzer_rotation/@units": "degrees", - "analyzer_rotation/@vector": [0, 0, 1], - "AXISNAME[rot_y]/@depends_on": ".", - "AXISNAME[rot_y]": 140.0, - "AXISNAME[rot_y]/@transformation_type": "rotation", - "AXISNAME[rot_y]/@units": "degrees", - "AXISNAME[rot_y]/@vector": [0, 1, 0] - } - }, - "/ENTRY/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/COLLECTIONCOLUMN[collectioncolumn]": { - "projection": "@attrs:metadata/scan_info/projection", - "scheme": "@attrs:metadata/scan_info/scheme", - "lens_mode": "@attrs:metadata/scan_info/LensMode", - "working_distance": 40.0, - "working_distance/@units": "mm" - }, - "/ENTRY/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/ENERGYDISPERSION[energydispersion]": { - "energy_scan_mode": "@attrs:metadata/scan_info/energy_scan_mode", - "pass_energy": "@attrs:metadata/scan_info/PassEnergy", - "pass_energy/@units": "eV", - "center_energy": "@attrs:metadata/scan_info/KineticEnergy", - "center_energy/@units": "eV", - "scheme": "hemispherical", - "diameter": 300.0, - "diameter/@units": "mm", - "entrance_slit": { - "shape": "curved slit", - "size": 1.0, - "size/@units": "mm" - }, - "exit_slit": { - "shape": "grid" - } - }, - "/ENTRY/INSTRUMENT[instrument]/ELECTRONANALYSER[electronanalyser]/DETECTOR[detector]": { - "amplifier_type": "MCP", - "detector_type": "Phosphor+CCD", - "sensor_pixels": [ - 256, - 320 - ], - "amplifier_bias": "@attrs:metadata/scan_info/ConversionVoltage", - "amplifier_bias/@units": "V", - "amplifier_voltage": "@attrs:metadata/scan_info/DetectorVoltage", - "amplifier_voltage/@units": "V", - "detector_voltage": "@attrs:metadata/scan_info/ScreenVoltage", - "detector_voltage/@units": "V" - }, - "/ENTRY/INSTRUMENT[instrument]/sourceTYPE[source_probe]": { - "name": "HHG @ TR-ARPES @ FHI", - "probe": "photon", - "type": "HHG laser", - "mode": "Single Bunch", - "frequency": "['@eln:/ENTRY/Instrument/Source/Probe/frequency', '@attrs:metadata/instrument/beam/probe/frequency']", - "frequency/@units": "kHz", - "associated_beam": "/entry/instrument/beam_probe" - }, - "/ENTRY/INSTRUMENT[instrument]/beamTYPE[beam_probe]": { - "distance": 0.0, - "distance/@units": "mm", - "incident_energy": "!['@eln:/ENTRY/Instrument/Beam/Probe/incident_energy', '@attrs:metadata/instrument/beam/probe/incident_energy']", - "incident_energy/@units": "eV", - "incident_energy_spread": "['@eln:/ENTRY/Instrument/Beam/Probe/incident_energy_spread', '@attrs:metadata/instrument/beam/probe/incident_energy_spread']", - "incident_energy_spread/@units": "eV", - "pulse_duration": "['@eln:/ENTRY/Instrument/Beam/Probe/pulse_duration', '@attrs:metadata/instrument/beam/probe/pulse_duration']", - "pulse_duration/@units": "fs", - "incident_polarization": "['@eln:/ENTRY/Instrument/Beam/Probe/incident_polarization', '@attrs:metadata/instrument/beam/probe/incident_polarization']", - "incident_polarization/@units": "V^2/mm^2", - "extent": "['@eln:/ENTRY/Instrument/Beam/Probe/extent', '@attrs:metadata/instrument/beam/probe/extent']", - "extent/@units": "µm", - "associated_source": "/entry/instrument/source_probe" - }, - "/ENTRY/INSTRUMENT[instrument]/sourceTYPE[source_pump]": { - "name": "OPCPA @ TR-ARPES @ FHI", - "probe": "visible light", - "type": "Optical Laser", - "mode": "Single Bunch", - "frequency": "['@eln:/ENTRY/Instrument/Source/Pump/frequency', '@attrs:metadata/instrument/beam/pump/frequency']", - "frequency/@units": "kHz", - "associated_beam": "/entry/instrument/beam_pump" - }, - "/ENTRY/INSTRUMENT[instrument]/beamTYPE[beam_pump]": { - "distance": 0.0, - "distance/@units": "mm", - "incident_energy": "!['@eln:/ENTRY/Instrument/Beam/Pump/incident_energy', '@attrs:metadata/instrument/beam/pump/incident_energy']", - "incident_energy/@units": "eV", - "incident_energy_spread": "['@eln:/ENTRY/Instrument/Beam/Pump/incident_energy_spread', '@attrs:metadata/instrument/beam/pump/incident_energy_spread']", - "incident_energy_spread/@units": "eV", - "incident_wavelength": "['@eln:/ENTRY/Instrument/Beam/Pump/incident_wavelength', '@attrs:metadata/instrument/beam/pump/incident_wavelength']", - "incident_wavelength/@units": "nm", - "pulse_duration": "['@eln:/ENTRY/Instrument/Beam/Pump/pulse_duration', '@attrs:metadata/instrument/beam/pump/pulse_duration']", - "pulse_duration/@units": "fs", - "incident_polarization": "['@eln:/ENTRY/Instrument/Beam/Pump/incident_polarization', '@attrs:metadata/instrument/beam/pump/incident_polarization']", - "incident_polarization/@units": "V^2/mm^2", - "pulse_energy": "['@eln:/ENTRY/Instrument/Beam/Pump/pulse_energy', '@attrs:metadata/instrument/beam/pump/pulse_energy']", - "pulse_energy/@units": "µJ", - "average_power": "['@eln:/ENTRY/Instrument/Beam/Pump/average_power', '@attrs:metadata/instrument/beam/pump/average_power']", - "average_power/@units": "mW", - "extent": "['@eln:/ENTRY/Instrument/Beam/Pump/extent', '@attrs:metadata/instrument/beam/pump/extent']", - "extent/@units": "µm", - "fluence": "['@eln:/ENTRY/Instrument/Beam/Pump/fluence', '@attrs:metadata/instrument/beam/pump/fluence']", - "fluence/@units": "mJ/cm^2", - "associated_source": "/entry/instrument/source_pump" - }, - "/ENTRY/INSTRUMENT[instrument]/MANIPULATOR[manipulator]": { - "temperature_sensor": { - "name": "sample_temperature", - "measurement": "temperature", - "value": "!['@eln:/ENTRY/Instrument/Manipulator/sample_temperature', '@attrs:metadata/scan_info/trARPES:Carving:TEMP_RBV']", - "value/@units": "K" + "source_pump": { + "name": "OPCPA @ TR-ARPES @ FHI", + "probe": "visible light", + "type": "Optical Laser", + "mode": "Single Bunch", + "frequency": "!['@eln:/ENTRY/Instrument/Source/Pump/frequency', '@attrs:metadata/instrument/beam/pump/frequency', '@attrs:metadata/elabFTW/laser_status/pump_repetition_rate']", + "frequency/@units": "kHz", + "associated_beam": "/entry/instrument/beam_pump" }, - "sample_bias_voltmeter": { - "name": "sample_bias", - "measurement": "voltage", - "value": 0.0, - "value/@units": "V" + "beam_pump": { + "distance": 0.0, + "distance/@units": "mm", + "incident_energy": "!['@eln:/ENTRY/Instrument/Beam/Pump/incident_energy', '@attrs:metadata/instrument/beam/pump/incident_energy', '@attrs:metadata/elabFTW/laser_status/pump_photon_energy']", + "incident_energy/@units": "eV", + "incident_energy_spread": "['@eln:/ENTRY/Instrument/Beam/Pump/incident_energy_spread', '@attrs:metadata/instrument/beam/pump/incident_energy_spread', '@attrs:metadata/elabFTW/laser_status/pump_photon_energy_spread']", + "incident_energy_spread/@units": "eV", + "incident_wavelength": "['@eln:/ENTRY/Instrument/Beam/Pump/incident_wavelength', '@attrs:metadata/instrument/beam/pump/incident_wavelength', '@attrs:metadata/scan_info/trARPES:Orpheus:Wavelength']", + "incident_wavelength/@units": "nm", + "pulse_duration": "['@eln:/ENTRY/Instrument/Beam/Pump/pulse_duration', '@attrs:metadata/instrument/beam/pump/pulse_duration', '@attrs:metadata/elabFTW/laser_status/pump_pulse_duration']", + "pulse_duration/@units": "fs", + "pulse_delay": "@attrs:metadata/scan_info/delay", + "pulse_delay/@units": "fs", + "pulse_delay/@reference_beam": "/entry/instrument/beam_probe", + "incident_polarization": "['@eln:/ENTRY/Instrument/Beam/Pump/incident_polarization', '@attrs:metadata/instrument/beam/pump/incident_polarization', '@attrs:metadata/elabFTW/scan/pump_polarization', '@attrs:metadata/scan_info/trARPES:Pump:wp.RBV']", + "incident_polarization/@units": "V^2/mm^2", + "pulse_energy": "['@eln:/ENTRY/Instrument/Beam/Pump/pulse_energy', '@attrs:metadata/instrument/beam/pump/pulse_energy', '@attrs:metadata/elabFTW/scan/pump_pulse_energy']", + "pulse_energy/@units": "µJ", + "average_power": "['@eln:/ENTRY/Instrument/Beam/Pump/average_power', '@attrs:metadata/instrument/beam/pump/average_power', '@attrs:metadata/scan_info/trARPES:Pump:Power.RBV']", + "average_power/@units": "mW", + "extent": "['@eln:/ENTRY/Instrument/Beam/Pump/extent', '@attrs:metadata/instrument/beam/pump/extent', '@attrs:metadata/elabFTW/laser_status/pump_profile']", + "extent/@units": "µm", + "fluence": "['@eln:/ENTRY/Instrument/Beam/Pump/fluence', '@attrs:metadata/instrument/beam/pump/fluence', '@attrs:metadata/elabFTW/scan/pump_fluence', '@attrs:metadata/scan_info/trARPES:Pump:fluence.RBV']", + "fluence/@units": "mJ/cm^2", + "associated_source": "/entry/instrument/source_pump" }, - "drain_current_amperemeter": { - "name": "drain_current", - "measurement": "current", - "value": "!['@eln:/ENTRY/Instrument/Manipulator/drain_current', '@attrs:metadata/scan_info/trARPES:Sample:Measure']", - "value/@units": "A" - }, - "depends_on": "/entry/instrument/manipulator/transformations/trans_z", - "TRANSFORMATIONS[transformations]": { - "AXISNAME[trans_z]": -0.32, - "AXISNAME[trans_z]/@depends_on": "rot_z", - "AXISNAME[trans_z]/@transformation_type": "translation", - "AXISNAME[trans_z]/@units": "m", - "AXISNAME[trans_z]/@vector": [0, 0, 1], - "AXISNAME[rot_z]/@depends_on": "rot_x", - "AXISNAME[rot_z]": -115.0, - "AXISNAME[rot_z]/@transformation_type": "rotation", - "AXISNAME[rot_z]/@units": "degrees", - "AXISNAME[rot_z]/@vector": [0, 0, 1], - "AXISNAME[rot_x]/@depends_on": ".", - "AXISNAME[rot_x]": -90.0, - "AXISNAME[rot_x]/@transformation_type": "rotation", - "AXISNAME[rot_x]/@units": "degrees", - "AXISNAME[rot_x]/@vector": [1, 0, 0] + "MANIPULATOR[manipulator]": { + "temperature_sensor": { + "name": "sample_temperature", + "measurement": "temperature", + "value": "!['@eln:/ENTRY/Instrument/Manipulator/sample_temperature', '@attrs:metadata/scan_info/trARPES:Carving:TEMP_RBV']", + "value/@units": "K" + }, + "sample_bias_voltmeter": { + "name": "sample_bias", + "measurement": "voltage", + "value": 0.0, + "value/@units": "V" + }, + "drain_current_ammeter": { + "name": "drain_current", + "measurement": "current", + "value": "!['@eln:/ENTRY/Instrument/Manipulator/drain_current', '@attrs:metadata/scan_info/trARPES:Sample:Measure']", + "value/@units": "A" + }, + "depends_on": "/entry/instrument/manipulator/transformations/trans_z", + "TRANSFORMATIONS[transformations]": { + "AXISNAME[trans_z]": -0.32, + "AXISNAME[trans_z]/@depends_on": "rot_z", + "AXISNAME[trans_z]/@transformation_type": "translation", + "AXISNAME[trans_z]/@units": "m", + "AXISNAME[trans_z]/@vector": [0, 0, 1], + "AXISNAME[rot_z]/@depends_on": "rot_x", + "AXISNAME[rot_z]": -115.0, + "AXISNAME[rot_z]/@transformation_type": "rotation", + "AXISNAME[rot_z]/@units": "degrees", + "AXISNAME[rot_z]/@vector": [0, 0, 1], + "AXISNAME[rot_x]/@depends_on": ".", + "AXISNAME[rot_x]": -90.0, + "AXISNAME[rot_x]/@transformation_type": "rotation", + "AXISNAME[rot_x]/@units": "degrees", + "AXISNAME[rot_x]/@vector": [1, 0, 0] + } } }, "/ENTRY/SAMPLE[sample]": { - "preparation_date": "['@eln:/ENTRY/Sample/preparation_date', '@attrs:metadata/sample/preparation_date']", - "history/notes/description": "['@eln:/ENTRY/Sample/sample_history', '@attrs:metadata/sample/sample_history']", - "description": "['@eln:/ENTRY/Sample/description', '@attrs:metadata/sample/chemical_formula']", - "name": "!['@eln:/ENTRY/Sample/name', '@attrs:metadata/sample/name']", + "preparation_date": "['@eln:/ENTRY/Sample/preparation_date', '@attrs:metadata/sample/preparation_date', '@attrs:metadata/elabFTW/sample/preparation_date']", + "history/sample_preparation/description": "['@eln:/ENTRY/Sample/sample_history', '@attrs:metadata/sample/sample_history', '@attrs:metadata/elabFTW/sample/sample_history']", + "history/sample_preparation/start_time": "['@eln:/ENTRY/Sample/preparation_date', '@attrs:metadata/sample/preparation_date', '@attrs:metadata/elabFTW/sample/preparation_date']", + "description": "['@eln:/ENTRY/Sample/description', '@attrs:metadata/sample/chemical_formula', '@attrs:metadata/elabFTW/sample/summary']", + "name": "!['@eln:/ENTRY/Sample/name', '@attrs:metadata/sample/name', '@attrs:metadata/elabFTW/sample/title']", "situation": "vacuum", - "SUBSTANCE[substance]/molecular_formula_hill": "['@eln:/ENTRY/Sample/chemical_formula', '@attrs:metadata/sample/chemical_formula']", + "chemical_formula": "['@eln:/ENTRY/Sample/chemical_formula', '@attrs:metadata/sample/chemical_formula', '@attrs:metadata/elabFTW/sample/sample_formula']", "temperature_env": { "temperature_sensor": "@link:/entry/instrument/manipulator/temperature_sensor" }, @@ -268,7 +264,7 @@ "voltmeter": "@link:/entry/instrument/manipulator/sample_bias_voltmeter" }, "drain_current_env": { - "amperemeter": "@link:/entry/instrument/manipulator/drain_current_amperemeter" + "ammeter": "@link:/entry/instrument/manipulator/drain_current_ammeter" }, "depends_on": "/entry/sample/transformations/offset_azimuth", "TRANSFORMATIONS[transformations]": { @@ -329,11 +325,28 @@ "AXISNAME[trans_x]/@vector": [0, 1, 0] } }, - "/ENTRY/PROCESS[process]/CALIBRATION[energy_calibration]":{ - "calibrated_axis": "@data:energy.data" + "/ENTRY/CALIBRATION[energy_calibration]":{ + "program": "@attrs:metadata/scan_info/program_name", + "version": "@attrs:metadata/scan_info/program_version", + "calibrated_axis": "@attrs:metadata/scan_info/Ekin", + "calibrated_axis/@units": "energy", + "physical_quantity": "energy", + "PARAMETERS[conversion_parameters]":{ + "TERM[*{apply_fft_filter,binning,rotation_angle,lens_mode,kinetic_energy,pass_energy,work_function,a_inner,da_matrix,retardation_ratio,source,dims,e_shift,de1,e_range,a_range,pixel_size,magnification,angle_offset_px,energy_offset_px}]": "@attrs:metadata/conversion_parameters/*" + } + }, + "/ENTRY/CALIBRATION[angular0_calibration]":{ + "calibrated_axis": "@link:/entry/data/angular0", + "calibrated_axis/@units": "angle", + "physical_quantity": "angle" }, - "/ENTRY/PROCESS[process]/CALIBRATION[angular0_calibration]":{ - "calibrated_axis": "@data:angular0.data" + "/ENTRY/CALIBRATION[energy_referencing]":{ + "calibrated_axis": "@link:/entry/data/energy", + "calibrated_axis/@units": "energy", + "physical_quantity": "energy", + "reference_peak": "@attrs:metadata/scan_info/reference_energy", + "binding_energy": 0.0, + "binding_energy/@units": "energy" }, "/ENTRY/data": { "@axes": "@data:dims", @@ -344,6 +357,7 @@ "*": "@data:*.data", "*/@units": "@data:*.unit", "*/@reference": "@attrs:metadata/scan_info/coordinate_depends/*", + "*/@long_name": "@attrs:metadata/scan_info/coordinate_label/*", "energy/@type": "kinetic" } } diff --git a/tutorial/3_specsscan_conversion_to_NeXus.ipynb b/tutorial/3_specsscan_conversion_to_NeXus.ipynb index 0e519d6..52507e4 100755 --- a/tutorial/3_specsscan_conversion_to_NeXus.ipynb +++ b/tutorial/3_specsscan_conversion_to_NeXus.ipynb @@ -66,11 +66,12 @@ "metadata['instrument'] = {}\n", "# energy resolution\n", "metadata['instrument']['energy_resolution'] = 150.\n", - "metadata['instrument']['electronanalyser'] = {}\n", - "metadata['instrument']['electronanalyser']['energy_resolution'] = 120\n", - "metadata['instrument']['electronanalyser']['angular_resolution'] = 0.2\n", - "metadata['instrument']['electronanalyser']['spatial_resolution'] = 0.5\n", - "\n", + "metadata['instrument']['electronanalyzer'] = {}\n", + "metadata['instrument']['electronanalyzer']['energy_resolution'] = 120.\n", + "metadata['instrument']['electronanalyzer']['angular_resolution'] = 0.2\n", + "metadata['instrument']['electronanalyzer']['spatial_resolution'] = 0.5\n", + "metadata['instrument']['electronanalyzer']['slit_shape'] = \"curved slit\"\n", + "metadata['instrument']['electronanalyzer']['slit_size'] = 1.0\n", "#probe beam\n", "metadata['instrument']['beam']={}\n", "metadata['instrument']['beam']['probe']={}\n", @@ -105,8 +106,8 @@ "\n", "metadata[\"scan_info\"] = {}\n", "metadata[\"scan_info\"][\"trARPES:XGS600:PressureAC:P_RD\"] = 2.5E-11\n", - "metadata[\"scan_info\"][\"trARPES:Carving:TEMP_RBV\"] = 70\n", - "metadata[\"scan_info\"][\"trARPES:Sample:Measure\"] = 0\n" + "metadata[\"scan_info\"][\"trARPES:Carving:TEMP_RBV\"] = 70.\n", + "metadata[\"scan_info\"][\"trARPES:Sample:Measure\"] = 0.\n" ] }, { @@ -248,7 +249,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.8" + "version": "3.10.16" } }, "nbformat": 4, From dddc80c43b7e66f11a5d0730da3fc7e27cd4bdf6 Mon Sep 17 00:00:00 2001 From: rettigl Date: Mon, 24 Mar 2025 13:11:14 +0100 Subject: [PATCH 3/6] fix test --- tests/test_specsscan.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/test_specsscan.py b/tests/test_specsscan.py index ed39670..80edf62 100755 --- a/tests/test_specsscan.py +++ b/tests/test_specsscan.py @@ -318,15 +318,20 @@ def test_conversion_and_save_to_nexus(): metadata["instrument"] = {} # energy resolution metadata["instrument"]["energy_resolution"] = 150.0 - metadata["instrument"]["electronanalyser"] = {} - metadata["instrument"]["electronanalyser"]["energy_resolution"] = 120 - metadata["instrument"]["electronanalyser"]["angular_resolution"] = 0.2 - metadata["instrument"]["electronanalyser"]["spatial_resolution"] = 0.5 + metadata["instrument"]["electronanalyzer"] = {} + metadata["instrument"]["electronanalyzer"]["energy_resolution"] = 120.0 + metadata["instrument"]["electronanalyzer"]["angular_resolution"] = 0.2 + metadata["instrument"]["electronanalyzer"]["spatial_resolution"] = 0.5 # probe beam metadata["instrument"]["beam"] = {} metadata["instrument"]["beam"]["probe"] = {} metadata["instrument"]["beam"]["probe"]["incident_energy"] = 21.7 + metadata["instrument"]["beam"]["probe"]["frequency"] = 500.0 + metadata["instrument"]["beam"]["probe"]["incident_energy_spread"] = 0.11 + metadata["instrument"]["beam"]["probe"]["pulse_duration"] = 20.0 + metadata["instrument"]["beam"]["probe"]["incident_polarization"] = [1, 1, 0, 0] + metadata["instrument"]["beam"]["probe"]["extent"] = [80.0, 80.0] # sample metadata["sample"] = {} @@ -334,8 +339,8 @@ def test_conversion_and_save_to_nexus(): metadata["scan_info"] = {} metadata["scan_info"]["trARPES:XGS600:PressureAC:P_RD"] = 2.5e-11 - metadata["scan_info"]["trARPES:Carving:TEMP_RBV"] = 70 - metadata["scan_info"]["trARPES:Sample:Measure"] = 0 + metadata["scan_info"]["trARPES:Carving:TEMP_RBV"] = 70.0 + metadata["scan_info"]["trARPES:Sample:Measure"] = 0.0 res_xarray = sps.load_scan( scan=1496, path=data_dir, From 1e9b52ab0e8d80cb6dd658f17c68b54f5970b593 Mon Sep 17 00:00:00 2001 From: rettigl Date: Mon, 24 Mar 2025 13:13:25 +0100 Subject: [PATCH 4/6] fix config --- src/specsscan/config/example_config_FHI.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/specsscan/config/example_config_FHI.yaml b/src/specsscan/config/example_config_FHI.yaml index cb26071..23e3538 100644 --- a/src/specsscan/config/example_config_FHI.yaml +++ b/src/specsscan/config/example_config_FHI.yaml @@ -18,8 +18,8 @@ coordinate_mapping: # dictionary of corresponding NeXus paths for the different axes coordinate_depends: - Ekin: "/entry/instrument/electronanalyser/energydispersion/kinetic_energy" - Angle: "/entry/instrument/electronanalyser/transformations/analyzer_dispersion" + Ekin: "/entry/instrument/electronanalyzer/energydispersion/kinetic_energy" + Angle: "/entry/instrument/electronanalyzer/transformations/analyzer_dispersion" polar: "/entry/sample/transformations/sample_polar" tilt: "/entry/sample/transformations/sample_tilt" azimuth: "/entry/sample/transformations/sample_azimuth" From fe3ce79a5ac72036bbdeebf56723de8045f48d38 Mon Sep 17 00:00:00 2001 From: rettigl Date: Mon, 24 Mar 2025 22:24:34 +0100 Subject: [PATCH 5/6] use newest pynxtools --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 44e7fdb..55403a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,8 +40,8 @@ dependencies = [ "matplotlib>=3.5.1", "numpy>=1.21.6", "opencv-python>=4.8.1.78", - "pynxtools-mpes>=0.2.1", - "pynxtools>=0.10.0", + "pynxtools-mpes@git+https:///github.com/FAIRmat-NFDI/pynxtools-mpes", + "pynxtools@git+https:///github.com/FAIRmat-NFDI/pynxtools", "python-dateutil>=2.8.2", "pyyaml>=6.0", "xarray>=0.20.2", From 35d602b8f1a35fa38f529cfb9da2c2e77c376761 Mon Sep 17 00:00:00 2001 From: rettigl Date: Wed, 26 Mar 2025 12:50:49 +0100 Subject: [PATCH 6/6] update pynxtools --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 55403a3..1d6ae8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,8 +40,8 @@ dependencies = [ "matplotlib>=3.5.1", "numpy>=1.21.6", "opencv-python>=4.8.1.78", - "pynxtools-mpes@git+https:///github.com/FAIRmat-NFDI/pynxtools-mpes", - "pynxtools@git+https:///github.com/FAIRmat-NFDI/pynxtools", + "pynxtools-mpes>=0.2.2", + "pynxtools>=0.10.1", "python-dateutil>=2.8.2", "pyyaml>=6.0", "xarray>=0.20.2",