From 8f38053aeb2ee1478bffd9012b02d3a3dfd0cf1c Mon Sep 17 00:00:00 2001 From: x12sa Date: Fri, 17 Jul 2026 17:02:55 +0200 Subject: [PATCH] changes from the beamline --- .../widgets/saxs_widget/controls.py | 4 ++-- .../widgets/saxs_widget/saxs_widget.py | 20 +++++++++++++++++++ csaxs_bec/device_configs/bl_detectors.yaml | 4 ++-- csaxs_bec/devices/jungfraujoch/eiger.py | 13 +++++++++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/csaxs_bec/bec_widgets/widgets/saxs_widget/controls.py b/csaxs_bec/bec_widgets/widgets/saxs_widget/controls.py index 9e7d7d8..f64a815 100644 --- a/csaxs_bec/bec_widgets/widgets/saxs_widget/controls.py +++ b/csaxs_bec/bec_widgets/widgets/saxs_widget/controls.py @@ -270,10 +270,10 @@ class ROIMappingBox(QGroupBox): layout.setColumnStretch(2, 1) # An unknown calibration must not silently become a one-motor-unit-per-pixel scan. - self.camera_scale_pixel_x = spinbox(value=0.0, single_step=0.1, parent=self) + self.camera_scale_pixel_x = spinbox(value=0.0, single_step=0.1, decimals=6, parent=self) self.offset_cam_xray_x = spinbox(value=0.0, single_step=0.1, parent=self) self.direction_x = direction_combo(self) - self.camera_scale_pixel_y = spinbox(value=0.0, single_step=0.1, parent=self) + self.camera_scale_pixel_y = spinbox(value=0.0, single_step=0.1, decimals=6, parent=self) self.offset_cam_xray_y = spinbox(value=0.0, single_step=0.1, parent=self) self.direction_y = direction_combo(self) self.mapping_lock_toggle = ToggleSwitch(self, checked=False) diff --git a/csaxs_bec/bec_widgets/widgets/saxs_widget/saxs_widget.py b/csaxs_bec/bec_widgets/widgets/saxs_widget/saxs_widget.py index 12aa947..c84e6a9 100644 --- a/csaxs_bec/bec_widgets/widgets/saxs_widget/saxs_widget.py +++ b/csaxs_bec/bec_widgets/widgets/saxs_widget/saxs_widget.py @@ -13,6 +13,7 @@ from typing import Any, Literal from uuid import uuid4 from bec_lib import bec_logger +from bec_lib.endpoints import MessageEndpoints from bec_lib.messages import VariableMessage from bec_qthemes import material_icon from bec_widgets.utils.bec_widget import BECWidget @@ -115,6 +116,11 @@ class SAXSWidget(BECWidget, QWidget): self._sync_mapping_reference_to_display() self._refresh_crosshair_pin_if_enabled() + # Connect to ScanStatusUpdates + self.bec_dispatcher.connect_slot( + slot=self._deactivate_toggle_live_mode, topics = MessageEndpoints.scan_status() + ) + # ------------------------------------------------------------------ # UI construction # ------------------------------------------------------------------ @@ -284,8 +290,22 @@ class SAXSWidget(BECWidget, QWidget): self._clear_reference_crosshair_pin() # self.image.toggle_crosshair(False) + @SafeSlot(dict,dict) + def _deactivate_toggle_live_mode(self, content, _metadata) -> None: + status = content.get("status", "") + if status == "open": + enabled = False + else: + enabled = True + toggle_cam_action = self.image.toolbar.components.get_action("toggle_cam") + if toggle_cam_action is not None: + toggle_cam_action.action.setEnabled(enabled) + def _toggle_camera_live_mode(self, enabled: bool) -> None: # If enabled, set the camera to live mode, if disabled, stop the live mode. + dev_manager = self.bec_dispatcher.client.device_manager + if dev_manager.scan_info.msg is not None and dev_manager.scan_info.msg.status in ["open"]: + return # Ignore commands if scan is running device_name = getattr(self.image, "device", "") if device_name and device_name in self.dev: device = self.dev[device_name] diff --git a/csaxs_bec/device_configs/bl_detectors.yaml b/csaxs_bec/device_configs/bl_detectors.yaml index 0b5ca29..f49fc20 100644 --- a/csaxs_bec/device_configs/bl_detectors.yaml +++ b/csaxs_bec/device_configs/bl_detectors.yaml @@ -13,8 +13,8 @@ eiger_9: description: Eiger 9M detector deviceClass: csaxs_bec.devices.jungfraujoch.eiger_9m.Eiger9M deviceConfig: - detector_distance: 2200 - beam_center: [870, 1203] + detector_distance: 6975.225 + beam_center: [1149.71, 1450.89] onFailure: raise enabled: True readoutPriority: async diff --git a/csaxs_bec/devices/jungfraujoch/eiger.py b/csaxs_bec/devices/jungfraujoch/eiger.py index 042da1c..dc855cd 100644 --- a/csaxs_bec/devices/jungfraujoch/eiger.py +++ b/csaxs_bec/devices/jungfraujoch/eiger.py @@ -85,7 +85,7 @@ class Eiger(PSIDeviceBase): **kwargs: Additional keyword arguments. """ - USER_ACCESS = ["set_detector_distance", "set_beam_center"] + USER_ACCESS = ["set_detector_distance", "set_beam_center", "print_detector_distance_and_center"] file_event = Cpt(FileEventSignal, name="file_event") preview_image = Cpt(PreviewSignal, name="preview_image", ndim=2) @@ -160,6 +160,10 @@ class Eiger(PSIDeviceBase): """ self.detector_distance = distance + def print_detector_distance_and_center(self): + print(f"Detector Distance : {self.detector_distance}") + print(f"Beam cetner position (x,y) : {self.beam_center}") + # pylint: disable=missing-function-docstring @property def beam_center(self) -> tuple[float, float]: @@ -273,6 +277,9 @@ class Eiger(PSIDeviceBase): logger.info(f"Device {self.name} on_stage called.") start_time = time.time() self.scan_parameters = fetch_scan_info(self.scan_info) + if self.jfj_client.detector_state != DetectorState.IDLE: + self.jfj_client.stop(request_timeout=0.5) + self.jfj_client.wait_for_idle(timeout=5) # TODO Reactivate try: @@ -323,8 +330,8 @@ class Eiger(PSIDeviceBase): image_time_us=int(exp_time * 1e6), ntrigger=self._num_triggers, file_prefix=path, - beam_x_pxl=int(self._beam_center[0]), - beam_y_pxl=int(self._beam_center[1]), + beam_x_pxl=float(self._beam_center[0]), + beam_y_pxl=float(self._beam_center[1]), detector_distance_mm=self.detector_distance, incident_energy_ke_v=self._incident_energy, )