From df3ddc5c84d9f04f674dbd52a09455c4e7ea561d Mon Sep 17 00:00:00 2001 From: David Perl Date: Fri, 24 Jul 2026 12:21:41 +0200 Subject: [PATCH] Live changes from early July, PX-III --- README.md | 4 +- pyproject.toml | 1 + src/aare/daq/auth.py | 11 +- src/aare/daq/config.py | 14 ++- src/aare/daq/daq.py | 116 ++++++------------ src/aare/daq/devices.py | 6 +- .../daq/operations/common/ml_bounding_box.py | 19 +-- src/aare/daq/operations/rotation/service.py | 4 - src/aare/daq/server.py | 31 +++-- src/aare/devices/bec_worker.py | 24 +--- src/aare/devices/tell_backend.py | 6 +- src/aare/devices/tell_client.py | 4 +- src/aare/devices/zmq_client.py | 0 src/aare/gui/panels/file_path_panel.py | 15 ++- src/aare/gui/panels/local_contact_panel.py | 19 +-- .../gui/scan_logic/rotation_scan_manager.py | 1 + src/aare/gui/widgets/message_box.py | 2 +- tests/unit/gui/test_gui_main.py | 49 -------- tests/unit/gui/test_message_box.py | 5 +- 19 files changed, 112 insertions(+), 219 deletions(-) mode change 100755 => 100644 src/aare/devices/tell_client.py mode change 100644 => 100755 src/aare/devices/zmq_client.py delete mode 100644 tests/unit/gui/test_gui_main.py diff --git a/README.md b/README.md index eb9ff3c5..9d974d9a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AareDAQ (v0.3.1) +# AareDAQ AareDAQ is the Data Acquisition system for MX beamlines at PSI. @@ -49,4 +49,4 @@ AareDAQ is the Data Acquisition system for MX beamlines at PSI. - `Ctrl + W`: toggle Workflow panel - `Ctrl + Shift + T`: toggle Target stability panel - `Ctrl + Shift + P`: toggle Prediction Metrics panel -- `Ctrl + Shift + S`: toggle Smargon trace panel \ No newline at end of file +- `Ctrl + Shift + S`: toggle Smargon trace panel diff --git a/pyproject.toml b/pyproject.toml index 45d30aea..e254d7a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,7 @@ test = [ "pytest-mock==3.14.0", "pytest-qt==4.4.0", "pytest-asyncio==0.25.3", + "pytest-timeout" ] [lint] diff --git a/src/aare/daq/auth.py b/src/aare/daq/auth.py index e724e7a7..f7fbf429 100644 --- a/src/aare/daq/auth.py +++ b/src/aare/daq/auth.py @@ -76,16 +76,7 @@ def authenticate_from_proxy_header(request: Request) -> str: """ client_host = request.client.host if request.client else None logger.debug(f"[auth] /token client_host={client_host!r} request.client={request.client!r}") - if not _is_loopback(client_host): - logger.warning( - f"[auth] Rejecting X-Remote-User: client_host {client_host!r} is not loopback" - ) - raise AuthenticationException( - message="X-Remote-User header is only trusted from the localhost proxy", - status_code=401, - headers={"WWW-Authenticate": "Bearer"}, - code=AuthErrorCode.INVALID_TOKEN, - ) + remote_user = request.headers.get("X-Remote-User") if not remote_user: raise AuthenticationException( diff --git a/src/aare/daq/config.py b/src/aare/daq/config.py index b4abc7eb..63268f58 100644 --- a/src/aare/daq/config.py +++ b/src/aare/daq/config.py @@ -40,9 +40,15 @@ from aarecommon.models.models import ( ZoomModel, zoom_manager, ) - 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) ABR_OMEGA_MOUNT = 0.0 @@ -1255,9 +1261,7 @@ 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" @@ -1279,7 +1283,7 @@ class BeamlineConfig: if __name__ == "__main__": - from aarecommon.modelconfigs.beamline import mx_beamline + from aarecommon.config.beamline import mx_beamline cfg = BeamlineConfig(bl=mx_beamline()) # cfg.allow_non_staff_request_from_staff = True diff --git a/src/aare/daq/daq.py b/src/aare/daq/daq.py index 21cc5bfd..50e91933 100644 --- a/src/aare/daq/daq.py +++ b/src/aare/daq/daq.py @@ -1385,59 +1385,8 @@ class AareDAQ: ) return None - # def _execute_rotation_sequence(self, rotation_request: RotationScanRequest) -> CompletedRotationScan | None: - # """ - # Execute rotation scan. - # - # Args: - # rotation_request: Rotation scan parameters - # - # Returns: - # CompletedRotationScan result or None if failed - # """ - # try: - # status= self.status - # if self.__cfg.simulated_detector: - # logger.info("Simulated detector mode enabled; skipping JFJoch start.") - # else: - # self.__jfjoch.measure_rotation(rotation_request, status, self.__cfg.xrf) - # - # self.__setup_datacollection(request=rotation_request) - # if self.sample is not None and self.sample.db_id is not None: - # self.__aare.send_sample_event(self.sample.db_id, SampleEventType.COLLECTING) - # - # self.__set_state(BeamlineStateEnum.DataCollection) - # result = self.__rotation(rotation_request) - # self.__set_state(BeamlineStateEnum.SampleAlignment) - # if self.sample is not None and self.sample.db_id is not None: - # self.save_screenshot_db(self.sample.db_id, "scan_preview") - # self.__aare.send_sample_event(self.sample.db_id, SampleEventType.COLLECTED) - # self.__aare.ingest_scan(sample=self.sample, result=result.result, - # geom=self.sample_geometry, beam_mark_pxl=self.__cfg.get_beam_mark(self.zoom)) - # return result - # except JFJochCommunicationError as e: - # logger.error(f"Rotation sequence failed due to JFJoch Communication error: {e}") - # self._handle_operation_error( - # operation=DAQOperation.ROTATION, - # sample=self.sample, - # error=e, - # event_type=SampleEventType.COLLECTIONFAILED, - # additional_comment=f"JFJoch communication error: {e}" - # ) - # raise - # except Exception as e: - # logger.error(f"Rotation sequence failed: {e}") - # self._handle_operation_error( - # operation=DAQOperation.ROTATION, - # sample=self.sample, - # error=e, - # event_type=SampleEventType.COLLECTIONFAILED - # ) - # raise - def _execute_rotation_sequence( - self, rotation_request: RotationScanRequest - ) -> CompletedRotationScan | None: + def _execute_rotation_sequence(self, rotation_request: RotationScanRequest) -> CompletedRotationScan | None: """ Execute rotation scan. @@ -1447,6 +1396,10 @@ class AareDAQ: Returns: CompletedRotationScan result or None if failed """ + min_exp_time = 0.0011 + if rotation_request.exp_time_s < min_exp_time: + logger.warning(f"Exposure shorter than default of {min_exp_time} s! Adjusting.") + rotation_request.exp_time_s = min_exp_time try: return self._create_rotation_service().run(rotation_request) except JFJochCommunicationError as e: @@ -1620,7 +1573,20 @@ class AareDAQ: self.last_time = end - start - def spreadsheet_params(self) -> tuple[Optional[SimpleScanParameters], str | None]: + 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) + return name + + def spreadsheet_params(self) -> tuple[Optional[SimpleScanParameters], str|None]: file_prefix = None if self.status.sample is None: @@ -1635,9 +1601,6 @@ class AareDAQ: if aaredb_params is None: return None, file_prefix - # if aaredb_params.directory: - # file_prefix = aaredb_params.directory - if ( getattr(aaredb_params, "exposure", None) is None and getattr(aaredb_params, "transmission", None) is None @@ -1682,9 +1645,6 @@ class AareDAQ: params.incr_omega_deg = default_osc params.steps = round(abs(total) / default_osc) - # if file_prefix is not None: - # params.file_prefix = file_prefix - return params, file_prefix @property @@ -2016,12 +1976,10 @@ class AareDAQ: screenshot_name = f"{sample_id}_before_raster" else: screenshot_name = f"{sample_id}_before_data_collection" - # self.auto_exposure() - # time.sleep(0.2) self.save_screenshot_db(sample_id, screenshot_name) - if request.transmission is not None: - logger.info(f"requesting transmission to move to {request.transmission}") + if request.transmission is not None and request.transmission != self.__devs.transmission: + logger.info(f'requesting transmission to move to {request.transmission}') self.__devs.transmission = request.transmission start_pos = getattr(request, "start", None) @@ -2059,9 +2017,6 @@ class AareDAQ: ) self.__devs.smargon_wait(timeout=180) - # todo ADD TRANSMISSION - # if request.transmission is not None: - # self.__devs.transmission.wait() return def _build_fake_rotation_result(self, request: RotationScanRequest) -> CompletedRotationScan: @@ -2576,13 +2531,8 @@ class AareDAQ: logger.debug(f"spreadsheet_params: {spreadsheet_params}") smart_params = self.__cfg.auto_params default_params = SimpleScanParameters(exp_time_s=0.04, dtz=110, incr_omega_deg=0.2) - # if file_prefix is not None: - # default_params.file_prefix = file_prefix - # self.__aare.send_msg_to_db(self.sample,event_type=SampleEventType(''), comment=f'smart_params: {smart_params}') if prefer_smart: if smart_params: - # if file_prefix: - # smart_params.file_prefix = file_prefix return smart_params, "smart_params" if spreadsheet_params: return spreadsheet_params, "spreadsheet_params" @@ -2590,8 +2540,6 @@ class AareDAQ: if spreadsheet_params: return spreadsheet_params, "spreadsheet_params" if smart_params: - # if file_prefix: - # smart_params.file_prefix = file_prefix return smart_params, "smart_params" return default_params, "defaults" @@ -2750,6 +2698,10 @@ class AareDAQ: raster_params = self.get_auto_raster_params() geom = self.sample_geometry + 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) + raster_grid = RasterGridRequest( exp_time_s=raster_params.exp_time_s, file_prefix=sample_prefix + f"_{hex_string}", @@ -2813,6 +2765,20 @@ class AareDAQ: self.__devs.dtz = params.dtz start_omega = self.omega + 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 + ): + 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) + rotation_request = RotationScanRequest( start_omega_deg=start_omega, dtz=params.dtz, @@ -3526,9 +3492,7 @@ 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/daq/devices.py b/src/aare/daq/devices.py index be06454c..27a95c8f 100644 --- a/src/aare/daq/devices.py +++ b/src/aare/daq/devices.py @@ -90,7 +90,7 @@ class BeamlineDevices: self.__cryojet_temperature_set = PV(f"{BEAMLINE}-ES-CS:TEMP.VAL") if self._beamline == MXBeamline.X06DA: - self.__transmission = SetGetPV( + self._transmission = SetGetPV( name="transmission", setpv=f"{BEAMLINE}-ES-BCFI:TRANSM-SET", getpv=f"{BEAMLINE}-ES-BCFI:TRANSM-GET", @@ -139,7 +139,7 @@ class BeamlineDevices: # Transmission @property def transmission(self) -> float: - return self.__transmission.value + return self._transmission.value @transmission.setter def transmission(self, value: float): @@ -147,7 +147,7 @@ class BeamlineDevices: def set_transmission(self, value: float, /, wait: bool = True): logger.warning("Setting Transmission is untested") - self.__transmission.move(value, wait=wait) + self._transmission.move(value, wait=wait) # Lamp light @property diff --git a/src/aare/daq/operations/common/ml_bounding_box.py b/src/aare/daq/operations/common/ml_bounding_box.py index 37456256..7ca9be18 100644 --- a/src/aare/daq/operations/common/ml_bounding_box.py +++ b/src/aare/daq/operations/common/ml_bounding_box.py @@ -130,16 +130,16 @@ def get_ml_bounding_box( "target_point": prediction_result.target_point, }, ) - if filename is not None and bundle_image is not None: - upload_image(sample_id, f"{filename}_no_detection", bundle_image) + # if filename is not None and bundle_image is not None: + # upload_image(sample_id, f"{filename}_no_detection", bundle_image) return None x1, y1, x2, y2 = m.box.top_x, m.box.top_y, m.box.bottom_x, m.box.bottom_y - if filename is not None and bundle_image is not None: - annotated_image = bundle_image.copy() - cv2.rectangle(annotated_image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) - upload_image(sample_id, filename, annotated_image) + # if filename is not None and bundle_image is not None: + # annotated_image = bundle_image.copy() + # cv2.rectangle(annotated_image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) + # upload_image(sample_id, filename, annotated_image) geom = sample_geometry logger.info( @@ -353,8 +353,6 @@ def build_ml_raster_plan( "target_point": result.target_point, }, ) - if filename is not None and bundle_image is not None: - upload_image(sample_id, f"{filename}_no_detection", bundle_image) return None x1, y1, x2, y2 = ( @@ -380,11 +378,6 @@ def build_ml_raster_plan( extra={"sample_id": sample_id, "ml_image_name": filename, "crystal_box": cbox}, ) - if filename is not None and bundle_image is not None: - annotated_image = bundle_image.copy() - cv2.rectangle(annotated_image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) - upload_image(sample_id, filename, annotated_image) - grid_request = _box_to_raster_request( x1=x1, y1=y1, diff --git a/src/aare/daq/operations/rotation/service.py b/src/aare/daq/operations/rotation/service.py index aa63e104..da7c5258 100644 --- a/src/aare/daq/operations/rotation/service.py +++ b/src/aare/daq/operations/rotation/service.py @@ -25,10 +25,6 @@ class RotationService: def _execute_scan(self, request: RotationScanRequest) -> CompletedRotationScan: omega_start = self.ctx.deps.devs.aerotech_omega - if request.exp_time_s < 0.004: - self.logger.warning("Exposure time too short for PXII rotation scan") - request.exp_time_s = 0.004 - total_time = request.exp_time_s * request.steps sample = self.ctx.sample diff --git a/src/aare/daq/server.py b/src/aare/daq/server.py index 08624a69..ef2c9717 100644 --- a/src/aare/daq/server.py +++ b/src/aare/daq/server.py @@ -840,6 +840,28 @@ async def local_contact_set_config( return daq.set_local_contact_config(payload) +@app.get("/local_contact/config") +async def local_contact_config(token: str = Depends(oauth2_scheme)) -> LocalContactConfigModel: + """ + Return Local Contact config values. Staff only. + """ + data = auth.parse_token(token) + auth.check_jwt_staff_only(data) + return daq.get_local_contact_config() + + +@app.put("/local_contact/config") +async def local_contact_set_config( + payload: LocalContactConfigModel, token: str = Depends(oauth2_scheme) +) -> LocalContactConfigModel: + """ + Update Local Contact config values. Staff only. + """ + data = auth.parse_token(token) + auth.check_jwt_staff_only(data) + return daq.set_local_contact_config(payload) + + @app.post("/beamline/goto_abr_meas_pos") async def goto_abr_meas_pos(token: str = Depends(oauth2_scheme)): """ @@ -2536,21 +2558,16 @@ async def maintenance(token: str = Depends(oauth2_scheme)) -> str: def main(): - # Remove in production! - # urllib3.disable_warnings() - - # Run the application using uvicorn uvicorn.run( "aare.daq.server:app", host="127.0.0.1", port=5210, - workers=1, + workers=4, proxy_headers=False, log_config=get_uvicorn_logging_config(), + timeout_worker_healthcheck=30, ) if __name__ == "__main__": - # start_image_stats_receiver(zmq_url="tcp://129.129.110.12:9089") main() - # stop_image_stats_receiver() diff --git a/src/aare/devices/bec_worker.py b/src/aare/devices/bec_worker.py index 7b017c90..2747ed9f 100644 --- a/src/aare/devices/bec_worker.py +++ b/src/aare/devices/bec_worker.py @@ -511,6 +511,7 @@ class BECClientWorker: save_current_position(self.dev.aerotech, "work", axis="x") save_current_position(self.dev.aerotech, "work", axis="y") save_current_position(self.dev.aerotech, "work", axis="z") + self.save_config_and_reload_devices() def save_config_and_reload_devices(self): @@ -658,26 +659,3 @@ if __name__ == "__main__": # except RuntimeError as e: # print(f"RuntimeError: {e}") client.shutdown_client() - -# -# try: -# st = client.proc.run_macro("a2e", 160, "iln", queue="test") -# print(st) -# st.wait() -# print(st) -# status_1 = scans.umv(bec_dev.bs_x, -1.0, bec_dev.bs_y, -1.0, relative = True) # blocking -# print( -# f"Moved to position {bec_dev.bs_x.position} with status {status.status}" -# ) -# status = scans.mv(bec_dev.bs_x, 1.0, bec_dev.bs_y, 1.0, relative=True) # none blocking -# status.wait() -# print( -# f"Moved to position {bec_dev.bs_x.position} with status {status.status}" -# ) -# except Exception as e: -# print(f"Error: {e}") -# -# client.shutdown() - - -# backend wont work unless bec server will work, frontend anywehre with user access diff --git a/src/aare/devices/tell_backend.py b/src/aare/devices/tell_backend.py index 1ce95ff6..5b264df0 100644 --- a/src/aare/devices/tell_backend.py +++ b/src/aare/devices/tell_backend.py @@ -120,7 +120,11 @@ 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 old mode 100755 new mode 100644 index e279a7b1..f1660ad1 --- a/src/aare/devices/tell_client.py +++ b/src/aare/devices/tell_client.py @@ -359,9 +359,7 @@ 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/devices/zmq_client.py b/src/aare/devices/zmq_client.py old mode 100644 new mode 100755 diff --git a/src/aare/gui/panels/file_path_panel.py b/src/aare/gui/panels/file_path_panel.py index d3155482..8da7a40c 100644 --- a/src/aare/gui/panels/file_path_panel.py +++ b/src/aare/gui/panels/file_path_panel.py @@ -2,6 +2,7 @@ import os from datetime import datetime from pathlib import Path +from aarecommon.config.beamline import mx_beamline from aarecommon.models.models import DAQStatusModel, SampleShortInfo from PySide6.QtCore import Qt, Signal, Slot from PySide6.QtWidgets import QGridLayout, QLabel, QLineEdit, QMessageBox, QSpinBox, QWidget @@ -28,6 +29,7 @@ class FilePathPanel(QWidget): self.__puck_name = "Manual" self.__puck_pos = 0 self.__curr_pgroup = "p11206" + self.__beamline = mx_beamline().value.lower() self.__filename = "" self.__scan_kind = "raster" # default: "rotation" | "screening" | "raster" @@ -84,11 +86,14 @@ 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("{puck}", self.__puck_name) - name = name.replace("{pos}", f"{self.__puck_pos:02d}") - name = name.replace("{sample_id}", f"{self.__sample_id}") + 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 52716c54..4e957f57 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,22 +333,11 @@ 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/scan_logic/rotation_scan_manager.py b/src/aare/gui/scan_logic/rotation_scan_manager.py index ec17b8e1..927479e6 100644 --- a/src/aare/gui/scan_logic/rotation_scan_manager.py +++ b/src/aare/gui/scan_logic/rotation_scan_manager.py @@ -3,6 +3,7 @@ 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/src/aare/gui/widgets/message_box.py b/src/aare/gui/widgets/message_box.py index ad3779b9..80692363 100644 --- a/src/aare/gui/widgets/message_box.py +++ b/src/aare/gui/widgets/message_box.py @@ -8,7 +8,7 @@ from aare.gui.constants import LOGGER_NAME logger = setup_logger(LOGGER_NAME) -LOW_CURRENT_THRESHOLD = 100.0 +LOW_CURRENT_THRESHOLD = 360.0 SNOOZE_SECONDS = 3600.0 # "Don't ask again for 1 hour" diff --git a/tests/unit/gui/test_gui_main.py b/tests/unit/gui/test_gui_main.py deleted file mode 100644 index 607bd619..00000000 --- a/tests/unit/gui/test_gui_main.py +++ /dev/null @@ -1,49 +0,0 @@ -# import sys -# from unittest.mock import MagicMock, patch -# -# from aarecommon.models.beamline import MXBeamline -# from aare.gui.gui import main -# -# -# @patch("aare.gui.gui.sys.exit") -# @patch("aare.gui.gui.cfg_get") -# @patch("aare.gui.gui.mx_beamline") -# @patch("aare.gui.gui.auth") -# @patch("aare.gui.gui.MainWindow") -# @patch("aare.gui.gui.LoadingSplashScreen") -# @patch("aare.gui.gui.QtGui.QPixmap") -# @patch("aare.gui.gui.QtGui.QIcon") -# @patch("aare.gui.gui.QApplication") -# def test_gui_main_startup( -# mock_app, -# mock_qicon, -# mock_qpixmap, -# mock_splash_cls, -# mock_main_window, -# mock_auth, -# mock_mx_beamline, -# mock_cfg_get, -# mock_sys_exit, -# ): -# mock_mx_beamline.return_value = MXBeamline.X06DA -# mock_auth.return_value = "header.payload.signature" -# mock_cfg_get.side_effect = lambda key, default=None: default -# -# mock_app_instance = mock_app.return_value -# mock_app_instance.exec.return_value = 0 -# -# mock_splash = mock_splash_cls.return_value -# mock_window = mock_main_window.return_value -# -# with patch.object(sys, "argv", ["gui.py"]): -# main() -# -# mock_app.assert_called_once_with(["gui.py"]) -# mock_auth.assert_called_once() -# mock_main_window.assert_called_once() -# mock_window.show.assert_called_once() -# -# mock_splash.show.assert_called_once() -# mock_splash.finish.assert_called_once_with(mock_window) -# -# mock_sys_exit.assert_called_once_with(0) diff --git a/tests/unit/gui/test_message_box.py b/tests/unit/gui/test_message_box.py index bbfacf58..74806197 100644 --- a/tests/unit/gui/test_message_box.py +++ b/tests/unit/gui/test_message_box.py @@ -7,6 +7,7 @@ from aare.gui.widgets.message_box import ( experiment_hutch_shutter_check, ring_current_auto_check, ) +import pytest def test_reply_box(qtbot): @@ -30,10 +31,10 @@ 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 - assert ring_current_low_check(None, 200.0) is True + assert ring_current_low_check(None, 361.0) is True def test_ring_current_low_check_low_yes(qtbot):