Feat/screening and gui polish #184
@@ -96,21 +96,29 @@ 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)
|
||||
|
||||
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)
|
||||
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("<center><B><u>Rotation</u></B></center>", parent=self), 9, 0, 1, 6
|
||||
QLabel("<center><B><u>Rotation</u></B></center>", 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
|
||||
)
|
||||
@@ -121,33 +129,33 @@ 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("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)
|
||||
@@ -155,21 +163,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()
|
||||
@@ -195,7 +203,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,
|
||||
)
|
||||
@@ -207,7 +215,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,
|
||||
)
|
||||
|
||||
@@ -37,6 +37,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,12 +88,13 @@ 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._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
|
||||
@@ -105,8 +107,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,6 +253,10 @@ 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
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.5"
|
||||
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" },
|
||||
|
||||
Reference in New Issue
Block a user