From 664621ef53638a1740d78563979d6780afd9a396 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 17 Dec 2025 14:35:14 +0000 Subject: [PATCH 01/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 175 ++++++++++++++++++++++++++++++---- 1 file changed, 157 insertions(+), 18 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 2008ed5..545df2b 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -2,7 +2,8 @@ from pathlib import Path from typing import Any -from bluesky import plan_stubs as bps +import bluesky.plan_stubs as bps +import bluesky.preprocessors as bpp from bluesky.plans import count from bluesky.protocols import Movable from bluesky.utils import MsgGenerator @@ -10,13 +11,31 @@ from dodal.devices.motors import XYZStage from dodal.plan_stubs.data_session import attach_data_session_metadata_decorator from dodal.plans import spec_scan -from ophyd_async.core import Device, Settings, SettingsProvider, YamlSettingsProvider +from ophyd_async.core import ( + DetectorTrigger, + Device, + Settings, + SettingsProvider, + StandardFlyer, + TriggerInfo, + YamlSettingsProvider, +) from ophyd_async.epics.adaravis import AravisDetector from ophyd_async.epics.adcore import ( NDAttributeDataType, NDAttributeParam, ) from ophyd_async.epics.adcore._core_io import NDROIStatNIO +from ophyd_async.epics.pmac import ( + PmacIO, + PmacTrajectoryTriggerLogic, +) +from ophyd_async.fastcs.panda import ( + HDFPanda, + ScanSpecInfo, + ScanSpecSeqTableTriggerLogic, + SeqBlock, +) from ophyd_async.plan_stubs import ( apply_settings, apply_settings_if_different, @@ -24,11 +43,13 @@ setup_ndattributes, store_settings, ) -from scanspec.specs import Line, Spec +from scanspec.specs import Fly, Line, Spec imaging_detector = inject("imaging_detector") spectroscopy_detector = inject("spectroscopy_detector") sample_stage = inject("sample_stage") +pmac = inject("pmac") +pandabox = inject("pandabox") def save_settings( @@ -161,9 +182,116 @@ def spectroscopy( yield from spec_scan({spectroscopy_detector, sample_stage}, spec, metadata=metadata) +def spectroscopy_fly( + spectroscopy_detector: AravisDetector = spectroscopy_detector, + sample_stage: XYZStage = sample_stage, + pmac: PmacIO = pmac, + pandabox: HDFPanda = pandabox, + spec: Spec[Movable] | None = None, + exposure_time: float = 0.1, + metadata: dict[str, Any] | None = None, +): + # Prepare motor info using trajectory scanning + scan_frame_duration = 0.1 + num_x = 2 + num_y = 100 + spec = spec or Fly( + scan_frame_duration + @ (Line(sample_stage.y, 0, 5, num_x) * ~Line(sample_stage.x, 0, 1, num_y)) # type: ignore + ) + + detector_deadtime = 2e-3 * 1.01 + total = num_x * num_y + + trigger_logic = spec + pmac_trajectory = PmacTrajectoryTriggerLogic(pmac) + pmac_trajectory_flyer = StandardFlyer(pmac_trajectory) + table: SeqBlock = pandabox.seq.__1 # type: ignore # noqa: SLF001 + + scan_spec_info = ScanSpecInfo(spec=spec, deadtime=detector_deadtime) + + panda_trigger_logic = StandardFlyer( + ScanSpecSeqTableTriggerLogic( + table, + ) + ) + + scan_frame_livetime = scan_frame_duration - detector_deadtime + + # Prepare Panda file writer trigger info + panda_hdf_info = TriggerInfo( + number_of_events=total, + trigger=DetectorTrigger.CONSTANT_GATE, + livetime=scan_frame_livetime, + deadtime=detector_deadtime, + ) + + # Prepare Panda file writer trigger info + detector_info = TriggerInfo( + number_of_events=total, + trigger=DetectorTrigger.CONSTANT_GATE, + livetime=scan_frame_livetime, + deadtime=detector_deadtime, + ) + + @attach_data_session_metadata_decorator() + @bpp.run_decorator() + @bpp.stage_decorator( + [pandabox, panda_trigger_logic, spectroscopy_detector, pmac_trajectory_flyer] + ) + def inner_plan(): + # create a group that is waited for + # Hashable prepare_group = ["pmac_trajectory_flyer", "trigger_logic"] + + # Prepare pmac with the trajectory + yield from bps.prepare(pmac_trajectory_flyer, trigger_logic) + # prepare sequencer table + yield from bps.prepare(panda_trigger_logic, scan_spec_info) + # prepare panda and hdf writer once, at start of scan + yield from bps.prepare(pandabox, panda_hdf_info) + # prepare spectroscopy_detector and info + # waiting for this last prepare means all prepare functions will be complete + yield from bps.prepare(spectroscopy_detector, detector_info, wait=True) + + # Need to run this after detectors are prepared + yield from bps.declare_stream( + pandabox, spectroscopy_detector, name="primary", collect=True + ) + + # Start the detectors and hdf writers acquiring. + # Configure the panda (seq table triggering). + # create a group that is waited for before pmac_trajectory_flyer kicked off on + # its own with wait=true. + yield from bps.kickoff(pandabox) + yield from bps.kickoff(panda_trigger_logic) + yield from bps.kickoff(spectroscopy_detector, wait=True) + + # Start the trajectory. + yield from bps.kickoff(pmac_trajectory_flyer, wait=True) + + # Wait for the scan to complete whilst continuously collecting the data. + yield from bps.collect_while_completing( + flyers=( + pmac_trajectory_flyer, + panda_trigger_logic, + pandabox, + spectroscopy_detector, + ), + dets=( + pandabox, + spectroscopy_detector, + ), + stream_name="primary", + ) + + yield from inner_plan() + + def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, + pmac: PmacIO = pmac, + pandabox: HDFPanda = pandabox, total_number_of_scan_points: int = 25, grid_size: float = 5.0, grid_origin_x: float = 0.0, @@ -175,18 +303,29 @@ def demo_spectroscopy( The time taken to scan is approximately linear in total_numbers_of_grid_points. All other parameters can be left at their defaults. """ - xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) - xmin = grid_origin_x - xmax = grid_origin_x + grid_size - ymin = grid_origin_y - ymax = grid_origin_y + grid_size - grid = Line(sample_stage.y, ymin, ymax, ysteps) * Line( - sample_stage.x, xmin, xmax, xsteps - ) - yield from spectroscopy( - spectroscopy_detector=spectroscopy_detector, - sample_stage=sample_stage, - spec=grid, - exposure_time=exposure_time, - metadata=metadata, - ) + if False: + xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) + xmin = grid_origin_x + xmax = grid_origin_x + grid_size + ymin = grid_origin_y + ymax = grid_origin_y + grid_size + grid = Line(sample_stage.y, ymin, ymax, ysteps) * Line( + sample_stage.x, xmin, xmax, xsteps + ) + yield from spectroscopy( + spectroscopy_detector=spectroscopy_detector, + sample_stage=sample_stage, + spec=grid, + exposure_time=exposure_time, + metadata=metadata, + ) + else: + yield from spectroscopy_fly( + spectroscopy_detector=spectroscopy_detector, + sample_stage=sample_stage, + pmac=pmac, + pandabox=pandabox, + spec=None, + exposure_time=exposure_time, + metadata=metadata, + ) From a6df76c0e6308e7e8f74414985300272d7cc6e71 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 10:24:17 +0000 Subject: [PATCH 02/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 545df2b..260979c 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -303,7 +303,7 @@ def demo_spectroscopy( The time taken to scan is approximately linear in total_numbers_of_grid_points. All other parameters can be left at their defaults. """ - if False: + if True: xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) xmin = grid_origin_x xmax = grid_origin_x + grid_size From 5c1c454ad95f4d870f9ed7dccc400ec025ff137a Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 11:01:21 +0000 Subject: [PATCH 03/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 260979c..a8adccf 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -290,7 +290,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - pmac: PmacIO = pmac, + # pmac: PmacIO = pmac, pandabox: HDFPanda = pandabox, total_number_of_scan_points: int = 25, grid_size: float = 5.0, From 41ba69af7495cbc204531809e6341599f0f77cf5 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 11:07:46 +0000 Subject: [PATCH 04/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index a8adccf..dd86800 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -303,7 +303,7 @@ def demo_spectroscopy( The time taken to scan is approximately linear in total_numbers_of_grid_points. All other parameters can be left at their defaults. """ - if True: + if False: xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) xmin = grid_origin_x xmax = grid_origin_x + grid_size From 9f03f9fce6e98f31902a98860304a359add40ce4 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 11:09:30 +0000 Subject: [PATCH 05/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index dd86800..545df2b 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -290,7 +290,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - # pmac: PmacIO = pmac, + pmac: PmacIO = pmac, pandabox: HDFPanda = pandabox, total_number_of_scan_points: int = 25, grid_size: float = 5.0, From 71a6fa8c417581cfde1e5fbb87abdc12bc801199 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 11:26:59 +0000 Subject: [PATCH 06/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 545df2b..260979c 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -303,7 +303,7 @@ def demo_spectroscopy( The time taken to scan is approximately linear in total_numbers_of_grid_points. All other parameters can be left at their defaults. """ - if False: + if True: xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) xmin = grid_origin_x xmax = grid_origin_x + grid_size From 5aa9ce0f9c67287386ff93d783283ce4bd6d68a3 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 11:32:33 +0000 Subject: [PATCH 07/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 37 +++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 260979c..5c48db6 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -190,7 +190,40 @@ def spectroscopy_fly( spec: Spec[Movable] | None = None, exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, -): +) -> MsgGenerator[None]: + yield from load_settings( + device=spectroscopy_detector, + design_name="spectroscopy_detector_baseline", + whitelist_pvs=[ + "fileio-nd_array_port", + "fileio-enable_callbacks", + "driver-acquire", + "driver-trigger_mode", + "driver-trigger_source", + "roistat-channels-array_counter", + "roistat-channels-1-min_x", + "roistat-channels-1-min_y", + "roistat-channels-1-name_", + "roistat-channels-1-size_x", + "roistat-channels-1-size_y", + "roistat-channels-1-use", + "roistat-channels-2-min_x", + "roistat-channels-2-min_y", + "roistat-channels-2-name_", + "roistat-channels-2-size_x", + "roistat-channels-2-size_y", + "roistat-channels-2-use", + "roistat-channels-3-min_x", + "roistat-channels-3-min_y", + "roistat-channels-3-name_", + "roistat-channels-3-size_x", + "roistat-channels-3-size_y", + "roistat-channels-3-use", + "roistat-nd_array_port", + "roistat-enable_callbacks", + ], + ) + # Prepare motor info using trajectory scanning scan_frame_duration = 0.1 num_x = 2 @@ -303,7 +336,7 @@ def demo_spectroscopy( The time taken to scan is approximately linear in total_numbers_of_grid_points. All other parameters can be left at their defaults. """ - if True: + if False: xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) xmin = grid_origin_x xmax = grid_origin_x + grid_size From b03da781fd793ef6f13cea938c75569138fc144b Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 11:35:16 +0000 Subject: [PATCH 08/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 64 +++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 5c48db6..f3b1c5e 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -191,38 +191,38 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: - yield from load_settings( - device=spectroscopy_detector, - design_name="spectroscopy_detector_baseline", - whitelist_pvs=[ - "fileio-nd_array_port", - "fileio-enable_callbacks", - "driver-acquire", - "driver-trigger_mode", - "driver-trigger_source", - "roistat-channels-array_counter", - "roistat-channels-1-min_x", - "roistat-channels-1-min_y", - "roistat-channels-1-name_", - "roistat-channels-1-size_x", - "roistat-channels-1-size_y", - "roistat-channels-1-use", - "roistat-channels-2-min_x", - "roistat-channels-2-min_y", - "roistat-channels-2-name_", - "roistat-channels-2-size_x", - "roistat-channels-2-size_y", - "roistat-channels-2-use", - "roistat-channels-3-min_x", - "roistat-channels-3-min_y", - "roistat-channels-3-name_", - "roistat-channels-3-size_x", - "roistat-channels-3-size_y", - "roistat-channels-3-use", - "roistat-nd_array_port", - "roistat-enable_callbacks", - ], - ) + # yield from load_settings( + # device=spectroscopy_detector, + # design_name="spectroscopy_detector_baseline", + # whitelist_pvs=[ + # "fileio-nd_array_port", + # "fileio-enable_callbacks", + # "driver-acquire", + # "driver-trigger_mode", + # "driver-trigger_source", + # "roistat-channels-array_counter", + # "roistat-channels-1-min_x", + # "roistat-channels-1-min_y", + # "roistat-channels-1-name_", + # "roistat-channels-1-size_x", + # "roistat-channels-1-size_y", + # "roistat-channels-1-use", + # "roistat-channels-2-min_x", + # "roistat-channels-2-min_y", + # "roistat-channels-2-name_", + # "roistat-channels-2-size_x", + # "roistat-channels-2-size_y", + # "roistat-channels-2-use", + # "roistat-channels-3-min_x", + # "roistat-channels-3-min_y", + # "roistat-channels-3-name_", + # "roistat-channels-3-size_x", + # "roistat-channels-3-size_y", + # "roistat-channels-3-use", + # "roistat-nd_array_port", + # "roistat-enable_callbacks", + # ], + # ) # Prepare motor info using trajectory scanning scan_frame_duration = 0.1 From 2cc32da95dfa3946f6b893c3c095b6b229db05ef Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 15:31:53 +0000 Subject: [PATCH 09/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 39 +++-------------------------------- 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index f3b1c5e..9bb295e 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -191,46 +191,13 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: - # yield from load_settings( - # device=spectroscopy_detector, - # design_name="spectroscopy_detector_baseline", - # whitelist_pvs=[ - # "fileio-nd_array_port", - # "fileio-enable_callbacks", - # "driver-acquire", - # "driver-trigger_mode", - # "driver-trigger_source", - # "roistat-channels-array_counter", - # "roistat-channels-1-min_x", - # "roistat-channels-1-min_y", - # "roistat-channels-1-name_", - # "roistat-channels-1-size_x", - # "roistat-channels-1-size_y", - # "roistat-channels-1-use", - # "roistat-channels-2-min_x", - # "roistat-channels-2-min_y", - # "roistat-channels-2-name_", - # "roistat-channels-2-size_x", - # "roistat-channels-2-size_y", - # "roistat-channels-2-use", - # "roistat-channels-3-min_x", - # "roistat-channels-3-min_y", - # "roistat-channels-3-name_", - # "roistat-channels-3-size_x", - # "roistat-channels-3-size_y", - # "roistat-channels-3-use", - # "roistat-nd_array_port", - # "roistat-enable_callbacks", - # ], - # ) - # Prepare motor info using trajectory scanning scan_frame_duration = 0.1 - num_x = 2 - num_y = 100 + num_x = 100 + num_y = 40 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.y, 0, 5, num_x) * ~Line(sample_stage.x, 0, 1, num_y)) # type: ignore + @ (Line(sample_stage.y, 0, 5, num_y) * ~Line(sample_stage.x, 0, 1, num_x)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 From f0154170a33e9c3259afd6b9694763469fab00ae Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 15:43:31 +0000 Subject: [PATCH 10/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 9bb295e..dd37a9e 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -39,6 +39,7 @@ from ophyd_async.plan_stubs import ( apply_settings, apply_settings_if_different, + ensure_connected, retrieve_settings, setup_ndattributes, store_settings, @@ -185,19 +186,27 @@ def spectroscopy( def spectroscopy_fly( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - pmac: PmacIO = pmac, + # pmac: PmacIO = pmac, pandabox: HDFPanda = pandabox, spec: Spec[Movable] | None = None, exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: + pmac = PmacIO( + "BL01C-MO-PPMAC-01:", + raw_motors=[sample_stage.z, sample_stage.x], + coord_nums=[1], + ) + + yield from ensure_connected(pmac) + # Prepare motor info using trajectory scanning scan_frame_duration = 0.1 num_x = 100 num_y = 40 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.y, 0, 5, num_y) * ~Line(sample_stage.x, 0, 1, num_x)) # type: ignore + @ (Line(sample_stage.z, 0, 5, num_y) * ~Line(sample_stage.x, 0, 1, num_x)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 @@ -290,7 +299,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - pmac: PmacIO = pmac, + # pmac: PmacIO = pmac, pandabox: HDFPanda = pandabox, total_number_of_scan_points: int = 25, grid_size: float = 5.0, @@ -323,7 +332,7 @@ def demo_spectroscopy( yield from spectroscopy_fly( spectroscopy_detector=spectroscopy_detector, sample_stage=sample_stage, - pmac=pmac, + # pmac=pmac, pandabox=pandabox, spec=None, exposure_time=exposure_time, From 90ab790b2cfce518a3e6fbbc67cd1b31b06e3d21 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 15:56:11 +0000 Subject: [PATCH 11/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index dd37a9e..e2e3b85 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -192,6 +192,58 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: + yield from load_settings( + device=spectroscopy_detector, + design_name="spectroscopy_detector_baseline", + whitelist_pvs=[ + "fileio-nd_array_port", + "fileio-enable_callbacks", + "driver-acquire", + "driver-trigger_mode", + "driver-trigger_source", + "roistat-channels-array_counter", + "roistat-channels-1-min_x", + "roistat-channels-1-min_y", + "roistat-channels-1-name_", + "roistat-channels-1-size_x", + "roistat-channels-1-size_y", + "roistat-channels-1-use", + "roistat-channels-2-min_x", + "roistat-channels-2-min_y", + "roistat-channels-2-name_", + "roistat-channels-2-size_x", + "roistat-channels-2-size_y", + "roistat-channels-2-use", + "roistat-channels-3-min_x", + "roistat-channels-3-min_y", + "roistat-channels-3-name_", + "roistat-channels-3-size_x", + "roistat-channels-3-size_y", + "roistat-channels-3-use", + "roistat-nd_array_port", + "roistat-enable_callbacks", + ], + ) + + params: list[NDAttributeParam] = [] + for channel in list(spectroscopy_detector.roistat.channels.keys()): # type: ignore + roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore + assert isinstance(roistatn, NDROIStatNIO) + + channel_name = yield from bps.rd(roistatn.name_) + + params.append( + NDAttributeParam( + name=f"{channel_name}Total", + param="ROISTAT_TOTAL", + datatype=NDAttributeDataType.DOUBLE, + addr=channel - 1, + description=f"Sum of {channel_name} channel", + ) + ) + + yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore + pmac = PmacIO( "BL01C-MO-PPMAC-01:", raw_motors=[sample_stage.z, sample_stage.x], From b7a0108015574fc0ab93d4287fb442a72fdf4da5 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 16:04:04 +0000 Subject: [PATCH 12/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index e2e3b85..dd56ec8 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -198,9 +198,9 @@ def spectroscopy_fly( whitelist_pvs=[ "fileio-nd_array_port", "fileio-enable_callbacks", - "driver-acquire", - "driver-trigger_mode", - "driver-trigger_source", + # "driver-acquire", + # "driver-trigger_mode", + # "driver-trigger_source", "roistat-channels-array_counter", "roistat-channels-1-min_x", "roistat-channels-1-min_y", From 891a153f33fd24e57398ac24f78a7ed0f195cc85 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 18 Dec 2025 16:06:14 +0000 Subject: [PATCH 13/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 102 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index dd56ec8..be5f790 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -192,57 +192,57 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: - yield from load_settings( - device=spectroscopy_detector, - design_name="spectroscopy_detector_baseline", - whitelist_pvs=[ - "fileio-nd_array_port", - "fileio-enable_callbacks", - # "driver-acquire", - # "driver-trigger_mode", - # "driver-trigger_source", - "roistat-channels-array_counter", - "roistat-channels-1-min_x", - "roistat-channels-1-min_y", - "roistat-channels-1-name_", - "roistat-channels-1-size_x", - "roistat-channels-1-size_y", - "roistat-channels-1-use", - "roistat-channels-2-min_x", - "roistat-channels-2-min_y", - "roistat-channels-2-name_", - "roistat-channels-2-size_x", - "roistat-channels-2-size_y", - "roistat-channels-2-use", - "roistat-channels-3-min_x", - "roistat-channels-3-min_y", - "roistat-channels-3-name_", - "roistat-channels-3-size_x", - "roistat-channels-3-size_y", - "roistat-channels-3-use", - "roistat-nd_array_port", - "roistat-enable_callbacks", - ], - ) - - params: list[NDAttributeParam] = [] - for channel in list(spectroscopy_detector.roistat.channels.keys()): # type: ignore - roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore - assert isinstance(roistatn, NDROIStatNIO) - - channel_name = yield from bps.rd(roistatn.name_) - - params.append( - NDAttributeParam( - name=f"{channel_name}Total", - param="ROISTAT_TOTAL", - datatype=NDAttributeDataType.DOUBLE, - addr=channel - 1, - description=f"Sum of {channel_name} channel", - ) - ) - - yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore + # yield from load_settings( + # device=spectroscopy_detector, + # design_name="spectroscopy_detector_baseline", + # whitelist_pvs=[ + # "fileio-nd_array_port", + # "fileio-enable_callbacks", + # # "driver-acquire", + # # "driver-trigger_mode", + # # "driver-trigger_source", + # "roistat-channels-array_counter", + # "roistat-channels-1-min_x", + # "roistat-channels-1-min_y", + # "roistat-channels-1-name_", + # "roistat-channels-1-size_x", + # "roistat-channels-1-size_y", + # "roistat-channels-1-use", + # "roistat-channels-2-min_x", + # "roistat-channels-2-min_y", + # "roistat-channels-2-name_", + # "roistat-channels-2-size_x", + # "roistat-channels-2-size_y", + # "roistat-channels-2-use", + # "roistat-channels-3-min_x", + # "roistat-channels-3-min_y", + # "roistat-channels-3-name_", + # "roistat-channels-3-size_x", + # "roistat-channels-3-size_y", + # "roistat-channels-3-use", + # "roistat-nd_array_port", + # "roistat-enable_callbacks", + # ], + # ) + + # params: list[NDAttributeParam] = [] + # for channel in list(spectroscopy_detector.roistat.channels.keys()): + # roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore + # assert isinstance(roistatn, NDROIStatNIO) + + # channel_name = yield from bps.rd(roistatn.name_) + + # params.append( + # NDAttributeParam( + # name=f"{channel_name}Total", + # param="ROISTAT_TOTAL", + # datatype=NDAttributeDataType.DOUBLE, + # addr=channel - 1, + # description=f"Sum of {channel_name} channel", + # ) + # ) + + # yield from setup_ndattributes(spectroscopy_detector.roistat, params) pmac = PmacIO( "BL01C-MO-PPMAC-01:", From 5f2cd7c1fcf031cb3aa9e99dcefc11de94dd1394 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:13:42 +0000 Subject: [PATCH 14/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index be5f790..0e56345 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -246,7 +246,7 @@ def spectroscopy_fly( pmac = PmacIO( "BL01C-MO-PPMAC-01:", - raw_motors=[sample_stage.z, sample_stage.x], + raw_motors=[sample_stage.y, sample_stage.x], coord_nums=[1], ) @@ -258,7 +258,7 @@ def spectroscopy_fly( num_y = 40 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.z, 0, 5, num_y) * ~Line(sample_stage.x, 0, 1, num_x)) # type: ignore + @ (Line(sample_stage.y, 0, 1, num_y) * ~Line(sample_stage.x, 0, 1, num_x)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 From ebb6bb0423f8039a7ed582c744f2a1492b2a1d80 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:18:27 +0000 Subject: [PATCH 15/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 0e56345..573f416 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -258,7 +258,7 @@ def spectroscopy_fly( num_y = 40 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.y, 0, 1, num_y) * ~Line(sample_stage.x, 0, 1, num_x)) # type: ignore + @ (Line(sample_stage.x, 0, 1, num_y) * ~Line(sample_stage.y, 0, 1, num_x)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 From 7d6e5f4fd9d142da664eb56465dad8e7cf5d8cbe Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:23:24 +0000 Subject: [PATCH 16/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 573f416..46d1003 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -258,7 +258,7 @@ def spectroscopy_fly( num_y = 40 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.x, 0, 1, num_y) * ~Line(sample_stage.y, 0, 1, num_x)) # type: ignore + @ (Line(sample_stage.x, 0, 5, num_y) * ~Line(sample_stage.y, 0, 5, num_x)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 From 2da5322368f22b1886605f8602cf3cabfc714cae Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:30:47 +0000 Subject: [PATCH 17/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 46d1003..5b37670 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -253,7 +253,7 @@ def spectroscopy_fly( yield from ensure_connected(pmac) # Prepare motor info using trajectory scanning - scan_frame_duration = 0.1 + scan_frame_duration = 0.3 num_x = 100 num_y = 40 spec = spec or Fly( From 12b66f98b9f5070f0a72479ccc5ebf2569da5f26 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:35:45 +0000 Subject: [PATCH 18/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 5b37670..970a6d9 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -258,7 +258,7 @@ def spectroscopy_fly( num_y = 40 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.x, 0, 5, num_y) * ~Line(sample_stage.y, 0, 5, num_x)) # type: ignore + @ (Line(sample_stage.x, 0, 1, num_y) * ~Line(sample_stage.y, 0, 1, num_x)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 From abe58eb7fe8ffca0531574b869efe90293449403 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:42:58 +0000 Subject: [PATCH 19/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 102 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 970a6d9..1fbdc89 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -192,57 +192,57 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: - # yield from load_settings( - # device=spectroscopy_detector, - # design_name="spectroscopy_detector_baseline", - # whitelist_pvs=[ - # "fileio-nd_array_port", - # "fileio-enable_callbacks", - # # "driver-acquire", - # # "driver-trigger_mode", - # # "driver-trigger_source", - # "roistat-channels-array_counter", - # "roistat-channels-1-min_x", - # "roistat-channels-1-min_y", - # "roistat-channels-1-name_", - # "roistat-channels-1-size_x", - # "roistat-channels-1-size_y", - # "roistat-channels-1-use", - # "roistat-channels-2-min_x", - # "roistat-channels-2-min_y", - # "roistat-channels-2-name_", - # "roistat-channels-2-size_x", - # "roistat-channels-2-size_y", - # "roistat-channels-2-use", - # "roistat-channels-3-min_x", - # "roistat-channels-3-min_y", - # "roistat-channels-3-name_", - # "roistat-channels-3-size_x", - # "roistat-channels-3-size_y", - # "roistat-channels-3-use", - # "roistat-nd_array_port", - # "roistat-enable_callbacks", - # ], - # ) - - # params: list[NDAttributeParam] = [] - # for channel in list(spectroscopy_detector.roistat.channels.keys()): - # roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore - # assert isinstance(roistatn, NDROIStatNIO) - - # channel_name = yield from bps.rd(roistatn.name_) - - # params.append( - # NDAttributeParam( - # name=f"{channel_name}Total", - # param="ROISTAT_TOTAL", - # datatype=NDAttributeDataType.DOUBLE, - # addr=channel - 1, - # description=f"Sum of {channel_name} channel", - # ) - # ) - - # yield from setup_ndattributes(spectroscopy_detector.roistat, params) + yield from load_settings( + device=spectroscopy_detector, + design_name="spectroscopy_detector_baseline", + whitelist_pvs=[ + "fileio-nd_array_port", + "fileio-enable_callbacks", + # "driver-acquire", + # "driver-trigger_mode", + # "driver-trigger_source", + "roistat-channels-array_counter", + "roistat-channels-1-min_x", + "roistat-channels-1-min_y", + "roistat-channels-1-name_", + "roistat-channels-1-size_x", + "roistat-channels-1-size_y", + "roistat-channels-1-use", + "roistat-channels-2-min_x", + "roistat-channels-2-min_y", + "roistat-channels-2-name_", + "roistat-channels-2-size_x", + "roistat-channels-2-size_y", + "roistat-channels-2-use", + "roistat-channels-3-min_x", + "roistat-channels-3-min_y", + "roistat-channels-3-name_", + "roistat-channels-3-size_x", + "roistat-channels-3-size_y", + "roistat-channels-3-use", + "roistat-nd_array_port", + "roistat-enable_callbacks", + ], + ) + + params: list[NDAttributeParam] = [] + for channel in list(spectroscopy_detector.roistat.channels.keys()): # type: ignore + roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore + assert isinstance(roistatn, NDROIStatNIO) + + channel_name = yield from bps.rd(roistatn.name_) + + params.append( + NDAttributeParam( + name=f"{channel_name}Total", + param="ROISTAT_TOTAL", + datatype=NDAttributeDataType.DOUBLE, + addr=channel - 1, + description=f"Sum of {channel_name} channel", + ) + ) + + yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore pmac = PmacIO( "BL01C-MO-PPMAC-01:", From b49234aec85ee1ec8499cc78de69405d3614c811 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 10:51:43 +0000 Subject: [PATCH 20/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 102 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 1fbdc89..970a6d9 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -192,57 +192,57 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: - yield from load_settings( - device=spectroscopy_detector, - design_name="spectroscopy_detector_baseline", - whitelist_pvs=[ - "fileio-nd_array_port", - "fileio-enable_callbacks", - # "driver-acquire", - # "driver-trigger_mode", - # "driver-trigger_source", - "roistat-channels-array_counter", - "roistat-channels-1-min_x", - "roistat-channels-1-min_y", - "roistat-channels-1-name_", - "roistat-channels-1-size_x", - "roistat-channels-1-size_y", - "roistat-channels-1-use", - "roistat-channels-2-min_x", - "roistat-channels-2-min_y", - "roistat-channels-2-name_", - "roistat-channels-2-size_x", - "roistat-channels-2-size_y", - "roistat-channels-2-use", - "roistat-channels-3-min_x", - "roistat-channels-3-min_y", - "roistat-channels-3-name_", - "roistat-channels-3-size_x", - "roistat-channels-3-size_y", - "roistat-channels-3-use", - "roistat-nd_array_port", - "roistat-enable_callbacks", - ], - ) - - params: list[NDAttributeParam] = [] - for channel in list(spectroscopy_detector.roistat.channels.keys()): # type: ignore - roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore - assert isinstance(roistatn, NDROIStatNIO) - - channel_name = yield from bps.rd(roistatn.name_) - - params.append( - NDAttributeParam( - name=f"{channel_name}Total", - param="ROISTAT_TOTAL", - datatype=NDAttributeDataType.DOUBLE, - addr=channel - 1, - description=f"Sum of {channel_name} channel", - ) - ) - - yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore + # yield from load_settings( + # device=spectroscopy_detector, + # design_name="spectroscopy_detector_baseline", + # whitelist_pvs=[ + # "fileio-nd_array_port", + # "fileio-enable_callbacks", + # # "driver-acquire", + # # "driver-trigger_mode", + # # "driver-trigger_source", + # "roistat-channels-array_counter", + # "roistat-channels-1-min_x", + # "roistat-channels-1-min_y", + # "roistat-channels-1-name_", + # "roistat-channels-1-size_x", + # "roistat-channels-1-size_y", + # "roistat-channels-1-use", + # "roistat-channels-2-min_x", + # "roistat-channels-2-min_y", + # "roistat-channels-2-name_", + # "roistat-channels-2-size_x", + # "roistat-channels-2-size_y", + # "roistat-channels-2-use", + # "roistat-channels-3-min_x", + # "roistat-channels-3-min_y", + # "roistat-channels-3-name_", + # "roistat-channels-3-size_x", + # "roistat-channels-3-size_y", + # "roistat-channels-3-use", + # "roistat-nd_array_port", + # "roistat-enable_callbacks", + # ], + # ) + + # params: list[NDAttributeParam] = [] + # for channel in list(spectroscopy_detector.roistat.channels.keys()): + # roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore + # assert isinstance(roistatn, NDROIStatNIO) + + # channel_name = yield from bps.rd(roistatn.name_) + + # params.append( + # NDAttributeParam( + # name=f"{channel_name}Total", + # param="ROISTAT_TOTAL", + # datatype=NDAttributeDataType.DOUBLE, + # addr=channel - 1, + # description=f"Sum of {channel_name} channel", + # ) + # ) + + # yield from setup_ndattributes(spectroscopy_detector.roistat, params) pmac = PmacIO( "BL01C-MO-PPMAC-01:", From b7bb86da0c8f65e1e3f160cd21caeddbef0cbdc9 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 11:13:27 +0000 Subject: [PATCH 21/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 102 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 970a6d9..94dca3b 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -192,57 +192,57 @@ def spectroscopy_fly( exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: - # yield from load_settings( - # device=spectroscopy_detector, - # design_name="spectroscopy_detector_baseline", - # whitelist_pvs=[ - # "fileio-nd_array_port", - # "fileio-enable_callbacks", - # # "driver-acquire", - # # "driver-trigger_mode", - # # "driver-trigger_source", - # "roistat-channels-array_counter", - # "roistat-channels-1-min_x", - # "roistat-channels-1-min_y", - # "roistat-channels-1-name_", - # "roistat-channels-1-size_x", - # "roistat-channels-1-size_y", - # "roistat-channels-1-use", - # "roistat-channels-2-min_x", - # "roistat-channels-2-min_y", - # "roistat-channels-2-name_", - # "roistat-channels-2-size_x", - # "roistat-channels-2-size_y", - # "roistat-channels-2-use", - # "roistat-channels-3-min_x", - # "roistat-channels-3-min_y", - # "roistat-channels-3-name_", - # "roistat-channels-3-size_x", - # "roistat-channels-3-size_y", - # "roistat-channels-3-use", - # "roistat-nd_array_port", - # "roistat-enable_callbacks", - # ], - # ) - - # params: list[NDAttributeParam] = [] - # for channel in list(spectroscopy_detector.roistat.channels.keys()): - # roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore - # assert isinstance(roistatn, NDROIStatNIO) - - # channel_name = yield from bps.rd(roistatn.name_) - - # params.append( - # NDAttributeParam( - # name=f"{channel_name}Total", - # param="ROISTAT_TOTAL", - # datatype=NDAttributeDataType.DOUBLE, - # addr=channel - 1, - # description=f"Sum of {channel_name} channel", - # ) - # ) - - # yield from setup_ndattributes(spectroscopy_detector.roistat, params) + yield from load_settings( + device=spectroscopy_detector, + design_name="spectroscopy_detector_baseline", + whitelist_pvs=[ + "fileio-nd_array_port", + "fileio-enable_callbacks", + # "driver-acquire", + # "driver-trigger_mode", + # "driver-trigger_source", + "roistat-channels-array_counter", + "roistat-channels-1-min_x", + "roistat-channels-1-min_y", + "roistat-channels-1-name_", + "roistat-channels-1-size_x", + "roistat-channels-1-size_y", + "roistat-channels-1-use", + "roistat-channels-2-min_x", + "roistat-channels-2-min_y", + "roistat-channels-2-name_", + "roistat-channels-2-size_x", + "roistat-channels-2-size_y", + "roistat-channels-2-use", + "roistat-channels-3-min_x", + "roistat-channels-3-min_y", + "roistat-channels-3-name_", + "roistat-channels-3-size_x", + "roistat-channels-3-size_y", + "roistat-channels-3-use", + "roistat-nd_array_port", + "roistat-enable_callbacks", + ], + ) + + params: list[NDAttributeParam] = [] + for channel in list(spectroscopy_detector.roistat.channels.keys()): + roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore + assert isinstance(roistatn, NDROIStatNIO) + + channel_name = yield from bps.rd(roistatn.name_) + + params.append( + NDAttributeParam( + name=f"{channel_name}Total", + param="ROISTAT_TOTAL", + datatype=NDAttributeDataType.DOUBLE, + addr=channel - 1, + description=f"Sum of {channel_name} channel", + ) + ) + + yield from setup_ndattributes(spectroscopy_detector.roistat, params) pmac = PmacIO( "BL01C-MO-PPMAC-01:", From c3a7906c9887f1af071ade97aa6bf1e09c59fbd1 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 11:15:32 +0000 Subject: [PATCH 22/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 94dca3b..bf96582 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -253,7 +253,7 @@ def spectroscopy_fly( yield from ensure_connected(pmac) # Prepare motor info using trajectory scanning - scan_frame_duration = 0.3 + scan_frame_duration = 0.01 num_x = 100 num_y = 40 spec = spec or Fly( From f5464f24ec1849c2dc1af3a0a3aeabb64cb22ced Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 11:28:08 +0000 Subject: [PATCH 23/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index bf96582..0cf1336 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -364,7 +364,7 @@ def demo_spectroscopy( The time taken to scan is approximately linear in total_numbers_of_grid_points. All other parameters can be left at their defaults. """ - if False: + if total_number_of_scan_points < 1000: xsteps = ysteps = int(round(math.sqrt(max(total_number_of_scan_points, 1)))) xmin = grid_origin_x xmax = grid_origin_x + grid_size From 36f8034bb5d1992be5cba51432123eb5592fe8f5 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 11:54:06 +0000 Subject: [PATCH 24/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 0cf1336..54b33cb 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -343,6 +343,7 @@ def inner_plan(): spectroscopy_detector, ), stream_name="primary", + flush_period=0.5, ) yield from inner_plan() From ce96ddfa4defab5e42f1a5e4fad7d08814ad2776 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 19 Dec 2025 14:55:52 +0000 Subject: [PATCH 25/49] wip[feat]: add flyscan plan --- src/test_rig_bluesky/plans.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 54b33cb..3de44cc 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -226,7 +226,7 @@ def spectroscopy_fly( ) params: list[NDAttributeParam] = [] - for channel in list(spectroscopy_detector.roistat.channels.keys()): + for channel in list(spectroscopy_detector.roistat.channels.keys()): # type: ignore roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore assert isinstance(roistatn, NDROIStatNIO) @@ -242,7 +242,7 @@ def spectroscopy_fly( ) ) - yield from setup_ndattributes(spectroscopy_detector.roistat, params) + yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore pmac = PmacIO( "BL01C-MO-PPMAC-01:", @@ -265,8 +265,7 @@ def spectroscopy_fly( total = num_x * num_y trigger_logic = spec - pmac_trajectory = PmacTrajectoryTriggerLogic(pmac) - pmac_trajectory_flyer = StandardFlyer(pmac_trajectory) + pmac_trajectory_flyer = PmacTrajectoryTriggerLogic(pmac) table: SeqBlock = pandabox.seq.__1 # type: ignore # noqa: SLF001 scan_spec_info = ScanSpecInfo(spec=spec, deadtime=detector_deadtime) From b32d3592407036a94caad6a68739a7a76f0aaf8e Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 29 Jan 2026 15:46:51 +0000 Subject: [PATCH 26/49] wip: use ophyd-async detector-rewrite --- src/test_rig_bluesky/plans.py | 39 ++++++++++++++++------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 3de44cc..9e1cef2 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -21,11 +21,7 @@ YamlSettingsProvider, ) from ophyd_async.epics.adaravis import AravisDetector -from ophyd_async.epics.adcore import ( - NDAttributeDataType, - NDAttributeParam, -) -from ophyd_async.epics.adcore._core_io import NDROIStatNIO +from ophyd_async.epics.adcore import NDAttributeDataType, NDAttributeParam, NDROIStatNIO from ophyd_async.epics.pmac import ( PmacIO, PmacTrajectoryTriggerLogic, @@ -50,7 +46,7 @@ spectroscopy_detector = inject("spectroscopy_detector") sample_stage = inject("sample_stage") pmac = inject("pmac") -pandabox = inject("pandabox") +pandabrick = inject("pandabrick") def save_settings( @@ -187,7 +183,7 @@ def spectroscopy_fly( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, # pmac: PmacIO = pmac, - pandabox: HDFPanda = pandabox, + pandabrick: HDFPanda = pandabrick, spec: Spec[Movable] | None = None, exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, @@ -254,11 +250,11 @@ def spectroscopy_fly( # Prepare motor info using trajectory scanning scan_frame_duration = 0.01 - num_x = 100 - num_y = 40 + num_x = 35 + num_y = 100 spec = spec or Fly( scan_frame_duration - @ (Line(sample_stage.x, 0, 1, num_y) * ~Line(sample_stage.y, 0, 1, num_x)) # type: ignore + @ (Line(sample_stage.y, 0, 1, num_x) * ~Line(sample_stage.x, 0, 1, num_y)) # type: ignore ) detector_deadtime = 2e-3 * 1.01 @@ -266,7 +262,8 @@ def spectroscopy_fly( trigger_logic = spec pmac_trajectory_flyer = PmacTrajectoryTriggerLogic(pmac) - table: SeqBlock = pandabox.seq.__1 # type: ignore # noqa: SLF001 + # pmac_trajectory_flyer = StandardFlyer(pmac_trajectory) + table: SeqBlock = pandabrick.seq.__1 # type: ignore # noqa: SLF001 scan_spec_info = ScanSpecInfo(spec=spec, deadtime=detector_deadtime) @@ -281,7 +278,7 @@ def spectroscopy_fly( # Prepare Panda file writer trigger info panda_hdf_info = TriggerInfo( number_of_events=total, - trigger=DetectorTrigger.CONSTANT_GATE, + trigger=DetectorTrigger.EXTERNAL_LEVEL, livetime=scan_frame_livetime, deadtime=detector_deadtime, ) @@ -289,7 +286,7 @@ def spectroscopy_fly( # Prepare Panda file writer trigger info detector_info = TriggerInfo( number_of_events=total, - trigger=DetectorTrigger.CONSTANT_GATE, + trigger=DetectorTrigger.EXTERNAL_EDGE, livetime=scan_frame_livetime, deadtime=detector_deadtime, ) @@ -297,7 +294,7 @@ def spectroscopy_fly( @attach_data_session_metadata_decorator() @bpp.run_decorator() @bpp.stage_decorator( - [pandabox, panda_trigger_logic, spectroscopy_detector, pmac_trajectory_flyer] + [pandabrick, panda_trigger_logic, spectroscopy_detector, pmac_trajectory_flyer] ) def inner_plan(): # create a group that is waited for @@ -308,21 +305,21 @@ def inner_plan(): # prepare sequencer table yield from bps.prepare(panda_trigger_logic, scan_spec_info) # prepare panda and hdf writer once, at start of scan - yield from bps.prepare(pandabox, panda_hdf_info) + yield from bps.prepare(pandabrick, panda_hdf_info) # prepare spectroscopy_detector and info # waiting for this last prepare means all prepare functions will be complete yield from bps.prepare(spectroscopy_detector, detector_info, wait=True) # Need to run this after detectors are prepared yield from bps.declare_stream( - pandabox, spectroscopy_detector, name="primary", collect=True + pandabrick, spectroscopy_detector, name="primary", collect=True ) # Start the detectors and hdf writers acquiring. # Configure the panda (seq table triggering). # create a group that is waited for before pmac_trajectory_flyer kicked off on # its own with wait=true. - yield from bps.kickoff(pandabox) + yield from bps.kickoff(pandabrick) yield from bps.kickoff(panda_trigger_logic) yield from bps.kickoff(spectroscopy_detector, wait=True) @@ -334,11 +331,11 @@ def inner_plan(): flyers=( pmac_trajectory_flyer, panda_trigger_logic, - pandabox, + pandabrick, spectroscopy_detector, ), dets=( - pandabox, + pandabrick, spectroscopy_detector, ), stream_name="primary", @@ -352,7 +349,7 @@ def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, # pmac: PmacIO = pmac, - pandabox: HDFPanda = pandabox, + pandabrick: HDFPanda = pandabrick, total_number_of_scan_points: int = 25, grid_size: float = 5.0, grid_origin_x: float = 0.0, @@ -385,7 +382,7 @@ def demo_spectroscopy( spectroscopy_detector=spectroscopy_detector, sample_stage=sample_stage, # pmac=pmac, - pandabox=pandabox, + pandabrick=pandabrick, spec=None, exposure_time=exposure_time, metadata=metadata, From 97c27624770370d4ea41ceb1d952f113662c3c61 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Thu, 29 Jan 2026 15:56:55 +0000 Subject: [PATCH 27/49] chore: amend baseline yaml with new pv name --- .../spectroscopy_detector_baseline.yaml | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml index 79e8280..97ad306 100644 --- a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml +++ b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml @@ -3,37 +3,37 @@ driver.acquire_period: 0.021815 driver.acquire_time: 0.10000 driver.array_counter: 3 driver.image_mode: Multiple -driver.nd_attributes_file: '' +driver.nd_attributes_file: "" driver.num_images: 1 -driver.trigger_mode: 'Off' +driver.trigger_mode: "Off" driver.trigger_source: Freerun driver.wait_for_plugins: false -fileio.acquire: false -fileio.array_counter: 3 -fileio.auto_increment: true -fileio.capture: false -fileio.chunk_size_auto: true -fileio.compression: None -fileio.create_directory: 0 -fileio.enable_callbacks: Enable -fileio.file_name: 5073260b-9688-4283-84d1-204955e423aa -fileio.file_number: 1 -fileio.file_path: /tmp/ -fileio.file_template: '%s%s.h5' -fileio.file_write_mode: Stream -fileio.flush_now: false -fileio.lazy_open: true -fileio.nd_array_address: 0 -fileio.nd_array_port: D2.roistat -fileio.nd_attributes_file: '' -fileio.num_capture: 0 -fileio.num_extra_dims: 0 -fileio.num_frames_chunks: 1 -fileio.position_mode: false -fileio.queue_size: 2 -fileio.swmr_mode: true -fileio.wait_for_plugins: false -fileio.xml_file_name: '' +writer.acquire: false +writer.array_counter: 3 +writer.auto_increment: true +writer.capture: false +writer.chunk_size_auto: true +writer.compression: None +writer.create_directory: 0 +writer.enable_callbacks: Enable +writer.file_name: 5073260b-9688-4283-84d1-204955e423aa +writer.file_number: 1 +writer.file_path: /tmp/ +writer.file_template: "%s%s.h5" +writer.file_write_mode: Stream +writer.flush_now: false +writer.lazy_open: true +writer.nd_array_address: 0 +writer.nd_array_port: D2.roistat +writer.nd_attributes_file: "" +writer.num_capture: 0 +writer.num_extra_dims: 0 +writer.num_frames_chunks: 1 +writer.position_mode: false +writer.queue_size: 2 +writer.swmr_mode: true +writer.wait_for_plugins: false +writer.xml_file_name: "" roistat.acquire: false roistat.array_counter: 3 roistat.channels.1.min_x: 95 @@ -57,7 +57,8 @@ roistat.channels.3.use: true roistat.enable_callbacks: Enable roistat.nd_array_address: 0 roistat.nd_array_port: D2.CAM -roistat.nd_attributes_file: Date: Fri, 30 Jan 2026 11:46:47 +0000 Subject: [PATCH 29/49] refactor: use injected pmac --- src/test_rig_bluesky/plans.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index f749670..1e6cda6 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -35,6 +35,7 @@ from ophyd_async.plan_stubs import ( apply_settings, apply_settings_if_different, + ensure_connected, retrieve_settings, setup_ndattributes, store_settings, @@ -181,7 +182,7 @@ def spectroscopy( def spectroscopy_fly( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - pmac: PmacIO = pmac, + # pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, spec: Spec[Movable] | None = None, exposure_time: float = 0.1, @@ -239,6 +240,14 @@ def spectroscopy_fly( yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore + pmac = PmacIO( + "BL01C-MO-PPMAC-01:", + raw_motors=[sample_stage.y, sample_stage.x], + coord_nums=[1], + ) + + yield from ensure_connected(pmac) + # Prepare motor info using trajectory scanning scan_frame_duration = 0.01 num_x = 35 @@ -339,7 +348,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - pmac: PmacIO = pmac, + # pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, total_number_of_scan_points: int = 25, grid_size: float = 5.0, @@ -372,7 +381,7 @@ def demo_spectroscopy( yield from spectroscopy_fly( spectroscopy_detector=spectroscopy_detector, sample_stage=sample_stage, - pmac=pmac, + # pmac=pmac, pandabrick=pandabrick, spec=None, exposure_time=exposure_time, From 2c62e3d95941d4fe329a755f5beca6d8f1913a37 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 30 Jan 2026 14:47:04 +0000 Subject: [PATCH 30/49] chore: add shape to flyscan metadata --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 1e6cda6..19d9c07 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -292,7 +292,7 @@ def spectroscopy_fly( ) @attach_data_session_metadata_decorator() - @bpp.run_decorator() + @bpp.run_decorator(md={"shape": spec.shape()}) @bpp.stage_decorator( [pandabrick, panda_trigger_logic, spectroscopy_detector, pmac_trajectory_flyer] ) From 476fb6828d205adeddeb847f447bbb4b37ea9af6 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Fri, 30 Jan 2026 14:57:40 +0000 Subject: [PATCH 31/49] chore: inject pmac --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 19d9c07..374e7bf 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -348,7 +348,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - # pmac: PmacIO = pmac, + pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, total_number_of_scan_points: int = 25, grid_size: float = 5.0, From fd20db84033681cc92ba8cf15881b7fe7957b3bf Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 4 Feb 2026 14:21:11 +0000 Subject: [PATCH 32/49] refactor: combine scans into common interface --- src/test_rig_bluesky/plans.py | 132 +++++++++------------------------- 1 file changed, 35 insertions(+), 97 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 374e7bf..aa770b3 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -94,6 +94,8 @@ def snapshot( def spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, + pandabrick: HDFPanda = pandabrick, + num_points: int = 25, spec: Spec[Movable] | None = None, exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, @@ -174,72 +176,23 @@ def spectroscopy( ], ) - spec = spec or Line(sample_stage.x, 0, 5, 5) - - yield from spec_scan({spectroscopy_detector, sample_stage}, spec, metadata=metadata) + spec = spec or Line(sample_stage.x, 0, 5, 5) # type: ignore + if num_points < 1_000: + yield from spec_scan( + {spectroscopy_detector, sample_stage}, + spec, # type: ignore + metadata=metadata, + ) + else: + yield from fly_scan(spec, spectroscopy_detector, pandabrick, num_points) # type: ignore -def spectroscopy_fly( +def fly_scan( + spec: Spec[Movable], spectroscopy_detector: AravisDetector = spectroscopy_detector, - sample_stage: XYZStage = sample_stage, - # pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, - spec: Spec[Movable] | None = None, - exposure_time: float = 0.1, - metadata: dict[str, Any] | None = None, -) -> MsgGenerator[None]: - yield from load_settings( - device=spectroscopy_detector, - design_name="spectroscopy_detector_baseline", - whitelist_pvs=[ - "fileio-nd_array_port", - "fileio-enable_callbacks", - # "driver-acquire", - # "driver-trigger_mode", - # "driver-trigger_source", - "roistat-channels-array_counter", - "roistat-channels-1-min_x", - "roistat-channels-1-min_y", - "roistat-channels-1-name_", - "roistat-channels-1-size_x", - "roistat-channels-1-size_y", - "roistat-channels-1-use", - "roistat-channels-2-min_x", - "roistat-channels-2-min_y", - "roistat-channels-2-name_", - "roistat-channels-2-size_x", - "roistat-channels-2-size_y", - "roistat-channels-2-use", - "roistat-channels-3-min_x", - "roistat-channels-3-min_y", - "roistat-channels-3-name_", - "roistat-channels-3-size_x", - "roistat-channels-3-size_y", - "roistat-channels-3-use", - "roistat-nd_array_port", - "roistat-enable_callbacks", - ], - ) - - params: list[NDAttributeParam] = [] - for channel in list(spectroscopy_detector.roistat.channels.keys()): # type: ignore - roistatn = spectroscopy_detector.roistat.channels[channel] # type: ignore - assert isinstance(roistatn, NDROIStatNIO) - - channel_name = yield from bps.rd(roistatn.name_) - - params.append( - NDAttributeParam( - name=f"{channel_name}Total", - param="ROISTAT_TOTAL", - datatype=NDAttributeDataType.DOUBLE, - addr=channel - 1, - description=f"Sum of {channel_name} channel", - ) - ) - - yield from setup_ndattributes(spectroscopy_detector.roistat, params) # type: ignore - + num_points: int = 1_000, +): pmac = PmacIO( "BL01C-MO-PPMAC-01:", raw_motors=[sample_stage.y, sample_stage.x], @@ -248,24 +201,15 @@ def spectroscopy_fly( yield from ensure_connected(pmac) - # Prepare motor info using trajectory scanning scan_frame_duration = 0.01 - num_x = 35 - num_y = 100 - spec = spec or Fly( - scan_frame_duration - @ (Line(sample_stage.y, 0, 1, num_x) * ~Line(sample_stage.x, 0, 1, num_y)) # type: ignore - ) - + fly_spec = Fly(scan_frame_duration @ spec) # type: ignore detector_deadtime = 2e-3 * 1.01 - total = num_x * num_y - trigger_logic = spec + trigger_logic = fly_spec pmac_trajectory_flyer = PmacTrajectoryTriggerLogic(pmac) - # pmac_trajectory_flyer = StandardFlyer(pmac_trajectory) table: SeqBlock = pandabrick.seq.__1 # type: ignore # noqa: SLF001 - scan_spec_info = ScanSpecInfo(spec=spec, deadtime=detector_deadtime) + scan_spec_info = ScanSpecInfo(spec=fly_spec, deadtime=detector_deadtime) # type: ignore panda_trigger_logic = StandardFlyer( ScanSpecSeqTableTriggerLogic( @@ -277,7 +221,7 @@ def spectroscopy_fly( # Prepare Panda file writer trigger info panda_hdf_info = TriggerInfo( - number_of_events=total, + number_of_events=num_points, trigger=DetectorTrigger.EXTERNAL_LEVEL, livetime=scan_frame_livetime, deadtime=detector_deadtime, @@ -285,7 +229,7 @@ def spectroscopy_fly( # Prepare Panda file writer trigger info detector_info = TriggerInfo( - number_of_events=total, + number_of_events=num_points, trigger=DetectorTrigger.EXTERNAL_EDGE, livetime=scan_frame_livetime, deadtime=detector_deadtime, @@ -348,7 +292,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - pmac: PmacIO = pmac, + # pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, total_number_of_scan_points: int = 25, grid_size: float = 5.0, @@ -366,24 +310,18 @@ def demo_spectroscopy( xmax = grid_origin_x + grid_size ymin = grid_origin_y ymax = grid_origin_y + grid_size - grid = Line(sample_stage.y, ymin, ymax, ysteps) * Line( - sample_stage.x, xmin, xmax, xsteps + grid = Line(sample_stage.y, ymin, ymax, ysteps) * Line( # type: ignore + sample_stage.x, # type: ignore + xmin, + xmax, + xsteps, + ) + yield from spectroscopy( + spectroscopy_detector=spectroscopy_detector, + sample_stage=sample_stage, + pandabrick=pandabrick, + num_points=total_number_of_scan_points, + spec=grid, + exposure_time=exposure_time, + metadata=metadata, ) - if total_number_of_scan_points < 1000: - yield from spectroscopy( - spectroscopy_detector=spectroscopy_detector, - sample_stage=sample_stage, - spec=grid, - exposure_time=exposure_time, - metadata=metadata, - ) - else: - yield from spectroscopy_fly( - spectroscopy_detector=spectroscopy_detector, - sample_stage=sample_stage, - # pmac=pmac, - pandabrick=pandabrick, - spec=None, - exposure_time=exposure_time, - metadata=metadata, - ) From 820f280a92a403e5451ae8c15741e950aa74e9be Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 4 Feb 2026 14:26:43 +0000 Subject: [PATCH 33/49] refactor: combine scans into common interface --- src/test_rig_bluesky/plans.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index aa770b3..1a815bd 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -190,6 +190,7 @@ def spectroscopy( def fly_scan( spec: Spec[Movable], spectroscopy_detector: AravisDetector = spectroscopy_detector, + sample_stage: XYZStage = sample_stage, pandabrick: HDFPanda = pandabrick, num_points: int = 1_000, ): From c4f70d994f2fafcdc5e92ff569bfb25d2e5123fa Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 4 Feb 2026 14:30:14 +0000 Subject: [PATCH 34/49] refactor: combine scans into common interface --- src/test_rig_bluesky/plans.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 1a815bd..069307f 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -184,15 +184,15 @@ def spectroscopy( metadata=metadata, ) else: - yield from fly_scan(spec, spectroscopy_detector, pandabrick, num_points) # type: ignore + yield from _fly_scan(spec, spectroscopy_detector, pandabrick, num_points) # type: ignore -def fly_scan( +def _fly_scan( spec: Spec[Movable], - spectroscopy_detector: AravisDetector = spectroscopy_detector, - sample_stage: XYZStage = sample_stage, - pandabrick: HDFPanda = pandabrick, - num_points: int = 1_000, + spectroscopy_detector: AravisDetector, + sample_stage: XYZStage, + pandabrick: HDFPanda, + num_points: int, ): pmac = PmacIO( "BL01C-MO-PPMAC-01:", From 0406387eecd1e2cf63bb09fe3e815ff43abb9997 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 4 Feb 2026 14:31:53 +0000 Subject: [PATCH 35/49] refactor: combine scans into common interface --- src/test_rig_bluesky/plans.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 069307f..f0724db 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -184,15 +184,21 @@ def spectroscopy( metadata=metadata, ) else: - yield from _fly_scan(spec, spectroscopy_detector, pandabrick, num_points) # type: ignore + yield from fly_scan( + spec, + spectroscopy_detector, + sample_stage, + pandabrick, + num_points, # type: ignore + ) -def _fly_scan( +def fly_scan( spec: Spec[Movable], - spectroscopy_detector: AravisDetector, - sample_stage: XYZStage, - pandabrick: HDFPanda, - num_points: int, + spectroscopy_detector: AravisDetector = spectroscopy_detector, + sample_stage: XYZStage = sample_stage, + pandabrick: HDFPanda = pandabrick, + num_points: int = 1_000, ): pmac = PmacIO( "BL01C-MO-PPMAC-01:", From 7df0f72dfe88e8e07b715ecbdbdf0485420fb9f4 Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 4 Feb 2026 14:39:57 +0000 Subject: [PATCH 36/49] refactor: combine scans into common interface --- src/test_rig_bluesky/plans.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index f0724db..3ea5236 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -209,7 +209,13 @@ def fly_scan( yield from ensure_connected(pmac) scan_frame_duration = 0.01 - fly_spec = Fly(scan_frame_duration @ spec) # type: ignore + # fly_spec = Fly(scan_frame_duration @ spec) # type: ignore + num_x = 35 + num_y = 100 + fly_spec = Fly( + scan_frame_duration + @ (Line(sample_stage.y, 0, 1, num_x) * ~Line(sample_stage.x, 0, 1, num_y)) # type: ignore + ) detector_deadtime = 2e-3 * 1.01 trigger_logic = fly_spec From 8aa8de38f02ed7453b5273555187e802afd3d30a Mon Sep 17 00:00:00 2001 From: Shihab Suliman Date: Wed, 4 Feb 2026 14:45:56 +0000 Subject: [PATCH 37/49] refactor: combine scans into common interface --- src/test_rig_bluesky/plans.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 3ea5236..f0724db 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -209,13 +209,7 @@ def fly_scan( yield from ensure_connected(pmac) scan_frame_duration = 0.01 - # fly_spec = Fly(scan_frame_duration @ spec) # type: ignore - num_x = 35 - num_y = 100 - fly_spec = Fly( - scan_frame_duration - @ (Line(sample_stage.y, 0, 1, num_x) * ~Line(sample_stage.x, 0, 1, num_y)) # type: ignore - ) + fly_spec = Fly(scan_frame_duration @ spec) # type: ignore detector_deadtime = 2e-3 * 1.01 trigger_logic = fly_spec From d1720cc7a7c1712226d763fabceb0353cdc994fd Mon Sep 17 00:00:00 2001 From: Emily Arnold <222046505+EmsArnold@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:29:24 +0000 Subject: [PATCH 38/49] Snake grid spec --- src/test_rig_bluesky/plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index f0724db..b4644d8 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -317,7 +317,7 @@ def demo_spectroscopy( xmax = grid_origin_x + grid_size ymin = grid_origin_y ymax = grid_origin_y + grid_size - grid = Line(sample_stage.y, ymin, ymax, ysteps) * Line( # type: ignore + grid = Line(sample_stage.y, ymin, ymax, ysteps) * ~Line( # type: ignore sample_stage.x, # type: ignore xmin, xmax, From 568d089e8ac52047efe3c998528d528e83af9662 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Thu, 12 Feb 2026 13:56:36 +0000 Subject: [PATCH 39/49] add load_panda_settings --- src/test_rig_bluesky/pandabrick_baseline.yml | 781 +++++++++++++++++++ src/test_rig_bluesky/plans.py | 24 +- 2 files changed, 804 insertions(+), 1 deletion(-) create mode 100644 src/test_rig_bluesky/pandabrick_baseline.yml diff --git a/src/test_rig_bluesky/pandabrick_baseline.yml b/src/test_rig_bluesky/pandabrick_baseline.yml new file mode 100644 index 0000000..63a7fd5 --- /dev/null +++ b/src/test_rig_bluesky/pandabrick_baseline.yml @@ -0,0 +1,781 @@ +absenc.__1.bits: 0 +absenc.__1.clk: TTLIN1.VAL +absenc.__1.clk_delay: 0 +absenc.__1.clk_period: 0.0 +absenc.__1.clk_period_units: min +absenc.__1.clk_src: Internally Generated +absenc.__1.conn_capture: false +absenc.__1.data_capture: false +absenc.__1.encoding: Unsigned Binary +absenc.__1.frame_period: 0.0 +absenc.__1.frame_period_units: min +absenc.__1.lsb_discard: 0 +absenc.__1.msb_discard: 0 +absenc.__1.protocol: SSI +absenc.__1.val_capture: "No" +absenc.__1.val_dataset: "" +absenc.__1.val_offset: 0.0 +absenc.__1.val_scale: 0.0 +absenc.__2.bits: 0 +absenc.__2.clk: TTLIN1.VAL +absenc.__2.clk_delay: 0 +absenc.__2.clk_period: 0.0 +absenc.__2.clk_period_units: min +absenc.__2.clk_src: Internally Generated +absenc.__2.conn_capture: false +absenc.__2.data_capture: false +absenc.__2.encoding: Unsigned Binary +absenc.__2.frame_period: 0.0 +absenc.__2.frame_period_units: min +absenc.__2.lsb_discard: 0 +absenc.__2.msb_discard: 0 +absenc.__2.protocol: SSI +absenc.__2.val_capture: "No" +absenc.__2.val_dataset: "" +absenc.__2.val_offset: 0.0 +absenc.__2.val_scale: 0.0 +absenc.__3.bits: 0 +absenc.__3.clk: TTLIN1.VAL +absenc.__3.clk_delay: 0 +absenc.__3.clk_period: 0.0 +absenc.__3.clk_period_units: min +absenc.__3.clk_src: Internally Generated +absenc.__3.conn_capture: false +absenc.__3.data_capture: false +absenc.__3.encoding: Unsigned Binary +absenc.__3.frame_period: 0.0 +absenc.__3.frame_period_units: min +absenc.__3.lsb_discard: 0 +absenc.__3.msb_discard: 0 +absenc.__3.protocol: SSI +absenc.__3.val_capture: "No" +absenc.__3.val_dataset: "" +absenc.__3.val_offset: 0.0 +absenc.__3.val_scale: 0.0 +absenc.__4.bits: 0 +absenc.__4.clk: TTLIN1.VAL +absenc.__4.clk_delay: 0 +absenc.__4.clk_period: 0.0 +absenc.__4.clk_period_units: min +absenc.__4.clk_src: Internally Generated +absenc.__4.conn_capture: false +absenc.__4.data_capture: false +absenc.__4.encoding: Unsigned Binary +absenc.__4.frame_period: 0.0 +absenc.__4.frame_period_units: min +absenc.__4.lsb_discard: 0 +absenc.__4.msb_discard: 0 +absenc.__4.protocol: SSI +absenc.__4.val_capture: "No" +absenc.__4.val_dataset: "" +absenc.__4.val_offset: 0.0 +absenc.__4.val_scale: 0.0 +absenc.__5.bits: 0 +absenc.__5.clk: TTLIN1.VAL +absenc.__5.clk_delay: 0 +absenc.__5.clk_period: 0.0 +absenc.__5.clk_period_units: min +absenc.__5.clk_src: Internally Generated +absenc.__5.conn_capture: false +absenc.__5.data_capture: false +absenc.__5.encoding: Unsigned Binary +absenc.__5.frame_period: 0.0 +absenc.__5.frame_period_units: min +absenc.__5.lsb_discard: 0 +absenc.__5.msb_discard: 0 +absenc.__5.protocol: SSI +absenc.__5.val_capture: "No" +absenc.__5.val_dataset: "" +absenc.__5.val_offset: 0.0 +absenc.__5.val_scale: 0.0 +absenc.__6.bits: 0 +absenc.__6.clk: TTLIN1.VAL +absenc.__6.clk_delay: 0 +absenc.__6.clk_period: 0.0 +absenc.__6.clk_period_units: min +absenc.__6.clk_src: Internally Generated +absenc.__6.conn_capture: false +absenc.__6.data_capture: false +absenc.__6.encoding: Unsigned Binary +absenc.__6.frame_period: 0.0 +absenc.__6.frame_period_units: min +absenc.__6.lsb_discard: 0 +absenc.__6.msb_discard: 0 +absenc.__6.protocol: SSI +absenc.__6.val_capture: "No" +absenc.__6.val_dataset: "" +absenc.__6.val_offset: 0.0 +absenc.__6.val_scale: 0.0 +absenc.__7.bits: 0 +absenc.__7.clk: TTLIN1.VAL +absenc.__7.clk_delay: 0 +absenc.__7.clk_period: 0.0 +absenc.__7.clk_period_units: min +absenc.__7.clk_src: Internally Generated +absenc.__7.conn_capture: false +absenc.__7.data_capture: false +absenc.__7.encoding: Unsigned Binary +absenc.__7.frame_period: 0.0 +absenc.__7.frame_period_units: min +absenc.__7.lsb_discard: 0 +absenc.__7.msb_discard: 0 +absenc.__7.protocol: SSI +absenc.__7.val_capture: "No" +absenc.__7.val_dataset: "" +absenc.__7.val_offset: 0.0 +absenc.__7.val_scale: 0.0 +absenc.__8.bits: 0 +absenc.__8.clk: TTLIN1.VAL +absenc.__8.clk_delay: 0 +absenc.__8.clk_period: 0.0 +absenc.__8.clk_period_units: min +absenc.__8.clk_src: Internally Generated +absenc.__8.conn_capture: false +absenc.__8.data_capture: false +absenc.__8.encoding: Unsigned Binary +absenc.__8.frame_period: 0.0 +absenc.__8.frame_period_units: min +absenc.__8.lsb_discard: 0 +absenc.__8.msb_discard: 0 +absenc.__8.protocol: SSI +absenc.__8.val_capture: "No" +absenc.__8.val_dataset: "" +absenc.__8.val_offset: 0.0 +absenc.__8.val_scale: 0.0 +bits.a: false +bits.b: false +bits.c: false +bits.d: false +bits.outa_capture: false +bits.outb_capture: false +bits.outc_capture: false +bits.outd_capture: false +calc.__1.inpa: ABSENC1.VAL +calc.__1.inpb: ABSENC1.VAL +calc.__1.inpc: ABSENC1.VAL +calc.__1.inpd: ABSENC1.VAL +calc.__1.out_capture: "No" +calc.__1.out_dataset: "" +calc.__1.out_offset: 0.0 +calc.__1.out_scale: 0.0 +calc.__1.shift: 0 +calc.__1.typea: Value +calc.__1.typeb: Value +calc.__1.typec: Value +calc.__1.typed: Value +calc.__2.inpa: ABSENC1.VAL +calc.__2.inpb: ABSENC1.VAL +calc.__2.inpc: ABSENC1.VAL +calc.__2.inpd: ABSENC1.VAL +calc.__2.out_capture: "No" +calc.__2.out_dataset: "" +calc.__2.out_offset: 0.0 +calc.__2.out_scale: 0.0 +calc.__2.shift: 0 +calc.__2.typea: Value +calc.__2.typeb: Value +calc.__2.typec: Value +calc.__2.typed: Value +clock.__1.enable: TTLIN1.VAL +clock.__1.enable_delay: 0 +clock.__1.out_capture: false +clock.__1.period: 0.0 +clock.__1.period_units: min +clock.__1.width: 0.0 +clock.__1.width_units: min +clock.__2.enable: TTLIN1.VAL +clock.__2.enable_delay: 0 +clock.__2.out_capture: false +clock.__2.period: 0.0 +clock.__2.period_units: min +clock.__2.width: 0.0 +clock.__2.width_units: min +counter.__1.carry_capture: false +counter.__1.dir: TTLIN1.VAL +counter.__1.dir_delay: 0 +counter.__1.enable: TTLIN1.VAL +counter.__1.enable_delay: 0 +counter.__1.max: 0 +counter.__1.min: 0 +counter.__1.out_capture: "No" +counter.__1.out_dataset: "" +counter.__1.out_mode: On-Change +counter.__1.out_offset: 0.0 +counter.__1.out_scale: 0.0 +counter.__1.set: 0 +counter.__1.start: 0 +counter.__1.step: 0 +counter.__1.trig: TTLIN1.VAL +counter.__1.trig_delay: 0 +counter.__1.trig_edge: Rising +counter.__2.carry_capture: false +counter.__2.dir: TTLIN1.VAL +counter.__2.dir_delay: 0 +counter.__2.enable: TTLIN1.VAL +counter.__2.enable_delay: 0 +counter.__2.max: 0 +counter.__2.min: 0 +counter.__2.out_capture: "No" +counter.__2.out_dataset: "" +counter.__2.out_mode: On-Change +counter.__2.out_offset: 0.0 +counter.__2.out_scale: 0.0 +counter.__2.set: 0 +counter.__2.start: 0 +counter.__2.step: 0 +counter.__2.trig: TTLIN1.VAL +counter.__2.trig_delay: 0 +counter.__2.trig_edge: Rising +counter.__3.carry_capture: false +counter.__3.dir: TTLIN1.VAL +counter.__3.dir_delay: 0 +counter.__3.enable: TTLIN1.VAL +counter.__3.enable_delay: 0 +counter.__3.max: 0 +counter.__3.min: 0 +counter.__3.out_capture: "No" +counter.__3.out_dataset: "" +counter.__3.out_mode: On-Change +counter.__3.out_offset: 0.0 +counter.__3.out_scale: 0.0 +counter.__3.set: 0 +counter.__3.start: 0 +counter.__3.step: 0 +counter.__3.trig: TTLIN1.VAL +counter.__3.trig_delay: 0 +counter.__3.trig_edge: Rising +counter.__4.carry_capture: false +counter.__4.dir: TTLIN1.VAL +counter.__4.dir_delay: 0 +counter.__4.enable: TTLIN1.VAL +counter.__4.enable_delay: 0 +counter.__4.max: 0 +counter.__4.min: 0 +counter.__4.out_capture: "No" +counter.__4.out_dataset: "" +counter.__4.out_mode: On-Change +counter.__4.out_offset: 0.0 +counter.__4.out_scale: 0.0 +counter.__4.set: 0 +counter.__4.start: 0 +counter.__4.step: 0 +counter.__4.trig: TTLIN1.VAL +counter.__4.trig_delay: 0 +counter.__4.trig_edge: Rising +data.capture: false +data.capture_mode: FOREVER +data.create_directory: 0 +data.flush_period: 0.0 +data.hdf_directory: /dls/b01-1/data/2026/cm44191-1/spool +data.hdf_file_name: b01-1-981-pandabrick.h5 +data.num_capture: 0 +div.__1.divisor: 0 +div.__1.enable: TTLIN1.VAL +div.__1.enable_delay: 0 +div.__1.first_pulse: OutN +div.__1.inp: TTLIN1.VAL +div.__1.inp_delay: 0 +div.__1.outd_capture: false +div.__1.outn_capture: false +div.__2.divisor: 0 +div.__2.enable: TTLIN1.VAL +div.__2.enable_delay: 0 +div.__2.first_pulse: OutN +div.__2.inp: TTLIN1.VAL +div.__2.inp_delay: 0 +div.__2.outd_capture: false +div.__2.outn_capture: false +equ.__1.val_capture: false +equ.__2.val_capture: false +equ.__3.val_capture: false +equ.__4.val_capture: false +equ.__5.val_capture: false +equ.__6.val_capture: false +equ.__7.val_capture: false +equ.__8.val_capture: false +filter.__1.enable: TTLIN1.VAL +filter.__1.enable_delay: 0 +filter.__1.inp: ABSENC1.VAL +filter.__1.mode: difference +filter.__1.out_capture: "No" +filter.__1.out_dataset: "" +filter.__1.out_offset: 0.0 +filter.__1.out_scale: 0.0 +filter.__1.ready_capture: false +filter.__1.trig: TTLIN1.VAL +filter.__1.trig_delay: 0 +filter.__2.enable: TTLIN1.VAL +filter.__2.enable_delay: 0 +filter.__2.inp: ABSENC1.VAL +filter.__2.mode: difference +filter.__2.out_capture: "No" +filter.__2.out_dataset: "" +filter.__2.out_offset: 0.0 +filter.__2.out_scale: 0.0 +filter.__2.ready_capture: false +filter.__2.trig: TTLIN1.VAL +filter.__2.trig_delay: 0 +incenc.__1.conn_capture: false +incenc.__1.protocol: Quadrature +incenc.__1.rst_on_z: false +incenc.__1.val_capture: "No" +incenc.__1.val_dataset: "" +incenc.__1.val_offset: 0.0 +incenc.__1.val_scale: 0.0 +incenc.__2.conn_capture: false +incenc.__2.protocol: Quadrature +incenc.__2.rst_on_z: false +incenc.__2.val_capture: "No" +incenc.__2.val_dataset: X +incenc.__2.val_offset: 0.0 +incenc.__2.val_scale: 0.0 +incenc.__3.conn_capture: false +incenc.__3.protocol: Quadrature +incenc.__3.rst_on_z: false +incenc.__3.val_capture: "No" +incenc.__3.val_dataset: Y +incenc.__3.val_offset: 0.0 +incenc.__3.val_scale: 0.0 +incenc.__4.conn_capture: false +incenc.__4.protocol: Quadrature +incenc.__4.rst_on_z: false +incenc.__4.val_capture: "No" +incenc.__4.val_dataset: "" +incenc.__4.val_offset: 0.0 +incenc.__4.val_scale: 0.0 +incenc.__5.conn_capture: false +incenc.__5.protocol: Quadrature +incenc.__5.rst_on_z: false +incenc.__5.val_capture: "No" +incenc.__5.val_dataset: "" +incenc.__5.val_offset: 0.0 +incenc.__5.val_scale: 0.0 +incenc.__6.conn_capture: false +incenc.__6.protocol: Quadrature +incenc.__6.rst_on_z: false +incenc.__6.val_capture: "No" +incenc.__6.val_dataset: "" +incenc.__6.val_offset: 0.0 +incenc.__6.val_scale: 0.0 +incenc.__7.conn_capture: false +incenc.__7.protocol: Quadrature +incenc.__7.rst_on_z: false +incenc.__7.val_capture: "No" +incenc.__7.val_dataset: "" +incenc.__7.val_offset: 0.0 +incenc.__7.val_scale: 0.0 +incenc.__8.conn_capture: false +incenc.__8.protocol: Quadrature +incenc.__8.rst_on_z: false +incenc.__8.val_capture: "No" +incenc.__8.val_dataset: "" +incenc.__8.val_offset: 0.0 +incenc.__8.val_scale: 0.0 +lut.__1.func: "" +lut.__1.inpa: TTLIN1.VAL +lut.__1.inpa_delay: 0 +lut.__1.inpb: TTLIN1.VAL +lut.__1.inpb_delay: 0 +lut.__1.inpc: TTLIN1.VAL +lut.__1.inpc_delay: 0 +lut.__1.inpd: TTLIN1.VAL +lut.__1.inpd_delay: 0 +lut.__1.inpe: TTLIN1.VAL +lut.__1.inpe_delay: 0 +lut.__1.out_capture: false +lut.__1.typea: Input-Level +lut.__1.typeb: Input-Level +lut.__1.typec: Input-Level +lut.__1.typed: Input-Level +lut.__1.typee: Input-Level +lut.__2.func: "" +lut.__2.inpa: TTLIN1.VAL +lut.__2.inpa_delay: 0 +lut.__2.inpb: TTLIN1.VAL +lut.__2.inpb_delay: 0 +lut.__2.inpc: TTLIN1.VAL +lut.__2.inpc_delay: 0 +lut.__2.inpd: TTLIN1.VAL +lut.__2.inpd_delay: 0 +lut.__2.inpe: TTLIN1.VAL +lut.__2.inpe_delay: 0 +lut.__2.out_capture: false +lut.__2.typea: Input-Level +lut.__2.typeb: Input-Level +lut.__2.typec: Input-Level +lut.__2.typed: Input-Level +lut.__2.typee: Input-Level +lut.__3.func: "" +lut.__3.inpa: TTLIN1.VAL +lut.__3.inpa_delay: 0 +lut.__3.inpb: TTLIN1.VAL +lut.__3.inpb_delay: 0 +lut.__3.inpc: TTLIN1.VAL +lut.__3.inpc_delay: 0 +lut.__3.inpd: TTLIN1.VAL +lut.__3.inpd_delay: 0 +lut.__3.inpe: TTLIN1.VAL +lut.__3.inpe_delay: 0 +lut.__3.out_capture: false +lut.__3.typea: Input-Level +lut.__3.typeb: Input-Level +lut.__3.typec: Input-Level +lut.__3.typed: Input-Level +lut.__3.typee: Input-Level +lut.__4.func: "" +lut.__4.inpa: TTLIN1.VAL +lut.__4.inpa_delay: 0 +lut.__4.inpb: TTLIN1.VAL +lut.__4.inpb_delay: 0 +lut.__4.inpc: TTLIN1.VAL +lut.__4.inpc_delay: 0 +lut.__4.inpd: TTLIN1.VAL +lut.__4.inpd_delay: 0 +lut.__4.inpe: TTLIN1.VAL +lut.__4.inpe_delay: 0 +lut.__4.out_capture: false +lut.__4.typea: Input-Level +lut.__4.typeb: Input-Level +lut.__4.typec: Input-Level +lut.__4.typed: Input-Level +lut.__4.typee: Input-Level +lut.__5.func: "" +lut.__5.inpa: TTLIN1.VAL +lut.__5.inpa_delay: 0 +lut.__5.inpb: TTLIN1.VAL +lut.__5.inpb_delay: 0 +lut.__5.inpc: TTLIN1.VAL +lut.__5.inpc_delay: 0 +lut.__5.inpd: TTLIN1.VAL +lut.__5.inpd_delay: 0 +lut.__5.inpe: TTLIN1.VAL +lut.__5.inpe_delay: 0 +lut.__5.out_capture: false +lut.__5.typea: Input-Level +lut.__5.typeb: Input-Level +lut.__5.typec: Input-Level +lut.__5.typed: Input-Level +lut.__5.typee: Input-Level +lut.__6.func: "" +lut.__6.inpa: TTLIN1.VAL +lut.__6.inpa_delay: 0 +lut.__6.inpb: TTLIN1.VAL +lut.__6.inpb_delay: 0 +lut.__6.inpc: TTLIN1.VAL +lut.__6.inpc_delay: 0 +lut.__6.inpd: TTLIN1.VAL +lut.__6.inpd_delay: 0 +lut.__6.inpe: TTLIN1.VAL +lut.__6.inpe_delay: 0 +lut.__6.out_capture: false +lut.__6.typea: Input-Level +lut.__6.typeb: Input-Level +lut.__6.typec: Input-Level +lut.__6.typed: Input-Level +lut.__6.typee: Input-Level +lut.__7.func: "" +lut.__7.inpa: TTLIN1.VAL +lut.__7.inpa_delay: 0 +lut.__7.inpb: TTLIN1.VAL +lut.__7.inpb_delay: 0 +lut.__7.inpc: TTLIN1.VAL +lut.__7.inpc_delay: 0 +lut.__7.inpd: TTLIN1.VAL +lut.__7.inpd_delay: 0 +lut.__7.inpe: TTLIN1.VAL +lut.__7.inpe_delay: 0 +lut.__7.out_capture: false +lut.__7.typea: Input-Level +lut.__7.typeb: Input-Level +lut.__7.typec: Input-Level +lut.__7.typed: Input-Level +lut.__7.typee: Input-Level +lut.__8.func: "" +lut.__8.inpa: TTLIN1.VAL +lut.__8.inpa_delay: 0 +lut.__8.inpb: TTLIN1.VAL +lut.__8.inpb_delay: 0 +lut.__8.inpc: TTLIN1.VAL +lut.__8.inpc_delay: 0 +lut.__8.inpd: TTLIN1.VAL +lut.__8.inpd_delay: 0 +lut.__8.inpe: TTLIN1.VAL +lut.__8.inpe_delay: 0 +lut.__8.out_capture: false +lut.__8.typea: Input-Level +lut.__8.typeb: Input-Level +lut.__8.typec: Input-Level +lut.__8.typed: Input-Level +lut.__8.typee: Input-Level +pcap.active_capture: false +pcap.arm: false +pcap.bits0_capture: "No" +pcap.bits0_dataset: "" +pcap.bits1_capture: "No" +pcap.bits1_dataset: "" +pcap.bits2_capture: "No" +pcap.bits2_dataset: "" +pcap.bits3_capture: "No" +pcap.bits3_dataset: "" +pcap.enable: TTLIN1.VAL +pcap.enable_delay: 0 +pcap.gate: TTLIN1.VAL +pcap.gate_delay: 0 +pcap.gate_duration_capture: "No" +pcap.gate_duration_dataset: "" +pcap.shift_sum: 0 +pcap.trig: TTLIN1.VAL +pcap.trig_delay: 0 +pcap.trig_edge: Rising +pcap.ts_end_capture: "No" +pcap.ts_end_dataset: "" +pcap.ts_start_capture: "No" +pcap.ts_start_dataset: "" +pcap.ts_trig_capture: "No" +pcap.ts_trig_dataset: "" +pcomp.__1.active_capture: false +pcomp.__1.dir: Positive +pcomp.__1.enable: TTLIN1.VAL +pcomp.__1.enable_delay: 0 +pcomp.__1.inp: ABSENC1.VAL +pcomp.__1.out_capture: false +pcomp.__1.pre_start: 0 +pcomp.__1.pulses: 0 +pcomp.__1.relative: Absolute +pcomp.__1.start: 0 +pcomp.__1.step: 0 +pcomp.__1.width: 0 +pcomp.__2.active_capture: false +pcomp.__2.dir: Positive +pcomp.__2.enable: TTLIN1.VAL +pcomp.__2.enable_delay: 0 +pcomp.__2.inp: ABSENC1.VAL +pcomp.__2.out_capture: false +pcomp.__2.pre_start: 0 +pcomp.__2.pulses: 0 +pcomp.__2.relative: Absolute +pcomp.__2.start: 0 +pcomp.__2.step: 0 +pcomp.__2.width: 0 +pmacenc.__1.bits: 0 +pmacenc.__1.clk_capture: false +pmacenc.__1.data: TTLIN1.VAL +pmacenc.__1.data_delay: 0 +pmacenc.__1.enable: TTLIN1.VAL +pmacenc.__1.enable_delay: 0 +pmacenc.__1.encoding: Unsigned Binary +pmacenc.__1.generator_error: "No" +pmacenc.__1.protocol: Passthrough - UVWT +pmacenc.__1.val: ABSENC1.VAL +pmacenc.__2.bits: 0 +pmacenc.__2.clk_capture: false +pmacenc.__2.data: TTLIN1.VAL +pmacenc.__2.data_delay: 0 +pmacenc.__2.enable: TTLIN1.VAL +pmacenc.__2.enable_delay: 0 +pmacenc.__2.encoding: Unsigned Binary +pmacenc.__2.generator_error: "No" +pmacenc.__2.protocol: Passthrough - UVWT +pmacenc.__2.val: ABSENC1.VAL +pmacenc.__3.bits: 0 +pmacenc.__3.clk_capture: false +pmacenc.__3.data: TTLIN1.VAL +pmacenc.__3.data_delay: 0 +pmacenc.__3.enable: TTLIN1.VAL +pmacenc.__3.enable_delay: 0 +pmacenc.__3.encoding: Unsigned Binary +pmacenc.__3.generator_error: "No" +pmacenc.__3.protocol: Passthrough - UVWT +pmacenc.__3.val: ABSENC1.VAL +pmacenc.__4.bits: 0 +pmacenc.__4.clk_capture: false +pmacenc.__4.data: TTLIN1.VAL +pmacenc.__4.data_delay: 0 +pmacenc.__4.enable: TTLIN1.VAL +pmacenc.__4.enable_delay: 0 +pmacenc.__4.encoding: Unsigned Binary +pmacenc.__4.generator_error: "No" +pmacenc.__4.protocol: Passthrough - UVWT +pmacenc.__4.val: ABSENC1.VAL +pmacenc.__5.bits: 0 +pmacenc.__5.clk_capture: false +pmacenc.__5.data: TTLIN1.VAL +pmacenc.__5.data_delay: 0 +pmacenc.__5.enable: TTLIN1.VAL +pmacenc.__5.enable_delay: 0 +pmacenc.__5.encoding: Unsigned Binary +pmacenc.__5.generator_error: "No" +pmacenc.__5.protocol: Passthrough - UVWT +pmacenc.__5.val: ABSENC1.VAL +pmacenc.__6.bits: 0 +pmacenc.__6.clk_capture: false +pmacenc.__6.data: TTLIN1.VAL +pmacenc.__6.data_delay: 0 +pmacenc.__6.enable: TTLIN1.VAL +pmacenc.__6.enable_delay: 0 +pmacenc.__6.encoding: Unsigned Binary +pmacenc.__6.generator_error: "No" +pmacenc.__6.protocol: Passthrough - UVWT +pmacenc.__6.val: ABSENC1.VAL +pmacenc.__7.bits: 0 +pmacenc.__7.clk_capture: false +pmacenc.__7.data: TTLIN1.VAL +pmacenc.__7.data_delay: 0 +pmacenc.__7.enable: TTLIN1.VAL +pmacenc.__7.enable_delay: 0 +pmacenc.__7.encoding: Unsigned Binary +pmacenc.__7.generator_error: "No" +pmacenc.__7.protocol: Passthrough - UVWT +pmacenc.__7.val: ABSENC1.VAL +pmacenc.__8.bits: 0 +pmacenc.__8.clk_capture: false +pmacenc.__8.data: TTLIN1.VAL +pmacenc.__8.data_delay: 0 +pmacenc.__8.enable: TTLIN1.VAL +pmacenc.__8.enable_delay: 0 +pmacenc.__8.encoding: Unsigned Binary +pmacenc.__8.generator_error: "No" +pmacenc.__8.protocol: Passthrough - UVWT +pmacenc.__8.val: ABSENC1.VAL +pulse.__1.delay: 0.0 +pulse.__1.delay_units: min +pulse.__1.enable: TTLIN1.VAL +pulse.__1.enable_delay: 0 +pulse.__1.out_capture: false +pulse.__1.pulses: 0 +pulse.__1.step: 0.0 +pulse.__1.step_units: min +pulse.__1.trig: TTLIN1.VAL +pulse.__1.trig_delay: 0 +pulse.__1.trig_edge: Rising +pulse.__1.width: 0.0 +pulse.__1.width_units: min +pulse.__2.delay: 0.0 +pulse.__2.delay_units: min +pulse.__2.enable: TTLIN1.VAL +pulse.__2.enable_delay: 0 +pulse.__2.out_capture: false +pulse.__2.pulses: 0 +pulse.__2.step: 0.0 +pulse.__2.step_units: min +pulse.__2.trig: TTLIN1.VAL +pulse.__2.trig_delay: 0 +pulse.__2.trig_edge: Rising +pulse.__2.width: 0.0 +pulse.__2.width_units: min +pulse.__3.delay: 0.0 +pulse.__3.delay_units: min +pulse.__3.enable: TTLIN1.VAL +pulse.__3.enable_delay: 0 +pulse.__3.out_capture: false +pulse.__3.pulses: 0 +pulse.__3.step: 0.0 +pulse.__3.step_units: min +pulse.__3.trig: TTLIN1.VAL +pulse.__3.trig_delay: 0 +pulse.__3.trig_edge: Rising +pulse.__3.width: 0.0 +pulse.__3.width_units: min +pulse.__4.delay: 0.0 +pulse.__4.delay_units: min +pulse.__4.enable: TTLIN1.VAL +pulse.__4.enable_delay: 0 +pulse.__4.out_capture: false +pulse.__4.pulses: 0 +pulse.__4.step: 0.0 +pulse.__4.step_units: min +pulse.__4.trig: TTLIN1.VAL +pulse.__4.trig_delay: 0 +pulse.__4.trig_edge: Rising +pulse.__4.width: 0.0 +pulse.__4.width_units: min +seq.__1.active_capture: false +seq.__1.bita: TTLIN1.VAL +seq.__1.bita_delay: 0 +seq.__1.bitb: TTLIN1.VAL +seq.__1.bitb_delay: 0 +seq.__1.bitc: TTLIN1.VAL +seq.__1.bitc_delay: 0 +seq.__1.enable: ZERO +seq.__1.enable_delay: 0 +seq.__1.outa_capture: false +seq.__1.outb_capture: false +seq.__1.outc_capture: false +seq.__1.outd_capture: false +seq.__1.oute_capture: false +seq.__1.outf_capture: false +seq.__1.posa: ZERO +seq.__1.posb: ABSENC1.VAL +seq.__1.posc: ABSENC1.VAL +seq.__1.prescale: 1.0 +seq.__1.prescale_units: us +seq.__1.repeats: 1 +seq.__2.active_capture: false +seq.__2.bita: TTLIN1.VAL +seq.__2.bita_delay: 0 +seq.__2.bitb: TTLIN1.VAL +seq.__2.bitb_delay: 0 +seq.__2.bitc: TTLIN1.VAL +seq.__2.bitc_delay: 0 +seq.__2.enable: ZERO +seq.__2.enable_delay: 0 +seq.__2.outa_capture: false +seq.__2.outb_capture: false +seq.__2.outc_capture: false +seq.__2.outd_capture: false +seq.__2.oute_capture: false +seq.__2.outf_capture: false +seq.__2.posa: ZERO +seq.__2.posb: ABSENC1.VAL +seq.__2.posc: ABSENC1.VAL +seq.__2.prescale: 0.0 +seq.__2.prescale_units: us +seq.__2.repeats: 1 +srgate.__1.enable: TTLIN1.VAL +srgate.__1.enable_delay: 0 +srgate.__1.out_capture: false +srgate.__1.rst: TTLIN1.VAL +srgate.__1.rst_delay: 0 +srgate.__1.rst_edge: Rising +srgate.__1.set: TTLIN1.VAL +srgate.__1.set_delay: 0 +srgate.__1.set_edge: Rising +srgate.__1.when_disabled: Set output low +srgate.__2.enable: TTLIN1.VAL +srgate.__2.enable_delay: 0 +srgate.__2.out_capture: false +srgate.__2.rst: TTLIN1.VAL +srgate.__2.rst_delay: 0 +srgate.__2.rst_edge: Rising +srgate.__2.set: TTLIN1.VAL +srgate.__2.set_delay: 0 +srgate.__2.set_edge: Rising +srgate.__2.when_disabled: Set output low +srgate.__3.enable: TTLIN1.VAL +srgate.__3.enable_delay: 0 +srgate.__3.out_capture: false +srgate.__3.rst: TTLIN1.VAL +srgate.__3.rst_delay: 0 +srgate.__3.rst_edge: Rising +srgate.__3.set: TTLIN1.VAL +srgate.__3.set_delay: 0 +srgate.__3.set_edge: Rising +srgate.__3.when_disabled: Set output low +srgate.__4.enable: TTLIN1.VAL +srgate.__4.enable_delay: 0 +srgate.__4.out_capture: false +srgate.__4.rst: TTLIN1.VAL +srgate.__4.rst_delay: 0 +srgate.__4.rst_edge: Rising +srgate.__4.set: TTLIN1.VAL +srgate.__4.set_delay: 0 +srgate.__4.set_edge: Rising +srgate.__4.when_disabled: Set output low +ttlin.__1.term: High-Z +ttlin.__1.val_capture: false +ttlin.__2.term: High-Z +ttlin.__2.val_capture: false +ttlout.__1.val: TTLIN1.VAL +ttlout.__1.val_delay: 0 +ttlout.__2.val: TTLIN1.VAL +ttlout.__2.val_delay: 0 diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index b4644d8..f8e25bf 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -33,6 +33,7 @@ SeqBlock, ) from ophyd_async.plan_stubs import ( + apply_panda_settings, apply_settings, apply_settings_if_different, ensure_connected, @@ -76,6 +77,25 @@ def load_settings( yield from apply_settings_if_different(settings_to_set, apply_settings) +def load_panda_settings( + panda: HDFPanda, + design_name: str, + whitelist_pvs: list[str] | None = None, +) -> MsgGenerator[None]: + provider = _settings_provider() + settings = yield from retrieve_settings(provider, design_name, panda) + if whitelist_pvs is None: + settings_to_set = settings + else: + signal_values = { + signal: value + for signal, value in settings.items() + if signal.name.replace(f"{panda.name}-", "") in whitelist_pvs + } + settings_to_set = Settings(settings.panda, signal_values) + yield from apply_settings_if_different(settings_to_set, apply_panda_settings) + + def _settings_provider() -> SettingsProvider: this_directory = Path(__file__).parent return YamlSettingsProvider(this_directory) @@ -143,7 +163,7 @@ def spectroscopy( yield from bps.mv( *(spectroscopy_detector.driver.acquire_time, exposure_time), *(spectroscopy_detector.driver.acquire_period, exposure_time + 1961e-6), - wait=True, + group="spectroscopy_detector_aquire", ) params: list[NDAttributeParam] = [] @@ -200,6 +220,8 @@ def fly_scan( pandabrick: HDFPanda = pandabrick, num_points: int = 1_000, ): + yield from load_panda_settings(panda=pandabrick, design_name="pandabrick_baseline") + pmac = PmacIO( "BL01C-MO-PPMAC-01:", raw_motors=[sample_stage.y, sample_stage.x], From 096a5fca24d922aa2065d945624b8c9e678c5a33 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Thu, 12 Feb 2026 14:24:39 +0000 Subject: [PATCH 40/49] pass exposure_time to fly_scan --- src/test_rig_bluesky/plans.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index f8e25bf..cb0c2a9 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -210,6 +210,7 @@ def spectroscopy( sample_stage, pandabrick, num_points, # type: ignore + exposure_time, ) @@ -219,6 +220,7 @@ def fly_scan( sample_stage: XYZStage = sample_stage, pandabrick: HDFPanda = pandabrick, num_points: int = 1_000, + exposure_time: float = 0.1, ): yield from load_panda_settings(panda=pandabrick, design_name="pandabrick_baseline") @@ -230,7 +232,7 @@ def fly_scan( yield from ensure_connected(pmac) - scan_frame_duration = 0.01 + scan_frame_duration = exposure_time fly_spec = Fly(scan_frame_duration @ spec) # type: ignore detector_deadtime = 2e-3 * 1.01 From a80ba98542077d3e947586bb7f4699741687bb23 Mon Sep 17 00:00:00 2001 From: Emily Arnold <222046505+EmsArnold@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:30:32 +0000 Subject: [PATCH 41/49] rename file --- .../{pandabrick_baseline.yml => pandabrick_baseline.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test_rig_bluesky/{pandabrick_baseline.yml => pandabrick_baseline.yaml} (100%) diff --git a/src/test_rig_bluesky/pandabrick_baseline.yml b/src/test_rig_bluesky/pandabrick_baseline.yaml similarity index 100% rename from src/test_rig_bluesky/pandabrick_baseline.yml rename to src/test_rig_bluesky/pandabrick_baseline.yaml From cd6d15fc5db4f653b8637d6337a8c1bd3035f5d5 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Thu, 12 Feb 2026 17:37:31 +0000 Subject: [PATCH 42/49] add move to initial point --- src/test_rig_bluesky/plans.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index cb0c2a9..42aa59e 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -341,6 +341,12 @@ def demo_spectroscopy( xmax = grid_origin_x + grid_size ymin = grid_origin_y ymax = grid_origin_y + grid_size + + # Move to the start point + yield from bps.mv( + *(sample_stage.x, xmin), *(sample_stage.y, ymin), group="initial_move" + ) + grid = Line(sample_stage.y, ymin, ymax, ysteps) * ~Line( # type: ignore sample_stage.x, # type: ignore xmin, From 39d338df35f0180080f1f6922598a656357c3541 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Mon, 23 Feb 2026 09:51:58 +0000 Subject: [PATCH 43/49] add spec_scan metadata to fly scan --- src/test_rig_bluesky/plans.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 42aa59e..0ce32c7 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -92,7 +92,7 @@ def load_panda_settings( for signal, value in settings.items() if signal.name.replace(f"{panda.name}-", "") in whitelist_pvs } - settings_to_set = Settings(settings.panda, signal_values) + settings_to_set = Settings(settings.device, signal_values) yield from apply_settings_if_different(settings_to_set, apply_panda_settings) @@ -196,6 +196,12 @@ def spectroscopy( ], ) + yield from load_panda_settings( + panda=pandabrick, + design_name="pandabrick_baseline", + whitelist_pvs=["incenc-__3-val_dataset", "incenc-__2-val_dataset"], + ) + spec = spec or Line(sample_stage.x, 0, 5, 5) # type: ignore if num_points < 1_000: yield from spec_scan( @@ -211,6 +217,7 @@ def spectroscopy( pandabrick, num_points, # type: ignore exposure_time, + metadata, ) @@ -221,6 +228,7 @@ def fly_scan( pandabrick: HDFPanda = pandabrick, num_points: int = 1_000, exposure_time: float = 0.1, + metadata: dict[str, Any] | None = None, ): yield from load_panda_settings(panda=pandabrick, design_name="pandabrick_baseline") @@ -232,6 +240,17 @@ def fly_scan( yield from ensure_connected(pmac) + # Reproduce metadata present in spec_scan + _md = { + "plan_args": { + "detectors": {det.name for det in [pandabrick, spectroscopy_detector]}, + "spec": repr(spec), + }, + "plan_name": "spec_scan", + "shape": spec.shape(), + **(metadata or {}), + } + scan_frame_duration = exposure_time fly_spec = Fly(scan_frame_duration @ spec) # type: ignore detector_deadtime = 2e-3 * 1.01 @@ -267,7 +286,7 @@ def fly_scan( ) @attach_data_session_metadata_decorator() - @bpp.run_decorator(md={"shape": spec.shape()}) + @bpp.run_decorator(md=_md) @bpp.stage_decorator( [pandabrick, panda_trigger_logic, spectroscopy_detector, pmac_trajectory_flyer] ) From 355b1ff842897062d84bf3be2fe39098e5b5db07 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Mon, 23 Feb 2026 10:20:52 +0000 Subject: [PATCH 44/49] read plan_args from fly_spec --- src/test_rig_bluesky/plans.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 0ce32c7..370afc6 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -240,17 +240,6 @@ def fly_scan( yield from ensure_connected(pmac) - # Reproduce metadata present in spec_scan - _md = { - "plan_args": { - "detectors": {det.name for det in [pandabrick, spectroscopy_detector]}, - "spec": repr(spec), - }, - "plan_name": "spec_scan", - "shape": spec.shape(), - **(metadata or {}), - } - scan_frame_duration = exposure_time fly_spec = Fly(scan_frame_duration @ spec) # type: ignore detector_deadtime = 2e-3 * 1.01 @@ -269,6 +258,17 @@ def fly_scan( scan_frame_livetime = scan_frame_duration - detector_deadtime + # Reproduce metadata present in spec_scan + _md = { + "plan_args": { + "detectors": {det.name for det in [pandabrick, spectroscopy_detector]}, + "spec": repr(fly_spec), + }, + "plan_name": "fly_scan", + "shape": fly_spec.shape(), + **(metadata or {}), + } + # Prepare Panda file writer trigger info panda_hdf_info = TriggerInfo( number_of_events=num_points, From a3564d706251fdadcc0f0efe80331d2083284f47 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Mon, 23 Feb 2026 10:51:17 +0000 Subject: [PATCH 45/49] add velocity driven fly_scan logic and logging --- src/test_rig_bluesky/plans.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 370afc6..1c2a341 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -1,3 +1,4 @@ +import logging import math from pathlib import Path from typing import Any @@ -43,6 +44,8 @@ ) from scanspec.specs import Fly, Line, Spec +LOGGER = logging.getLogger(__name__) + imaging_detector = inject("imaging_detector") spectroscopy_detector = inject("spectroscopy_detector") sample_stage = inject("sample_stage") @@ -118,6 +121,7 @@ def spectroscopy( num_points: int = 25, spec: Spec[Movable] | None = None, exposure_time: float = 0.1, + fly: bool = True, metadata: dict[str, Any] | None = None, ) -> MsgGenerator[None]: """Do a spectroscopy scan.""" @@ -203,13 +207,8 @@ def spectroscopy( ) spec = spec or Line(sample_stage.x, 0, 5, 5) # type: ignore - if num_points < 1_000: - yield from spec_scan( - {spectroscopy_detector, sample_stage}, - spec, # type: ignore - metadata=metadata, - ) - else: + if fly: + LOGGER.info("Performing a fly scan.") yield from fly_scan( spec, spectroscopy_detector, @@ -219,6 +218,13 @@ def spectroscopy( exposure_time, metadata, ) + else: + LOGGER.info("Performing a step scan.") + yield from spec_scan( + {spectroscopy_detector, sample_stage}, + spec, # type: ignore + metadata=metadata, + ) def fly_scan( @@ -361,6 +367,19 @@ def demo_spectroscopy( ymin = grid_origin_y ymax = grid_origin_y + grid_size + velomax = grid_size / (xsteps * exposure_time) + if velomax <= 10 * 0.98: + fly = True + LOGGER.info("test-rig-bluesky") + LOGGER.info( + f"Estimated velocity is {velomax:.2f} mm/sec, performing a fly scan." + ) + else: + fly = False + LOGGER.info( + f"Estimated velocity is {velomax:.2f} mm/sec, performing a step scan." + ) + # Move to the start point yield from bps.mv( *(sample_stage.x, xmin), *(sample_stage.y, ymin), group="initial_move" @@ -379,5 +398,6 @@ def demo_spectroscopy( num_points=total_number_of_scan_points, spec=grid, exposure_time=exposure_time, + fly=fly, metadata=metadata, ) From 8f582e2fefe1e2afc7fbba1e4dfee6fa44fad54d Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Wed, 8 Apr 2026 06:42:32 +0000 Subject: [PATCH 46/49] update blueapi version, ROI locations --- pyproject.toml | 2 +- .../spectroscopy_detector_baseline.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bf5b60e..3936422 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ requires-python = ">=3.11" [project.optional-dependencies] dev = [ - "blueapi>=1.3.1", + "blueapi>=1.12.0", "copier", "pipdeptree", "pre-commit", diff --git a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml index 97ad306..19f7f7e 100644 --- a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml +++ b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml @@ -36,20 +36,20 @@ writer.wait_for_plugins: false writer.xml_file_name: "" roistat.acquire: false roistat.array_counter: 3 -roistat.channels.1.min_x: 95 -roistat.channels.1.min_y: 610 +roistat.channels.1.min_x: 1511 +roistat.channels.1.min_y: 104 roistat.channels.1.name_: Red roistat.channels.1.size_x: 150 roistat.channels.1.size_y: 150 roistat.channels.1.use: true -roistat.channels.2.min_x: 880 -roistat.channels.2.min_y: 605 +roistat.channels.2.min_x: 907 +roistat.channels.2.min_y: 108 roistat.channels.2.name_: Green roistat.channels.2.size_x: 150 roistat.channels.2.size_y: 150 roistat.channels.2.use: true -roistat.channels.3.min_x: 1665 -roistat.channels.3.min_y: 600 +roistat.channels.3.min_x: 295 +roistat.channels.3.min_y: 114 roistat.channels.3.name_: Blue roistat.channels.3.size_x: 150 roistat.channels.3.size_y: 150 From e8c0fd6d7c0139acb34de482c53c04ea7bf2964f Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Wed, 29 Apr 2026 09:03:38 +0000 Subject: [PATCH 47/49] mirror current changes in PVC --- src/test_rig_bluesky/plans.py | 90 ++++++++++++------- .../spectroscopy_detector_baseline.yaml | 40 ++++----- 2 files changed, 79 insertions(+), 51 deletions(-) diff --git a/src/test_rig_bluesky/plans.py b/src/test_rig_bluesky/plans.py index 1c2a341..8ffc5ea 100644 --- a/src/test_rig_bluesky/plans.py +++ b/src/test_rig_bluesky/plans.py @@ -22,35 +22,36 @@ YamlSettingsProvider, ) from ophyd_async.epics.adaravis import AravisDetector -from ophyd_async.epics.adcore import NDAttributeDataType, NDAttributeParam, NDROIStatNIO -from ophyd_async.epics.pmac import ( - PmacIO, - PmacTrajectoryTriggerLogic, +from ophyd_async.epics.adcore import ( + NDAttributeDataType, + NDAttributeParam, + NDROIStatNIO, + setup_ndattributes, ) +from ophyd_async.epics.pmac import PmacIO, PmacTrajectoryTriggerLogic from ophyd_async.fastcs.panda import ( HDFPanda, ScanSpecInfo, ScanSpecSeqTableTriggerLogic, SeqBlock, + apply_panda_settings, ) from ophyd_async.plan_stubs import ( - apply_panda_settings, apply_settings, apply_settings_if_different, - ensure_connected, retrieve_settings, - setup_ndattributes, store_settings, ) from scanspec.specs import Fly, Line, Spec LOGGER = logging.getLogger(__name__) -imaging_detector = inject("imaging_detector") +# imaging_detector = inject("imaging_detector") spectroscopy_detector = inject("spectroscopy_detector") sample_stage = inject("sample_stage") pmac = inject("pmac") pandabrick = inject("pandabrick") +# pmac_trigger_logic = inject("pmac_trigger_logic") def save_settings( @@ -106,7 +107,7 @@ def _settings_provider() -> SettingsProvider: @attach_data_session_metadata_decorator() def snapshot( - imaging_detector: AravisDetector = imaging_detector, + imaging_detector: AravisDetector, spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, ) -> MsgGenerator[None]: @@ -117,6 +118,7 @@ def snapshot( def spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, + pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, num_points: int = 25, spec: Spec[Movable] | None = None, @@ -200,19 +202,39 @@ def spectroscopy( ], ) - yield from load_panda_settings( - panda=pandabrick, - design_name="pandabrick_baseline", - whitelist_pvs=["incenc-__3-val_dataset", "incenc-__2-val_dataset"], - ) + # yield from load_panda_settings( + # panda=pandabrick, + # design_name="pandabrick_baseline", + # whitelist_pvs=["incenc-__3-val_dataset", "incenc-__2-val_dataset"], + # ) + + LOGGER.info("Panda Children: %s", list(pandabrick.absenc.children())) # type: ignore spec = spec or Line(sample_stage.x, 0, 5, 5) # type: ignore + + # NOTE: replace with spec_serialized = spec.serialize() when this merges: https://github.com/bluesky/scanspec/pull/208 + from typing import Any + + from pydantic import TypeAdapter + from scanspec.specs import Spec + + spec_serialzied = TypeAdapter(Spec[Any]).dump_python( + spec, mode="json", fallback=repr + ) + + # write json-serializable form of spec into metadata + if metadata is None: + metadata = {} + # spec.serialize() when https://github.com/bluesky/scanspec/pull/208 merges + metadata["spec"] = spec_serialzied + if fly: LOGGER.info("Performing a fly scan.") yield from fly_scan( spec, spectroscopy_detector, sample_stage, + pmac, pandabrick, num_points, # type: ignore exposure_time, @@ -231,34 +253,39 @@ def fly_scan( spec: Spec[Movable], spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, + pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, num_points: int = 1_000, exposure_time: float = 0.1, metadata: dict[str, Any] | None = None, ): - yield from load_panda_settings(panda=pandabrick, design_name="pandabrick_baseline") + # yield from load_panda_settings(panda=pandabrick,design_name="pandabrick_baseline") - pmac = PmacIO( - "BL01C-MO-PPMAC-01:", - raw_motors=[sample_stage.y, sample_stage.x], - coord_nums=[1], + yield from load_panda_settings( + panda=pandabrick, + design_name="pandabrick_baseline", + whitelist_pvs=["incenc-3-val_dataset", "incenc-2-val_dataset"], ) - yield from ensure_connected(pmac) - scan_frame_duration = exposure_time fly_spec = Fly(scan_frame_duration @ spec) # type: ignore detector_deadtime = 2e-3 * 1.01 trigger_logic = fly_spec - pmac_trajectory_flyer = PmacTrajectoryTriggerLogic(pmac) - table: SeqBlock = pandabrick.seq.__1 # type: ignore # noqa: SLF001 + pmac_trigger_logic = PmacTrajectoryTriggerLogic(pmac) + table: SeqBlock = pandabrick.seq[1] # type: ignore # noqa: SLF001 scan_spec_info = ScanSpecInfo(spec=fly_spec, deadtime=detector_deadtime) # type: ignore + # motor_pos_out = { + # sample_stage.x: PosOutScaleOffset.from_inenc(pandabrick, 2), + # sample_stage.y: PosOutScaleOffset.from_inenc(pandabrick, 3) + # } + panda_trigger_logic = StandardFlyer( ScanSpecSeqTableTriggerLogic( table, + # motor_pos_out ) ) @@ -294,14 +321,14 @@ def fly_scan( @attach_data_session_metadata_decorator() @bpp.run_decorator(md=_md) @bpp.stage_decorator( - [pandabrick, panda_trigger_logic, spectroscopy_detector, pmac_trajectory_flyer] + [pandabrick, panda_trigger_logic, spectroscopy_detector, pmac_trigger_logic] ) def inner_plan(): # create a group that is waited for - # Hashable prepare_group = ["pmac_trajectory_flyer", "trigger_logic"] + # Hashable prepare_group = ["pmac_trigger_logic", "trigger_logic"] # Prepare pmac with the trajectory - yield from bps.prepare(pmac_trajectory_flyer, trigger_logic) + yield from bps.prepare(pmac_trigger_logic, trigger_logic) # prepare sequencer table yield from bps.prepare(panda_trigger_logic, scan_spec_info) # prepare panda and hdf writer once, at start of scan @@ -317,19 +344,19 @@ def inner_plan(): # Start the detectors and hdf writers acquiring. # Configure the panda (seq table triggering). - # create a group that is waited for before pmac_trajectory_flyer kicked off on + # create a group that is waited for before pmac_trigger_logic kicked off on # its own with wait=true. yield from bps.kickoff(pandabrick) yield from bps.kickoff(panda_trigger_logic) yield from bps.kickoff(spectroscopy_detector, wait=True) # Start the trajectory. - yield from bps.kickoff(pmac_trajectory_flyer, wait=True) + yield from bps.kickoff(pmac_trigger_logic, wait=True) # Wait for the scan to complete whilst continuously collecting the data. yield from bps.collect_while_completing( flyers=( - pmac_trajectory_flyer, + pmac_trigger_logic, panda_trigger_logic, pandabrick, spectroscopy_detector, @@ -348,7 +375,7 @@ def inner_plan(): def demo_spectroscopy( spectroscopy_detector: AravisDetector = spectroscopy_detector, sample_stage: XYZStage = sample_stage, - # pmac: PmacIO = pmac, + pmac: PmacIO = pmac, pandabrick: HDFPanda = pandabrick, total_number_of_scan_points: int = 25, grid_size: float = 5.0, @@ -381,6 +408,7 @@ def demo_spectroscopy( ) # Move to the start point + # pmac should handle premove yield from bps.mv( *(sample_stage.x, xmin), *(sample_stage.y, ymin), group="initial_move" ) @@ -391,9 +419,11 @@ def demo_spectroscopy( xmax, xsteps, ) + # fly = False yield from spectroscopy( spectroscopy_detector=spectroscopy_detector, sample_stage=sample_stage, + pmac=pmac, pandabrick=pandabrick, num_points=total_number_of_scan_points, spec=grid, diff --git a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml index 19f7f7e..0e4c46d 100644 --- a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml +++ b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml @@ -8,7 +8,6 @@ driver.num_images: 1 driver.trigger_mode: "Off" driver.trigger_source: Freerun driver.wait_for_plugins: false -writer.acquire: false writer.array_counter: 3 writer.auto_increment: true writer.capture: false @@ -32,13 +31,11 @@ writer.num_frames_chunks: 1 writer.position_mode: false writer.queue_size: 2 writer.swmr_mode: true -writer.wait_for_plugins: false writer.xml_file_name: "" -roistat.acquire: false roistat.array_counter: 3 -roistat.channels.1.min_x: 1511 -roistat.channels.1.min_y: 104 -roistat.channels.1.name_: Red +roistat.channels.1.min_x: 295 +roistat.channels.1.min_y: 114 +roistat.channels.1.name_: Blue roistat.channels.1.size_x: 150 roistat.channels.1.size_y: 150 roistat.channels.1.use: true @@ -48,25 +45,26 @@ roistat.channels.2.name_: Green roistat.channels.2.size_x: 150 roistat.channels.2.size_y: 150 roistat.channels.2.use: true -roistat.channels.3.min_x: 295 -roistat.channels.3.min_y: 114 -roistat.channels.3.name_: Blue +roistat.channels.3.min_x: 1511 +roistat.channels.3.min_y: 104 +roistat.channels.3.name_: Red roistat.channels.3.size_x: 150 roistat.channels.3.size_y: 150 roistat.channels.3.use: true roistat.enable_callbacks: Enable roistat.nd_array_address: 0 roistat.nd_array_port: D2.CAM -roistat.nd_attributes_file: - +roistat.nd_attributes_file: roistat.queue_size: 2 -roistat.wait_for_plugins: false From 71d74429d938fc70f0e4e059ca67903527067efa Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Wed, 29 Apr 2026 10:18:43 +0000 Subject: [PATCH 48/49] update pandabrick_baseline signal names --- src/test_rig_bluesky/pandabrick_baseline.yaml | 1480 ++++++++--------- 1 file changed, 740 insertions(+), 740 deletions(-) diff --git a/src/test_rig_bluesky/pandabrick_baseline.yaml b/src/test_rig_bluesky/pandabrick_baseline.yaml index 63a7fd5..f820ddf 100644 --- a/src/test_rig_bluesky/pandabrick_baseline.yaml +++ b/src/test_rig_bluesky/pandabrick_baseline.yaml @@ -1,147 +1,147 @@ -absenc.__1.bits: 0 -absenc.__1.clk: TTLIN1.VAL -absenc.__1.clk_delay: 0 -absenc.__1.clk_period: 0.0 -absenc.__1.clk_period_units: min -absenc.__1.clk_src: Internally Generated -absenc.__1.conn_capture: false -absenc.__1.data_capture: false -absenc.__1.encoding: Unsigned Binary -absenc.__1.frame_period: 0.0 -absenc.__1.frame_period_units: min -absenc.__1.lsb_discard: 0 -absenc.__1.msb_discard: 0 -absenc.__1.protocol: SSI -absenc.__1.val_capture: "No" -absenc.__1.val_dataset: "" -absenc.__1.val_offset: 0.0 -absenc.__1.val_scale: 0.0 -absenc.__2.bits: 0 -absenc.__2.clk: TTLIN1.VAL -absenc.__2.clk_delay: 0 -absenc.__2.clk_period: 0.0 -absenc.__2.clk_period_units: min -absenc.__2.clk_src: Internally Generated -absenc.__2.conn_capture: false -absenc.__2.data_capture: false -absenc.__2.encoding: Unsigned Binary -absenc.__2.frame_period: 0.0 -absenc.__2.frame_period_units: min -absenc.__2.lsb_discard: 0 -absenc.__2.msb_discard: 0 -absenc.__2.protocol: SSI -absenc.__2.val_capture: "No" -absenc.__2.val_dataset: "" -absenc.__2.val_offset: 0.0 -absenc.__2.val_scale: 0.0 -absenc.__3.bits: 0 -absenc.__3.clk: TTLIN1.VAL -absenc.__3.clk_delay: 0 -absenc.__3.clk_period: 0.0 -absenc.__3.clk_period_units: min -absenc.__3.clk_src: Internally Generated -absenc.__3.conn_capture: false -absenc.__3.data_capture: false -absenc.__3.encoding: Unsigned Binary -absenc.__3.frame_period: 0.0 -absenc.__3.frame_period_units: min -absenc.__3.lsb_discard: 0 -absenc.__3.msb_discard: 0 -absenc.__3.protocol: SSI -absenc.__3.val_capture: "No" -absenc.__3.val_dataset: "" -absenc.__3.val_offset: 0.0 -absenc.__3.val_scale: 0.0 -absenc.__4.bits: 0 -absenc.__4.clk: TTLIN1.VAL -absenc.__4.clk_delay: 0 -absenc.__4.clk_period: 0.0 -absenc.__4.clk_period_units: min -absenc.__4.clk_src: Internally Generated -absenc.__4.conn_capture: false -absenc.__4.data_capture: false -absenc.__4.encoding: Unsigned Binary -absenc.__4.frame_period: 0.0 -absenc.__4.frame_period_units: min -absenc.__4.lsb_discard: 0 -absenc.__4.msb_discard: 0 -absenc.__4.protocol: SSI -absenc.__4.val_capture: "No" -absenc.__4.val_dataset: "" -absenc.__4.val_offset: 0.0 -absenc.__4.val_scale: 0.0 -absenc.__5.bits: 0 -absenc.__5.clk: TTLIN1.VAL -absenc.__5.clk_delay: 0 -absenc.__5.clk_period: 0.0 -absenc.__5.clk_period_units: min -absenc.__5.clk_src: Internally Generated -absenc.__5.conn_capture: false -absenc.__5.data_capture: false -absenc.__5.encoding: Unsigned Binary -absenc.__5.frame_period: 0.0 -absenc.__5.frame_period_units: min -absenc.__5.lsb_discard: 0 -absenc.__5.msb_discard: 0 -absenc.__5.protocol: SSI -absenc.__5.val_capture: "No" -absenc.__5.val_dataset: "" -absenc.__5.val_offset: 0.0 -absenc.__5.val_scale: 0.0 -absenc.__6.bits: 0 -absenc.__6.clk: TTLIN1.VAL -absenc.__6.clk_delay: 0 -absenc.__6.clk_period: 0.0 -absenc.__6.clk_period_units: min -absenc.__6.clk_src: Internally Generated -absenc.__6.conn_capture: false -absenc.__6.data_capture: false -absenc.__6.encoding: Unsigned Binary -absenc.__6.frame_period: 0.0 -absenc.__6.frame_period_units: min -absenc.__6.lsb_discard: 0 -absenc.__6.msb_discard: 0 -absenc.__6.protocol: SSI -absenc.__6.val_capture: "No" -absenc.__6.val_dataset: "" -absenc.__6.val_offset: 0.0 -absenc.__6.val_scale: 0.0 -absenc.__7.bits: 0 -absenc.__7.clk: TTLIN1.VAL -absenc.__7.clk_delay: 0 -absenc.__7.clk_period: 0.0 -absenc.__7.clk_period_units: min -absenc.__7.clk_src: Internally Generated -absenc.__7.conn_capture: false -absenc.__7.data_capture: false -absenc.__7.encoding: Unsigned Binary -absenc.__7.frame_period: 0.0 -absenc.__7.frame_period_units: min -absenc.__7.lsb_discard: 0 -absenc.__7.msb_discard: 0 -absenc.__7.protocol: SSI -absenc.__7.val_capture: "No" -absenc.__7.val_dataset: "" -absenc.__7.val_offset: 0.0 -absenc.__7.val_scale: 0.0 -absenc.__8.bits: 0 -absenc.__8.clk: TTLIN1.VAL -absenc.__8.clk_delay: 0 -absenc.__8.clk_period: 0.0 -absenc.__8.clk_period_units: min -absenc.__8.clk_src: Internally Generated -absenc.__8.conn_capture: false -absenc.__8.data_capture: false -absenc.__8.encoding: Unsigned Binary -absenc.__8.frame_period: 0.0 -absenc.__8.frame_period_units: min -absenc.__8.lsb_discard: 0 -absenc.__8.msb_discard: 0 -absenc.__8.protocol: SSI -absenc.__8.val_capture: "No" -absenc.__8.val_dataset: "" -absenc.__8.val_offset: 0.0 -absenc.__8.val_scale: 0.0 +absenc.1.bits: 0 +absenc.1.clk: TTLIN1.VAL +absenc.1.clk_delay: 0 +absenc.1.clk_period: 0.0 +absenc.1.clk_period_units: min +absenc.1.clk_src: Internally Generated +absenc.1.conn_capture: false +absenc.1.data_capture: false +absenc.1.encoding: Unsigned Binary +absenc.1.frame_period: 0.0 +absenc.1.frame_period_units: min +absenc.1.lsb_discard: 0 +absenc.1.msb_discard: 0 +absenc.1.protocol: SSI +absenc.1.val_capture: "No" +absenc.1.val_dataset: "" +absenc.1.val_offset: 0.0 +absenc.1.val_scale: 0.0 +absenc.2.bits: 0 +absenc.2.clk: TTLIN1.VAL +absenc.2.clk_delay: 0 +absenc.2.clk_period: 0.0 +absenc.2.clk_period_units: min +absenc.2.clk_src: Internally Generated +absenc.2.conn_capture: false +absenc.2.data_capture: false +absenc.2.encoding: Unsigned Binary +absenc.2.frame_period: 0.0 +absenc.2.frame_period_units: min +absenc.2.lsb_discard: 0 +absenc.2.msb_discard: 0 +absenc.2.protocol: SSI +absenc.2.val_capture: "No" +absenc.2.val_dataset: "" +absenc.2.val_offset: 0.0 +absenc.2.val_scale: 0.0 +absenc.3.bits: 0 +absenc.3.clk: TTLIN1.VAL +absenc.3.clk_delay: 0 +absenc.3.clk_period: 0.0 +absenc.3.clk_period_units: min +absenc.3.clk_src: Internally Generated +absenc.3.conn_capture: false +absenc.3.data_capture: false +absenc.3.encoding: Unsigned Binary +absenc.3.frame_period: 0.0 +absenc.3.frame_period_units: min +absenc.3.lsb_discard: 0 +absenc.3.msb_discard: 0 +absenc.3.protocol: SSI +absenc.3.val_capture: "No" +absenc.3.val_dataset: "" +absenc.3.val_offset: 0.0 +absenc.3.val_scale: 0.0 +absenc.4.bits: 0 +absenc.4.clk: TTLIN1.VAL +absenc.4.clk_delay: 0 +absenc.4.clk_period: 0.0 +absenc.4.clk_period_units: min +absenc.4.clk_src: Internally Generated +absenc.4.conn_capture: false +absenc.4.data_capture: false +absenc.4.encoding: Unsigned Binary +absenc.4.frame_period: 0.0 +absenc.4.frame_period_units: min +absenc.4.lsb_discard: 0 +absenc.4.msb_discard: 0 +absenc.4.protocol: SSI +absenc.4.val_capture: "No" +absenc.4.val_dataset: "" +absenc.4.val_offset: 0.0 +absenc.4.val_scale: 0.0 +absenc.5.bits: 0 +absenc.5.clk: TTLIN1.VAL +absenc.5.clk_delay: 0 +absenc.5.clk_period: 0.0 +absenc.5.clk_period_units: min +absenc.5.clk_src: Internally Generated +absenc.5.conn_capture: false +absenc.5.data_capture: false +absenc.5.encoding: Unsigned Binary +absenc.5.frame_period: 0.0 +absenc.5.frame_period_units: min +absenc.5.lsb_discard: 0 +absenc.5.msb_discard: 0 +absenc.5.protocol: SSI +absenc.5.val_capture: "No" +absenc.5.val_dataset: "" +absenc.5.val_offset: 0.0 +absenc.5.val_scale: 0.0 +absenc.6.bits: 0 +absenc.6.clk: TTLIN1.VAL +absenc.6.clk_delay: 0 +absenc.6.clk_period: 0.0 +absenc.6.clk_period_units: min +absenc.6.clk_src: Internally Generated +absenc.6.conn_capture: false +absenc.6.data_capture: false +absenc.6.encoding: Unsigned Binary +absenc.6.frame_period: 0.0 +absenc.6.frame_period_units: min +absenc.6.lsb_discard: 0 +absenc.6.msb_discard: 0 +absenc.6.protocol: SSI +absenc.6.val_capture: "No" +absenc.6.val_dataset: "" +absenc.6.val_offset: 0.0 +absenc.6.val_scale: 0.0 +absenc.7.bits: 0 +absenc.7.clk: TTLIN1.VAL +absenc.7.clk_delay: 0 +absenc.7.clk_period: 0.0 +absenc.7.clk_period_units: min +absenc.7.clk_src: Internally Generated +absenc.7.conn_capture: false +absenc.7.data_capture: false +absenc.7.encoding: Unsigned Binary +absenc.7.frame_period: 0.0 +absenc.7.frame_period_units: min +absenc.7.lsb_discard: 0 +absenc.7.msb_discard: 0 +absenc.7.protocol: SSI +absenc.7.val_capture: "No" +absenc.7.val_dataset: "" +absenc.7.val_offset: 0.0 +absenc.7.val_scale: 0.0 +absenc.8.bits: 0 +absenc.8.clk: TTLIN1.VAL +absenc.8.clk_delay: 0 +absenc.8.clk_period: 0.0 +absenc.8.clk_period_units: min +absenc.8.clk_src: Internally Generated +absenc.8.conn_capture: false +absenc.8.data_capture: false +absenc.8.encoding: Unsigned Binary +absenc.8.frame_period: 0.0 +absenc.8.frame_period_units: min +absenc.8.lsb_discard: 0 +absenc.8.msb_discard: 0 +absenc.8.protocol: SSI +absenc.8.val_capture: "No" +absenc.8.val_dataset: "" +absenc.8.val_offset: 0.0 +absenc.8.val_scale: 0.0 bits.a: false bits.b: false bits.c: false @@ -150,118 +150,118 @@ bits.outa_capture: false bits.outb_capture: false bits.outc_capture: false bits.outd_capture: false -calc.__1.inpa: ABSENC1.VAL -calc.__1.inpb: ABSENC1.VAL -calc.__1.inpc: ABSENC1.VAL -calc.__1.inpd: ABSENC1.VAL -calc.__1.out_capture: "No" -calc.__1.out_dataset: "" -calc.__1.out_offset: 0.0 -calc.__1.out_scale: 0.0 -calc.__1.shift: 0 -calc.__1.typea: Value -calc.__1.typeb: Value -calc.__1.typec: Value -calc.__1.typed: Value -calc.__2.inpa: ABSENC1.VAL -calc.__2.inpb: ABSENC1.VAL -calc.__2.inpc: ABSENC1.VAL -calc.__2.inpd: ABSENC1.VAL -calc.__2.out_capture: "No" -calc.__2.out_dataset: "" -calc.__2.out_offset: 0.0 -calc.__2.out_scale: 0.0 -calc.__2.shift: 0 -calc.__2.typea: Value -calc.__2.typeb: Value -calc.__2.typec: Value -calc.__2.typed: Value -clock.__1.enable: TTLIN1.VAL -clock.__1.enable_delay: 0 -clock.__1.out_capture: false -clock.__1.period: 0.0 -clock.__1.period_units: min -clock.__1.width: 0.0 -clock.__1.width_units: min -clock.__2.enable: TTLIN1.VAL -clock.__2.enable_delay: 0 -clock.__2.out_capture: false -clock.__2.period: 0.0 -clock.__2.period_units: min -clock.__2.width: 0.0 -clock.__2.width_units: min -counter.__1.carry_capture: false -counter.__1.dir: TTLIN1.VAL -counter.__1.dir_delay: 0 -counter.__1.enable: TTLIN1.VAL -counter.__1.enable_delay: 0 -counter.__1.max: 0 -counter.__1.min: 0 -counter.__1.out_capture: "No" -counter.__1.out_dataset: "" -counter.__1.out_mode: On-Change -counter.__1.out_offset: 0.0 -counter.__1.out_scale: 0.0 -counter.__1.set: 0 -counter.__1.start: 0 -counter.__1.step: 0 -counter.__1.trig: TTLIN1.VAL -counter.__1.trig_delay: 0 -counter.__1.trig_edge: Rising -counter.__2.carry_capture: false -counter.__2.dir: TTLIN1.VAL -counter.__2.dir_delay: 0 -counter.__2.enable: TTLIN1.VAL -counter.__2.enable_delay: 0 -counter.__2.max: 0 -counter.__2.min: 0 -counter.__2.out_capture: "No" -counter.__2.out_dataset: "" -counter.__2.out_mode: On-Change -counter.__2.out_offset: 0.0 -counter.__2.out_scale: 0.0 -counter.__2.set: 0 -counter.__2.start: 0 -counter.__2.step: 0 -counter.__2.trig: TTLIN1.VAL -counter.__2.trig_delay: 0 -counter.__2.trig_edge: Rising -counter.__3.carry_capture: false -counter.__3.dir: TTLIN1.VAL -counter.__3.dir_delay: 0 -counter.__3.enable: TTLIN1.VAL -counter.__3.enable_delay: 0 -counter.__3.max: 0 -counter.__3.min: 0 -counter.__3.out_capture: "No" -counter.__3.out_dataset: "" -counter.__3.out_mode: On-Change -counter.__3.out_offset: 0.0 -counter.__3.out_scale: 0.0 -counter.__3.set: 0 -counter.__3.start: 0 -counter.__3.step: 0 -counter.__3.trig: TTLIN1.VAL -counter.__3.trig_delay: 0 -counter.__3.trig_edge: Rising -counter.__4.carry_capture: false -counter.__4.dir: TTLIN1.VAL -counter.__4.dir_delay: 0 -counter.__4.enable: TTLIN1.VAL -counter.__4.enable_delay: 0 -counter.__4.max: 0 -counter.__4.min: 0 -counter.__4.out_capture: "No" -counter.__4.out_dataset: "" -counter.__4.out_mode: On-Change -counter.__4.out_offset: 0.0 -counter.__4.out_scale: 0.0 -counter.__4.set: 0 -counter.__4.start: 0 -counter.__4.step: 0 -counter.__4.trig: TTLIN1.VAL -counter.__4.trig_delay: 0 -counter.__4.trig_edge: Rising +calc.1.inpa: ABSENC1.VAL +calc.1.inpb: ABSENC1.VAL +calc.1.inpc: ABSENC1.VAL +calc.1.inpd: ABSENC1.VAL +calc.1.out_capture: "No" +calc.1.out_dataset: "" +calc.1.out_offset: 0.0 +calc.1.out_scale: 0.0 +calc.1.shift: 0 +calc.1.typea: Value +calc.1.typeb: Value +calc.1.typec: Value +calc.1.typed: Value +calc.2.inpa: ABSENC1.VAL +calc.2.inpb: ABSENC1.VAL +calc.2.inpc: ABSENC1.VAL +calc.2.inpd: ABSENC1.VAL +calc.2.out_capture: "No" +calc.2.out_dataset: "" +calc.2.out_offset: 0.0 +calc.2.out_scale: 0.0 +calc.2.shift: 0 +calc.2.typea: Value +calc.2.typeb: Value +calc.2.typec: Value +calc.2.typed: Value +clock.1.enable: TTLIN1.VAL +clock.1.enable_delay: 0 +clock.1.out_capture: false +clock.1.period: 0.0 +clock.1.period_units: min +clock.1.width: 0.0 +clock.1.width_units: min +clock.2.enable: TTLIN1.VAL +clock.2.enable_delay: 0 +clock.2.out_capture: false +clock.2.period: 0.0 +clock.2.period_units: min +clock.2.width: 0.0 +clock.2.width_units: min +counter.1.carry_capture: false +counter.1.dir: TTLIN1.VAL +counter.1.dir_delay: 0 +counter.1.enable: TTLIN1.VAL +counter.1.enable_delay: 0 +counter.1.max: 0 +counter.1.min: 0 +counter.1.out_capture: "No" +counter.1.out_dataset: "" +counter.1.out_mode: On-Change +counter.1.out_offset: 0.0 +counter.1.out_scale: 0.0 +counter.1.set: 0 +counter.1.start: 0 +counter.1.step: 0 +counter.1.trig: TTLIN1.VAL +counter.1.trig_delay: 0 +counter.1.trig_edge: Rising +counter.2.carry_capture: false +counter.2.dir: TTLIN1.VAL +counter.2.dir_delay: 0 +counter.2.enable: TTLIN1.VAL +counter.2.enable_delay: 0 +counter.2.max: 0 +counter.2.min: 0 +counter.2.out_capture: "No" +counter.2.out_dataset: "" +counter.2.out_mode: On-Change +counter.2.out_offset: 0.0 +counter.2.out_scale: 0.0 +counter.2.set: 0 +counter.2.start: 0 +counter.2.step: 0 +counter.2.trig: TTLIN1.VAL +counter.2.trig_delay: 0 +counter.2.trig_edge: Rising +counter.3.carry_capture: false +counter.3.dir: TTLIN1.VAL +counter.3.dir_delay: 0 +counter.3.enable: TTLIN1.VAL +counter.3.enable_delay: 0 +counter.3.max: 0 +counter.3.min: 0 +counter.3.out_capture: "No" +counter.3.out_dataset: "" +counter.3.out_mode: On-Change +counter.3.out_offset: 0.0 +counter.3.out_scale: 0.0 +counter.3.set: 0 +counter.3.start: 0 +counter.3.step: 0 +counter.3.trig: TTLIN1.VAL +counter.3.trig_delay: 0 +counter.3.trig_edge: Rising +counter.4.carry_capture: false +counter.4.dir: TTLIN1.VAL +counter.4.dir_delay: 0 +counter.4.enable: TTLIN1.VAL +counter.4.enable_delay: 0 +counter.4.max: 0 +counter.4.min: 0 +counter.4.out_capture: "No" +counter.4.out_dataset: "" +counter.4.out_mode: On-Change +counter.4.out_offset: 0.0 +counter.4.out_scale: 0.0 +counter.4.set: 0 +counter.4.start: 0 +counter.4.step: 0 +counter.4.trig: TTLIN1.VAL +counter.4.trig_delay: 0 +counter.4.trig_edge: Rising data.capture: false data.capture_mode: FOREVER data.create_directory: 0 @@ -269,244 +269,244 @@ data.flush_period: 0.0 data.hdf_directory: /dls/b01-1/data/2026/cm44191-1/spool data.hdf_file_name: b01-1-981-pandabrick.h5 data.num_capture: 0 -div.__1.divisor: 0 -div.__1.enable: TTLIN1.VAL -div.__1.enable_delay: 0 -div.__1.first_pulse: OutN -div.__1.inp: TTLIN1.VAL -div.__1.inp_delay: 0 -div.__1.outd_capture: false -div.__1.outn_capture: false -div.__2.divisor: 0 -div.__2.enable: TTLIN1.VAL -div.__2.enable_delay: 0 -div.__2.first_pulse: OutN -div.__2.inp: TTLIN1.VAL -div.__2.inp_delay: 0 -div.__2.outd_capture: false -div.__2.outn_capture: false -equ.__1.val_capture: false -equ.__2.val_capture: false -equ.__3.val_capture: false -equ.__4.val_capture: false -equ.__5.val_capture: false -equ.__6.val_capture: false -equ.__7.val_capture: false -equ.__8.val_capture: false -filter.__1.enable: TTLIN1.VAL -filter.__1.enable_delay: 0 -filter.__1.inp: ABSENC1.VAL -filter.__1.mode: difference -filter.__1.out_capture: "No" -filter.__1.out_dataset: "" -filter.__1.out_offset: 0.0 -filter.__1.out_scale: 0.0 -filter.__1.ready_capture: false -filter.__1.trig: TTLIN1.VAL -filter.__1.trig_delay: 0 -filter.__2.enable: TTLIN1.VAL -filter.__2.enable_delay: 0 -filter.__2.inp: ABSENC1.VAL -filter.__2.mode: difference -filter.__2.out_capture: "No" -filter.__2.out_dataset: "" -filter.__2.out_offset: 0.0 -filter.__2.out_scale: 0.0 -filter.__2.ready_capture: false -filter.__2.trig: TTLIN1.VAL -filter.__2.trig_delay: 0 -incenc.__1.conn_capture: false -incenc.__1.protocol: Quadrature -incenc.__1.rst_on_z: false -incenc.__1.val_capture: "No" -incenc.__1.val_dataset: "" -incenc.__1.val_offset: 0.0 -incenc.__1.val_scale: 0.0 -incenc.__2.conn_capture: false -incenc.__2.protocol: Quadrature -incenc.__2.rst_on_z: false -incenc.__2.val_capture: "No" -incenc.__2.val_dataset: X -incenc.__2.val_offset: 0.0 -incenc.__2.val_scale: 0.0 -incenc.__3.conn_capture: false -incenc.__3.protocol: Quadrature -incenc.__3.rst_on_z: false -incenc.__3.val_capture: "No" -incenc.__3.val_dataset: Y -incenc.__3.val_offset: 0.0 -incenc.__3.val_scale: 0.0 -incenc.__4.conn_capture: false -incenc.__4.protocol: Quadrature -incenc.__4.rst_on_z: false -incenc.__4.val_capture: "No" -incenc.__4.val_dataset: "" -incenc.__4.val_offset: 0.0 -incenc.__4.val_scale: 0.0 -incenc.__5.conn_capture: false -incenc.__5.protocol: Quadrature -incenc.__5.rst_on_z: false -incenc.__5.val_capture: "No" -incenc.__5.val_dataset: "" -incenc.__5.val_offset: 0.0 -incenc.__5.val_scale: 0.0 -incenc.__6.conn_capture: false -incenc.__6.protocol: Quadrature -incenc.__6.rst_on_z: false -incenc.__6.val_capture: "No" -incenc.__6.val_dataset: "" -incenc.__6.val_offset: 0.0 -incenc.__6.val_scale: 0.0 -incenc.__7.conn_capture: false -incenc.__7.protocol: Quadrature -incenc.__7.rst_on_z: false -incenc.__7.val_capture: "No" -incenc.__7.val_dataset: "" -incenc.__7.val_offset: 0.0 -incenc.__7.val_scale: 0.0 -incenc.__8.conn_capture: false -incenc.__8.protocol: Quadrature -incenc.__8.rst_on_z: false -incenc.__8.val_capture: "No" -incenc.__8.val_dataset: "" -incenc.__8.val_offset: 0.0 -incenc.__8.val_scale: 0.0 -lut.__1.func: "" -lut.__1.inpa: TTLIN1.VAL -lut.__1.inpa_delay: 0 -lut.__1.inpb: TTLIN1.VAL -lut.__1.inpb_delay: 0 -lut.__1.inpc: TTLIN1.VAL -lut.__1.inpc_delay: 0 -lut.__1.inpd: TTLIN1.VAL -lut.__1.inpd_delay: 0 -lut.__1.inpe: TTLIN1.VAL -lut.__1.inpe_delay: 0 -lut.__1.out_capture: false -lut.__1.typea: Input-Level -lut.__1.typeb: Input-Level -lut.__1.typec: Input-Level -lut.__1.typed: Input-Level -lut.__1.typee: Input-Level -lut.__2.func: "" -lut.__2.inpa: TTLIN1.VAL -lut.__2.inpa_delay: 0 -lut.__2.inpb: TTLIN1.VAL -lut.__2.inpb_delay: 0 -lut.__2.inpc: TTLIN1.VAL -lut.__2.inpc_delay: 0 -lut.__2.inpd: TTLIN1.VAL -lut.__2.inpd_delay: 0 -lut.__2.inpe: TTLIN1.VAL -lut.__2.inpe_delay: 0 -lut.__2.out_capture: false -lut.__2.typea: Input-Level -lut.__2.typeb: Input-Level -lut.__2.typec: Input-Level -lut.__2.typed: Input-Level -lut.__2.typee: Input-Level -lut.__3.func: "" -lut.__3.inpa: TTLIN1.VAL -lut.__3.inpa_delay: 0 -lut.__3.inpb: TTLIN1.VAL -lut.__3.inpb_delay: 0 -lut.__3.inpc: TTLIN1.VAL -lut.__3.inpc_delay: 0 -lut.__3.inpd: TTLIN1.VAL -lut.__3.inpd_delay: 0 -lut.__3.inpe: TTLIN1.VAL -lut.__3.inpe_delay: 0 -lut.__3.out_capture: false -lut.__3.typea: Input-Level -lut.__3.typeb: Input-Level -lut.__3.typec: Input-Level -lut.__3.typed: Input-Level -lut.__3.typee: Input-Level -lut.__4.func: "" -lut.__4.inpa: TTLIN1.VAL -lut.__4.inpa_delay: 0 -lut.__4.inpb: TTLIN1.VAL -lut.__4.inpb_delay: 0 -lut.__4.inpc: TTLIN1.VAL -lut.__4.inpc_delay: 0 -lut.__4.inpd: TTLIN1.VAL -lut.__4.inpd_delay: 0 -lut.__4.inpe: TTLIN1.VAL -lut.__4.inpe_delay: 0 -lut.__4.out_capture: false -lut.__4.typea: Input-Level -lut.__4.typeb: Input-Level -lut.__4.typec: Input-Level -lut.__4.typed: Input-Level -lut.__4.typee: Input-Level -lut.__5.func: "" -lut.__5.inpa: TTLIN1.VAL -lut.__5.inpa_delay: 0 -lut.__5.inpb: TTLIN1.VAL -lut.__5.inpb_delay: 0 -lut.__5.inpc: TTLIN1.VAL -lut.__5.inpc_delay: 0 -lut.__5.inpd: TTLIN1.VAL -lut.__5.inpd_delay: 0 -lut.__5.inpe: TTLIN1.VAL -lut.__5.inpe_delay: 0 -lut.__5.out_capture: false -lut.__5.typea: Input-Level -lut.__5.typeb: Input-Level -lut.__5.typec: Input-Level -lut.__5.typed: Input-Level -lut.__5.typee: Input-Level -lut.__6.func: "" -lut.__6.inpa: TTLIN1.VAL -lut.__6.inpa_delay: 0 -lut.__6.inpb: TTLIN1.VAL -lut.__6.inpb_delay: 0 -lut.__6.inpc: TTLIN1.VAL -lut.__6.inpc_delay: 0 -lut.__6.inpd: TTLIN1.VAL -lut.__6.inpd_delay: 0 -lut.__6.inpe: TTLIN1.VAL -lut.__6.inpe_delay: 0 -lut.__6.out_capture: false -lut.__6.typea: Input-Level -lut.__6.typeb: Input-Level -lut.__6.typec: Input-Level -lut.__6.typed: Input-Level -lut.__6.typee: Input-Level -lut.__7.func: "" -lut.__7.inpa: TTLIN1.VAL -lut.__7.inpa_delay: 0 -lut.__7.inpb: TTLIN1.VAL -lut.__7.inpb_delay: 0 -lut.__7.inpc: TTLIN1.VAL -lut.__7.inpc_delay: 0 -lut.__7.inpd: TTLIN1.VAL -lut.__7.inpd_delay: 0 -lut.__7.inpe: TTLIN1.VAL -lut.__7.inpe_delay: 0 -lut.__7.out_capture: false -lut.__7.typea: Input-Level -lut.__7.typeb: Input-Level -lut.__7.typec: Input-Level -lut.__7.typed: Input-Level -lut.__7.typee: Input-Level -lut.__8.func: "" -lut.__8.inpa: TTLIN1.VAL -lut.__8.inpa_delay: 0 -lut.__8.inpb: TTLIN1.VAL -lut.__8.inpb_delay: 0 -lut.__8.inpc: TTLIN1.VAL -lut.__8.inpc_delay: 0 -lut.__8.inpd: TTLIN1.VAL -lut.__8.inpd_delay: 0 -lut.__8.inpe: TTLIN1.VAL -lut.__8.inpe_delay: 0 -lut.__8.out_capture: false -lut.__8.typea: Input-Level -lut.__8.typeb: Input-Level -lut.__8.typec: Input-Level -lut.__8.typed: Input-Level -lut.__8.typee: Input-Level +div.1.divisor: 0 +div.1.enable: TTLIN1.VAL +div.1.enable_delay: 0 +div.1.first_pulse: OutN +div.1.inp: TTLIN1.VAL +div.1.inp_delay: 0 +div.1.outd_capture: false +div.1.outn_capture: false +div.2.divisor: 0 +div.2.enable: TTLIN1.VAL +div.2.enable_delay: 0 +div.2.first_pulse: OutN +div.2.inp: TTLIN1.VAL +div.2.inp_delay: 0 +div.2.outd_capture: false +div.2.outn_capture: false +equ.1.val_capture: false +equ.2.val_capture: false +equ.3.val_capture: false +equ.4.val_capture: false +equ.5.val_capture: false +equ.6.val_capture: false +equ.7.val_capture: false +equ.8.val_capture: false +filter.1.enable: TTLIN1.VAL +filter.1.enable_delay: 0 +filter.1.inp: ABSENC1.VAL +filter.1.mode: difference +filter.1.out_capture: "No" +filter.1.out_dataset: "" +filter.1.out_offset: 0.0 +filter.1.out_scale: 0.0 +filter.1.ready_capture: false +filter.1.trig: TTLIN1.VAL +filter.1.trig_delay: 0 +filter.2.enable: TTLIN1.VAL +filter.2.enable_delay: 0 +filter.2.inp: ABSENC1.VAL +filter.2.mode: difference +filter.2.out_capture: "No" +filter.2.out_dataset: "" +filter.2.out_offset: 0.0 +filter.2.out_scale: 0.0 +filter.2.ready_capture: false +filter.2.trig: TTLIN1.VAL +filter.2.trig_delay: 0 +incenc.1.conn_capture: false +incenc.1.protocol: Quadrature +incenc.1.rst_on_z: false +incenc.1.val_capture: "No" +incenc.1.val_dataset: "" +incenc.1.val_offset: 0.0 +incenc.1.val_scale: 0.0 +incenc.2.conn_capture: false +incenc.2.protocol: Quadrature +incenc.2.rst_on_z: false +incenc.2.val_capture: "No" +incenc.2.val_dataset: X +incenc.2.val_offset: 0.0 +incenc.2.val_scale: 0.0 +incenc.3.conn_capture: false +incenc.3.protocol: Quadrature +incenc.3.rst_on_z: false +incenc.3.val_capture: "No" +incenc.3.val_dataset: Y +incenc.3.val_offset: 0.0 +incenc.3.val_scale: 0.0 +incenc.4.conn_capture: false +incenc.4.protocol: Quadrature +incenc.4.rst_on_z: false +incenc.4.val_capture: "No" +incenc.4.val_dataset: "" +incenc.4.val_offset: 0.0 +incenc.4.val_scale: 0.0 +incenc.5.conn_capture: false +incenc.5.protocol: Quadrature +incenc.5.rst_on_z: false +incenc.5.val_capture: "No" +incenc.5.val_dataset: "" +incenc.5.val_offset: 0.0 +incenc.5.val_scale: 0.0 +incenc.6.conn_capture: false +incenc.6.protocol: Quadrature +incenc.6.rst_on_z: false +incenc.6.val_capture: "No" +incenc.6.val_dataset: "" +incenc.6.val_offset: 0.0 +incenc.6.val_scale: 0.0 +incenc.7.conn_capture: false +incenc.7.protocol: Quadrature +incenc.7.rst_on_z: false +incenc.7.val_capture: "No" +incenc.7.val_dataset: "" +incenc.7.val_offset: 0.0 +incenc.7.val_scale: 0.0 +incenc.8.conn_capture: false +incenc.8.protocol: Quadrature +incenc.8.rst_on_z: false +incenc.8.val_capture: "No" +incenc.8.val_dataset: "" +incenc.8.val_offset: 0.0 +incenc.8.val_scale: 0.0 +lut.1.func: "" +lut.1.inpa: TTLIN1.VAL +lut.1.inpa_delay: 0 +lut.1.inpb: TTLIN1.VAL +lut.1.inpb_delay: 0 +lut.1.inpc: TTLIN1.VAL +lut.1.inpc_delay: 0 +lut.1.inpd: TTLIN1.VAL +lut.1.inpd_delay: 0 +lut.1.inpe: TTLIN1.VAL +lut.1.inpe_delay: 0 +lut.1.out_capture: false +lut.1.typea: Input-Level +lut.1.typeb: Input-Level +lut.1.typec: Input-Level +lut.1.typed: Input-Level +lut.1.typee: Input-Level +lut.2.func: "" +lut.2.inpa: TTLIN1.VAL +lut.2.inpa_delay: 0 +lut.2.inpb: TTLIN1.VAL +lut.2.inpb_delay: 0 +lut.2.inpc: TTLIN1.VAL +lut.2.inpc_delay: 0 +lut.2.inpd: TTLIN1.VAL +lut.2.inpd_delay: 0 +lut.2.inpe: TTLIN1.VAL +lut.2.inpe_delay: 0 +lut.2.out_capture: false +lut.2.typea: Input-Level +lut.2.typeb: Input-Level +lut.2.typec: Input-Level +lut.2.typed: Input-Level +lut.2.typee: Input-Level +lut.3.func: "" +lut.3.inpa: TTLIN1.VAL +lut.3.inpa_delay: 0 +lut.3.inpb: TTLIN1.VAL +lut.3.inpb_delay: 0 +lut.3.inpc: TTLIN1.VAL +lut.3.inpc_delay: 0 +lut.3.inpd: TTLIN1.VAL +lut.3.inpd_delay: 0 +lut.3.inpe: TTLIN1.VAL +lut.3.inpe_delay: 0 +lut.3.out_capture: false +lut.3.typea: Input-Level +lut.3.typeb: Input-Level +lut.3.typec: Input-Level +lut.3.typed: Input-Level +lut.3.typee: Input-Level +lut.4.func: "" +lut.4.inpa: TTLIN1.VAL +lut.4.inpa_delay: 0 +lut.4.inpb: TTLIN1.VAL +lut.4.inpb_delay: 0 +lut.4.inpc: TTLIN1.VAL +lut.4.inpc_delay: 0 +lut.4.inpd: TTLIN1.VAL +lut.4.inpd_delay: 0 +lut.4.inpe: TTLIN1.VAL +lut.4.inpe_delay: 0 +lut.4.out_capture: false +lut.4.typea: Input-Level +lut.4.typeb: Input-Level +lut.4.typec: Input-Level +lut.4.typed: Input-Level +lut.4.typee: Input-Level +lut.5.func: "" +lut.5.inpa: TTLIN1.VAL +lut.5.inpa_delay: 0 +lut.5.inpb: TTLIN1.VAL +lut.5.inpb_delay: 0 +lut.5.inpc: TTLIN1.VAL +lut.5.inpc_delay: 0 +lut.5.inpd: TTLIN1.VAL +lut.5.inpd_delay: 0 +lut.5.inpe: TTLIN1.VAL +lut.5.inpe_delay: 0 +lut.5.out_capture: false +lut.5.typea: Input-Level +lut.5.typeb: Input-Level +lut.5.typec: Input-Level +lut.5.typed: Input-Level +lut.5.typee: Input-Level +lut.6.func: "" +lut.6.inpa: TTLIN1.VAL +lut.6.inpa_delay: 0 +lut.6.inpb: TTLIN1.VAL +lut.6.inpb_delay: 0 +lut.6.inpc: TTLIN1.VAL +lut.6.inpc_delay: 0 +lut.6.inpd: TTLIN1.VAL +lut.6.inpd_delay: 0 +lut.6.inpe: TTLIN1.VAL +lut.6.inpe_delay: 0 +lut.6.out_capture: false +lut.6.typea: Input-Level +lut.6.typeb: Input-Level +lut.6.typec: Input-Level +lut.6.typed: Input-Level +lut.6.typee: Input-Level +lut.7.func: "" +lut.7.inpa: TTLIN1.VAL +lut.7.inpa_delay: 0 +lut.7.inpb: TTLIN1.VAL +lut.7.inpb_delay: 0 +lut.7.inpc: TTLIN1.VAL +lut.7.inpc_delay: 0 +lut.7.inpd: TTLIN1.VAL +lut.7.inpd_delay: 0 +lut.7.inpe: TTLIN1.VAL +lut.7.inpe_delay: 0 +lut.7.out_capture: false +lut.7.typea: Input-Level +lut.7.typeb: Input-Level +lut.7.typec: Input-Level +lut.7.typed: Input-Level +lut.7.typee: Input-Level +lut.8.func: "" +lut.8.inpa: TTLIN1.VAL +lut.8.inpa_delay: 0 +lut.8.inpb: TTLIN1.VAL +lut.8.inpb_delay: 0 +lut.8.inpc: TTLIN1.VAL +lut.8.inpc_delay: 0 +lut.8.inpd: TTLIN1.VAL +lut.8.inpd_delay: 0 +lut.8.inpe: TTLIN1.VAL +lut.8.inpe_delay: 0 +lut.8.out_capture: false +lut.8.typea: Input-Level +lut.8.typeb: Input-Level +lut.8.typec: Input-Level +lut.8.typed: Input-Level +lut.8.typee: Input-Level pcap.active_capture: false pcap.arm: false pcap.bits0_capture: "No" @@ -533,249 +533,249 @@ pcap.ts_start_capture: "No" pcap.ts_start_dataset: "" pcap.ts_trig_capture: "No" pcap.ts_trig_dataset: "" -pcomp.__1.active_capture: false -pcomp.__1.dir: Positive -pcomp.__1.enable: TTLIN1.VAL -pcomp.__1.enable_delay: 0 -pcomp.__1.inp: ABSENC1.VAL -pcomp.__1.out_capture: false -pcomp.__1.pre_start: 0 -pcomp.__1.pulses: 0 -pcomp.__1.relative: Absolute -pcomp.__1.start: 0 -pcomp.__1.step: 0 -pcomp.__1.width: 0 -pcomp.__2.active_capture: false -pcomp.__2.dir: Positive -pcomp.__2.enable: TTLIN1.VAL -pcomp.__2.enable_delay: 0 -pcomp.__2.inp: ABSENC1.VAL -pcomp.__2.out_capture: false -pcomp.__2.pre_start: 0 -pcomp.__2.pulses: 0 -pcomp.__2.relative: Absolute -pcomp.__2.start: 0 -pcomp.__2.step: 0 -pcomp.__2.width: 0 -pmacenc.__1.bits: 0 -pmacenc.__1.clk_capture: false -pmacenc.__1.data: TTLIN1.VAL -pmacenc.__1.data_delay: 0 -pmacenc.__1.enable: TTLIN1.VAL -pmacenc.__1.enable_delay: 0 -pmacenc.__1.encoding: Unsigned Binary -pmacenc.__1.generator_error: "No" -pmacenc.__1.protocol: Passthrough - UVWT -pmacenc.__1.val: ABSENC1.VAL -pmacenc.__2.bits: 0 -pmacenc.__2.clk_capture: false -pmacenc.__2.data: TTLIN1.VAL -pmacenc.__2.data_delay: 0 -pmacenc.__2.enable: TTLIN1.VAL -pmacenc.__2.enable_delay: 0 -pmacenc.__2.encoding: Unsigned Binary -pmacenc.__2.generator_error: "No" -pmacenc.__2.protocol: Passthrough - UVWT -pmacenc.__2.val: ABSENC1.VAL -pmacenc.__3.bits: 0 -pmacenc.__3.clk_capture: false -pmacenc.__3.data: TTLIN1.VAL -pmacenc.__3.data_delay: 0 -pmacenc.__3.enable: TTLIN1.VAL -pmacenc.__3.enable_delay: 0 -pmacenc.__3.encoding: Unsigned Binary -pmacenc.__3.generator_error: "No" -pmacenc.__3.protocol: Passthrough - UVWT -pmacenc.__3.val: ABSENC1.VAL -pmacenc.__4.bits: 0 -pmacenc.__4.clk_capture: false -pmacenc.__4.data: TTLIN1.VAL -pmacenc.__4.data_delay: 0 -pmacenc.__4.enable: TTLIN1.VAL -pmacenc.__4.enable_delay: 0 -pmacenc.__4.encoding: Unsigned Binary -pmacenc.__4.generator_error: "No" -pmacenc.__4.protocol: Passthrough - UVWT -pmacenc.__4.val: ABSENC1.VAL -pmacenc.__5.bits: 0 -pmacenc.__5.clk_capture: false -pmacenc.__5.data: TTLIN1.VAL -pmacenc.__5.data_delay: 0 -pmacenc.__5.enable: TTLIN1.VAL -pmacenc.__5.enable_delay: 0 -pmacenc.__5.encoding: Unsigned Binary -pmacenc.__5.generator_error: "No" -pmacenc.__5.protocol: Passthrough - UVWT -pmacenc.__5.val: ABSENC1.VAL -pmacenc.__6.bits: 0 -pmacenc.__6.clk_capture: false -pmacenc.__6.data: TTLIN1.VAL -pmacenc.__6.data_delay: 0 -pmacenc.__6.enable: TTLIN1.VAL -pmacenc.__6.enable_delay: 0 -pmacenc.__6.encoding: Unsigned Binary -pmacenc.__6.generator_error: "No" -pmacenc.__6.protocol: Passthrough - UVWT -pmacenc.__6.val: ABSENC1.VAL -pmacenc.__7.bits: 0 -pmacenc.__7.clk_capture: false -pmacenc.__7.data: TTLIN1.VAL -pmacenc.__7.data_delay: 0 -pmacenc.__7.enable: TTLIN1.VAL -pmacenc.__7.enable_delay: 0 -pmacenc.__7.encoding: Unsigned Binary -pmacenc.__7.generator_error: "No" -pmacenc.__7.protocol: Passthrough - UVWT -pmacenc.__7.val: ABSENC1.VAL -pmacenc.__8.bits: 0 -pmacenc.__8.clk_capture: false -pmacenc.__8.data: TTLIN1.VAL -pmacenc.__8.data_delay: 0 -pmacenc.__8.enable: TTLIN1.VAL -pmacenc.__8.enable_delay: 0 -pmacenc.__8.encoding: Unsigned Binary -pmacenc.__8.generator_error: "No" -pmacenc.__8.protocol: Passthrough - UVWT -pmacenc.__8.val: ABSENC1.VAL -pulse.__1.delay: 0.0 -pulse.__1.delay_units: min -pulse.__1.enable: TTLIN1.VAL -pulse.__1.enable_delay: 0 -pulse.__1.out_capture: false -pulse.__1.pulses: 0 -pulse.__1.step: 0.0 -pulse.__1.step_units: min -pulse.__1.trig: TTLIN1.VAL -pulse.__1.trig_delay: 0 -pulse.__1.trig_edge: Rising -pulse.__1.width: 0.0 -pulse.__1.width_units: min -pulse.__2.delay: 0.0 -pulse.__2.delay_units: min -pulse.__2.enable: TTLIN1.VAL -pulse.__2.enable_delay: 0 -pulse.__2.out_capture: false -pulse.__2.pulses: 0 -pulse.__2.step: 0.0 -pulse.__2.step_units: min -pulse.__2.trig: TTLIN1.VAL -pulse.__2.trig_delay: 0 -pulse.__2.trig_edge: Rising -pulse.__2.width: 0.0 -pulse.__2.width_units: min -pulse.__3.delay: 0.0 -pulse.__3.delay_units: min -pulse.__3.enable: TTLIN1.VAL -pulse.__3.enable_delay: 0 -pulse.__3.out_capture: false -pulse.__3.pulses: 0 -pulse.__3.step: 0.0 -pulse.__3.step_units: min -pulse.__3.trig: TTLIN1.VAL -pulse.__3.trig_delay: 0 -pulse.__3.trig_edge: Rising -pulse.__3.width: 0.0 -pulse.__3.width_units: min -pulse.__4.delay: 0.0 -pulse.__4.delay_units: min -pulse.__4.enable: TTLIN1.VAL -pulse.__4.enable_delay: 0 -pulse.__4.out_capture: false -pulse.__4.pulses: 0 -pulse.__4.step: 0.0 -pulse.__4.step_units: min -pulse.__4.trig: TTLIN1.VAL -pulse.__4.trig_delay: 0 -pulse.__4.trig_edge: Rising -pulse.__4.width: 0.0 -pulse.__4.width_units: min -seq.__1.active_capture: false -seq.__1.bita: TTLIN1.VAL -seq.__1.bita_delay: 0 -seq.__1.bitb: TTLIN1.VAL -seq.__1.bitb_delay: 0 -seq.__1.bitc: TTLIN1.VAL -seq.__1.bitc_delay: 0 -seq.__1.enable: ZERO -seq.__1.enable_delay: 0 -seq.__1.outa_capture: false -seq.__1.outb_capture: false -seq.__1.outc_capture: false -seq.__1.outd_capture: false -seq.__1.oute_capture: false -seq.__1.outf_capture: false -seq.__1.posa: ZERO -seq.__1.posb: ABSENC1.VAL -seq.__1.posc: ABSENC1.VAL -seq.__1.prescale: 1.0 -seq.__1.prescale_units: us -seq.__1.repeats: 1 -seq.__2.active_capture: false -seq.__2.bita: TTLIN1.VAL -seq.__2.bita_delay: 0 -seq.__2.bitb: TTLIN1.VAL -seq.__2.bitb_delay: 0 -seq.__2.bitc: TTLIN1.VAL -seq.__2.bitc_delay: 0 -seq.__2.enable: ZERO -seq.__2.enable_delay: 0 -seq.__2.outa_capture: false -seq.__2.outb_capture: false -seq.__2.outc_capture: false -seq.__2.outd_capture: false -seq.__2.oute_capture: false -seq.__2.outf_capture: false -seq.__2.posa: ZERO -seq.__2.posb: ABSENC1.VAL -seq.__2.posc: ABSENC1.VAL -seq.__2.prescale: 0.0 -seq.__2.prescale_units: us -seq.__2.repeats: 1 -srgate.__1.enable: TTLIN1.VAL -srgate.__1.enable_delay: 0 -srgate.__1.out_capture: false -srgate.__1.rst: TTLIN1.VAL -srgate.__1.rst_delay: 0 -srgate.__1.rst_edge: Rising -srgate.__1.set: TTLIN1.VAL -srgate.__1.set_delay: 0 -srgate.__1.set_edge: Rising -srgate.__1.when_disabled: Set output low -srgate.__2.enable: TTLIN1.VAL -srgate.__2.enable_delay: 0 -srgate.__2.out_capture: false -srgate.__2.rst: TTLIN1.VAL -srgate.__2.rst_delay: 0 -srgate.__2.rst_edge: Rising -srgate.__2.set: TTLIN1.VAL -srgate.__2.set_delay: 0 -srgate.__2.set_edge: Rising -srgate.__2.when_disabled: Set output low -srgate.__3.enable: TTLIN1.VAL -srgate.__3.enable_delay: 0 -srgate.__3.out_capture: false -srgate.__3.rst: TTLIN1.VAL -srgate.__3.rst_delay: 0 -srgate.__3.rst_edge: Rising -srgate.__3.set: TTLIN1.VAL -srgate.__3.set_delay: 0 -srgate.__3.set_edge: Rising -srgate.__3.when_disabled: Set output low -srgate.__4.enable: TTLIN1.VAL -srgate.__4.enable_delay: 0 -srgate.__4.out_capture: false -srgate.__4.rst: TTLIN1.VAL -srgate.__4.rst_delay: 0 -srgate.__4.rst_edge: Rising -srgate.__4.set: TTLIN1.VAL -srgate.__4.set_delay: 0 -srgate.__4.set_edge: Rising -srgate.__4.when_disabled: Set output low -ttlin.__1.term: High-Z -ttlin.__1.val_capture: false -ttlin.__2.term: High-Z -ttlin.__2.val_capture: false -ttlout.__1.val: TTLIN1.VAL -ttlout.__1.val_delay: 0 -ttlout.__2.val: TTLIN1.VAL -ttlout.__2.val_delay: 0 +pcomp.1.active_capture: false +pcomp.1.dir: Positive +pcomp.1.enable: TTLIN1.VAL +pcomp.1.enable_delay: 0 +pcomp.1.inp: ABSENC1.VAL +pcomp.1.out_capture: false +pcomp.1.pre_start: 0 +pcomp.1.pulses: 0 +pcomp.1.relative: Absolute +pcomp.1.start: 0 +pcomp.1.step: 0 +pcomp.1.width: 0 +pcomp.2.active_capture: false +pcomp.2.dir: Positive +pcomp.2.enable: TTLIN1.VAL +pcomp.2.enable_delay: 0 +pcomp.2.inp: ABSENC1.VAL +pcomp.2.out_capture: false +pcomp.2.pre_start: 0 +pcomp.2.pulses: 0 +pcomp.2.relative: Absolute +pcomp.2.start: 0 +pcomp.2.step: 0 +pcomp.2.width: 0 +pmacenc.1.bits: 0 +pmacenc.1.clk_capture: false +pmacenc.1.data: TTLIN1.VAL +pmacenc.1.data_delay: 0 +pmacenc.1.enable: TTLIN1.VAL +pmacenc.1.enable_delay: 0 +pmacenc.1.encoding: Unsigned Binary +pmacenc.1.generator_error: "No" +pmacenc.1.protocol: Passthrough - UVWT +pmacenc.1.val: ABSENC1.VAL +pmacenc.2.bits: 0 +pmacenc.2.clk_capture: false +pmacenc.2.data: TTLIN1.VAL +pmacenc.2.data_delay: 0 +pmacenc.2.enable: TTLIN1.VAL +pmacenc.2.enable_delay: 0 +pmacenc.2.encoding: Unsigned Binary +pmacenc.2.generator_error: "No" +pmacenc.2.protocol: Passthrough - UVWT +pmacenc.2.val: ABSENC1.VAL +pmacenc.3.bits: 0 +pmacenc.3.clk_capture: false +pmacenc.3.data: TTLIN1.VAL +pmacenc.3.data_delay: 0 +pmacenc.3.enable: TTLIN1.VAL +pmacenc.3.enable_delay: 0 +pmacenc.3.encoding: Unsigned Binary +pmacenc.3.generator_error: "No" +pmacenc.3.protocol: Passthrough - UVWT +pmacenc.3.val: ABSENC1.VAL +pmacenc.4.bits: 0 +pmacenc.4.clk_capture: false +pmacenc.4.data: TTLIN1.VAL +pmacenc.4.data_delay: 0 +pmacenc.4.enable: TTLIN1.VAL +pmacenc.4.enable_delay: 0 +pmacenc.4.encoding: Unsigned Binary +pmacenc.4.generator_error: "No" +pmacenc.4.protocol: Passthrough - UVWT +pmacenc.4.val: ABSENC1.VAL +pmacenc.5.bits: 0 +pmacenc.5.clk_capture: false +pmacenc.5.data: TTLIN1.VAL +pmacenc.5.data_delay: 0 +pmacenc.5.enable: TTLIN1.VAL +pmacenc.5.enable_delay: 0 +pmacenc.5.encoding: Unsigned Binary +pmacenc.5.generator_error: "No" +pmacenc.5.protocol: Passthrough - UVWT +pmacenc.5.val: ABSENC1.VAL +pmacenc.6.bits: 0 +pmacenc.6.clk_capture: false +pmacenc.6.data: TTLIN1.VAL +pmacenc.6.data_delay: 0 +pmacenc.6.enable: TTLIN1.VAL +pmacenc.6.enable_delay: 0 +pmacenc.6.encoding: Unsigned Binary +pmacenc.6.generator_error: "No" +pmacenc.6.protocol: Passthrough - UVWT +pmacenc.6.val: ABSENC1.VAL +pmacenc.7.bits: 0 +pmacenc.7.clk_capture: false +pmacenc.7.data: TTLIN1.VAL +pmacenc.7.data_delay: 0 +pmacenc.7.enable: TTLIN1.VAL +pmacenc.7.enable_delay: 0 +pmacenc.7.encoding: Unsigned Binary +pmacenc.7.generator_error: "No" +pmacenc.7.protocol: Passthrough - UVWT +pmacenc.7.val: ABSENC1.VAL +pmacenc.8.bits: 0 +pmacenc.8.clk_capture: false +pmacenc.8.data: TTLIN1.VAL +pmacenc.8.data_delay: 0 +pmacenc.8.enable: TTLIN1.VAL +pmacenc.8.enable_delay: 0 +pmacenc.8.encoding: Unsigned Binary +pmacenc.8.generator_error: "No" +pmacenc.8.protocol: Passthrough - UVWT +pmacenc.8.val: ABSENC1.VAL +pulse.1.delay: 0.0 +pulse.1.delay_units: min +pulse.1.enable: TTLIN1.VAL +pulse.1.enable_delay: 0 +pulse.1.out_capture: false +pulse.1.pulses: 0 +pulse.1.step: 0.0 +pulse.1.step_units: min +pulse.1.trig: TTLIN1.VAL +pulse.1.trig_delay: 0 +pulse.1.trig_edge: Rising +pulse.1.width: 0.0 +pulse.1.width_units: min +pulse.2.delay: 0.0 +pulse.2.delay_units: min +pulse.2.enable: TTLIN1.VAL +pulse.2.enable_delay: 0 +pulse.2.out_capture: false +pulse.2.pulses: 0 +pulse.2.step: 0.0 +pulse.2.step_units: min +pulse.2.trig: TTLIN1.VAL +pulse.2.trig_delay: 0 +pulse.2.trig_edge: Rising +pulse.2.width: 0.0 +pulse.2.width_units: min +pulse.3.delay: 0.0 +pulse.3.delay_units: min +pulse.3.enable: TTLIN1.VAL +pulse.3.enable_delay: 0 +pulse.3.out_capture: false +pulse.3.pulses: 0 +pulse.3.step: 0.0 +pulse.3.step_units: min +pulse.3.trig: TTLIN1.VAL +pulse.3.trig_delay: 0 +pulse.3.trig_edge: Rising +pulse.3.width: 0.0 +pulse.3.width_units: min +pulse.4.delay: 0.0 +pulse.4.delay_units: min +pulse.4.enable: TTLIN1.VAL +pulse.4.enable_delay: 0 +pulse.4.out_capture: false +pulse.4.pulses: 0 +pulse.4.step: 0.0 +pulse.4.step_units: min +pulse.4.trig: TTLIN1.VAL +pulse.4.trig_delay: 0 +pulse.4.trig_edge: Rising +pulse.4.width: 0.0 +pulse.4.width_units: min +seq.1.active_capture: false +seq.1.bita: TTLIN1.VAL +seq.1.bita_delay: 0 +seq.1.bitb: TTLIN1.VAL +seq.1.bitb_delay: 0 +seq.1.bitc: TTLIN1.VAL +seq.1.bitc_delay: 0 +seq.1.enable: ZERO +seq.1.enable_delay: 0 +seq.1.outa_capture: false +seq.1.outb_capture: false +seq.1.outc_capture: false +seq.1.outd_capture: false +seq.1.oute_capture: false +seq.1.outf_capture: false +seq.1.posa: ZERO +seq.1.posb: ABSENC1.VAL +seq.1.posc: ABSENC1.VAL +seq.1.prescale: 1.0 +seq.1.prescale_units: us +seq.1.repeats: 1 +seq.2.active_capture: false +seq.2.bita: TTLIN1.VAL +seq.2.bita_delay: 0 +seq.2.bitb: TTLIN1.VAL +seq.2.bitb_delay: 0 +seq.2.bitc: TTLIN1.VAL +seq.2.bitc_delay: 0 +seq.2.enable: ZERO +seq.2.enable_delay: 0 +seq.2.outa_capture: false +seq.2.outb_capture: false +seq.2.outc_capture: false +seq.2.outd_capture: false +seq.2.oute_capture: false +seq.2.outf_capture: false +seq.2.posa: ZERO +seq.2.posb: ABSENC1.VAL +seq.2.posc: ABSENC1.VAL +seq.2.prescale: 0.0 +seq.2.prescale_units: us +seq.2.repeats: 1 +srgate.1.enable: TTLIN1.VAL +srgate.1.enable_delay: 0 +srgate.1.out_capture: false +srgate.1.rst: TTLIN1.VAL +srgate.1.rst_delay: 0 +srgate.1.rst_edge: Rising +srgate.1.set: TTLIN1.VAL +srgate.1.set_delay: 0 +srgate.1.set_edge: Rising +srgate.1.when_disabled: Set output low +srgate.2.enable: TTLIN1.VAL +srgate.2.enable_delay: 0 +srgate.2.out_capture: false +srgate.2.rst: TTLIN1.VAL +srgate.2.rst_delay: 0 +srgate.2.rst_edge: Rising +srgate.2.set: TTLIN1.VAL +srgate.2.set_delay: 0 +srgate.2.set_edge: Rising +srgate.2.when_disabled: Set output low +srgate.3.enable: TTLIN1.VAL +srgate.3.enable_delay: 0 +srgate.3.out_capture: false +srgate.3.rst: TTLIN1.VAL +srgate.3.rst_delay: 0 +srgate.3.rst_edge: Rising +srgate.3.set: TTLIN1.VAL +srgate.3.set_delay: 0 +srgate.3.set_edge: Rising +srgate.3.when_disabled: Set output low +srgate.4.enable: TTLIN1.VAL +srgate.4.enable_delay: 0 +srgate.4.out_capture: false +srgate.4.rst: TTLIN1.VAL +srgate.4.rst_delay: 0 +srgate.4.rst_edge: Rising +srgate.4.set: TTLIN1.VAL +srgate.4.set_delay: 0 +srgate.4.set_edge: Rising +srgate.4.when_disabled: Set output low +ttlin.1.term: High-Z +ttlin.1.val_capture: false +ttlin.2.term: High-Z +ttlin.2.val_capture: false +ttlout.1.val: TTLIN1.VAL +ttlout.1.val_delay: 0 +ttlout.2.val: TTLIN1.VAL +ttlout.2.val_delay: 0 From 7557832cc3829611be037f11654677dc50ea7636 Mon Sep 17 00:00:00 2001 From: Emily Arnold Date: Tue, 11 Aug 2026 07:53:53 +0000 Subject: [PATCH 49/49] Update port names --- src/test_rig_bluesky/spectroscopy_detector_baseline.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml index 0e4c46d..e701ef0 100644 --- a/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml +++ b/src/test_rig_bluesky/spectroscopy_detector_baseline.yaml @@ -23,7 +23,7 @@ writer.file_write_mode: Stream writer.flush_now: false writer.lazy_open: true writer.nd_array_address: 0 -writer.nd_array_port: D2.roistat +writer.nd_array_port: D2.ROISTAT writer.nd_attributes_file: "" writer.num_capture: 0 writer.num_extra_dims: 0 @@ -53,7 +53,7 @@ roistat.channels.3.size_y: 150 roistat.channels.3.use: true roistat.enable_callbacks: Enable roistat.nd_array_address: 0 -roistat.nd_array_port: D2.CAM +roistat.nd_array_port: D2.DRV roistat.nd_attributes_file: