From f1cf55adb9b9be3c244128115cb51123e5df8a3d Mon Sep 17 00:00:00 2001 From: Dawn Date: Tue, 8 Sep 2026 11:53:26 +0200 Subject: [PATCH] fix: take the aareDB transmission as the fraction aarecommon >= 0.7 declares CI resolves aarecommon 0.7.3, where DataCollectionParameters.transmission is a 0-to-1 fraction that rejects anything above 1.0 (the percent sheets are converted inside AareDB >= 0.83, which main already requires). The divide-by-100 from the earlier 'percentage' fix therefore failed the model test on CI and would have turned 20% into 0.2% at the beamline. Pass the fraction through and pin aarecommon>=0.7.3 so the older int percentage model can no longer be installed; relock. Also satisfy the diff typecheck gate: basedpyright only counts instance variables assigned in __init__, so the Database/User toggle widgets are created there and _build_source_toggle only lays them out. Co-Authored-By: Claude Fable 5.1 --- pyproject.toml | 4 +++- src/aare/gui/panels/scan_settings_panel.py | 20 +++++++++---------- .../unit/gui/test_data_collection_settings.py | 2 +- uv.lock | 18 ++++++++--------- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0da2787e..428bf705 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,9 @@ requires-python = ">=3.11" dependencies = [ "uv", "gunicorn", - "aarecommon>=0.5.1", + # >=0.7: DataCollectionParameters.transmission is a 0-1 fraction, which + # the scan panels rely on (older releases held an int percentage). + "aarecommon>=0.7.3", "pydantic>=2.11", "numpy", "jfjoch_client>=1.0.0rc165", diff --git a/src/aare/gui/panels/scan_settings_panel.py b/src/aare/gui/panels/scan_settings_panel.py index 5ef1750a..17d369c0 100644 --- a/src/aare/gui/panels/scan_settings_panel.py +++ b/src/aare/gui/panels/scan_settings_panel.py @@ -86,15 +86,13 @@ class SampleParameters: params = None if sample is None else sample.aaredb_params if params is None: return cls() - # aareDB holds transmission as a percentage (DataCollectionParameters - # .transmission is an int, 0 to 100); everything here works in the - # 0-to-1 fraction the scan requests are built from. - transmission = _spreadsheet_float(params, "transmission") - if transmission is not None: - transmission = transmission / 100.0 + # DataCollectionParameters.transmission is the 0-to-1 fraction the + # scan requests use (aarecommon >= 0.7 rejects anything above 1.0 by + # design; the percent spreadsheets humans write are converted inside + # AareDB). No scaling here: dividing again would turn 20% into 0.2%. return cls( resolution_a=_spreadsheet_float(params, "targetresolution"), - transmission=transmission, + transmission=_spreadsheet_float(params, "transmission"), total_angle_deg=_spreadsheet_float(params, "totalangle"), image_angle_deg=_spreadsheet_float(params, "oscillation"), exp_time_s=_spreadsheet_float(params, "exposure"), @@ -158,6 +156,11 @@ class ScanSettingsPanel(QWidget): outer = QVBoxLayout(self) outer.setContentsMargins(0, 0, 0, 0) outer.setSpacing(0) + # Created here, not in _build_source_toggle: basedpyright only counts + # instance variables assigned in __init__ as initialized. + self._database_radio = QRadioButton("Database values", self) + self._user_radio = QRadioButton("User values", self) + self._source_group = QButtonGroup(self) outer.addWidget(self._build_source_toggle()) grid_host = QWidget(self) @@ -242,10 +245,7 @@ class ScanSettingsPanel(QWidget): container = QWidget(self) row = QHBoxLayout(container) row.setContentsMargins(0, 0, 0, 0) - self._database_radio = QRadioButton("Database values", container) - self._user_radio = QRadioButton("User values", container) self._database_radio.setChecked(True) - self._source_group = QButtonGroup(container) self._source_group.addButton(self._database_radio) self._source_group.addButton(self._user_radio) # One connection is enough: toggled fires on both directions. diff --git a/tests/unit/gui/test_data_collection_settings.py b/tests/unit/gui/test_data_collection_settings.py index 07333279..d821e942 100644 --- a/tests/unit/gui/test_data_collection_settings.py +++ b/tests/unit/gui/test_data_collection_settings.py @@ -59,7 +59,7 @@ def test_sample_parameters_translate_the_spreadsheet_row(): pin=1, aaredb_params=DataCollectionParameters( targetresolution=1.5, - transmission=20, # aareDB stores a percentage + transmission=0.2, # 0-to-1 fraction; aareDB converts the percent sheets totalangle=180, oscillation=0.1, exposure=0.02, diff --git a/uv.lock b/uv.lock index a3bbd4b1..5e34f601 100644 --- a/uv.lock +++ b/uv.lock @@ -11,7 +11,7 @@ overrides = [{ name = "opencv-python", marker = "sys_platform == 'nonexistent'" [[package]] name = "aarecommon" -version = "0.5.4" +version = "0.7.3" 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.5.4/aarecommon-0.5.4.tar.gz", hash = "sha256:3e4e2e5ee1dbe2690e6b6ee26598f2fd845f5f458bbe8b05282e24cf9fa27aca" } +sdist = { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aarecommon/0.7.3/aarecommon-0.7.3.tar.gz", hash = "sha256:e85ddf9d3b740ca7536597b26cf839b159e96efc68845a6efb667a7dca5c4e0f" } wheels = [ - { 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" }, + { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aarecommon/0.7.3/aarecommon-0.7.3-py3-none-any.whl", hash = "sha256:22e8c87e2800cbe9223341b43b448f4d0a4f2c199e59c27d17eed2a4b2e11531" }, ] [[package]] name = "aaredaq" -version = "0.21.3" +version = "0.22.1" source = { editable = "." } dependencies = [ { name = "aarecommon" }, @@ -82,8 +82,8 @@ test = [ [package.metadata] requires-dist = [ - { name = "aarecommon", specifier = ">=0.5.1" }, - { name = "aaredb", specifier = ">=0.2", index = "https://gitea.psi.ch/api/packages/mx/pypi/simple" }, + { name = "aarecommon", specifier = ">=0.7.3" }, + { name = "aaredb", specifier = ">=0.83.1", index = "https://gitea.psi.ch/api/packages/mx/pypi/simple" }, { name = "aarelcinfer-client", specifier = "==0.1.1a8" }, { name = "aarescan-client", specifier = "==1.0.0rc5" }, { name = "basedpyright", marker = "extra == 'test'" }, @@ -124,7 +124,7 @@ provides-extras = ["test", "docs"] [[package]] name = "aaredb" -version = "0.6.0" +version = "0.83.1" source = { registry = "https://gitea.psi.ch/api/packages/mx/pypi/simple" } dependencies = [ { name = "pydantic" }, @@ -132,9 +132,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aaredb/0.6.0/aaredb-0.6.0.tar.gz", hash = "sha256:c6e9a4d5c23b1efd0e558e30811685343b9ace20cb6dd433b3e43ae26b9af049" } +sdist = { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aaredb/0.83.1/aaredb-0.83.1.tar.gz", hash = "sha256:9bbcf7cb9f165ae1217cb0392e48c820748976cadd3daf194b71a99c21de836e" } wheels = [ - { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aaredb/0.6.0/aaredb-0.6.0-py3-none-any.whl", hash = "sha256:78cd04e09a9ae16843ded6a60322baf35f43d0d926c787544402b7a85d2924e3" }, + { url = "https://gitea.psi.ch/api/packages/mx/pypi/files/aaredb/0.83.1/aaredb-0.83.1-py3-none-any.whl", hash = "sha256:cf7a2cd8171f7911b572b6367e5a8aabf9b10d731bddb724495273e8e17e2eb7" }, ] [[package]]