From a449b00d043d759d909dcc68476a701cf976d51c Mon Sep 17 00:00:00 2001 From: David Perl Date: Tue, 25 Aug 2026 13:02:01 +0200 Subject: [PATCH] fix: tidy bec client init and shutdown --- src/aare/daq/daq.py | 3 ++ src/aare/daq/devices.py | 2 -- src/aare/daq/server.py | 1 + src/aare/devices/bec_worker.py | 50 +++++++++------------------------- 4 files changed, 17 insertions(+), 39 deletions(-) diff --git a/src/aare/daq/daq.py b/src/aare/daq/daq.py index 60d785fd..82f10e6d 100644 --- a/src/aare/daq/daq.py +++ b/src/aare/daq/daq.py @@ -303,6 +303,9 @@ class AareDAQ: pgroup_provider=_DAQPGroupProvider(self), ) + def shutdown(self): + self._devs.bec_worker.shutdown() + def _cached_detector_metadata(self) -> dict: return self._cfg.cached_detector_metadata diff --git a/src/aare/daq/devices.py b/src/aare/daq/devices.py index aa0bd4bf..1560286b 100644 --- a/src/aare/daq/devices.py +++ b/src/aare/daq/devices.py @@ -34,9 +34,7 @@ class BeamlineDevices: BEAMLINE = beamline.value.upper() self.tell = make_tell_client(beamline) self.aerotech = aerotech.AerotechController(beamline) - logger.debug("initialising BEC worker") self.bec_worker = BECClientWorker(beamline) - logger.debug("initialising BEC worker done") self._smargon = smargon.Smargon(beamline) self.exp_shutter = ExperimentalHutchShutter(beamline=self._beamline) # Personnel Safety System: gates whether the robot is allowed to move. diff --git a/src/aare/daq/server.py b/src/aare/daq/server.py index 86ad4489..cb3b4ed2 100644 --- a/src/aare/daq/server.py +++ b/src/aare/daq/server.py @@ -133,6 +133,7 @@ async def lifespan(application: FastAPI): yield # ── application serves requests here ── # Shutdown: add cleanup here if needed + daq.shutdown() logger.info(f"Worker {os.getpid()} shutting down.") diff --git a/src/aare/devices/bec_worker.py b/src/aare/devices/bec_worker.py index a06824fd..680d8856 100644 --- a/src/aare/devices/bec_worker.py +++ b/src/aare/devices/bec_worker.py @@ -11,7 +11,6 @@ from aarecommon.models.models import BeamlineStateEnum from bec_ipython_client import BECIPythonClient from bec_ipython_client.signals import OperationMode from bec_lib.device import RPCError, ScanRequestError -from bec_lib.procedures.helper import FrontendProcedureHelper from bec_lib.service_config import ServiceConfig from aare.beamline_dispatch.beamline_dispatch import get_beamline_dispatch @@ -70,6 +69,7 @@ def _bec_state_to_aare_state(bec_state: BeamlineState) -> BeamlineStateEnum: class BECClientWorker: def __init__(self, beamline: MXBeamline, name: str = "default"): + logger.debug(f"initialising BEC worker for {beamline}") BEAMLINE = beamline.value.lower() self.beamline = beamline if self.beamline is MXBeamline.X06DA: @@ -87,31 +87,29 @@ class BECClientWorker: if self.beamline is MXBeamline.SIMULATED: self.simulated = True - + host = "localhost" else: self.simulated = False - logger.debug(f"Initializing BECClientWorker for {BEAMLINE} beamline") host = cfg_get("daq.hardware.bec_url", f"{BEAMLINE}-bec-001.psi.ch") - service_config = ServiceConfig(redis={"host": host, "port": 6379}) - service_config.config["log_writer"]["base_path"] = "/tmp/logs" - # service_config.config["user_macros"]["base_path"]=f'/sls/{BEAMLINE}/config/bec/production/pxiii_bec/pxiii_bec' - # print(service_config.config) + service_config = ServiceConfig(redis={"host": host, "port": 6379}) + service_config.config["log_writer"]["base_path"] = "/tmp/logs" + try: self.client = BECIPythonClient(config=service_config, mode=OperationMode.Procedure) self.client.start() - # self.client.config.update_session_with_file("/sls/x10sa/config/bec/production/bec/bec_lib/bec_lib/config_helper.py") self.dev = self.client.device_manager.devices - print(self.dev.keys()) self.scans = self.client.scans self.macros = self.dispatch.bec_macros - self.helper = FrontendProcedureHelper(self.client.connector) self._set_scilog_tags() - try: - self._init_beamline_environment() - except Exception: - logger.exception("Error initialising BEC devices") - sys.exit(1) + self._init_beamline_environment() + except Exception: + logger.exception("Error initialising BEC devices") + self.client.shutdown() + sys.exit(1) logger.debug(f"simulated is {self.simulated}") + def shutdown(self): + self.client.shutdown() + def _init_beamline_environment(self): try: self.position_devices, self.planner = self.macros.init_beamline_environment() @@ -246,28 +244,6 @@ class BECClientWorker: except Exception: logger.exception("Error sending scilog message") - def run_macro(self, macro_name: str, *args, queue: str = "default", **kwargs): - if self.simulated: - logger.debug(f"Simulating macro {macro_name}") - return None - try: - return self.client.proc.run_macro(macro_name, *args, queue=queue) - except Exception as e: - raise self._bec_error(e, operation=f"run_macro:{macro_name}") from e - - def run_macro_blocked(self, macro_name: str, *args, queue: str = "default", **kwargs): - if self.simulated: - logger.debug(f"Simulating macro {macro_name}") - return None - try: - status = self.run_macro(macro_name, *args, queue=queue) - print(status) - status.wait() - print(status) - return status - except Exception as e: - raise self._bec_error(e, operation=f"run_macro_blocked:{macro_name}") from e - @log_timing(logger, "BEC move_to") def move_to(self, state: BeamlineState): start = time.perf_counter()