From df376caf659fd96a73e4ff5d73c4353c4b8d3abe Mon Sep 17 00:00:00 2001 From: David Perl Date: Fri, 21 Aug 2026 13:17:34 +0200 Subject: [PATCH] feat: use live beam center throughout daq --- src/aare/daq/config.py | 19 ------------------- src/aare/daq/daq.py | 17 ++--------------- src/aare/daq/devices.py | 19 ++++++++++++++----- src/aare/daq/server.py | 19 ------------------- src/aare/gui/panels/beam_center_panel.py | 22 +++++++--------------- 5 files changed, 23 insertions(+), 73 deletions(-) diff --git a/src/aare/daq/config.py b/src/aare/daq/config.py index 421c1c91..24b44759 100644 --- a/src/aare/daq/config.py +++ b/src/aare/daq/config.py @@ -632,25 +632,6 @@ class BeamlineConfig: lens_factor = DEFAULT_LENS_MAGNIFICATION / lens_magnification return float(np.log(lens_factor / (b * target_pixel_in_mm)) / a) - @property - def beam_center(self) -> tuple[float, float]: - tmp_x = self._client.get(f"{self._bl}:beam_center_x") - tmp_y = self._client.get(f"{self._bl}:beam_center_y") - if tmp_x: - val_x = float(tmp_x) - else: - val_x = 0 - if tmp_y: - val_y = float(tmp_y) - else: - val_y = 0 - return val_x, val_y - - @beam_center.setter - def beam_center(self, data: tuple[float, float]): - self._client.set(f"{self._bl}:beam_center_x", data[0]) - self._client.set(f"{self._bl}:beam_center_y", data[1]) - @property def beam_size_mm(self) -> Coordinate: tmp_x = self._client.get(f"{self._bl}:beam_size_x") diff --git a/src/aare/daq/daq.py b/src/aare/daq/daq.py index 6f357d3a..5e90d291 100644 --- a/src/aare/daq/daq.py +++ b/src/aare/daq/daq.py @@ -275,7 +275,7 @@ class AareDAQ: self.last_time = 0.0 self._dispatch = dispatch self._cfg = cfg - self._devs = BeamlineDevices(bl) + self._devs = BeamlineDevices(bl, dispatch) self._mlbox = MlBox(bl) self._jfjoch = JFJochWrapper(bl) self._bl = bl.value.upper() @@ -2259,14 +2259,6 @@ class AareDAQ: ) return sample_geom - @property - def beam_center(self) -> tuple[float, float]: - return self._cfg.beam_center - - @beam_center.setter - def beam_center(self, val: tuple[float, float]): - self._cfg.beam_center = val - @property def beam_size_mm(self) -> Coordinate: return self._cfg.beam_size_mm @@ -3157,17 +3149,12 @@ class AareDAQ: detector_serial_number = str(metadata.get("detector_serial_number", "unavailable")) energy = self._devs.energy_kev dtz = self._devs.dtz - beam_center_x, beam_center_y = self._dispatch.geo.beam_centre_model.predict( - dtz, self._devs.dty - ) - beam_center_x, beam_center_y = float(beam_center_x[0]), float(beam_center_y[0]) - return DiffractionGeometry( energy_keV=energy, dtz_mm=dtz, detector_size_pxl=(width, height), pixel_size_mm=pixel_size_mm, - beam_center_pxl=(beam_center_x, beam_center_y), + beam_center_pxl=self._devs.detector_beam_centre_px, detector_description=detector_description, detector_serial_number=detector_serial_number, poni_rot1_rad=-0.001396263, diff --git a/src/aare/daq/devices.py b/src/aare/daq/devices.py index 4a16fa8b..aa0bd4bf 100644 --- a/src/aare/daq/devices.py +++ b/src/aare/daq/devices.py @@ -1,10 +1,6 @@ # Abstractions of devices for beamline import time -# Each "standard" device needs three elements: -# - property to read device value -# - setter with option to do sync/async move -# - property setter, which assumes that sync move is done (excl. zoom, which is async by default) from aarecommon.config.beamline import cfg_get from aarecommon.config.logger import setup_logger from aarecommon.config.logger_events import log_timing @@ -13,6 +9,11 @@ from aarecommon.models.beamline import MXBeamline from aarecommon.models.models import BeamlineStateEnum, SampleCameraSettings, StagePositionEnum from epics import PV +# Each "standard" device needs three elements: +# - property to read device value +# - setter with option to do sync/async move +# - property setter, which assumes that sync move is done (excl. zoom, which is async by default) +from aare.beamline_dispatch.protocols import BeamlineDispatch from aare.devices import aerotech, smargon from aare.devices.area_detector import AutoEnum, epicsAD from aare.devices.bec_worker import BECClientWorker @@ -27,7 +28,8 @@ logger = setup_logger("aareDAQ") class BeamlineDevices: - def __init__(self, beamline: MXBeamline): + def __init__(self, beamline: MXBeamline, dispatch: BeamlineDispatch): + self._dispatch = dispatch self._beamline = beamline BEAMLINE = beamline.value.upper() self.tell = make_tell_client(beamline) @@ -157,6 +159,13 @@ class BeamlineDevices: def lamp_light(self) -> float: return self._front_light.value + @property + def detector_beam_centre_px(self) -> tuple[float, float]: + beam_center_x, beam_center_y = self._dispatch.geo.beam_centre_model.predict( + self.dtz, self.dty + ) + return float(beam_center_x[0]), float(beam_center_y[0]) + @lamp_light.setter def lamp_light(self, v: float): self.set_front_light(v, wait=False) diff --git a/src/aare/daq/server.py b/src/aare/daq/server.py index 42b3f1cb..86ad4489 100644 --- a/src/aare/daq/server.py +++ b/src/aare/daq/server.py @@ -932,25 +932,6 @@ async def clear_beam_mark(token: str = Depends(oauth2_scheme)): return "OK" -@app.post("/beamline/beam_center") -async def beam_center(x: float, y: float, token: str = Depends(oauth2_scheme)): - """ - Set the beam center position. Staff only. - - Args: - x: X coordinate in pixels. - y: Y coordinate in pixels. - token: OAuth2 access token. - - Returns: - "OK" on success. - """ - logger.debug(f"Beam Center {x}, {y}") - auth.check_jwt_staff(cfg, auth.parse_token(token)) - daq.beam_center = (x, y) - return "OK" - - @app.post("/beamline/beam_size_mm") async def beam_size_mm(x: float, y: float, token: str = Depends(oauth2_scheme)): """ diff --git a/src/aare/gui/panels/beam_center_panel.py b/src/aare/gui/panels/beam_center_panel.py index 45236fbb..6aaf71ee 100644 --- a/src/aare/gui/panels/beam_center_panel.py +++ b/src/aare/gui/panels/beam_center_panel.py @@ -2,7 +2,6 @@ from aarecommon.models.models import DAQStatusModel from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import QGridLayout, QLabel, QWidget -from aare.gui.widgets.number_line_edit import NumberLineEdit from aare.gui.widgets.title_label import section_title @@ -16,23 +15,16 @@ class BeamCenterWidget(QWidget): grid_layout.addWidget(section_title("Beam center (detector)", self), 0, 0, 1, 5) - self.x = NumberLineEdit(-4000, 4000, 0, parent=self) - self.x.newValue.connect(self.beam_center_edited) - - self.y = NumberLineEdit(-4000, 4000, 0, parent=self) - self.y.newValue.connect(self.beam_center_edited) + self._x = QLabel("...") + self._y = QLabel("...") grid_layout.addWidget(QLabel("x:"), 1, 0) - grid_layout.addWidget(self.x, 1, 1) + grid_layout.addWidget(self._x, 1, 1) grid_layout.addWidget(QLabel("y:"), 1, 2) - grid_layout.addWidget(self.y, 1, 3) - grid_layout.addWidget(QLabel("pxl"), 1, 4) + grid_layout.addWidget(self._y, 1, 3) + grid_layout.addWidget(QLabel("px"), 1, 4) @Slot(DAQStatusModel) def update_daq_status(self, s: DAQStatusModel): - self.x.update_value(s.diffraction.beam_center_pxl[0]) - self.y.update_value(s.diffraction.beam_center_pxl[1]) - - @Slot(float) - def beam_center_edited(self, _: float): - self.beam_center.emit(self.x.value, self.y.value) + self._x.setText(f"{s.diffraction.beam_center_pxl[0]:.1f}") + self._y.setText(f"{s.diffraction.beam_center_pxl[1]:.1f}")