Source code for ewoksid11.pdfgetx_save_nexus
import h5py
import os.path
import json
from silx.io.dictdump import dicttonx
from ewoksxrpd.tasks.data_access import TaskWithDataAccess
from .constants import SIGNAL_TYPES
try:
from diffpy import pdfgetx
VERSION = pdfgetx.__version__
except ImportError:
VERSION = None
[docs]class PdfGetXSaveNexus(
TaskWithDataAccess,
input_names=[
"output_filename",
"scan",
"detector_name",
"result",
"pdfgetx_options",
],
optional_input_names=["subscan"],
output_names=["output_url"],
):
"""
Saves the PDF result (iq, sq, fq, gr) in a NeXus file
Inputs:
- output_filename: h5file name where the data must be saved
- scan: scan number
- detector name: name of the detector
- result: PDFGetter object with attributes defined by outputtype. Attributes are tuples with [0] X (radial) and [1] Y (intensity)
Outputs:
- output_url: URL of the NXprocess containing the saved data
"""
[docs] def run(self):
scan = self.inputs.scan
subscan = self.get_input_value("subscan", 1)
detector_name = self.inputs.detector_name
output_filename = self.inputs.output_filename
output_url = f"silx://{output_filename}?path=/{scan}.{subscan}"
result = self.inputs.result
info = pdfgetx_config_as_nxdict(self.inputs.pdfgetx_options)
with self.open_h5item(output_url, mode="a", create=True) as data_parent:
assert isinstance(data_parent, h5py.Group)
nxprocess = data_parent.create_group(f"{detector_name}_PDF")
nxprocess.attrs["NX_class"] = "NXprocess"
dicttonx(
info, data_parent.file, h5path=f"{nxprocess.name}", update_mode="modify"
)
for signal_type, signal_quantities in SIGNAL_TYPES.items():
nxdata = nxprocess.create_group(signal_type)
nxdata.attrs["NX_class"] = "NXdata"
axis, signal = getattr(result, signal_type)
signal_dset = nxdata.create_dataset(signal_type, data=signal)
nxdata.attrs["signal"] = signal_type
signal_dset.attrs["long_name"] = signal_quantities["y"].name
signal_dset.attrs["units"] = signal_quantities["y"].unit
axis_name, axis_unit = signal_quantities["x"]
axis_dset = nxdata.create_dataset(axis_name, data=axis)
axis_dset.attrs["unit"] = axis_unit
nxdata.attrs["axes"] = axis_name
nxprocess.attrs["default"] = signal_type
nxprocess.parent.attrs["default"] = os.path.basename(nxprocess.name)
self.outputs.output_url = f"silx://{output_filename}?path={nxprocess.name}"
[docs]def pdfgetx_config_as_nxdict(pdfgetx_config: dict) -> dict:
"""Convert pdfgetx config to a Nexus dictionary. Add keys and units when appropriate."""
nxtree_dict = {
"@NX_class": "NXprocess",
"program": "pdfgetx",
"version": VERSION,
}
nxtree_dict["configuration"] = {
"@NX_class": "NXnote",
"type": "application/json",
"data": json.dumps(pdfgetx_config),
}
return nxtree_dict