diff --git a/common/src/aaredaqlib/raster_grid.py b/common/src/aaredaqlib/raster_grid.py index 27a4bbfa..3a4f900b 100644 --- a/common/src/aaredaqlib/raster_grid.py +++ b/common/src/aaredaqlib/raster_grid.py @@ -1,4 +1,3 @@ -import math from typing import Annotated, List from pydantic import Field, AfterValidator, BaseModel diff --git a/gui/src/aaregui/main_window.py b/gui/src/aaregui/main_window.py index 78e5a564..de72e06a 100644 --- a/gui/src/aaregui/main_window.py +++ b/gui/src/aaregui/main_window.py @@ -68,7 +68,10 @@ class MainWindow(QMainWindow): ) self.raster = RasterGridManager(geom=geom) - self.data_collection = DataCollectionSettings(s=geom, parent=top_widget, raster_mgr=self.raster) + self.data_collection = DataCollectionSettings(s=geom, + parent=top_widget, + raster_mgr=self.raster, + diffraction=diffraction) top_widget_layout.addWidget(self.data_collection) self.camera_image = SampleCameraImageLabel(geom=geom, raster=self.raster, parent=top_widget, default_image=default_image) diff --git a/gui/src/aaregui/panels/data_collection_settings.py b/gui/src/aaregui/panels/data_collection_settings.py index b0b4500e..7700e373 100644 --- a/gui/src/aaregui/panels/data_collection_settings.py +++ b/gui/src/aaregui/panels/data_collection_settings.py @@ -7,6 +7,8 @@ from PySide6.QtWidgets import ( QPushButton, QWidget, ) + +from aaredaqlib.diffraction_geometry import DiffractionGeometry from aaredaqlib.rotation_scan import RotationScanRequest from aaredaqlib.sample_geometry import SampleGeometryModel @@ -23,8 +25,11 @@ class DataCollectionSettings(QFrame): standard_data_collection = Signal(RotationScanRequest) evaluate_grid = Signal() - def __init__(self, s: SampleGeometryModel, - raster_mgr: RasterGridManager, parent=None): + def __init__(self, + s: SampleGeometryModel, + raster_mgr: RasterGridManager, + diffraction: DiffractionGeometry, + parent=None): super().__init__(parent) self.setFixedWidth(400) self.setFrameShape(QFrame.Shape.StyledPanel) @@ -42,7 +47,8 @@ class DataCollectionSettings(QFrame): self.tab_widget = QTabWidget(parent=widget) - self.raster = RasterDataCollectionPanel(parent=self.tab_widget, raster_mgr=raster_mgr) + self.raster = RasterDataCollectionPanel(parent=self.tab_widget, raster_mgr=raster_mgr, + diffraction=diffraction) self.tab_widget.addTab(self.raster, "Raster") self.screening = ScreeningDataCollectionPanel(parent=self.tab_widget) diff --git a/gui/src/aaregui/panels/file_path_panel.py b/gui/src/aaregui/panels/file_path_panel.py index dc473d5e..dc858d05 100644 --- a/gui/src/aaregui/panels/file_path_panel.py +++ b/gui/src/aaregui/panels/file_path_panel.py @@ -1,6 +1,6 @@ from datetime import datetime -from PySide6.QtCore import Signal, Slot +from PySide6.QtCore import Signal, Slot, Qt from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QLineEdit, QSpinBox, QCheckBox from aaregui.widgets.title_label import TitleLabel @@ -39,6 +39,7 @@ class FilePathPanel(QWidget): self.run_number_edit.setStyleSheet("background-color: rgb(255, 255, 255);") self.run_number_edit.setValue(1) self.run_number_edit.setRange(1, 999) + self.run_number_edit.setAlignment(Qt.AlignmentFlag.AlignRight) grid_layout.addWidget(self.run_number_edit, 4, 1) grid_layout.addWidget(QLabel("File name", parent=self), 5, 0) diff --git a/gui/src/aaregui/panels/raster_data_collection.py b/gui/src/aaregui/panels/raster_data_collection.py index 811eeb01..885396ae 100644 --- a/gui/src/aaregui/panels/raster_data_collection.py +++ b/gui/src/aaregui/panels/raster_data_collection.py @@ -1,94 +1,80 @@ from PySide6.QtCore import Signal, Slot, Qt from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QSizePolicy, QSpacerItem +from aaredaqlib.diffraction_geometry import DiffractionGeometry +from aaregui.panels.scan_settings_panel import ScanSettingsPanel from aaregui.scan_logic.raster_grid_manager import RasterGridManager from aaregui.widgets.number_line_edit import NumberLineEdit -class RasterDataCollectionPanel(QWidget): +class RasterDataCollectionPanel(ScanSettingsPanel): grid_size_updated = Signal(float, float) exp_time_updated = Signal(float) - transmission_updated = Signal(float) - dtz_updated = Signal(float) - def __init__(self, raster_mgr :RasterGridManager, parent=None): - super().__init__(parent) + def __init__(self, raster_mgr :RasterGridManager, + diffraction: DiffractionGeometry, + default_dtz: float = 200.0, + default_transmission: float = 1.0, + parent=None): + super().__init__(diffraction, default_dtz, default_transmission, parent) + self.__n_x = raster_mgr.active_grid.n_x self.__n_y = raster_mgr.active_grid.n_y self.__size_x = raster_mgr.active_grid.grid_size_mm.x * 1000.0 self.__size_y = raster_mgr.active_grid.grid_size_mm.y * 1000.0 - grid_layout = QGridLayout(self) - - grid_layout.addWidget(QLabel("High resolution", parent=self), 0, 0) - self.high_res_enter = NumberLineEdit( - 0.5, 10, decimals=2, default=2.0, parent=self - ) - grid_layout.addWidget(self.high_res_enter, 0, 1, 1, 3) - grid_layout.addWidget(QLabel("Å", parent=self), 0, 4) - grid_layout.addWidget(QLabel("Detector distance", parent=self), 1, 0) - self.dtz_enter = NumberLineEdit(60, 1000, decimals=2, default=raster_mgr.active_grid.dtz, parent=self) - grid_layout.addWidget(self.dtz_enter, 1, 1, 1, 3) - grid_layout.addWidget(QLabel("mm", parent=self), 1, 4) - self.dtz_enter.newValue.connect(self.dtz) - - grid_layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0) - self.transmission_enter = NumberLineEdit( - 0, 1.0, decimals=4, default=raster_mgr.active_grid.transmission, parent=self - ) - grid_layout.addWidget(self.transmission_enter, 2, 1,1,3) - self.transmission_enter.newValue.connect(self.transmission) - - grid_layout.addWidget(QLabel("Grid element size", parent=self), 3, 0) + self._layout.addWidget(QLabel("Grid element size", parent=self), 3, 0) self.width_enter = NumberLineEdit(5, 100, decimals=0, default=self.__size_x, parent=self) self.width_enter.newValue.connect(self.grid_size) - grid_layout.addWidget(self.width_enter, 3, 1) + self._layout.addWidget(self.width_enter, 3, 1) - grid_layout.addWidget(QLabel(" x ", parent=self), 3, 2) + self._layout.addWidget(QLabel(" x ", parent=self), 3, 2) self.height_enter = NumberLineEdit(5, 100, decimals=0, default=self.__size_y, parent=self) self.height_enter.newValue.connect(self.grid_size) - grid_layout.addWidget(self.height_enter, 3, 3) - grid_layout.addWidget(QLabel("μm", parent=self), 3, 4) - grid_layout.addWidget(QLabel("Image time", parent=self), 4, 0) + self._layout.addWidget(self.height_enter, 3, 3) + + self._layout.addWidget(QLabel("μm", parent=self), 3, 4) + + self._layout.addWidget(QLabel("Image time", parent=self), 4, 0) self.image_time_enter = NumberLineEdit( 0.0005, 10.0, raster_mgr.active_grid.exp_time_s, decimals=4, parent=self ) - grid_layout.addWidget(self.image_time_enter, 4, 1, 1, 3) - grid_layout.addWidget(QLabel("s", parent=self), 4, 4) + self._layout.addWidget(self.image_time_enter, 4, 1, 1, 3) + self._layout.addWidget(QLabel("s", parent=self), 4, 4) self.image_time_enter.newValue.connect(self.exp_time_s) - grid_layout.addWidget(QLabel("Grid elements", parent=self), 5, 0) + self._layout.addWidget(QLabel("Grid elements", parent=self), 5, 0) self.n_x_label = QLabel("-", parent=self) self.n_x_label.setAlignment(Qt.AlignmentFlag.AlignRight) - grid_layout.addWidget(self.n_x_label, 5, 1) - grid_layout.addWidget(QLabel(" x ", parent=self), 5, 2) + self._layout.addWidget(self.n_x_label, 5, 1) + self._layout.addWidget(QLabel(" x ", parent=self), 5, 2) self.n_y_label = QLabel("-", parent=self) self.n_y_label.setAlignment(Qt.AlignmentFlag.AlignRight) - grid_layout.addWidget(self.n_y_label, 5, 3) + self._layout.addWidget(self.n_y_label, 5, 3) - grid_layout.addWidget(QLabel("Grid size", parent=self), 6, 0) + self._layout.addWidget(QLabel("Grid size", parent=self), 6, 0) self.size_x_label = QLabel("-", parent=self) self.size_x_label.setAlignment(Qt.AlignmentFlag.AlignRight) - grid_layout.addWidget(self.size_x_label, 6, 1) - grid_layout.addWidget(QLabel(" x ", parent=self), 6, 2) + self._layout.addWidget(self.size_x_label, 6, 1) + self._layout.addWidget(QLabel(" x ", parent=self), 6, 2) self.size_y_label = QLabel("-", parent=self) self.size_y_label.setAlignment(Qt.AlignmentFlag.AlignRight) - grid_layout.addWidget(self.size_y_label, 6, 3) + self._layout.addWidget(self.size_y_label, 6, 3) - grid_layout.addWidget(QLabel("μm", parent=self), 6, 4) + self._layout.addWidget(QLabel("μm", parent=self), 6, 4) horizontal_spacer = QSpacerItem( 40, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding ) - grid_layout.addItem(horizontal_spacer, 7, 0, 1, 4) + self._layout.addItem(horizontal_spacer, 7, 0, 1, 4) self.update_grid_scan_size() @Slot(float) @@ -103,14 +89,6 @@ class RasterDataCollectionPanel(QWidget): def exp_time_s(self, inp: float): self.exp_time_updated.emit(inp) - @Slot(float) - def dtz(self, inp: float): - self.dtz_updated.emit(inp) - - @Slot(float) - def transmission(self, inp: float): - self.transmission_updated.emit(inp) - @Slot(int, int) def grid_scan_size_change(self, n_x: int, n_y: int): self.__n_x = n_x diff --git a/gui/src/aaregui/panels/scan_settings_panel.py b/gui/src/aaregui/panels/scan_settings_panel.py new file mode 100644 index 00000000..6a5ad851 --- /dev/null +++ b/gui/src/aaregui/panels/scan_settings_panel.py @@ -0,0 +1,72 @@ +from PySide6.QtCore import Slot, Signal +from PySide6.QtWidgets import QWidget, QGridLayout, QLabel + +from aaredaqlib.diffraction_geometry import DiffractionGeometry +from aaredaqlib.models import DAQStatusModel +from aaregui.widgets.number_line_edit import NumberLineEdit + + +class ScanSettingsPanel(QWidget): + dtz_updated = Signal(float) + dtz_move = Signal(float) + transmission_updated = Signal(float) + + def __init__(self, diffraction: DiffractionGeometry, + default_dtz: float = 200.0, + default_transmission: float = 1.0, + parent=None): + super().__init__(parent) + self.__diffraction = diffraction + + self._transmission = default_transmission + self._dtz = default_dtz + self._high_res = diffraction.resolution_angstrom(self._dtz) + + self._layout = QGridLayout(self) + + self._layout.addWidget(QLabel("High resolution", parent=self), 0, 0) + self.high_res_enter = NumberLineEdit( + 0.5, 10, decimals=2, default=self._high_res, parent=self + ) + self._layout.addWidget(self.high_res_enter, 0, 1, 1, 3) + self._layout.addWidget(QLabel("Å", parent=self), 0, 4) + + self.high_res_enter.newValue.connect(self.set_high_res) + + self._layout.addWidget(QLabel("Detector distance", parent=self), 1, 0) + self.dtz_enter = NumberLineEdit(60, 1000, decimals=2, default=self._dtz, parent=self) + self._layout.addWidget(self.dtz_enter, 1, 1, 1, 3) + self._layout.addWidget(QLabel("mm", parent=self), 1, 4) + + self.dtz_enter.newValue.connect(self.set_dtz) + + self._layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0) + self.transmission_enter = NumberLineEdit( + 0, 1.0, decimals=4, default=self._transmission, parent=self + ) + self._layout.addWidget(self.transmission_enter, 2, 1, 1, 3) + self.transmission_enter.newValue.connect(self.set_transmission) + + @Slot(DAQStatusModel) + def update_daq_status(self, s: DAQStatusModel): + self.__diffraction = s.diffraction + + @Slot(float) + def set_dtz(self, v: float): + self._dtz = v + self._high_res = self.__diffraction.resolution_angstrom(self._dtz) + self.high_res_enter.update_value(self._high_res) + self.dtz_updated.emit(self._dtz) + + @Slot(float) + def set_high_res(self, v: float): + self._high_res = v + self._dtz = self.__diffraction.calc_dtz_mm(v) + self.dtz_enter.update_value(self._dtz) + self.dtz_updated.emit(self._dtz) + + @Slot(float) + def set_transmission(self, v: float): + self._transmission = v + self.transmission_enter.update_value(self._transmission) + self.transmission_updated.emit(self._transmission) diff --git a/gui/src/aaregui/scan_logic/rotation_scan_manager.py b/gui/src/aaregui/scan_logic/rotation_scan_manager.py new file mode 100644 index 00000000..08bf0583 --- /dev/null +++ b/gui/src/aaregui/scan_logic/rotation_scan_manager.py @@ -0,0 +1,6 @@ +from PySide6.QtCore import QObject + + +class RotationScanManager(QObject): + + pass