diff --git a/daq/src/aaredaq/best.pt b/daq/src/aaredaq/best.pt index 8ad56d3d..ed71546a 100644 Binary files a/daq/src/aaredaq/best.pt and b/daq/src/aaredaq/best.pt differ diff --git a/daq/src/mxlibs3/jfjoch.py b/daq/src/mxlibs3/jfjoch.py index 68a82e9c..90a82384 100644 --- a/daq/src/mxlibs3/jfjoch.py +++ b/daq/src/mxlibs3/jfjoch.py @@ -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) diff --git a/gui/src/aaregui/panels/smart_rotation_panel.py b/gui/src/aaregui/panels/smart_rotation_panel.py index 9dae8fc6..4886e46b 100644 --- a/gui/src/aaregui/panels/smart_rotation_panel.py +++ b/gui/src/aaregui/panels/smart_rotation_panel.py @@ -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("N/A") else: self.wavelength_label.setText(f"{s.diffraction.wavelength_angstrom:.3f}") - 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,