fix(eiger): Eiger should take initial energy from ccm

This commit is contained in:
2026-06-19 13:36:55 +02:00
parent 06507d01b8
commit cfef28e755
+37 -1
View File
@@ -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