feat: use live beam center throughout daq

This commit is contained in:
2026-08-25 09:30:59 +02:00
committed by perl_d
parent 7e203ce4a9
commit df376caf65
5 changed files with 23 additions and 73 deletions
-19
View File
@@ -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")
+2 -15
View File
@@ -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,
+14 -5
View File
@@ -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)
-19
View File
@@ -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)):
"""
+7 -15
View File
@@ -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}")