This commit is contained in:
Guillaume Cyril Gotthard
2025-10-14 11:23:32 +02:00
parent 0b9f21b9a1
commit 7f4c9f1d72
3 changed files with 89 additions and 116 deletions
Binary file not shown.
+5 -1
View File
@@ -126,7 +126,11 @@ class JFJochWrapper:
ring_current_mA=s.bl.ring_current_mA,
sample_temperature_K=s.bl.cryojet_K,
total_flux=s.bl.flux_ph_s,
space_group_number=1
space_group_number=1,
poni_rot1_rad = s.diffraction.poni_rot1_rad,
poni_rot2_rad = s.diffraction.poni_rot2_rad,
max_spot_count = 1000,
detect_ice_rings = True
#TODO space_group_number and unit_cell???
)
self.__api.start_post(dataset_settings=dataset_settings)
+84 -115
View File
@@ -3,22 +3,19 @@ import math
from PySide6.QtCore import Slot, Qt, Signal
from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QFrame, QPushButton, QSpacerItem, QSizePolicy
from aaredaqlib.models import DAQStatusModel, SimpleScanParameters
from aaredaqlib.models import DAQStatusModel
from aaredaqlib.rotation_scan import RotationScanRequest
from aaregui.panels.rotation_data_collection import add_data_to_path
from aaregui.widgets.number_line_edit import NumberLineEdit
class SimpleRotationSettingsPanel(QWidget):
rotation_scan = Signal(RotationScanRequest)
viewer_track_online = Signal()
parameters_changed = Signal(SimpleScanParameters)
def __init__(self, parent=None):
super().__init__(parent)
self.n_images = 1
self.xtal_size_dose_rate_MGy_s = None
self.xtal_x = None
self.xtal_y = None
@@ -27,12 +24,14 @@ class SimpleRotationSettingsPanel(QWidget):
self.dose_rate_MGy_s = None
self._filename = ""
self.dtz = 120
self.image_time_s = 0.1
self.n_images = None
self.transmission = 1.0
self.image_time_s = None
self.image_angle = 0.2
self.__d = None
self._temperature = 100
self.__omega = 0
self._wilson_b = None
self.parameters = SimpleScanParameters()
self._wilson_b = 0
self._layout = QGridLayout(self)
@@ -45,75 +44,73 @@ class SimpleRotationSettingsPanel(QWidget):
self._layout.addWidget(QLabel("Å", parent=self), 0, 4)
self.visible_res_enter.newValue.connect(self.set_visible_resolution)
self._layout.addWidget(QLabel("Start angle", parent=self), 1, 0)
self.start_angle_enter = NumberLineEdit(-720, 720.0, 0.0, decimals=3, parent=self)
self._layout.addWidget(self.start_angle_enter, 1, 1, 1, 3)
# Angular range (entry)
self._layout.addWidget(QLabel("Total angle", parent=self), 1, 0)
self.angular_range_enter = NumberLineEdit(
5.0, 1000.0, decimals=3, default=210.0, parent=self
)
self._layout.addWidget(self.angular_range_enter, 1, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 1, 4)
self.visible_res_enter.newValue.connect(self.set_visible_resolution)
# Calculated labels
self._layout.addWidget(QLabel("Target resolution", parent=self), 2, 0)
self.target_res_label = QLabel("--", parent=self)
self.target_res_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.target_res_label, 2, 1, 1, 3)
self._layout.addWidget(QLabel("Å", parent=self), 2, 4)
self._layout.addWidget(QLabel("Image angle", parent=self), 3, 0)
self.image_angle_label = QLabel("--", parent=self)
self.image_angle_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.image_angle_label, 3, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 3, 4)
self._layout.addWidget(QLabel("Image time", parent=self), 4, 0)
self.image_time_label = QLabel("--", parent=self)
self.image_time_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.image_time_label, 4, 1, 1, 3)
self._layout.addWidget(QLabel("s", parent=self), 4, 4)
self._layout.addWidget(QLabel("Transmission", parent=self), 5, 0)
self.transmission_label = QLabel("--", parent=self)
self.transmission_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.transmission_label, 5, 1, 1, 3)
self._layout.addWidget(QLabel("%", parent=self), 5, 4)
self._layout.addWidget(QLabel("Detector distance", parent=self), 6, 0)
self.dtz_label = QLabel(f"--", parent=self)
self.dtz_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.dtz_label, 6, 1, 1, 3)
self._layout.addWidget(QLabel("mm", parent=self), 6, 4)
self._layout.addWidget(QLabel("Target Dose", parent=self), 7, 0)
self.target_dose_label = QLabel(f"--", parent=self)
self.target_dose_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.target_dose_label, 7, 1, 1, 3)
self._layout.addWidget(QLabel("MGy", parent=self), 7, 4)
self._layout.addWidget(QLabel("Calculated Dose Rate", parent=self), 8, 0)
self.calculated_dose_rate_label = QLabel(f"--", parent=self)
self.calculated_dose_rate_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.calculated_dose_rate_label, 8, 1, 1, 3)
self._layout.addWidget(QLabel("MGy S^-1", parent=self), 8, 4)
self._layout.addWidget(QLabel("Temperature", parent=self), 9, 0)
self.temp_enter = NumberLineEdit(80, 330, decimals=2, default=100.0, parent=self)
self._layout.addWidget(self.temp_enter, 9, 1, 1, 3)
self._layout.addWidget(QLabel("K", parent=self), 9, 4)
self.temp_enter.newValue.connect(self.set_temperature)
self._layout.addWidget(QLabel("Start angle", parent=self), 10, 0)
self.start_angle = NumberLineEdit(-720, 720.0, 0.0, decimals=3, parent=self)
self._layout.addWidget(self.start_angle, 10, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 10, 4)
self.omega_button = QPushButton("Ω")
self.omega_button.setFixedWidth(20)
self.omega_button.clicked.connect(self.update_omega_start)
self._layout.addWidget(self.omega_button, 1, 5)
# Angular range (entry)
self._layout.addWidget(QLabel("Total angle", parent=self), 2, 0)
self.angular_range_enter = NumberLineEdit(
5.0, 1000.0, decimals=3, default=360.0, parent=self
)
self._layout.addWidget(self.angular_range_enter, 2, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 2, 4)
self.visible_res_enter.newValue.connect(self.set_total_angle)
self._layout.addWidget(QLabel("Image angle", parent=self), 3, 0)
self.image_angle_enter = NumberLineEdit(
0.001, 1.000, decimals=3, default=0.2, parent=self
)
self._layout.addWidget(self.image_angle_enter, 3, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 3, 4)
self.image_angle_enter.newValue.connect(self.set_image_angle)
self._layout.addWidget(QLabel("Temperature", parent=self), 4, 0)
self.temp_enter = NumberLineEdit(80, 330, decimals=2, default=100.0, parent=self)
self._layout.addWidget(self.temp_enter, 4, 1, 1, 3)
self._layout.addWidget(QLabel("K", parent=self), 4, 4)
self.temp_enter.newValue.connect(self.set_temperature)
# Calculated labels
self._layout.addWidget(QLabel("Target resolution", parent=self), 5, 0)
self.target_res_label = QLabel("--", parent=self)
self.target_res_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.target_res_label, 5, 1, 1, 3)
self._layout.addWidget(QLabel("Å", parent=self), 5, 4)
self._layout.addWidget(QLabel("Image time", parent=self), 6, 0)
self.image_time_label = QLabel("--", parent=self)
self.image_time_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.image_time_label, 6, 1, 1, 3)
self._layout.addWidget(QLabel("s", parent=self), 6, 4)
self._layout.addWidget(QLabel("Transmission", parent=self), 7, 0)
self.transmission_label = QLabel("--", parent=self)
self.transmission_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.transmission_label, 7, 1, 1, 3)
self._layout.addWidget(QLabel("%", parent=self), 7, 4)
self._layout.addWidget(QLabel("Detector distance", parent=self), 8, 0)
self.dtz_label = QLabel(f"--", parent=self)
self.dtz_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.dtz_label, 8, 1, 1, 3)
self._layout.addWidget(QLabel("mm", parent=self), 8, 4)
self._layout.addWidget(QLabel("Target Dose", parent=self), 9, 0)
self.target_dose_label = QLabel(f"--", parent=self)
self.target_dose_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.target_dose_label, 9, 1, 1, 3)
self._layout.addWidget(QLabel("MGy", parent=self), 9, 4)
self._layout.addWidget(QLabel("Calculated Dose Rate", parent=self), 10, 0)
self.calculated_dose_rate_label = QLabel(f"--", parent=self)
self.calculated_dose_rate_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
self._layout.addWidget(self.calculated_dose_rate_label, 10, 1, 1, 3)
self._layout.addWidget(QLabel("MGy S^-1", parent=self), 10, 4)
self._layout.addWidget(self.omega_button, 10, 5)
self._layout.addWidget(QLabel("Wilson B Factor", parent=self), 11, 0)
self.wilson_b_label = QLabel(f"--", parent=self)
@@ -181,13 +178,8 @@ class SimpleRotationSettingsPanel(QWidget):
@Slot(DAQStatusModel)
def update_daq_status(self, s: DAQStatusModel):
self.__d = s
#TODO only update best_res after raster finished otherwise ask to update. or have toggle to overwrite with user value
#TODO only take best res from flat face scan
#TODO identify flat face!!!!
best_res = s.last_best_res
print("best_res: ", best_res)
self.__omega = s.geom.omega_deg
print(best_res)
if best_res is not None:
# clamp to control limits and update field; this will also trigger recalculation
lo, hi = 0.8, 10.0
@@ -195,14 +187,12 @@ class SimpleRotationSettingsPanel(QWidget):
self.visible_res_enter.update_value(v)
self.set_visible_resolution(v)
self._wilson_b = s.last_best_b_factor
print("b_factor: ", self._wilson_b)
if self._wilson_b is not None:
self.wilson_b_label.setText(f"{self._wilson_b:.2f}")
best_b_factor = s.last_best_b_factor
print(best_b_factor)
if best_b_factor is not None:
self.wilson_b_label.setText(f"{best_b_factor:.2f}")
xtal_size = s.crystal_size
print("crystal_size: ", xtal_size)
if xtal_size is not None:
# clamp to control limits and update field; this will also trigger recalculation
self.xtal_x = xtal_size.x
@@ -221,21 +211,12 @@ class SimpleRotationSettingsPanel(QWidget):
self.wavelength_label.setText("<b>N/A</b>")
else:
self.wavelength_label.setText(f"<b>{s.diffraction.wavelength_angstrom:.3f}</b>")
self.update_calculated_labels()
@Slot(float)
def set_visible_resolution(self, v: float):
self.update_calculated_labels()
@Slot(float)
def set_total_angle(self, v: float):
self.update_calculated_labels()
@Slot(float)
def set_image_angle(self, v: float):
self.update_calculated_labels()
@Slot(float)
def set_temperature(self, v: float):
self.update_calculated_labels()
@@ -246,7 +227,7 @@ class SimpleRotationSettingsPanel(QWidget):
@Slot()
def update_omega_start(self):
self.start_angle_enter.update_value(self.__omega)
self.start_angle.update_value(self.__omega)
def update_calculated_labels(self):
if self.__d is None:
@@ -257,21 +238,18 @@ class SimpleRotationSettingsPanel(QWidget):
#TODO read resolution estiamtion from jfjoch
total_angle = self.angular_range_enter.value
d_vis = self.visible_res_enter.value
image_angle = self.image_angle_enter.value
if d_vis == 0.0:
d_vis = 1.3
d_tar = 1/(1/d_vis + 0.1)
self.target_res_label.setText(f"{d_tar:.2f}")
#self.wilson_b_label.setText("--")
Kdose = 2000 / (self.__d.diffraction.wavelength_angstrom**2)
beam_size_um_y = self.__d.geom.beam_size_mm.y * 1000
beam_size_um_x = self.__d.geom.beam_size_mm.x * 1000
self.dose_rate_MGy_s = (flux / (beam_size_um_x * beam_size_um_y * Kdose)) / 1e6
if self.xtal_y is None or self.xtal_z is None or beam_size_um_x is None or beam_size_um_y is None:
if xtal_y is None or xtal_z is None or beam_size_um_x is None or beam_size_um_y is None:
self.xtal_size_dose_rate_MGy_s = self.dose_rate_MGy_s
elif self.xtal_y > beam_size_um_y or self.xtal_z > beam_size_um_y :
multiplier_1 = max(self.xtal_y, beam_size_um_y)
multiplier_2 = max( self.xtal_z,beam_size_um_y)
@@ -293,9 +271,10 @@ class SimpleRotationSettingsPanel(QWidget):
total_time_s = self.target_dose_MGy / self.dose_rate_MGy_s
self.calculated_dose_label.setText(f"{self.xtal_size_dose_rate_MGy_s*total_time_s:.2f}")
if image_angle == 0.0:
image_angle = 0.001
self.n_images = round(total_angle / image_angle)
self.image_angle = 0.2
self.image_angle_label.setText(f"{self.image_angle:.3f}")
self.n_images = total_angle / self.image_angle
self.image_time_s = total_time_s / self.n_images
if self.image_time_s < 0.01:
self.transmission = self.image_time_s / 0.01
@@ -316,23 +295,13 @@ class SimpleRotationSettingsPanel(QWidget):
else:
self.dtz_label.setText(f"{self.dtz:.2f}")
self.parameters = SimpleScanParameters(
dtz=int(round(self.dtz)),
exp_time_s=self.image_time_s,
start_omega_deg=self.start_angle_enter.value,
incr_omega_deg=image_angle,
steps=self.n_images,
transmission=self.transmission
)
self.parameters_changed.emit(self.parameters)
@Slot()
def run_measurement(self):
r = RotationScanRequest(
file_prefix=str(add_data_to_path(self._filename)),
start_omega_deg=self.start_angle_enter.value,
file_prefix=self._filename,
start_omega_deg=0,#,self.start_angle.value,
steps=self.n_images,
incr_omega_deg=self.image_angle_enter.value,
incr_omega_deg=self.image_angle,
dtz=self.dtz,
transmission=self.transmission,
screening=False,