fix(eiger): Eiger should take initial energy from ccm
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user