From 3d602931e9b5612c51acc90d549833502531f925 Mon Sep 17 00:00:00 2001 From: Dawn Date: Wed, 26 Aug 2026 14:31:00 +0200 Subject: [PATCH 1/8] style: reduce separator hint deplay to 66 --- src/aare/gui/styles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aare/gui/styles.py b/src/aare/gui/styles.py index 41254aeb..3543ce20 100644 --- a/src/aare/gui/styles.py +++ b/src/aare/gui/styles.py @@ -118,7 +118,7 @@ BANNER_TAB_GAP = 6 # separator under the cursor fills with SEPARATOR_HINT. The rest/drag gate # lives in MainWindow.event(); the QSS :hover part picks the one separator. SEPARATOR_HINT = "rgba(168, 178, 192, 20%)" # scrollbar-track grey @50% -SEPARATOR_HINT_DELAY_MS = 888 # int, used in code, not QSS +SEPARATOR_HINT_DELAY_MS = 66 # int, used in code, not QSS # Theme-switch screenshot cross-fade duration (int ms, used in code). THEME_FADE_MS = 250 -- 2.54.0 From 84ab3ce57a882d37e5916d6c0261e11cf3585edf Mon Sep 17 00:00:00 2001 From: Dawn Date: Wed, 26 Aug 2026 14:50:52 +0200 Subject: [PATCH 2/8] style: check QPushButton height --- src/aare/gui/styles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aare/gui/styles.py b/src/aare/gui/styles.py index 3543ce20..618f9a81 100644 --- a/src/aare/gui/styles.py +++ b/src/aare/gui/styles.py @@ -1342,7 +1342,7 @@ def _sunset_stylesheet() -> str: background-color: $dark_elevated; border: 1px solid $dark_border_faint; min-height: 16px; - max-height: 16px; + max-height: 24px; padding-top: 1px; padding-bottom: 1px; } -- 2.54.0 From 7b1ee682d1e44b722c351dfa76305374f7f007c1 Mon Sep 17 00:00:00 2001 From: Dawn Date: Mon, 31 Aug 2026 13:25:34 +0200 Subject: [PATCH 3/8] feat: demote warning from reference tools so it does not be too obvious in user GUI --- src/aare/gui/threads/daq_worker.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/aare/gui/threads/daq_worker.py b/src/aare/gui/threads/daq_worker.py index 81c28d19..9f60f9af 100644 --- a/src/aare/gui/threads/daq_worker.py +++ b/src/aare/gui/threads/daq_worker.py @@ -608,13 +608,18 @@ class DAQWorker(QObject): @Slot(QNetworkReply) def handle_reference_tools_response(self, reply: QNetworkReply): + # not accumulate errors from reference tools, just log them + if reply.error() != QNetworkReply.NetworkError.NoError: + logger.debug(f"Reference tools request failed: {reply.errorString()}") + reply.deleteLater() + return try: response_data = self.handle_response(reply) parsed_response = SampleShortInfoList.model_validate_json(response_data) self.reference_tools.emit(parsed_response) - except Exception as e: - logger.exception("Exception from reference tools response") - self.http_error.emit(str(e)) + except Exception: + # demote reference tool exception to debug + logger.debug("Exception from reference tools response", exc_info=True) def handle_req_response(self, reply: QNetworkReply): if reply.error() != QNetworkReply.NetworkError.NoError: -- 2.54.0 From 0ba8c5cef67eed574ece4d948bb89b6c63dfcc4f Mon Sep 17 00:00:00 2001 From: Dawn Date: Mon, 31 Aug 2026 13:28:40 +0200 Subject: [PATCH 4/8] feat: add 4x60 and 5x45 for screening --- src/aare/gui/panels/rotation_data_collection.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aare/gui/panels/rotation_data_collection.py b/src/aare/gui/panels/rotation_data_collection.py index 32f14336..1657b561 100644 --- a/src/aare/gui/panels/rotation_data_collection.py +++ b/src/aare/gui/panels/rotation_data_collection.py @@ -96,8 +96,10 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self.screening_type.addItem("2 images every 90°", {"steps": 2, "omega_step_deg": 90}) self.screening_type.addItem("4 images every 90°", {"steps": 4, "omega_step_deg": 90}) self.screening_type.addItem("3 images every 60°", {"steps": 3, "omega_step_deg": 60}) + self.screening_type.addItem("4 images every 60°", {"steps": 4, "omega_step_deg": 60}) self.screening_type.addItem("2 images every 45°", {"steps": 2, "omega_step_deg": 45}) self.screening_type.addItem("4 images every 45°", {"steps": 4, "omega_step_deg": 45}) + self.screening_type.addItem("5 images every 45°", {"steps": 5, "omega_step_deg": 45}) self._layout.addWidget(self.screening_type, 7, 0, 1, 6) -- 2.54.0 From 2ebbcd0b7612893e716c9ef321f35fe199729c24 Mon Sep 17 00:00:00 2001 From: Dawn Date: Mon, 31 Aug 2026 14:07:25 +0200 Subject: [PATCH 5/8] WIP: uv.lock refresh (aarecommon 0.5.4) --- uv.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/uv.lock b/uv.lock index d529cb74..901b66d1 100644 --- a/uv.lock +++ b/uv.lock @@ -11,7 +11,7 @@ overrides = [{ name = "opencv-python", marker = "sys_platform == 'nonexistent'" [[package]] name = "aarecommon" -version = "0.3.0" +version = "0.5.4" source = { registry = "https://gitea.psi.ch/api/packages/mx/pypi/simple" } dependencies = [ { name = "jfjoch-client" }, @@ -24,14 +24,14 @@ dependencies = [ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] -sdist = { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aarecommon/0.3.0/aarecommon-0.3.0.tar.gz", hash = "sha256:4b30e9c9b983989e2e86800aae185b55279c34704775b53f6d8abec1747511d0" } +sdist = { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aarecommon/0.5.4/aarecommon-0.5.4.tar.gz", hash = "sha256:3e4e2e5ee1dbe2690e6b6ee26598f2fd845f5f458bbe8b05282e24cf9fa27aca" } wheels = [ - { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aarecommon/0.3.0/aarecommon-0.3.0-py3-none-any.whl", hash = "sha256:c3e2c518bd7f2258ec1652f268e8cc29b5b5eeb7912fc06af31129be60cb70a1" }, + { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aarecommon/0.5.4/aarecommon-0.5.4-py3-none-any.whl", hash = "sha256:ad0efe9d593532331dd898edf0498a5ccb992d11cfb3b7db037385c399258600" }, ] [[package]] name = "aaredaq" -version = "0.13.4" +version = "0.17.3" source = { editable = "." } dependencies = [ { name = "aarecommon" }, @@ -82,7 +82,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "aarecommon", specifier = ">=0.2.2" }, + { name = "aarecommon", specifier = ">=0.5.1" }, { name = "aaredb", specifier = ">=0.2", index = "https://gitea.psi.ch/api/packages/mx/pypi/simple" }, { name = "aarelcinfer-client", specifier = "==0.1.1a8" }, { name = "aarescan-client", specifier = "==1.0.0rc5" }, -- 2.54.0 From 5515673d81fb3b2d336a508abcb6b0d79b0cd6c3 Mon Sep 17 00:00:00 2001 From: Dawn Date: Mon, 31 Aug 2026 14:41:30 +0200 Subject: [PATCH 6/8] feat: allow screening to take a different transmission input --- .../gui/panels/rotation_data_collection.py | 53 ++++++++++++------- src/aare/gui/panels/scan_settings_panel.py | 16 ++---- uv.lock | 2 +- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/aare/gui/panels/rotation_data_collection.py b/src/aare/gui/panels/rotation_data_collection.py index 1657b561..418049e4 100644 --- a/src/aare/gui/panels/rotation_data_collection.py +++ b/src/aare/gui/panels/rotation_data_collection.py @@ -103,16 +103,23 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(self.screening_type, 7, 0, 1, 6) + self._layout.addWidget(QLabel("Beam transmission", parent=self), 8, 0) + self.screening_transmission_enter = DbOverrideLineEdit( + 0, 1.0, default=self._transmission, decimals=4, parent=self + ) + self._layout.addWidget(self.screening_transmission_enter, 8, 1, 1, 3) + self.screening_transmission_enter.valueChanged.connect(self.set_screening_transmission) + # increment later self.screening_button = QPushButton("Run screening") self.screening_button.setStyleSheet(f"color: {GO_TEXT};") self.screening_button.clicked.connect(self.run_screening) - self._layout.addWidget(self.screening_button, 8, 0, 1, 6) + self._layout.addWidget(self.screening_button, 9, 0, 1, 6) self._layout.addWidget( - QLabel("
Rotation
", parent=self), 9, 0, 1, 6 + QLabel("
Rotation
", parent=self), 10, 0, 1, 6 ) - self._layout.addWidget(QLabel("Total angle", parent=self), 10, 0) + self._layout.addWidget(QLabel("Total angle", parent=self), 11, 0) default_steps = cfg_get( "daq.data_collection_settings.default_rotation_settings.steps", 1800 ) @@ -123,33 +130,41 @@ class RotationDataCollectionPanel(ScanSettingsPanel): 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(self.total_angle, 11, 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._layout.addWidget(QLabel("Image angle", parent=self), 12, 0) 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._layout.addWidget(self.image_angle, 12, 1, 1, 3) + self._layout.addWidget(QLabel("°", parent=self), 12, 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) + self._layout.addWidget(QLabel("Image time", parent=self), 13, 0) 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 ) - self._layout.addWidget(self.image_time_enter, 12, 1, 1, 3) - self._layout.addWidget(QLabel("s", parent=self), 12, 4) + self._layout.addWidget(self.image_time_enter, 13, 1, 1, 3) + self._layout.addWidget(QLabel("s", parent=self), 13, 4) self._register_override_field(self.image_time_enter) - self._layout.addWidget(QLabel("Total measurement time", parent=self), 13, 0) + self._layout.addWidget(QLabel("Beam transmission", parent=self), 14, 0) + self.transmission_enter = DbOverrideLineEdit( + 0, 1.0, default=self._transmission, decimals=4, parent=self + ) + self._layout.addWidget(self.transmission_enter, 14, 1, 1, 3) + self.transmission_enter.valueChanged.connect(self.set_transmission) + self._register_override_field(self.transmission_enter) + + self._layout.addWidget(QLabel("Total measurement time", parent=self), 15, 0) self.total_time = QLabel(f"{self._total_time} min 0 s") self.total_time.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) - self._layout.addWidget(self.total_time, 13, 1, 1, 3) + self._layout.addWidget(self.total_time, 15, 1, 1, 3) self.total_angle.valueChanged.connect(self.calculate_measurement_time) self.image_angle.valueChanged.connect(self.calculate_measurement_time) @@ -157,21 +172,21 @@ class RotationDataCollectionPanel(ScanSettingsPanel): # Initial compute self.calculate_measurement_time() - self._layout.addWidget(QLabel("Dose", parent=self), 14, 0) + self._layout.addWidget(QLabel("Dose", parent=self), 16, 0) self.dose = QLabel(f"{self._dose_mgy}") self.dose.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) - self._layout.addWidget(self.dose, 14, 1, 1, 3) - self._layout.addWidget(QLabel("MGy", parent=self), 14, 4) + self._layout.addWidget(self.dose, 16, 1, 1, 3) + self._layout.addWidget(QLabel("MGy", parent=self), 16, 4) self.measurement_button = QPushButton("Run rotation") self.measurement_button.setStyleSheet(f"color: {GO_TEXT};") self.measurement_button.clicked.connect(self.run_measurement) - self._layout.addWidget(self.measurement_button, 16, 0, 1, 6) + self._layout.addWidget(self.measurement_button, 17, 0, 1, 6) # Per-tab Abort (DataCollectionSettings wires it to the DAQ cancel). self.abort_button = QPushButton("Abort measurement") self.abort_button.setStyleSheet(f"color: {ABORT_TEXT};") - self._layout.addWidget(self.abort_button, 17, 0, 1, 6) + self._layout.addWidget(self.abort_button, 18, 0, 1, 6) self._reset_to_defaults() @Slot() @@ -197,7 +212,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): wedge_omega_deg=screening_settings["omega_step_deg"], steps=1, dtz=self._dtz, - transmission=self._transmission, + transmission=self._screening_transmission, screening=True, exp_time_s=self.screening_image_time_enter.value, ) @@ -209,7 +224,7 @@ class RotationDataCollectionPanel(ScanSettingsPanel): incr_omega_deg=screening_settings["omega_step_deg"], steps=screening_settings["steps"], dtz=self._dtz, - transmission=self._transmission, + transmission=self._screening_transmission, screening=True, exp_time_s=self.screening_image_time_enter.value, ) diff --git a/src/aare/gui/panels/scan_settings_panel.py b/src/aare/gui/panels/scan_settings_panel.py index 2a2e2ac7..ce5dc731 100644 --- a/src/aare/gui/panels/scan_settings_panel.py +++ b/src/aare/gui/panels/scan_settings_panel.py @@ -24,7 +24,6 @@ class ScanSettingsPanel(QWidget): dtz_move = Signal(float) # TODO min and max dtz is set by beamline add max MIN_DTZ = 108.0 # this is beamline dependent - transmission_updated = Signal(float) def __init__( self, @@ -37,6 +36,7 @@ class ScanSettingsPanel(QWidget): self._diffraction = diffraction self._transmission = default_transmission + self._screening_transmission = default_transmission self._dtz = default_dtz self._high_res = diffraction.resolution_angstrom(self._dtz) @@ -87,13 +87,6 @@ class ScanSettingsPanel(QWidget): self._layout.addWidget(self.dtz_enter, 1, 1, 1, 3) self._layout.addWidget(QLabel("mm", parent=self), 1, 4) - self._layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0) - self.transmission_enter = DbOverrideLineEdit( - 0, 1.0, default=self._transmission, decimals=4, parent=self - ) - self._layout.addWidget(self.transmission_enter, 2, 1, 1, 3) - self.transmission_enter.valueChanged.connect(self.set_transmission) - # dtz and resolution are two views of one quantity. They share the # source toggle; ``valueChanged`` keeps internal state/downstream in # sync (toggle, db updates), while ``edited`` (a real user edit) derives @@ -105,8 +98,6 @@ class ScanSettingsPanel(QWidget): self._override_fields.append(self.dtz_enter) self._override_fields.append(self.high_res_enter) - self._register_override_field(self.transmission_enter) - self._reset_to_defaults() # -- source toggle ----------------------------------------------------- @@ -253,10 +244,13 @@ class ScanSettingsPanel(QWidget): self.set_source(DbOverrideLineEdit.SOURCE_MINE) self.dtz_updated.emit(self._dtz) + @Slot(float) + def set_screening_transmission(self, v: float): + self._screening_transmission = v + @Slot(float) def set_transmission(self, v: float): self._transmission = v - self.transmission_updated.emit(self._transmission) @Slot() def reload_parameters(self): diff --git a/uv.lock b/uv.lock index 901b66d1..0a9c2ba6 100644 --- a/uv.lock +++ b/uv.lock @@ -31,7 +31,7 @@ wheels = [ [[package]] name = "aaredaq" -version = "0.17.3" +version = "0.17.5" source = { editable = "." } dependencies = [ { name = "aarecommon" }, -- 2.54.0 From 07e0cad909b30f0069be0d05bc09e3492a54c649 Mon Sep 17 00:00:00 2001 From: Dawn Date: Mon, 31 Aug 2026 15:05:28 +0200 Subject: [PATCH 7/8] fix: move beam transmission back and just add a new name for screening transmission --- src/aare/gui/panels/rotation_data_collection.py | 11 +---------- src/aare/gui/panels/scan_settings_panel.py | 8 ++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/aare/gui/panels/rotation_data_collection.py b/src/aare/gui/panels/rotation_data_collection.py index 418049e4..70ecc48c 100644 --- a/src/aare/gui/panels/rotation_data_collection.py +++ b/src/aare/gui/panels/rotation_data_collection.py @@ -103,13 +103,12 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(self.screening_type, 7, 0, 1, 6) - self._layout.addWidget(QLabel("Beam transmission", parent=self), 8, 0) + self._layout.addWidget(QLabel("Screening transmission", parent=self), 8, 0) self.screening_transmission_enter = DbOverrideLineEdit( 0, 1.0, default=self._transmission, decimals=4, parent=self ) self._layout.addWidget(self.screening_transmission_enter, 8, 1, 1, 3) self.screening_transmission_enter.valueChanged.connect(self.set_screening_transmission) - # increment later self.screening_button = QPushButton("Run screening") self.screening_button.setStyleSheet(f"color: {GO_TEXT};") self.screening_button.clicked.connect(self.run_screening) @@ -153,14 +152,6 @@ class RotationDataCollectionPanel(ScanSettingsPanel): self._layout.addWidget(QLabel("s", parent=self), 13, 4) self._register_override_field(self.image_time_enter) - self._layout.addWidget(QLabel("Beam transmission", parent=self), 14, 0) - self.transmission_enter = DbOverrideLineEdit( - 0, 1.0, default=self._transmission, decimals=4, parent=self - ) - self._layout.addWidget(self.transmission_enter, 14, 1, 1, 3) - self.transmission_enter.valueChanged.connect(self.set_transmission) - self._register_override_field(self.transmission_enter) - self._layout.addWidget(QLabel("Total measurement time", parent=self), 15, 0) self.total_time = QLabel(f"{self._total_time} min 0 s") self.total_time.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) diff --git a/src/aare/gui/panels/scan_settings_panel.py b/src/aare/gui/panels/scan_settings_panel.py index ce5dc731..b28aa562 100644 --- a/src/aare/gui/panels/scan_settings_panel.py +++ b/src/aare/gui/panels/scan_settings_panel.py @@ -87,6 +87,14 @@ class ScanSettingsPanel(QWidget): self._layout.addWidget(self.dtz_enter, 1, 1, 1, 3) self._layout.addWidget(QLabel("mm", parent=self), 1, 4) + self._layout.addWidget(QLabel("Rotation transmission", parent=self), 2, 0) + self.transmission_enter = DbOverrideLineEdit( + 0, 1.0, default=self._transmission, decimals=4, parent=self + ) + self._layout.addWidget(self.transmission_enter, 2, 1, 1, 3) + self.transmission_enter.valueChanged.connect(self.set_transmission) + self._register_override_field(self.transmission_enter) + # dtz and resolution are two views of one quantity. They share the # source toggle; ``valueChanged`` keeps internal state/downstream in # sync (toggle, db updates), while ``edited`` (a real user edit) derives -- 2.54.0 From 49d7089d69a5227a1c9b97e77d8374833b9ee6de Mon Sep 17 00:00:00 2001 From: Dawn Date: Mon, 31 Aug 2026 15:18:23 +0200 Subject: [PATCH 8/8] fix: add the transmission_updated signal back --- src/aare/gui/panels/scan_settings_panel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aare/gui/panels/scan_settings_panel.py b/src/aare/gui/panels/scan_settings_panel.py index b28aa562..65a5e6b1 100644 --- a/src/aare/gui/panels/scan_settings_panel.py +++ b/src/aare/gui/panels/scan_settings_panel.py @@ -24,6 +24,7 @@ class ScanSettingsPanel(QWidget): dtz_move = Signal(float) # TODO min and max dtz is set by beamline add max MIN_DTZ = 108.0 # this is beamline dependent + transmission_updated = Signal(float) def __init__( self, @@ -259,6 +260,7 @@ class ScanSettingsPanel(QWidget): @Slot(float) def set_transmission(self, v: float): self._transmission = v + self.transmission_updated.emit(self._transmission) @Slot() def reload_parameters(self): -- 2.54.0