From 5e3b4b50d5f4db4ecaef1f2df925b670c5f330c7 Mon Sep 17 00:00:00 2001 From: Mirko Holler Date: Mon, 26 Oct 2026 21:48:53 +0100 Subject: [PATCH] feat(flomni): trigger source of the flOMNI loop at every Fermat scan start (soft trigger) flomni_fermat_scan sets the loop setting trigger_soft before arming ddg1: at the beamline (a real, not simulated, ddg1 or one of the exposure box motors ebtrx/ebtry/ebtrz/ebsupport configured; a failing check counts as beamline) the hardware trigger, else the soft trigger with soft_exposure_ms = exp_time x frames_per_trigger. At the beamline the scan is aborted if the hardware trigger cannot be confirmed; away only a warning. flomni_loop_settings: signals trigger_soft, soft_exposure_ms, soft_latency_ms. rt_settings.trigger_set_soft(); trigger_show() shows both groups. Docs + PDF. Needs the flOMNI loop / web HMI with the soft trigger (flOMNI feat/soft-trigger) first. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017KicuVBRC7jB1TLG5hLZwx --- .../local_contact_only-realtime_system.md | 20 +++++ .../local_contact_only-realtime_system.pdf | Bin 58205 -> 68928 bytes .../plugins/flomni/flomni_realtime_system.py | 25 ++++-- .../devices/omny/flomni_loop_settings.py | 1 + csaxs_bec/scans/flomni_fermat_scan.py | 69 +++++++++++++++++ .../test_flomni_realtime_system.py | 9 +++ tests/tests_scans/test_flomni_fermat_scan.py | 73 ++++++++++++++++++ 7 files changed, 191 insertions(+), 6 deletions(-) diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/docs/local_contact_only-realtime_system.md b/csaxs_bec/bec_ipython_client/plugins/flomni/docs/local_contact_only-realtime_system.md index 165239ba..eb9d1348 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/docs/local_contact_only-realtime_system.md +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/docs/local_contact_only-realtime_system.md @@ -21,6 +21,7 @@ Background and reference (flOMNI control repository, `OMNY/flOMNI` on gitea): | FZP scanner (only between scans) | `fzp_enable` (both axes or none), `fzp_range_V_x` / `_y`, `feedforward_enable`, `fzp_ff_priority` (feedforward first, 1 in production and all scan profiles since 2026-10-26), `move_beyond_um_x` / `_y`, `exposure_during_motion`, `abbe_enable`, `abbe_limit_um` | | Sample stage moves (only between scans) | `target_shaper_scale`, `jump_max_um_x` / `_y` | | Detector trigger | `trigger_tolerance_nm`, `trigger_hold_ms`, `trigger_min_delay_ms`, `trigger_on_move` | +| Trigger source (only between scans) | `trigger_soft` (never saved, set by the Fermat scan), `soft_exposure_ms`, `soft_latency_ms` | | Laser tracker and thresholds | `tracking_target_y` / `_z`, `psd_threshold_low`, `interferometer_threshold`, `interferometer_threshold_rot` | | FZP calibration (expert, only between scans) | `sample_hold_fzp_V`, `sample_hold_err_um`, `sample_hold_zero` | @@ -59,6 +60,25 @@ sensor) stays within the tolerance in x and in y (each averaged over 0.5 ms) for The former `flomni.interferometer_trigger_*` were removed 2026-10-23. +### Soft trigger (working without detector) + +With the soft trigger no trigger leaves the loop (the detector trigger output stays 0) and the loop emulates the +detector: every trigger starts an exposure of `soft_exposure_ms` after `soft_latency_ms` (1 ms). Scans then run +without detector or trigger PLC. The loop always starts with the hardware trigger; `trigger_soft` is never saved as +default and is in no profile (flOMNI `FeedbackLoop/soft_trigger.md`). + +**`flomni_fermat_scan` sets the trigger source at every scan start** (2026-10-26): + +- **At the beamline → hardware.** At the beamline means: `ddg1` is configured with a real (not simulated) device + class, or one of the exposure box motors `ebtrx`, `ebtry`, `ebtrz`, `ebsupport` is in the session. If this cannot + be confirmed (web HMI not reachable, refused) the scan is aborted: with the soft trigger the detector would not + be triggered while flOMNI exposes internally. A failing check also counts as beamline. +- **Otherwise (simulated `ddg1`, no beamline devices) → soft** with `soft_exposure_ms` = `exp_time` × + `frames_per_trigger` × 1000. If that fails the scan continues with a warning (alarm). + +By hand: `flomni.rt_settings.trigger_set_soft(True, exposure_ms=100)`, `trigger_set_soft(False)`; +`trigger_show()` shows both groups. + ### Laser tracker `flomni.rt_settings.tracking_show()`, `tracking_set_target_y(v)` / `tracking_set_target_z(v)`, diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/docs/local_contact_only-realtime_system.pdf b/csaxs_bec/bec_ipython_client/plugins/flomni/docs/local_contact_only-realtime_system.pdf index cf5b5236e68afe75ecf0ef10e0ce05fb361d928a..fb4ee1d079799fbd89e6d0f3d9eb167cd334d639 100644 GIT binary patch delta 49894 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ŋUnr&g;AQx8D$clVLHoTlsKLX&71Ooc$+& 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 diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_realtime_system.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_realtime_system.py index b539dbd9..598d262f 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_realtime_system.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni_realtime_system.py @@ -85,16 +85,18 @@ class FlomniRealtimeSystem(WebHmiClient): raise RealtimeSystemError(f"unknown setting '{name}'; known: {', '.join(values)}") return values[name] - def show(self, group: str = None, expert: bool = False): - """Print the settings (live value, .xmp value, markers), the violated rules and the scan state.""" + def show(self, group=None, expert: bool = False): + """Print the settings (live value, .xmp value, markers), the violated rules and the scan state; group: one + group name or several (tuple).""" snap = self.read() + wanted = (group,) if isinstance(group, str) else tuple(group or ()) groups = {g["name"]: g for g in snap["groups"]} sc = snap.get("scan") or {} print(STAFF_ONLY) print(f"Loop settings {snap.get('instrument', '')} ({self.route}) - " + (f"scan running (mode {_fmt(sc.get('mode'))})" if sc.get("active") else "no scan")) for gname, g in groups.items(): - if group and gname != group: + if wanted and gname not in wanted: continue if g.get("expert") and not expert and not group: continue @@ -203,8 +205,9 @@ class FlomniRealtimeSystem(WebHmiClient): # the former flomni.interferometer_trigger_* (removed 2026-10-23) def trigger_show(self): - """Detector trigger (step scans): tolerance, hold time, minimum delay, trigger after every move.""" - self.show(group="trigger") + """Detector trigger (step scans): tolerance, hold time, minimum delay, trigger after every move; trigger source + (hardware / soft).""" + self.show(group=("trigger", "trigger_source")) def trigger_set_tolerance_nm(self, tolerance_nm: float): """|relative position sample vs FZP| x and y within this (nm) for the hold time. 30 coarse, 10 standard, 2 finest; @@ -220,6 +223,16 @@ class FlomniRealtimeSystem(WebHmiClient): False: triggers at step-scan points only.""" return self.set(trigger_on_move=1 if enable else 0) + def trigger_set_soft(self, enable: bool, exposure_ms: float = None): + """Soft trigger (working without detector / trigger PLC): True = no hardware trigger leaves the loop, every + trigger starts an emulated exposure of exposure_ms (default: unchanged); False = hardware trigger. Never saved + as default (the loop starts with the hardware trigger); the flOMNI Fermat scan sets it at every scan start + (hardware at the beamline, soft otherwise). Only between scans.""" + changes = {"trigger_soft": 1 if enable else 0} + if enable and exposure_ms is not None: + changes["soft_exposure_ms"] = exposure_ms + return self.set(**changes) + def tracking_targets(self): """-> (target y, target z) of the laser tracker on the PSD.""" v = self.get() @@ -253,7 +266,7 @@ class FlomniRealtimeSystem(WebHmiClient): if name is None: print(__doc__.split("\n\nConnection:")[0]) print("\nShortcuts: trigger_show(), trigger_set_tolerance_nm(v), trigger_set_hold_ms(v)," - " trigger_set_after_move(True/False), tracking_targets(), tracking_show(), tracking_set_target_y(v)," + " trigger_set_after_move(True/False), trigger_set_soft(True/False, exposure_ms), tracking_targets(), tracking_show(), tracking_set_target_y(v)," " tracking_set_target_z(v), tracking_set_interferometer_threshold(v), tracking_set_psd_threshold_low(v);" " profiles(), unsaved(), get(name)") print('Explanations: help("all") or help(""), e.g. help("move_beyond_um_x")') diff --git a/csaxs_bec/devices/omny/flomni_loop_settings.py b/csaxs_bec/devices/omny/flomni_loop_settings.py index dbb32383..23bf5faf 100644 --- a/csaxs_bec/devices/omny/flomni_loop_settings.py +++ b/csaxs_bec/devices/omny/flomni_loop_settings.py @@ -44,6 +44,7 @@ SETTINGS = ( "sample_hold_fzp_V", "sample_hold_err_um", "sample_hold_zero", "target_shaper_scale", "jump_max_um_x", "jump_max_um_y", # group motion, scan-mode profiles (2026-10-26) "fzp_ff_priority", # FZP feedforward priority (2026-10-26) + "trigger_soft", "soft_exposure_ms", "soft_latency_ms", # soft trigger (2026-10-26) ) RETRY_AFTER_FAILURE_S = 60.0 # web HMI not reachable: no new attempt for this long (a tomogram does not wait each time) diff --git a/csaxs_bec/scans/flomni_fermat_scan.py b/csaxs_bec/scans/flomni_fermat_scan.py index fc1b820c..6cfac1bc 100644 --- a/csaxs_bec/scans/flomni_fermat_scan.py +++ b/csaxs_bec/scans/flomni_fermat_scan.py @@ -69,6 +69,10 @@ class FlomniFermatScan(ScanBase): MAX_CORRIDOR_SIZE = 3 # Corridor size is capped at this value (in um) for stability MIN_FERMAT_ASYMMETRY = 0.1 # Practical working range for fermat_asymmetry (soft-clamped) MAX_FERMAT_ASYMMETRY = 10.0 + # Devices that exist only in the beamline configuration (bl_endstation.yaml: exposure box motors); with one of + # them, or a ddg1 that is not simulated, the session is at the beamline -> hardware trigger (flOMNI soft trigger, + # FeedbackLoop/soft_trigger.md, 2026-10-26) + BEAMLINE_DEVICES = ("ebtrx", "ebtry", "ebtrz", "ebsupport") def __init__( # fmt: off @@ -345,6 +349,9 @@ class FlomniFermatScan(ScanBase): """ dev = self.dev + # Trigger source of the flOMNI loop: hardware at the beamline, soft otherwise + self.set_trigger_source() + # Prepare DDG1 dev.ddg1.set_trigger(TRIGGERSOURCE.EXT_RISING_EDGE.value) @@ -377,6 +384,68 @@ class FlomniFermatScan(ScanBase): "Signal strength of the laser tracker is too low for scanning. Realignment required!" ) + def at_beamline(self) -> tuple[bool, str]: + """ + Is this session at the beamline? True when ddg1 is configured with a real (not simulated) device class or + one of BEAMLINE_DEVICES is configured; False only when both say no. A failing check counts as beamline, + so the hardware trigger is the fallback. + + Returns: + (at_beamline, reason) + """ + try: + devices = self.device_manager.devices + reasons = [] + if "ddg1" in devices: + cls = str((getattr(devices["ddg1"], "_config", None) or {}).get("deviceClass", "")) + if ".sim." not in cls and "Simulated" not in cls: + reasons.append(f"ddg1 is {cls or 'not simulated'}") + found = [name for name in self.BEAMLINE_DEVICES if name in devices] + if found: + reasons.append("beamline devices " + ", ".join(found)) + if reasons: + return True, "; ".join(reasons) + return False, "no beamline devices, ddg1 simulated or absent" + except Exception as exc: # pylint: disable=broad-except + return True, f"beamline check failed ({exc}), treated as beamline" + + def set_trigger_source(self): + """ + Set the trigger source of the flOMNI loop (loop setting trigger_soft, web HMI via flomni_loop_settings): + at the beamline the hardware trigger (the loop's default); otherwise the soft trigger with the exposure + exp_time x frames_per_trigger, so a scan runs without detector or trigger PLC. At the beamline the scan is + aborted if the hardware trigger cannot be confirmed (with the soft trigger the detector would not be + triggered while flOMNI exposes internally). + """ + at_bl, reason = self.at_beamline() + if at_bl: + changes = {"trigger_soft": 0} + else: + changes = {"trigger_soft": 1, + "soft_exposure_ms": float(self.exp_time) * float(self.frames_per_trigger) * 1000.0} + try: + res = self.dev.flomni_loop_settings.api_post( + "/api/settings/apply", {"changes": changes, "profile": None, "adjust": False} + ) + errors = [] if res and res.get("ok") else list((res or {}).get("errors") or ["no answer"]) + except Exception as exc: # pylint: disable=broad-except + errors = [str(exc)] + source = "hardware" if at_bl else "soft" + if errors: + text = f"flOMNI trigger source {source} ({reason}) not set: {'; '.join(errors)}" + if at_bl: + raise ScanAbortion(text + ". At the beamline the hardware trigger must be confirmed.") + logger.warning(text) + self.device_manager.connector.raise_alarm( + severity=Alarms.WARNING, + info=messages.ErrorInfo( + error_message=text, compact_error_message=text, exception_type="TriggerSource", + device="flomni_loop_settings", + ), + ) + return + logger.info(f"flOMNI trigger source: {source} ({reason}), {changes}") + def flomni_rotation(self, angle: float): """ Rotate flomni to the requested angle. diff --git a/tests/tests_bec_ipython_client/test_flomni_realtime_system.py b/tests/tests_bec_ipython_client/test_flomni_realtime_system.py index d44bbf96..04921234 100644 --- a/tests/tests_bec_ipython_client/test_flomni_realtime_system.py +++ b/tests/tests_bec_ipython_client/test_flomni_realtime_system.py @@ -212,3 +212,12 @@ def test_help(server, capsys): assert "BEAMLINE SCIENTISTS" in capsys.readouterr().out with pytest.raises(RealtimeSystemError, match="unknown setting"): rts.help("nosuch") + + +def test_trigger_set_soft(server): + url, tok, _ = server + rts = FlomniRealtimeSystem(url=url, token_file=tok) + rts.trigger_set_soft(True, exposure_ms=200) + assert _Handler.requests[-1][1]["changes"] == {"trigger_soft": 1, "soft_exposure_ms": 200} + rts.trigger_set_soft(False, exposure_ms=200) + assert _Handler.requests[-1][1]["changes"] == {"trigger_soft": 0} diff --git a/tests/tests_scans/test_flomni_fermat_scan.py b/tests/tests_scans/test_flomni_fermat_scan.py index 2e2e4c0e..98a66823 100644 --- a/tests/tests_scans/test_flomni_fermat_scan.py +++ b/tests/tests_scans/test_flomni_fermat_scan.py @@ -1,6 +1,8 @@ from unittest import mock import numpy as np +import pytest +from bec_server.scan_server.scans import ScanAbortion from csaxs_bec.scans.flomni_fermat_scan import FlomniFermatScan @@ -152,3 +154,74 @@ def test_randomize_offset_false_gives_unshifted_deterministic_lattice(): phi = 2 * np.pi * ((1 + np.sqrt(5)) / 2.0) r = 0.57 np.testing.assert_allclose(a[0, :2], [r * np.sin(phi), r * np.cos(phi)]) + + +# ── trigger source of the flOMNI loop (soft trigger, 2026-10-26) ────────────── + +def _trigger_stub(devices, apply_result=None, apply_exc=None, exp_time=0.1, frames_per_trigger=2): + """A stand-in for a FlomniFermatScan instance with a device list {name: deviceClass} and the loop-settings + device answering /api/settings/apply.""" + scan = mock.MagicMock() + scan.BEAMLINE_DEVICES = FlomniFermatScan.BEAMLINE_DEVICES + scan.device_manager.devices = { + name: mock.MagicMock(_config={"deviceClass": cls}) for name, cls in devices.items() + } + scan.exp_time = exp_time + scan.frames_per_trigger = frames_per_trigger + if apply_exc is not None: + scan.dev.flomni_loop_settings.api_post.side_effect = apply_exc + else: + scan.dev.flomni_loop_settings.api_post.return_value = ( + apply_result if apply_result is not None else {"ok": True, "errors": []} + ) + scan.at_beamline = lambda: FlomniFermatScan.at_beamline(scan) + return scan + + +SIM_DDG1 = "csaxs_bec.devices.sim.simulated_beamline_devices.SimulatedDDG1" +REAL_DDG1 = "csaxs_bec.devices.epics.delay_generator_csaxs.DDG1" +MOTOR = "ophyd_devices.devices.psi_motor.EpicsUserMotorVME" + + +def test_at_beamline_detection(): + assert FlomniFermatScan.at_beamline(_trigger_stub({"ddg1": SIM_DDG1}))[0] is False + assert FlomniFermatScan.at_beamline(_trigger_stub({}))[0] is False + assert FlomniFermatScan.at_beamline(_trigger_stub({"ddg1": REAL_DDG1}))[0] is True + # a beamline-only device counts even with a simulated ddg1 + at_bl, reason = FlomniFermatScan.at_beamline(_trigger_stub({"ddg1": SIM_DDG1, "ebtrx": MOTOR})) + assert at_bl is True and "ebtrx" in reason + # a failing check counts as beamline (hardware trigger is the fallback) + scan = _trigger_stub({}) + scan.device_manager.devices = None + assert FlomniFermatScan.at_beamline(scan)[0] is True + + +def test_trigger_source_soft_away_from_beamline(): + scan = _trigger_stub({"ddg1": SIM_DDG1}, exp_time=0.1, frames_per_trigger=2) + FlomniFermatScan.set_trigger_source(scan) + path, body = scan.dev.flomni_loop_settings.api_post.call_args[0] + assert path == "/api/settings/apply" + assert body["changes"]["trigger_soft"] == 1 + assert abs(body["changes"]["soft_exposure_ms"] - 200.0) < 1e-9 + + +def test_trigger_source_hardware_at_beamline(): + scan = _trigger_stub({"ddg1": REAL_DDG1, "ebtry": MOTOR}) + FlomniFermatScan.set_trigger_source(scan) + body = scan.dev.flomni_loop_settings.api_post.call_args[0][1] + assert body["changes"] == {"trigger_soft": 0} + + +def test_trigger_source_not_confirmed_at_beamline_aborts(): + scan = _trigger_stub({"ddg1": REAL_DDG1}, apply_exc=RuntimeError("web HMI not reachable")) + with pytest.raises(ScanAbortion, match="hardware trigger must be confirmed"): + FlomniFermatScan.set_trigger_source(scan) + scan = _trigger_stub({"ddg1": REAL_DDG1}, apply_result={"ok": False, "errors": ["a scan is running"]}) + with pytest.raises(ScanAbortion, match="a scan is running"): + FlomniFermatScan.set_trigger_source(scan) + + +def test_trigger_source_failure_away_only_warns(): + scan = _trigger_stub({"ddg1": SIM_DDG1}, apply_exc=RuntimeError("web HMI not reachable")) + FlomniFermatScan.set_trigger_source(scan) + scan.device_manager.connector.raise_alarm.assert_called_once()