diff --git a/src/aare/daq/config.py b/src/aare/daq/config.py index 63268f58..0f80f7c8 100644 --- a/src/aare/daq/config.py +++ b/src/aare/daq/config.py @@ -42,11 +42,8 @@ from aarecommon.models.models import ( ) from aare.daq.config_model import LocalContactConfigModel -#TODO WHAT SHOULD THIS BE? This should be in the YAMl file it is beamline specific -ABR_POS_MOUNT = AerotechCoordinate( - at_mm=Coordinate(x=0, y=0, z=0), - omega_deg=0 -) +# TODO WHAT SHOULD THIS BE? This should be in the YAMl file it is beamline specific +ABR_POS_MOUNT = AerotechCoordinate(at_mm=Coordinate(x=0, y=0, z=0), omega_deg=0) # TODO WHAT SHOULD THIS BE? This should be in the YAMl file it is beamline specific @@ -1261,7 +1258,9 @@ class BeamlineConfig: logger.warning(f"Failed to read Local Contact config from Redis: {e}") return default - def set_local_contact_config(self, config: LocalContactConfigModel | dict) -> LocalContactConfigModel: + def set_local_contact_config( + self, config: LocalContactConfigModel | dict + ) -> LocalContactConfigModel: validated = LocalContactConfigModel.model_validate(config) try: redis_key = f"{self.__bl}:local_contact_config" diff --git a/src/aare/daq/daq.py b/src/aare/daq/daq.py index 50e91933..875ddfe5 100644 --- a/src/aare/daq/daq.py +++ b/src/aare/daq/daq.py @@ -1385,8 +1385,9 @@ class AareDAQ: ) return None - - def _execute_rotation_sequence(self, rotation_request: RotationScanRequest) -> CompletedRotationScan | None: + def _execute_rotation_sequence( + self, rotation_request: RotationScanRequest + ) -> CompletedRotationScan | None: """ Execute rotation scan. @@ -1574,19 +1575,21 @@ class AareDAQ: self.last_time = end - start def _expand_macros(self, name: str) -> str: - name = name.replace('{date}', datetime.now().strftime('%Y%m%d')) - name = name.replace('{sample}', self.sample.sample_name) - name = name.replace('{CrystalName}', self.sample.sample_name) - name = name.replace('{puck}', self.sample.puck_name) - name = name.replace('{position}', f"{self.sample.pin:02d}") - name = name.replace('{sample_id}', f"{self.sample.db_id}") - name = name.replace('{beamline}', f"{self._beamline.value.lower()}") - name = name.replace('{prefix}', f"{self.sample.puck_name}/{self.sample.pin:02d}/{self.sample.sample_name}") - #TODO work out why clean_filename is removing slahses - #name = clean_filename(name) + name = name.replace("{date}", datetime.now().strftime("%Y%m%d")) + name = name.replace("{sample}", self.sample.sample_name) + name = name.replace("{CrystalName}", self.sample.sample_name) + name = name.replace("{puck}", self.sample.puck_name) + name = name.replace("{position}", f"{self.sample.pin:02d}") + name = name.replace("{sample_id}", f"{self.sample.db_id}") + name = name.replace("{beamline}", f"{self._beamline.value.lower()}") + name = name.replace( + "{prefix}", f"{self.sample.puck_name}/{self.sample.pin:02d}/{self.sample.sample_name}" + ) + # TODO work out why clean_filename is removing slahses + # name = clean_filename(name) return name - def spreadsheet_params(self) -> tuple[Optional[SimpleScanParameters], str|None]: + def spreadsheet_params(self) -> tuple[Optional[SimpleScanParameters], str | None]: file_prefix = None if self.status.sample is None: @@ -1979,7 +1982,7 @@ class AareDAQ: self.save_screenshot_db(sample_id, screenshot_name) if request.transmission is not None and request.transmission != self.__devs.transmission: - logger.info(f'requesting transmission to move to {request.transmission}') + logger.info(f"requesting transmission to move to {request.transmission}") self.__devs.transmission = request.transmission start_pos = getattr(request, "start", None) @@ -2700,7 +2703,9 @@ class AareDAQ: if raster_params.filename is not None: logger.info(f"Using filename {raster_params.filename}") - sample_prefix = "{filename}/{prefix}".format(filename=raster_params.filename, prefix=sample.sample_name) + sample_prefix = "{filename}/{prefix}".format( + filename=raster_params.filename, prefix=sample.sample_name + ) raster_grid = RasterGridRequest( exp_time_s=raster_params.exp_time_s, @@ -2767,17 +2772,20 @@ class AareDAQ: update_sample = self.sample if ( - update_sample is not None - and update_sample.db_id is not None - and update_sample.db_id == sample.db_id + update_sample is not None + and update_sample.db_id is not None + and update_sample.db_id == sample.db_id ): - logger.info(f"Updating sample info {sample.db_id} old run_number" - f" sample.run_number {sample.run_number} new run_number {update_sample.run_number}") - + logger.info( + f"Updating sample info {sample.db_id} old run_number" + f" sample.run_number {sample.run_number} new run_number {update_sample.run_number}" + ) if params.filename is not None: logger.info(f"Using filename {params.filename}") - sample_prefix = "{filename}/{prefix}".format(filename=params.filename, prefix=sample.sample_name) + sample_prefix = "{filename}/{prefix}".format( + filename=params.filename, prefix=sample.sample_name + ) rotation_request = RotationScanRequest( start_omega_deg=start_omega, @@ -3492,7 +3500,9 @@ class AareDAQ: finally: self.__cfg.state_busy = False - def fluorimeter_take_spectrum(self, fm: FluorescenceSpectrumParameterModel) -> FluorescenceSpectrumOutputModel: + def fluorimeter_take_spectrum( + self, fm: FluorescenceSpectrumParameterModel + ) -> FluorescenceSpectrumOutputModel: self.__cfg.try_set_busy(timeout=360) try: diff --git a/src/aare/devices/tell_backend.py b/src/aare/devices/tell_backend.py index 5b264df0..1ce95ff6 100644 --- a/src/aare/devices/tell_backend.py +++ b/src/aare/devices/tell_backend.py @@ -120,11 +120,7 @@ class PShellTellBackend: if e.response is not None and e.response.text: msg = e.response.text.strip() raise TellCommunicationError( - msg, - base_url=self._url, - endpoint=endpoint, - operation=operation, - critical=True, + msg, base_url=self._url, endpoint=endpoint, operation=operation, critical=True ) from e def eval(self, expr: str): diff --git a/src/aare/devices/tell_client.py b/src/aare/devices/tell_client.py index f1660ad1..e279a7b1 100644 --- a/src/aare/devices/tell_client.py +++ b/src/aare/devices/tell_client.py @@ -359,7 +359,9 @@ class TellClient: raise except Exception as e: logger.error(f"Exception occurred: {e}") - raise TellCommunicationError(message=f"Error during mount {segment}{puck}-{sample}: {e}", critical=True) + raise TellCommunicationError( + message=f"Error during mount {segment}{puck}-{sample}: {e}", critical=True + ) def unmount(self, force=False, wait=False, timeout=360.0): if self.is_busy(): diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 75d31029..0ca2defb 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -2493,6 +2493,6 @@ class MainWindow(QMainWindow): "Idle timeout reached, but GUI remains open because beamline is busy or automation is active." ) return - #TODO deny communication from GUI to DAQ while IDLE for too long rather than kill the GUI + # TODO deny communication from GUI to DAQ while IDLE for too long rather than kill the GUI logger.warning("Closing GUI after inactivity timeout.") self.close() diff --git a/src/aare/gui/panels/file_path_panel.py b/src/aare/gui/panels/file_path_panel.py index 8da7a40c..9cca0e56 100644 --- a/src/aare/gui/panels/file_path_panel.py +++ b/src/aare/gui/panels/file_path_panel.py @@ -86,14 +86,16 @@ class FilePathPanel(QWidget): def _expand_macros(self, base: str, rn: int) -> str: name = f"{base}_{rn:03d}" - name = name.replace('{date}', self.__formatted_date) - name = name.replace('{sample}', self.__sample_name) - name = name.replace('{CrystalName}', self.__sample_name) - name = name.replace('{puck}', self.__puck_name) - name = name.replace('{position}', f"{self.__puck_pos:02d}") - name = name.replace('{sample_id}', f"{self.__sample_id}") - name = name.replace('{beamline}', f"{self.__beamline}") - name = name.replace('{prefix}', f"{self.__puck_name}/{self.__puck_pos:02d}/{self.__sample_name}") + name = name.replace("{date}", self.__formatted_date) + name = name.replace("{sample}", self.__sample_name) + name = name.replace("{CrystalName}", self.__sample_name) + name = name.replace("{puck}", self.__puck_name) + name = name.replace("{position}", f"{self.__puck_pos:02d}") + name = name.replace("{sample_id}", f"{self.__sample_id}") + name = name.replace("{beamline}", f"{self.__beamline}") + name = name.replace( + "{prefix}", f"{self.__puck_name}/{self.__puck_pos:02d}/{self.__sample_name}" + ) return name def _effective_dataset_base(self, base_no_run: str) -> str: diff --git a/src/aare/gui/panels/local_contact_panel.py b/src/aare/gui/panels/local_contact_panel.py index 4e957f57..52716c54 100644 --- a/src/aare/gui/panels/local_contact_panel.py +++ b/src/aare/gui/panels/local_contact_panel.py @@ -22,7 +22,7 @@ from PySide6.QtWidgets import ( QTabWidget, QTextEdit, QVBoxLayout, - QWidget, + QWidget, ) from aare.gui.constants import LOGGER_NAME @@ -333,11 +333,22 @@ class LocalContactPanel(QFrame): tools_layout.addWidget(tools) tools_layout.addWidget( - self._make_button("Load BEC user macros", self._daq.bec_load_user_macros, "Loading BEC user macros.")) + self._make_button( + "Load BEC user macros", self._daq.bec_load_user_macros, "Loading BEC user macros." + ) + ) tools_layout.addWidget( - self._make_button("Show BEC user macros", self._daq.bec_list_all_user_macros, "Listing BEC user macros.")) + self._make_button( + "Show BEC user macros", + self._daq.bec_list_all_user_macros, + "Listing BEC user macros.", + ) + ) tools_layout.addWidget( - self._make_button("Show BEC position devices", self._daq.bec_list_all_devices, "Listing BEC devices.")) + self._make_button( + "Show BEC position devices", self._daq.bec_list_all_devices, "Listing BEC devices." + ) + ) tools_layout.addWidget( self._make_button( "Reinitialise BEC planner/devices", diff --git a/src/aare/gui/panels/raster_data_collection.py b/src/aare/gui/panels/raster_data_collection.py index 59663c3e..75dfca2b 100644 --- a/src/aare/gui/panels/raster_data_collection.py +++ b/src/aare/gui/panels/raster_data_collection.py @@ -31,15 +31,14 @@ class RasterDataCollectionPanel(ScanSettingsPanel): raster_alpha_changed = Signal(int) def __init__( - self, - raster_mgr: RasterGridManager, - diffraction: DiffractionGeometry, - parent=None, + self, raster_mgr: RasterGridManager, diffraction: DiffractionGeometry, parent=None ): - super().__init__(diffraction=diffraction, - default_dtz=raster_mgr.active_grid.dtz, - default_transmission=raster_mgr.active_grid.transmission, - parent=parent) + super().__init__( + diffraction=diffraction, + default_dtz=raster_mgr.active_grid.dtz, + default_transmission=raster_mgr.active_grid.transmission, + parent=parent, + ) self._previous_sample_was_none_raster = True diff --git a/src/aare/gui/panels/rotation_data_collection.py b/src/aare/gui/panels/rotation_data_collection.py index 7e050210..fb8e455d 100644 --- a/src/aare/gui/panels/rotation_data_collection.py +++ b/src/aare/gui/panels/rotation_data_collection.py @@ -39,8 +39,13 @@ class RotationDataCollectionPanel(ScanSettingsPanel): super().__init__( parent=parent, diffraction=diffraction, - default_dtz=cfg_get("daq.data_collection_settings.default_rotation_settings.dtz", default_dtz), - default_transmission=cfg_get("daq.data_collection_settings.default_rotation_settings.transmission", default_transmission), + default_dtz=cfg_get( + "daq.data_collection_settings.default_rotation_settings.dtz", default_dtz + ), + default_transmission=cfg_get( + "daq.data_collection_settings.default_rotation_settings.transmission", + default_transmission, + ), ) self.__beamline_state = None @@ -71,8 +76,12 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("°", parent=self), 5, 4) self._layout.addWidget(QLabel("Image time", parent=self), 6, 0) - default_screening_exp_time = cfg_get("daq.data_collection_settings.default_screening_settings.exp_time_s", 0.1) - self.screening_image_time_enter = NumberLineEdit(0.0005, 10.0, default_screening_exp_time, decimals=4, parent=self) + default_screening_exp_time = cfg_get( + "daq.data_collection_settings.default_screening_settings.exp_time_s", 0.1 + ) + self.screening_image_time_enter = NumberLineEdit( + 0.0005, 10.0, default_screening_exp_time, decimals=4, parent=self + ) self._layout.addWidget(self.screening_image_time_enter, 6, 1, 1, 3) self._layout.addWidget(QLabel("s", parent=self), 6, 4) @@ -96,22 +105,32 @@ class RotationDataCollectionPanel(ScanSettingsPanel): ) self._layout.addWidget(QLabel("Total angle", parent=self), 10, 0) - default_steps = cfg_get("daq.data_collection_settings.default_rotation_settings.steps", 1800) - default_increment_omega = cfg_get("daq.data_collection_settings.default_rotation_settings.increment_omega_deg", 0.2) - default_total_angle = default_steps*default_increment_omega - self.total_angle = DbOverrideLineEdit(0, 9999.0, default=default_total_angle, decimals=3, parent=self) + default_steps = cfg_get( + "daq.data_collection_settings.default_rotation_settings.steps", 1800 + ) + default_increment_omega = cfg_get( + "daq.data_collection_settings.default_rotation_settings.increment_omega_deg", 0.2 + ) + default_total_angle = default_steps * default_increment_omega + self.total_angle = DbOverrideLineEdit( + 0, 9999.0, default=default_total_angle, decimals=3, parent=self + ) self._layout.addWidget(self.total_angle, 10, 1, 1, 3) self._layout.addWidget(QLabel("°", parent=self), 10, 4) self._register_override_field(self.total_angle) self._layout.addWidget(QLabel("Image angle", parent=self), 11, 0) - self.image_angle = DbOverrideLineEdit(0, 10.0, default=default_increment_omega, decimals=3, parent=self) + self.image_angle = DbOverrideLineEdit( + 0, 10.0, default=default_increment_omega, decimals=3, parent=self + ) self._layout.addWidget(self.image_angle, 11, 1, 1, 3) self._layout.addWidget(QLabel("°", parent=self), 11, 4) self._register_override_field(self.image_angle) # TODO add protection on X10SA to prevent too short exposure time/ too high detector rep rate self._layout.addWidget(QLabel("Image time", parent=self), 12, 0) - default_image_exp_time = cfg_get("daq.data_collection_settings.default_rotation_settings.exp_time_s", 0.01) + default_image_exp_time = cfg_get( + "daq.data_collection_settings.default_rotation_settings.exp_time_s", 0.01 + ) self.image_time_enter = DbOverrideLineEdit( 0.0005, 10.0, default=default_image_exp_time, decimals=4, parent=self ) @@ -145,7 +164,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self.measurement_button.clicked.connect(self.run_measurement) self._layout.addWidget(self.measurement_button, 16, 0, 1, 6) self._reset_to_defaults() - + @Slot() def run_screening(self): if self.__beamline_state != BeamlineStateEnum.SampleAlignment: diff --git a/src/aare/gui/panels/scan_settings_panel.py b/src/aare/gui/panels/scan_settings_panel.py index 418c3a8a..4352bf7c 100644 --- a/src/aare/gui/panels/scan_settings_panel.py +++ b/src/aare/gui/panels/scan_settings_panel.py @@ -196,7 +196,7 @@ class ScanSettingsPanel(QWidget): else: if not self._previous_sample_was_none: logger.info("Sample cleared, resetting parameters to defaults") - #self._reset_to_defaults() + # self._reset_to_defaults() self._previous_sample_was_none = True # Mark that sample is now None self._sample = None diff --git a/src/aare/gui/scan_logic/raster_grid_manager.py b/src/aare/gui/scan_logic/raster_grid_manager.py index 9eaa02b3..676346ce 100644 --- a/src/aare/gui/scan_logic/raster_grid_manager.py +++ b/src/aare/gui/scan_logic/raster_grid_manager.py @@ -140,8 +140,12 @@ class RasterGridManager(QObject): smargon_top_left=self.__geom.smargon, grid_size_mm=Coordinate(x=0.8 * self.__beam_size_mm.x, y=0.8 * self.__beam_size_mm.y), omega_deg=self.__geom.omega_deg, - exp_time_s=cfg_get("daq.data_collection_settings.default_raster_settings.exp_time_s", 0.01), - transmission=cfg_get("daq.data_collection_settings.default_raster_settings.transmission", 1.0), + exp_time_s=cfg_get( + "daq.data_collection_settings.default_raster_settings.exp_time_s", 0.01 + ), + transmission=cfg_get( + "daq.data_collection_settings.default_raster_settings.transmission", 1.0 + ), dtz=cfg_get("daq.data_collection_settings.default_raster_settings.dtz", 200.0), ) self.__completed_grids: List[CompletedRasterGridElem] = [] diff --git a/src/aare/gui/scan_logic/rotation_scan_manager.py b/src/aare/gui/scan_logic/rotation_scan_manager.py index 927479e6..ec17b8e1 100644 --- a/src/aare/gui/scan_logic/rotation_scan_manager.py +++ b/src/aare/gui/scan_logic/rotation_scan_manager.py @@ -3,7 +3,6 @@ from aarecommon.models.rotation_scan import CompletedRotationScan from PySide6.QtCore import QObject, Signal, Slot - class RotationScanManager(QObject): file_ready = Signal(str, int) diff --git a/tests/unit/daq/test_auth.py b/tests/unit/daq/test_auth.py index 4fbe4eb4..85d2c856 100644 --- a/tests/unit/daq/test_auth.py +++ b/tests/unit/daq/test_auth.py @@ -23,12 +23,7 @@ with patch.dict("os.environ", {"JWT_AAREDAQ_KEY": "test_secret"}): respond_to_baton_request, ) from aarecommon.errors.exception_handler import AuthenticationException, UserRightsException -from aarecommon.models.auth import ( - BatonHolderInfo, - BatonRequest, - BatonRequestStatus, - BatonStatus, -) +from aarecommon.models.auth import BatonHolderInfo, BatonRequest, BatonRequestStatus, BatonStatus from aarecommon.models.models import SessionsStateEnum diff --git a/tests/unit/gui/test_message_box.py b/tests/unit/gui/test_message_box.py index 74806197..8f2464fd 100644 --- a/tests/unit/gui/test_message_box.py +++ b/tests/unit/gui/test_message_box.py @@ -31,6 +31,7 @@ def test_timer_box_auto_accept(qtbot): assert box.result() == QMessageBox.StandardButton.Yes + @pytest.mark.timeout(10) def test_ring_current_low_check_ok(qtbot): # Should return True immediately if current is high enough