diff --git a/csaxs_bec/devices/jungfraujoch/eiger.py b/csaxs_bec/devices/jungfraujoch/eiger.py index e8d94d2..a868783 100644 --- a/csaxs_bec/devices/jungfraujoch/eiger.py +++ b/csaxs_bec/devices/jungfraujoch/eiger.py @@ -36,6 +36,7 @@ import os import time from typing import TYPE_CHECKING, Literal +import numpy as np import yaml from bec_lib.file_utils import get_full_path from bec_lib.logger import bec_logger @@ -117,6 +118,8 @@ class Eiger(PSIDeviceBase): self._full_path = "" self._num_triggers = 0 self._wait_for_on_complete = 20 # seconds + # Initial incident energy in keV, if restarted None + self._incident_energy: float | None = None if self.device_manager is not None: self.device_manager: DeviceManagerDS self.scan_parameters: ScanServerScanInfo | None = None @@ -272,7 +275,25 @@ class Eiger(PSIDeviceBase): # TODO: Check mono energy from device in BEC # Setting incident energy in keV - incident_energy = 12.0 + + try: + incident_energy = self._get_beam_energy(self.device_manager) + if self._incident_energy is None: + self._incident_energy = incident_energy + elif not np.isclose( + self._incident_energy, incident_energy, atol=0.01 + ): # 10 keV tolerance + logger.warning( + f"Incident energy changed from {self._incident_energy} keV to {incident_energy} keV for device {self.name}. " + ) + self._incident_energy = incident_energy + except Exception as e: + logger.warning(f"Failed to set up beam energy for {self.name}: {e}") + incident_energy = 12.0 # default to 12 keV if error occurs + self._incident_energy = incident_energy + + logger.info(f"Device {self.name} uses incident energy of {incident_energy} keV.") + # Setting up exp_time and num_triggers acquisition parameter exp_time = self.scan_parameters.exp_time if exp_time <= self._readout_time: # Exp_time must be at least the readout time @@ -417,3 +438,18 @@ class Eiger(PSIDeviceBase): self.jfj_preview_client.stop() self.on_stop() return super().on_destroy() + + def _get_beam_energy(self, device_manager: DeviceManagerDS) -> float: + """ + Fetch the beam energy from the device manager. + + Args: + device_manager (DeviceManagerDS): The device manager to fetch the beam energy from. + + Returns: + float: The beam energy in keV. + """ + if hasattr(device_manager, "devices") and hasattr(device_manager.devices, "ccm_energy"): + energy = device_manager.devices.ccm_energy.get() + + return energy