From 12096c21f59f52aba27e0975e2cd3bf8f2dc65e2 Mon Sep 17 00:00:00 2001 From: David Perl Date: Fri, 28 Aug 2026 10:04:39 +0200 Subject: [PATCH] fix: report user friendly error on attempted file overwrite --- src/aare/daq/operations/rotation/service.py | 1 + src/aare/devices/jfjoch.py | 4 +++- src/aare/gui/panels/rotation_data_collection.py | 6 +++--- src/aare/gui/panels/smart_rotation_panel.py | 4 +--- src/aare/gui/scan_logic/raster_grid_manager.py | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/aare/daq/operations/rotation/service.py b/src/aare/daq/operations/rotation/service.py index 1246c6dd..3698a100 100644 --- a/src/aare/daq/operations/rotation/service.py +++ b/src/aare/daq/operations/rotation/service.py @@ -33,6 +33,7 @@ class RotationService: if not self.ctx.deps.cfg.simulated_detector: self.ctx.deps.jfjoch.wait_till_running(timeout=60.0) + jfjoch_status = self.ctx.deps.jfjoch # The detector move (sa2dc) is non-blocking; ensure it has reached the # requested distance before triggering the scan, so data is collected # at the dtz already reported to JFJoch/DB. diff --git a/src/aare/devices/jfjoch.py b/src/aare/devices/jfjoch.py index 73b4fd70..7221522b 100644 --- a/src/aare/devices/jfjoch.py +++ b/src/aare/devices/jfjoch.py @@ -8,7 +8,7 @@ from typing import Concatenate, ParamSpec, TypeVar, final import jfjoch_client from aarecommon.config.beamline import get_jfjoch_url from aarecommon.config.logger import setup_logger -from aarecommon.errors.exception_handler import JFJochCommunicationError +from aarecommon.errors.exception_handler import AareUserError, JFJochCommunicationError from aarecommon.models.beamline import MXBeamline from aarecommon.models.models import DAQStatusModel, FluorescenceSpectrumOutputModel from aarecommon.models.raster_grid import RasterGridRequest @@ -293,6 +293,8 @@ class JFJochWrapper: ) return True except Exception as e: + if "Output file already exists" in str(e): + raise AareUserError("JFJoch reports output file already exists! Change the filename or increment the run number.", critical=True) from e raise self._jfjoch_error( f"JFJoch wait until running returned an exception: {e}", error=e, diff --git a/src/aare/gui/panels/rotation_data_collection.py b/src/aare/gui/panels/rotation_data_collection.py index 32f14336..864d4302 100644 --- a/src/aare/gui/panels/rotation_data_collection.py +++ b/src/aare/gui/panels/rotation_data_collection.py @@ -189,7 +189,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): if is_single_image: r = RotationScanRequest( - file_prefix=str(add_screening_to_path(self._filename)) + "_" + secrets.token_hex(3), + file_prefix=str(add_screening_to_path(self._filename)), start_omega_deg=self.start_angle.value, incr_omega_deg=self.screening_image_angle.value, wedge_omega_deg=screening_settings["omega_step_deg"], @@ -201,7 +201,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): ) else: r = RotationScanRequest( - file_prefix=str(add_screening_to_path(self._filename)) + "_" + secrets.token_hex(3), + file_prefix=str(add_screening_to_path(self._filename)), start_omega_deg=self.start_angle.value, wedge_omega_deg=self.screening_image_angle.value, incr_omega_deg=screening_settings["omega_step_deg"], @@ -225,7 +225,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): logger.error("Cannot run measurement because of check") return r = RotationScanRequest( - file_prefix=str(add_data_to_path(self._filename)) + "_" + secrets.token_hex(3), + file_prefix=str(add_data_to_path(self._filename)), start_omega_deg=self.start_angle.value, steps=self.image_number(), incr_omega_deg=self.image_angle.value, diff --git a/src/aare/gui/panels/smart_rotation_panel.py b/src/aare/gui/panels/smart_rotation_panel.py index dfda61e2..639de4ab 100644 --- a/src/aare/gui/panels/smart_rotation_panel.py +++ b/src/aare/gui/panels/smart_rotation_panel.py @@ -402,16 +402,14 @@ class SimpleRotationSettingsPanel(QWidget): d_tar=d_tar, ) - # logger.debug("updated labels") if self._prev_params != self.parameters: self._prev_params = self.parameters self.parameters_changed.emit(self.parameters) - # logger.debug("emitted parameters") @Slot() def run_measurement(self): r = RotationScanRequest( - file_prefix=str(add_data_to_path(self._filename)) + "_" + secrets.token_hex(3), + file_prefix=str(add_data_to_path(self._filename)), start_omega_deg=self.start_angle_enter.value, steps=self.n_images, incr_omega_deg=self.image_angle_enter.value, diff --git a/src/aare/gui/scan_logic/raster_grid_manager.py b/src/aare/gui/scan_logic/raster_grid_manager.py index ee75d9ca..d3d89718 100644 --- a/src/aare/gui/scan_logic/raster_grid_manager.py +++ b/src/aare/gui/scan_logic/raster_grid_manager.py @@ -459,7 +459,7 @@ class RasterGridManager(QObject): grid = RasterGridRequest( dtz=ag.dtz, transmission=ag.transmission, - file_prefix=ag.file_prefix + "_" + secrets.token_hex(3), + file_prefix=ag.file_prefix, exp_time_s=ag.exp_time_s, n_x=ag.n_x, n_y=ag.n_y, @@ -485,7 +485,7 @@ class RasterGridManager(QObject): grid = RasterGridRequest( dtz=ag.dtz, transmission=ag.transmission, - file_prefix=ag.file_prefix + "_" + secrets.token_hex(3), + file_prefix=ag.file_prefix, exp_time_s=ag.exp_time_s, n_x=ag.n_x, n_y=ag.n_y,