Source code for ewoksxrdct.tasks.create_nxxrdct
from typing import Optional
from typing import Union
from ewokscore import Task
from ewokscore.model import BaseInputModel
from ewokscore.model import BaseOutputModel
from nxxrdct import NXxrdct
from pydantic import Field
[docs]
class CreateNxxrdctInputModel(BaseInputModel, validate_assignment=True):
nx_path: str = Field(
...,
description="Full path to the NX file.",
)
bliss_path: Optional[str] = Field(
default=None, description="Path to the HDF5 master file."
)
title: Optional[str] = Field(default=None, description="Title of experiment.")
start_time: Optional[str] = Field(
default=None, description="Start time of the scan."
)
end_time: Optional[str] = Field(default=None, description="End time of the scan.")
beam_incident_energy: Optional[float] = Field(
default=None,
description="Incident energy of the beam.",
)
detector_data: Optional[str] = Field(
default=None, description="Data url to the AI data."
)
detector_polar_angle: Optional[str] = Field(
default=None, description="Polar angle outputted from AI."
)
detector_count_time: Optional[float] = Field(
default=None, description="Time to record a single frame."
)
detector_distance: Optional[float] = Field(
default=None, description="Distance between the detector and sample."
)
detector_x_pixel_size: Optional[float] = Field(
default=None, description="The detector pixel size in the x direction."
)
detector_y_pixel_size: Optional[float] = Field(
default=None, description="The detector pixel size in the y direction."
)
detector_diffraction_channel: Optional[str] = Field(
default=None, description="The diffraction channel of the detector."
)
source_name: Optional[str] = Field(default=None, description="Name of the source.")
source_type: Optional[str] = Field(default=None, description="Type of the source.")
source_probe: Optional[str] = Field(
default="XRAYS", description="Probe of the source."
)
monochromator_wavelength: Optional[float] = Field(
default=None,
description="Wavelength.",
)
sample_name: Optional[str] = Field(default=None, description="Name of the sample.")
sample_rotation_angles: Union[str, list, None] = Field(
default=None, description="Rotation angles (one per frame)."
)
sample_translation_values: Union[str, list, None] = Field(
default=None, description="Translation values (one per frame)."
)
sample_x_translation: Union[str, list, None] = Field(
default=None, description="Translation values of x."
)
sample_y_translation: Union[str, list, None] = Field(
default=None, description="Translation values of y."
)
sample_z_translation: Union[str, list, None] = Field(
default=None, description="Translation values of z."
)
monitor_data: Optional[list] = Field(
default=None, description="Data from the fpico meter."
)
monitor_mode: Optional[str] = Field(
default=None, description="Mode of the monitor."
)
monitor_preset: Optional[str] = Field(
default=None, description="Preset of the monitor."
)
monitor_integral: Optional[float] = Field(default=None, description="Integral.")
[docs]
class CreateNxxrdctOutputModel(BaseOutputModel):
nx_path: str = Field(
...,
description="Full path to the NX file.",
)
[docs]
class CreateNxxrdct(
Task,
input_model=CreateNxxrdctInputModel,
output_model=CreateNxxrdctOutputModel,
):
[docs]
def build_nx_object(self) -> NXxrdct:
"""Create the NX object."""
nx = NXxrdct()
nx.title = self.inputs.title
nx.start_time = self.inputs.start_time
nx.end_time = self.inputs.end_time
nx.beam.incident_energy = self.inputs.beam_incident_energy
nx.instrument.detector.data = self.inputs.detector_data
nx.instrument.detector.polar_angle = self.inputs.detector_polar_angle
nx.instrument.detector.count_time = self.inputs.detector_count_time
nx.instrument.detector.distance = self.inputs.detector_distance
nx.instrument.detector.x_pixel_size = self.inputs.detector_x_pixel_size
nx.instrument.detector.y_pixel_size = self.inputs.detector_y_pixel_size
nx.instrument.detector.diffraction_channel = (
self.inputs.detector_diffraction_channel
)
nx.instrument.source.name = self.inputs.source_name
nx.instrument.source.type = self.inputs.source_type
nx.instrument.source.probe = self.inputs.source_probe
nx.instrument.monochromator.wavelength = self.inputs.monochromator_wavelength
nx.sample.name = self.inputs.sample_name
nx.sample.rotation_angle = self.inputs.sample_rotation_angles
nx.sample.translation_values = self.inputs.sample_translation_values
nx.sample.x_translation = self.inputs.sample_x_translation
nx.sample.y_translation = self.inputs.sample_y_translation
nx.sample.z_translation = self.inputs.sample_z_translation
nx.control.data = self.inputs.monitor_data
nx.control.mode = self.inputs.monitor_mode
nx.control.preset = self.inputs.monitor_preset
nx.control.integral = self.inputs.monitor_integral
return nx
[docs]
def save_nx_file(self, nx: NXxrdct, save_path: str) -> None:
"""Save the NX object at the specified file path."""
nx.save(file_path=save_path, data_path="entry")
[docs]
def run(self) -> None:
"""Execute the task to create an NX file from the given inputs."""
nx = self.build_nx_object()
output_path = self.inputs.nx_path
self.save_nx_file(nx, output_path)
self.outputs.nx_path = output_path