From 2e7627dbcce61bbcec2aa7e020543df733612d2a Mon Sep 17 00:00:00 2001 From: appleb_m Date: Wed, 10 Dec 2025 17:07:42 +0100 Subject: [PATCH 1/4] DAQ: Add throttle down to raster scan --- gui/src/aaregui/widgets/camera_image.py | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/gui/src/aaregui/widgets/camera_image.py b/gui/src/aaregui/widgets/camera_image.py index 3234eabf..54342405 100644 --- a/gui/src/aaregui/widgets/camera_image.py +++ b/gui/src/aaregui/widgets/camera_image.py @@ -116,6 +116,12 @@ class SampleCameraImageLabel(QGraphicsView): self.left_click_hold_threshold = 200 self.right_click_hold_threshold = 200 + self.raster_timer = QTimer() + self.raster_timer.setSingleShot(True) + self.raster_timer_interval = 400 + self.raster_timer.timeout.connect(self.__on_raster_timer_timeout) + self.__pending_load_pos = None + self.__detections = [] # list of dicts from publisher self.__det_shape = None # shape from payload [h,w] so we can scale @@ -267,7 +273,11 @@ class SampleCameraImageLabel(QGraphicsView): if self.__state == SampleCameraImageState.IDLE: if event.modifiers() & Qt.KeyboardModifier.ShiftModifier: - self.load_image.emit(mouse_pos) + if not self.raster_timer.isActive(): + self.load_image.emit(mouse_pos) + self.raster_timer.start(self.raster_timer_interval) + else: + self.__pending_load_pos = mouse_pos else: txt = self.__raster_mgr.is_part_of_completed_grid(mouse_pos) if txt != "": @@ -285,6 +295,12 @@ class SampleCameraImageLabel(QGraphicsView): self._update_grid() self.update() + def __on_raster_timer_timeout(self): + if self.__pending_load_pos is not None: + self.load_image.emit(self.__pending_load_pos) + self.__pending_load_pos = None + self.raster_timer.start(self.raster_timer_interval) + def mouseReleaseEvent(self, event): if event.button() == Qt.MouseButton.LeftButton: if self.click_timer.isActive(): @@ -637,16 +653,12 @@ class SampleCameraImageLabel(QGraphicsView): mouse_global_pos = QCursor.pos() mouse_view_pos = self.mapFromGlobal(mouse_global_pos) mouse_scene_pos = self.mapToScene(mouse_view_pos) - smargon_coord = SmargonCoordinate( - sh_mm=self.__geom.picture_to_smargon( - Coordinate(x=mouse_scene_pos.x(), y=mouse_scene_pos.y()) - )) - if event.key() == Qt.Key.Key_1: - self.set_helical_start.emit(smargon_coord) - - elif event.key() == Qt.Key.Key_2: - self.set_helical_end.emit(smargon_coord) + if event.key() == Qt.Key.Key_Shift: + if self.__state == SampleCameraImageState.IDLE: + if not self.raster_timer.isActive(): + self.load_image.emit(mouse_scene_pos) + self.raster_timer.start(self.raster_timer_interval) super().keyPressEvent(event) From c2b8b7549bfdbc3a021275f63b46deb191e66c0d Mon Sep 17 00:00:00 2001 From: appleb_m Date: Thu, 11 Dec 2025 10:27:42 +0100 Subject: [PATCH 2/4] DAQ: Use server URL for image --- gui/src/aaregui/scan_logic/raster_grid_manager.py | 4 ++-- gui/src/aaregui/scan_logic/rotation_scan_manager.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gui/src/aaregui/scan_logic/raster_grid_manager.py b/gui/src/aaregui/scan_logic/raster_grid_manager.py index 0f61ef03..73271c63 100644 --- a/gui/src/aaregui/scan_logic/raster_grid_manager.py +++ b/gui/src/aaregui/scan_logic/raster_grid_manager.py @@ -244,8 +244,8 @@ class RasterGridManager(QObject): self.__loaded_image_prefix = grid.result.file_prefix self.__loaded_image_index = grid.result.images[cell].number print(f"Load {grid.result.file_prefix} {grid.result.images[cell].number}") - self.image_selected.emit(grid.result.file_prefix, grid.result.images[cell].number) - #self.image_selected.emit("http://sls-gpu-001:8080", grid.result.images[cell].number) + #self.image_selected.emit(grid.result.file_prefix, grid.result.images[cell].number) + self.image_selected.emit("http://sls-gpu-001:8080", grid.result.images[cell].number) def is_part_of_active_grid(self, point: QPointF) -> bool: if not self._is_grid_visible(self.__active_grid): diff --git a/gui/src/aaregui/scan_logic/rotation_scan_manager.py b/gui/src/aaregui/scan_logic/rotation_scan_manager.py index 9cba6262..2b052bf8 100644 --- a/gui/src/aaregui/scan_logic/rotation_scan_manager.py +++ b/gui/src/aaregui/scan_logic/rotation_scan_manager.py @@ -9,5 +9,4 @@ class RotationScanManager(QObject): @Slot(CompletedRotationScan) def scan_completed(self, r: CompletedRotationScan): if r.result.file_prefix is not None: - self.file_ready.emit(r.result.file_prefix) - + self.file_ready.emit("http://sls-gpu-001:8080") From c9b0ee20385be506b0d531f9b36aea8e5fa7d223 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Thu, 11 Dec 2025 10:34:33 +0100 Subject: [PATCH 3/4] DAQ: Go back to start omega --- daq/src/aaredaq/daq.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/daq/src/aaredaq/daq.py b/daq/src/aaredaq/daq.py index b6a2f8b2..82a93f11 100644 --- a/daq/src/aaredaq/daq.py +++ b/daq/src/aaredaq/daq.py @@ -649,6 +649,8 @@ class AareDAQ: if request.start is not None: self.__devs.smargon.target = request.start + omega_start = self.omega + self.__devs.transmission.wait() if request.start is not None: self.__devs.smargon.wait() @@ -689,8 +691,10 @@ class AareDAQ: self.__devs.aerotech.wait_scan_done(total_time + 60) self.__devs.aerotech.reset() + self.__devs.aerotech.move(omega_start, wait=False, speed=180.0, direct=True) result = self.__jfjoch.wait_till_done(60) self.__aare.sample_collected(self.sample) + self.__devs.aerotech.move(omega_start, wait=True, speed=180.0, direct=True) if self.sample is not None and self.sample.db_id is not None: self.save_screenshot_db(self.sample.db_id, "after_dc") From b4e1961a16a8f84218890843a12c088a464fd0a8 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Thu, 11 Dec 2025 12:02:52 +0100 Subject: [PATCH 4/4] ScanResultPayloadModel addded --- common/src/aaredaqlib/models.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/common/src/aaredaqlib/models.py b/common/src/aaredaqlib/models.py index af771831..feb9fe10 100644 --- a/common/src/aaredaqlib/models.py +++ b/common/src/aaredaqlib/models.py @@ -770,4 +770,11 @@ class SimpleScanParameters(BaseModel): beam_size_y_um: float | None = None dose_rate_MGy_s: float | None = None d_vis: float | None = None - d_tar: float | None = None \ No newline at end of file + d_tar: float | None = None + +class ScanResultPayloadModel(BaseModel): + result: ScanResult + beam_mark_pxl: tuple[float, float] + beam_size_mm: Annotated[Coordinate, AfterValidator(positive_coords)] + attach_image: bool = True + sample_id: int \ No newline at end of file