Fix Eiger to respect message_severity of JFJ broker status #199
@@ -354,7 +354,20 @@ class Eiger(PSIDeviceBase):
|
||||
timeout = self._wait_for_on_complete
|
||||
while time.time() - start_time < timeout:
|
||||
if self.jfj_client.wait_for_idle(timeout=1, raise_on_timeout=False):
|
||||
# TODO: Once available, add check for
|
||||
# Call API endpoints to get broker status
|
||||
broker_status = self.jfj_client.jfj_status
|
||||
if broker_status.message_severity not in [
|
||||
"success",
|
||||
"info",
|
||||
]: # Log if not success or info
|
||||
logger.info(
|
||||
f"JungfrauJoch broker status: {yaml.dump(broker_status.to_dict(), indent=4)}"
|
||||
)
|
||||
if broker_status.message_severity == "error": # Raise on error
|
||||
raise EigerError(
|
||||
f"Device {self.name} acquisition completed with error status from JungfrauJoch broker: {yaml.dump(broker_status.to_dict(), indent=4)}"
|
||||
)
|
||||
# Call API endpoint to get statistics
|
||||
statistics: MeasurementStatistics = (
|
||||
self.jfj_client.api.statistics_data_collection_get(_request_timeout=5)
|
||||
)
|
||||
@@ -363,8 +376,10 @@ class Eiger(PSIDeviceBase):
|
||||
f"Device {self.name} acquisition incomplete. "
|
||||
f"Expected {self._num_triggers} triggers, "
|
||||
f"but only {statistics.images_collected} were collected."
|
||||
f"\n\nBroker status: \n{yaml.dump(broker_status.to_dict(), indent=4)} \n\n"
|
||||
f"Measurement statistics: \n{yaml.dump(statistics.to_dict(), indent=4)}"
|
||||
)
|
||||
return
|
||||
return # Acquisition completed successfully, if none of the above conditions were met
|
||||
logger.info(
|
||||
f"Waiting for device {self.name} to finish complete, time elapsed: "
|
||||
f"{time.time() - start_time}."
|
||||
|
||||
@@ -20,7 +20,7 @@ from jfjoch_client.models.measurement_statistics import MeasurementStatistics
|
||||
from ophyd import Staged
|
||||
from ophyd_devices.utils.psi_device_base_utils import DeviceStatus
|
||||
|
||||
from csaxs_bec.devices.jungfraujoch.eiger import Eiger
|
||||
from csaxs_bec.devices.jungfraujoch.eiger import EigerError
|
||||
from csaxs_bec.devices.jungfraujoch.eiger_1_5m import Eiger1_5M
|
||||
from csaxs_bec.devices.jungfraujoch.eiger_9m import Eiger9M
|
||||
|
||||
@@ -284,7 +284,9 @@ def test_eiger_on_complete(eiger_1_5m, raise_timeout):
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
eiger.jfj_client.api, "status_get", return_value=BrokerStatus(state="Idle")
|
||||
eiger.jfj_client.api,
|
||||
"status_get",
|
||||
return_value=BrokerStatus(state="Idle", message_severity="info"),
|
||||
),
|
||||
mock.patch.object(eiger.jfj_client, "wait_for_idle", side_effect=mock_wait_for_idle),
|
||||
mock.patch.object(
|
||||
@@ -312,6 +314,43 @@ def test_eiger_on_complete(eiger_1_5m, raise_timeout):
|
||||
assert status.success == False if raise_timeout else True
|
||||
|
||||
|
||||
def test_eiger_on_complete_error_message(eiger_1_5m):
|
||||
"""Test that on_complete raises if the message severity is error."""
|
||||
# Test that on_complete raises if message_severity is error
|
||||
eiger = eiger_1_5m
|
||||
unblock_wait_for_idle = threading.Event()
|
||||
raise_timeout = False
|
||||
|
||||
def mock_wait_for_idle(timeout: float, raise_on_timeout: bool) -> bool:
|
||||
if unblock_wait_for_idle.wait(timeout):
|
||||
if raise_timeout:
|
||||
return False
|
||||
return True
|
||||
return False
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
eiger.jfj_client.api,
|
||||
"status_get",
|
||||
return_value=BrokerStatus(state="Idle", message_severity="error", message="Test error"),
|
||||
),
|
||||
mock.patch.object(eiger.jfj_client, "wait_for_idle", side_effect=mock_wait_for_idle),
|
||||
mock.patch.object(
|
||||
eiger.jfj_client.api,
|
||||
"statistics_data_collection_get",
|
||||
return_value=MeasurementStatistics(
|
||||
run_number=1,
|
||||
images_collected=eiger.scan_info.msg.num_points
|
||||
* eiger.scan_info.msg.scan_parameters["frames_per_trigger"],
|
||||
),
|
||||
),
|
||||
):
|
||||
with pytest.raises(EigerError):
|
||||
status = eiger.complete()
|
||||
unblock_wait_for_idle.set()
|
||||
status.wait(timeout=2)
|
||||
|
||||
|
||||
def test_eiger_file_event_callback(eiger_1_5m, tmp_path):
|
||||
"""Test the file_event callback of the Eiger detector. This is equivalent for 9M and 1_5M."""
|
||||
eiger = eiger_1_5m
|
||||
|
||||
Reference in New Issue
Block a user