Source code for ewoksbm29.tasks.read
from ewokscore import Task
from ..io.read_offline import read_scan_data_slice as read_offline
from ..io.read_online import read_scan_data_slice as read_online
[docs]
class ReadScanDataSlice(
Task,
optional_input_names=[
"lima_file_index",
"dahu_to_counter_name",
"storage_ring_current",
"exposure_time",
# Online:
"scan_key",
"retry_timeout",
"retry_period",
# Offline:
"scan_file_path",
"scan_number",
],
output_names=[
"scan_data_slice",
"has_data",
"lima_file_index",
"next_lima_file_index",
],
):
"""Return a subset of `IntegrateParameters` for a SAXS scan index range covered
by the lima file with index `lima_file_index`.
Optional inputs (online & offline):
- lima_file_index (int): Lima file index that determines the scan slice.
- dahu_to_counter_name (dict): Map counter names to `IntegrateParameters` keys.
- storage_ring_current (float): Storage ring current in mA.
- exposure_time (float): Scan point exposure time in s.
Optional inputs (online):
- scan_key (str): Blissdata scan key (tries offline when fails).
- retry_timeout (float): Timeout when trying to access the Lima image dataset or wait for the scan to be PREPARED.
- retry_period (float): Period in retry loops.
Optional inputs (offline):
- scan_file_path (str): Bliss scan file name.
- scan_number (str): Bliss scan number.
Outputs:
- scan_data_slice (dict): Subset of `IntegrateParameters` related to the scan data.
- has_data (bool): `scan_data_slice` contains a non-empty scan data slice.
- lima_file_index (int): The lime file index to which `scan_data_slice` belongs.
- next_lima_file_index (int): The next Lima file index.
"""
[docs]
def run(self):
lima_file_index: int = self.get_input_value("lima_file_index", None) or 0
params = self.get_input_values()
if self._has_online_parameters():
try:
scan_data_slice = read_online(**params)
except Exception:
if not self._has_offline_parameters():
raise
scan_data_slice = read_offline(**params)
elif self._has_offline_parameters():
scan_data_slice = read_offline(**params)
else:
raise ValueError("Requires 'scan_key' or 'scan_file_path' + 'scan_number'")
if not scan_data_slice:
scan_data_slice = {"frame_ids": []}
self.outputs.scan_data_slice = scan_data_slice
has_data = bool(scan_data_slice["frame_ids"])
self.outputs.has_data = has_data
self.outputs.lima_file_index = lima_file_index
if has_data:
self.outputs.next_lima_file_index = lima_file_index + 1
else:
self.outputs.next_lima_file_index = lima_file_index
def _has_offline_parameters(self) -> bool:
return bool(
self.get_input_value("scan_file_path")
and self.get_input_value("scan_number")
)
def _has_online_parameters(self) -> bool:
return bool(self.get_input_value("scan_key"))