gitea workflows: added missing dependency imports, remove redundant mlbox_logic test, update workdflows and bec_worker due to local import
Build and Publish / test (push) Failing after 1m11s
Build and Publish / build (push) Has been skipped
Build and Publish / Build and Deploy Docs (push) Has been skipped

This commit is contained in:
2026-04-27 16:58:38 +02:00
parent 7f6bd788e2
commit c9463583bc
6 changed files with 66 additions and 50 deletions
+23 -8
View File
@@ -1,14 +1,15 @@
from dataclasses import dataclass, field
from typing import Optional, Iterable
from typing import Optional, Iterable, TYPE_CHECKING, Any
import cv2
import numpy as np
import time
from aarelcinfer_client.models import LatestPredictionModel
if TYPE_CHECKING:
from aarelcinfer_client.models import LatestPredictionModel
else:
LatestPredictionModel = Any
from aare.common.aarelc_infer import AareLCInferWrapper
from aare.common.beamline import MXBeamline
from aare.common.models import MLBoxModel, MLOutputModel, MLBoxType, BoundingBoxModel
from aare.common.logger_config import setup_logger
@@ -47,23 +48,37 @@ class MLBundle:
class MlBox:
RETRY_COUNT = 3
RETRY_SLEEP_S = 0.1
def __init__(self, bl: MXBeamline, wrapper=None):
"""
wrapper:
Optional injected inference wrapper for tests.
If None, the production wrapper is created lazily.
"""
self.__beamline = bl
if wrapper is not None:
self.__wrapper = wrapper
return
def __init__(self, bl:MXBeamline): #mx-aare-test.psi.ch, mx-ml.psi.ch
if bl == MXBeamline.SIMULATED:
raise NotImplementedError(f"MLBox bundle mode not implemented for {bl}")
elif bl == MXBeamline.X06DA:
raise NotImplementedError(f"MLBox bundle mode not implemented for {bl}")
elif bl == MXBeamline.X10SA:
# Lazy import keeps module importable without external client installed
from aare.common.aarelc_infer import AareLCInferWrapper
self.__wrapper = AareLCInferWrapper(bl)
self.__beamline = bl
elif bl == MXBeamline.X06SA:
raise NotImplementedError(f"MLBox bundle mode not implemented for {bl}")
else:
raise Exception(f"unknown beamline {bl}")
raise ValueError(f"unknown beamline {bl}")
@staticmethod
def _decode_bundle_image(jpeg_bytes: bytes | None) -> np.ndarray | None:
+1 -1
View File
@@ -1,10 +1,10 @@
from aare.common.models import StagePositionEnum
from aare.daq.devices import BeamlineDevices
from aare.daq.config import BeamlineConfig, ABR_POS_MOUNT
from pxii_bec.macros.planner import BeamlineState
from aare.devices.area_detector import AutoEnum
from aare.common.logger_config import setup_logger
from aare.devices.bec_worker import BeamlineState
logger = setup_logger("aareDAQ")
+16 -1
View File
@@ -1,8 +1,9 @@
from enum import Enum
from bec_ipython_client import BECIPythonClient
from bec_ipython_client.signals import OperationMode
from bec_lib.service_config import ServiceConfig
from bec_lib.procedures.helper import FrontendProcedureHelper, BackendProcedureHelper
from pxii_bec.macros.planner import BeamlineState
from aare.common.beamline import MXBeamline, mx_beamline
@@ -23,6 +24,20 @@ from aare.common.beamline import MXBeamline, mx_beamline
def bec_exception_handler(exception: Exception):
print(f"Exception: {exception}")
class BeamlineState(str, Enum):
ROBOT_SAMPLE_EXCHANGE = "robot_sample_exchange"
SAMPLE_ALIGNMENT = "sample_alignment"
DATA_COLLECTION = "data_collection"
DC_XRF = "DC_XRF"
MANUAL_SAMPLE_EXCHANGE = "manual_sample_exchange"
BEAM_VISUALISATION = "beam_visualisation"
FLUX_MEASUREMENT = "flux_measurement"
BEAMSTOP_ALIGNMENT = "beamstop_alignment"
MAINTENANCE = "maintenance"
XTAL_SNAPSHOT = "xtal_snapshot"
class BECClientWorker:
def __init__(self, beamline:MXBeamline, name:str = "default"):
BEAMLINE = beamline.value.lower()
+25
View File
@@ -1,4 +1,5 @@
import sys
from unittest.mock import MagicMock
import pytest
@@ -6,6 +7,30 @@ from PySide6.QtWidgets import QApplication
from aare.common.models import SampleShortInfo, DewarAddress
# external service mocks
from unittest.mock import MagicMock
import sys
def mock_module(name):
m = MagicMock()
m.__path__ = []
sys.modules[name] = m
return m
mock_module("aarelcinfer_client")
mock_module("aarelcinfer_client.api")
mock_module("aarelcinfer_client.models")
mock_module("aarescan_client")
mock_module("aarescan_client.models")
mock_module("aarescan_client.models.grid_request")
mock_module("aarescan_client.models.screen_request")
sys.modules.setdefault("pxii_bec", MagicMock())
sys.modules.setdefault("pxii_bec.macros", MagicMock())
sys.modules.setdefault("pxii_bec.macros.planner", MagicMock())
@pytest.fixture
def sample_info():
-40
View File
@@ -1,40 +0,0 @@
from aare.daq.mlbox import MlBox
from aare.common.models import MLOutputModel, MLBoxType
def test_preferred_class_prefers_loop_over_pin_when_margin_not_exceeded():
boxes = MLOutputModel()
boxes.add_box(MLBoxType.Pin, (0, 0, 10, 10), 0.8)
boxes.add_box(MLBoxType.Loop_face, (1, 1, 9, 9), 0.75)
best = MlBox.get_preferred_class_box_with_confidence_threshold(
boxes,
loop_preference_margin=0.1,
)
assert best is not None
assert best.cls == MLBoxType.Loop_face
def test_prediction_score_empty():
assert MlBox._prediction_score(None) == (0, 0.0)
def test_prediction_score_uses_count_and_max_confidence():
model = MLOutputModel()
model.add_box(MLBoxType.Pin, (0, 0, 10, 10), 0.4)
model.add_box(MLBoxType.Crystal, (1, 1, 9, 9), 0.8)
assert MlBox._prediction_score(model) == (2, 0.8)
def test_best_by_class_keeps_highest_confidence_per_class():
results = [
{"class": 1, "confidence": 0.4, "box": {"x1": 0, "y1": 0, "x2": 10, "y2": 10}},
{"class": 1, "confidence": 0.8, "box": {"x1": 1, "y1": 1, "x2": 11, "y2": 11}},
{"class": 2, "confidence": 0.6, "box": {"x1": 2, "y1": 2, "x2": 12, "y2": 12}},
]
out = MlBox._best_by_class(results)
assert out is not None
assert out.get_best_for_class(MLBoxType.Pin).conf == 0.8
assert out.get_best_for_class(MLBoxType.Crystal).conf == 0.6
+1
View File
@@ -10,6 +10,7 @@ import numpy as np
os.environ["JWT_AAREDAQ_KEY"] = "test_key_for_unit_testing"
# Mock the entire backend before importing the app to prevent any real initialisation
import aare.daq.daq
with patch("aare.daq.daq.AareDAQ"), \
patch("aare.daq.config.MXBeamline"), \
patch("aare.daq.config.BeamlineConfig"), \