diff --git a/src/aare/daq/config.py b/src/aare/daq/config.py index 77a64327..049c1da4 100644 --- a/src/aare/daq/config.py +++ b/src/aare/daq/config.py @@ -98,6 +98,27 @@ class BeamlineConfig: host = cfg_get("daq.hardware.redis_url", f"{self.__bl}-redis.psi.ch") self.__client = redis.Redis(host=host, port=6379, db=0, decode_responses=True) self.simulated_detector = bl is MXBeamline.SIMULATED + self._initialize_optional_yaml_defaults() + + def _initialize_optional_yaml_defaults(self) -> None: + raw_dtz_safe_position = cfg_get("daq.hardware.dtz_safe_position") + + if raw_dtz_safe_position in (None, ""): + return + + if self.dtz_safe_position is not None: + return + + try: + self.dtz_safe_position = float(raw_dtz_safe_position) + logger.info( + f"Initialized dtz_safe_position from beamline config: {self.dtz_safe_position}" + ) + except (TypeError, ValueError) as e: + logger.warning( + f"Ignoring invalid daq.hardware.dtz_safe_position value: " + f"{raw_dtz_safe_position!r} ({e})" + ) #GUI session management @@ -820,7 +841,7 @@ class BeamlineConfig: def dtz_safe_position(self) -> float | None: tmp = self.__client.get(f"{self.__bl}:dtz_safe_position") if tmp is None: - return 200.0 + return None return float(tmp) @dtz_safe_position.setter @@ -1197,4 +1218,5 @@ if __name__ == "__main__": cfg = BeamlineConfig(bl=mx_beamline()) # cfg.allow_non_staff_request_from_staff = True # cfg.state_busy = False - cfg.abr_meas_pos = AerotechCoordinate(at_mm=Coordinate(x=0.0,y=0.0,z=0.0)) \ No newline at end of file + #fg.abr_meas_pos = AerotechCoordinate(at_mm=Coordinate(x=0.0,y=0.0,z=0.0)) + cfg.dtz_safe_position = 300.0 \ No newline at end of file diff --git a/src/aare/daq/workflows.py b/src/aare/daq/workflows.py index 53834b66..4a1fa4bc 100644 --- a/src/aare/daq/workflows.py +++ b/src/aare/daq/workflows.py @@ -1,10 +1,10 @@ from aare.common.models import SampleCameraSettings -from aare.daq.devices import BeamlineDevices -from aare.daq.config import BeamlineConfig, ABR_POS_MOUNT, ABR_OMEGA_MOUNT +from aare.common.logger_config import setup_logger from aare.devices.area_detector import AutoEnum -from aare.common.logger_config import setup_logger from aare.devices.bec_worker import BeamlineState +from aare.daq.devices import BeamlineDevices +from aare.daq.config import BeamlineConfig, ABR_POS_MOUNT, ABR_OMEGA_MOUNT import time @@ -12,7 +12,32 @@ logger = setup_logger("aareDAQ") SAFE_POSITION = 600 + +def _move_detector_to_safe_position_if_needed(devs: BeamlineDevices, cfg: BeamlineConfig): + safe_position = cfg.dtz_safe_position + current_dtz = cfg.dtz + + if safe_position is None: + logger.debug("No dtz_safe_position configured; skipping detector move") + return + + if current_dtz is None: + logger.debug("Current dtz is unknown; skipping detector safe-position move") + return + + if current_dtz < safe_position: + logger.info(f"Moving detector to safe position {safe_position}") + return devs.bec_worker.det_z(value=safe_position) + + logger.debug( + f"Detector already at or beyond safe position " + f"(current={current_dtz}, safe={safe_position}); skipping move" + ) + return None + + def common_2rse(devs: BeamlineDevices, cfg: BeamlineConfig): + _move_detector_to_safe_position_if_needed(devs, cfg) devs.bec_worker.move_to(BeamlineState.ROBOT_SAMPLE_EXCHANGE) print('move smargon home') devs.smargon_move_home() @@ -123,9 +148,7 @@ def sa2dc(devs: BeamlineDevices, cfg: BeamlineConfig): logger.info(f"sam cam auto exposure in {time.perf_counter() - start:.2f}") def dc2sa(devs: BeamlineDevices, cfg: BeamlineConfig): - status = None - if cfg.dtz and cfg.dtz < SAFE_POSITION: - status = devs.bec_worker.det_z(value=SAFE_POSITION) + status = _move_detector_to_safe_position_if_needed(devs, cfg) devs.samcam_auto(AutoEnum.AUTO) devs.bec_worker.move_to(BeamlineState.SAMPLE_ALIGNMENT) devs.aerotech_pos = cfg.abr_meas_pos @@ -215,7 +238,6 @@ def common2maintenance(devs: BeamlineDevices, cfg: BeamlineConfig): if __name__ == "__main__": from aare.common.beamline import mx_beamline - import time beamline = mx_beamline() config = BeamlineConfig(beamline) devices = BeamlineDevices(beamline)