GUI: Data collection running works

This commit is contained in:
leonarski_f committed 2025-06-13 11:19:29 +02:00
1 parent 0d63d920d2
commit 3988c345c9
9 files changed
+141 -332

No files matched your search

+1 -11
View File
@@ -173,16 +173,8 @@ class MainWindow(QMainWindow):
# )
#
self.data_collection.standard_data_collection.connect(self.daq.standard_scan)
self.data_collection.helical.show_helical_start.connect(self.camera_image.show_helical_start)
self.data_collection.helical.show_helical_end.connect(self.camera_image.show_helical_end)
self.camera_image.autofocus.connect(self.daq.autofocus)
self.camera_image.set_helical_start.connect(self.data_collection.helical.set_start_point)
self.camera_image.set_helical_end.connect(self.data_collection.helical.set_end_point)
self.camera_image.evaluate_grid.connect(self.raster.run_grid_scan)
self.data_collection.raster.evaluate_grid.connect(self.raster.run_grid_scan)
@@ -201,10 +193,8 @@ class MainWindow(QMainWindow):
self.data_collection.raster.transmission_updated.connect(self.raster.update_transmission)
self.data_collection.raster.dtz_updated.connect(self.raster.update_dtz)
self.data_collection.file_path_panel.set_file_prefix(self.raster.update_filename)
self.raster.update_filename(self.data_collection.file_path_panel.filename)
self.raster.grid_scan.connect(self.daq.raster_scan)
self.data_collection.screening.rotation_scan.connect(self.daq.standard_scan)
self.raster.grid_scan_size_changed.connect(self.data_collection.raster.grid_scan_size_change)
self.status_bar.set_pgroup.connect(self.daq.set_pgroup)
@@ -14,10 +14,8 @@ from aaredaqlib.rotation_scan import RotationScanRequest
from aaredaqlib.sample_geometry import SampleGeometryModel
from aaregui.panels.file_path_panel import FilePathPanel
from aaregui.panels.helical_scan_panel import HelicalDataCollectionPanel
from aaregui.panels.raster_data_collection import RasterDataCollectionPanel
from aaregui.panels.screening_data_collection import ScreeningDataCollectionPanel
from aaregui.panels.standard_data_collection import StandardDataCollectionPanel
from aaregui.panels.rotation_data_collection import RotationDataCollectionPanel
from aaregui.scan_logic.raster_grid_manager import RasterGridManager
from aaregui.widgets.title_label import TitleLabel
@@ -36,81 +34,32 @@ class DataCollectionSettings(QFrame):
self.setFrameShape(QFrame.Shape.StyledPanel)
self.setFrameShadow(QFrame.Shadow.Raised)
self.grid_layout = QGridLayout(self)
v_layout = QVBoxLayout(self)
self.file_path_panel = FilePathPanel(self)
self.grid_layout.addWidget(self.file_path_panel, 0, 0, 1, 2)
v_layout.addWidget(self.file_path_panel)
widget = QWidget(self)
v_layout = QVBoxLayout(widget)
widget.setLayout(v_layout)
v_layout.addWidget(TitleLabel("Grid scan"))
v_layout.addWidget(TitleLabel("Data collection settings"))
self.raster = RasterDataCollectionPanel(parent=self, raster_mgr=raster_mgr, diffraction=diffraction)
self.tab_widget = QTabWidget(parent=widget)
v_layout.addWidget(self.raster)
self.raster = RasterDataCollectionPanel(parent=self.tab_widget, raster_mgr=raster_mgr,
diffraction=diffraction)
self.tab_widget.addTab(self.raster, "Raster")
v_layout.addWidget(TitleLabel("Data collection"))
self.screening = ScreeningDataCollectionPanel(parent=self.tab_widget,
diffraction=diffraction,)
self.tab_widget.addTab(self.screening, "Screening")
self.screening = RotationDataCollectionPanel(parent=self, diffraction=diffraction)
v_layout.addWidget(self.screening)
self.standard = StandardDataCollectionPanel(parent=self.tab_widget)
self.tab_widget.addTab(self.standard, "Standard")
self.helical = HelicalDataCollectionPanel(s=s, parent=self.tab_widget)
self.tab_widget.addTab(self.helical, "Helical")
v_layout.addWidget(self.tab_widget)
v_layout.addStretch()
self.grid_layout.addWidget(widget, 1, 0, 1, 2)
def run_data_collection(self):
current_tab = self.tab_widget.currentWidget()
self.abort_button = QPushButton("Abort measurement", parent=self)
self.abort_button.setStyleSheet("color: rgb(164, 0, 0);")
v_layout.addWidget(self.abort_button)
if current_tab == self.screening:
data = self.screening.screening_type.itemData(
self.screening.screening_type.currentIndex()
)
if data is None:
print("No screening type selected.")
return
r = RotationScanRequest(
start_omega_deg=self.screening.start_angle.value,
exp_time_s=self.screening.image_time_enter.value,
incr_omega_deg=data["omega_step_deg"],
wedge_omega_deg=0.1,
steps=data["steps"],
screening=True
)
self.standard_data_collection.emit(r)
elif current_tab == self.standard:
total_angle = self.standard.total_angle.value
image_angle = self.standard.image_angle.value
if total_angle <= 0 or total_angle < image_angle:
print("Total angle is not valid.")
return
image_number = round(total_angle / image_angle)
r = RotationScanRequest(
start_omega_deg=self.standard.start_angle.value,
incr_omega_deg=self.standard.image_angle.value,
steps=image_number,
exp_time_s=self.standard.image_time_enter.value,
)
self.standard_data_collection.emit(r)
elif current_tab == self.helical:
r = self.helical.get_request()
if r is not None:
self.standard_data_collection.emit(r)
else:
print("No matching tab found.")
raster_mgr.update_filename(self.file_path_panel.filename)
self.screening.update_filename(self.file_path_panel.filename)
self.file_path_panel.path_updated.connect(raster_mgr.update_filename)
self.file_path_panel.path_updated.connect(self.screening.update_filename)
@Slot(DAQStatusModel)
def update_daq_status(self, s: DAQStatusModel):
self.raster.update_daq_status(s)
self.helical.update_daq_status(s)
@@ -1,133 +0,0 @@
from PySide6.QtCore import Signal, Slot
from PySide6.QtWidgets import (
QWidget,
QGridLayout,
QLabel,
QSizePolicy,
QSpacerItem,
QPushButton,
)
from aaredaqlib.coordinate import SmargonCoordinate
from aaredaqlib.rotation_scan import RotationScanRequest
from aaredaqlib.models import DAQStatusModel
from aaredaqlib.sample_geometry import SampleGeometryModel
from aaregui.widgets.number_line_edit import NumberLineEdit
class HelicalDataCollectionPanel(QWidget):
helical_scan = Signal(RotationScanRequest)
show_helical_start = Signal(SmargonCoordinate)
show_helical_end = Signal(SmargonCoordinate)
def __init__(self, s: SampleGeometryModel, parent=None):
super().__init__(parent)
grid_layout = QGridLayout(self)
self.__geom = s
self.__steps = 100
self.__image_time = 0.005
self.__image_angle = 0.1
self.__total_angle = 360.0
self.__start = SmargonCoordinate()
self.__end = SmargonCoordinate()
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)
grid_layout.addWidget(QLabel("Å", parent=self), 0, 2)
grid_layout.addWidget(QLabel("Detector distance", parent=self), 1, 0)
self.dtz_enter = NumberLineEdit(60, 1000, decimals=2, default=120, parent=self)
grid_layout.addWidget(self.dtz_enter, 1, 1)
grid_layout.addWidget(QLabel("mm", parent=self), 1, 2)
grid_layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0)
self.transmission_enter = NumberLineEdit(
0, 1.0, decimals=4, default=1.0, parent=self
)
grid_layout.addWidget(self.transmission_enter, 2, 1)
grid_layout.addWidget(QLabel("Start angle", parent=self), 3, 0)
self.start_angle = NumberLineEdit(-720, 719.0, 0, decimals=3, parent=self)
grid_layout.addWidget(self.start_angle, 3, 1)
grid_layout.addWidget(QLabel("°", parent=self), 3, 2)
grid_layout.addWidget(QLabel("Total angle", parent=self), 4, 0)
self.total_angle = NumberLineEdit(
0, 999.0, self.__total_angle, decimals=3, parent=self
)
grid_layout.addWidget(self.total_angle, 4, 1)
grid_layout.addWidget(QLabel("°", parent=self), 4, 2)
grid_layout.addWidget(QLabel("Image angle", parent=self), 5, 0)
self.image_angle = NumberLineEdit(
0, 10.0, self.__image_angle, decimals=3, parent=self
)
grid_layout.addWidget(self.image_angle, 5, 1)
grid_layout.addWidget(QLabel("°", parent=self), 5, 2)
grid_layout.addWidget(QLabel("Image time", parent=self), 6, 0)
self.image_time_enter = NumberLineEdit(
0.0005, 10.0, self.__image_time, decimals=4, parent=self
)
grid_layout.addWidget(self.image_time_enter, 6, 1)
grid_layout.addWidget(QLabel("s", parent=self), 6, 2)
start_button = QPushButton("Save start point", parent=self)
start_button.clicked.connect(self.set_start_point_curr)
grid_layout.addWidget(start_button, 7, 0, 1, 3)
end_button = QPushButton("Save end point", parent=self)
end_button.clicked.connect(self.set_end_point_curr)
grid_layout.addWidget(end_button, 8, 0, 1, 3)
horizontal_spacer = QSpacerItem(
40, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
)
grid_layout.addItem(horizontal_spacer, 9, 0, 1, 3)
@Slot(DAQStatusModel)
def update_daq_status(self, s: DAQStatusModel):
self.__geom = s.geom
@Slot()
def set_end_point_curr(self):
self.set_end_point(self.__geom.smargon)
@Slot()
def set_start_point_curr(self):
self.set_start_point(self.__geom.smargon)
@Slot(SmargonCoordinate)
def set_start_point(self, s: SmargonCoordinate):
self.__start = s
if s.sh_mm is not None:
self.start_angle.update_value(self.__geom.omega_deg)
self.show_helical_start.emit(self.__start)
@Slot(SmargonCoordinate)
def set_end_point(self, s: SmargonCoordinate):
self.__end = s
self.show_helical_end.emit(self.__end)
def get_request(self) -> RotationScanRequest | None:
if self.__start.sh_mm is None or self.__end.sh_mm is None:
return
image_number = round(self.total_angle.value / self.image_angle.value)
h = RotationScanRequest(
start=self.__start,
end=self.__end,
start_omega_deg=self.start_angle.value,
incr_omega_deg=self.image_angle.value,
exp_time_s=self.image_time_enter.value,
steps=image_number,
)
return h
@@ -77,19 +77,10 @@ class RasterDataCollectionPanel(ScanSettingsPanel):
)
self._layout.addItem(horizontal_spacer, 7, 0, 1, 4)
button_layout = QHBoxLayout()
self.start_button = QPushButton("Start")
self.start_button = QPushButton("Evaluate grid")
self.start_button.setStyleSheet("color: rgb(78, 154, 6);")
button_layout.addWidget(self.start_button)
self.start_button.clicked.connect(self.evaluate_grid)
self.abort_button = QPushButton("Abort")
self.abort_button.setStyleSheet("color: rgb(164, 0, 0);")
button_layout.addWidget(self.abort_button)
# Add the button layout to the main layout
self._layout.addLayout(button_layout, 8, 0, 1, 5)
self._layout.addWidget(self.start_button, 8, 0, 1, 5)
self.update_grid_scan_size()
@@ -0,0 +1,120 @@
from PySide6.QtCore import Slot, Signal
from PySide6.QtWidgets import QLabel, QComboBox, QPushButton
from aaredaqlib.diffraction_geometry import DiffractionGeometry
from aaredaqlib.rotation_scan import RotationScanRequest
from aaregui.panels.scan_settings_panel import ScanSettingsPanel
from aaregui.widgets.number_line_edit import NumberLineEdit
class RotationDataCollectionPanel(ScanSettingsPanel):
rotation_scan = Signal(RotationScanRequest)
def __init__(self, diffraction: DiffractionGeometry,
default_dtz: float = 200.0,
default_transmission: float = 1.0,
parent=None):
super().__init__(parent=parent,
diffraction=diffraction,
default_dtz=default_dtz,
default_transmission=default_transmission)
self._filename = ""
self._layout.addWidget(QLabel("Start angle", parent=self), 3, 0)
self.start_angle = NumberLineEdit(-720, 720.0, 0.0, decimals=3, parent=self)
self._layout.addWidget(self.start_angle, 3, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 3, 4)
self._layout.addWidget(QLabel("<br/><center><B><u>Screening</u></B></center>", parent=self), 4, 0, 1,5)
self._layout.addWidget(QLabel("Image time", parent=self), 5, 0)
self.screening_image_time_enter = NumberLineEdit(
0.0005, 10.0, 0.005, decimals=4, parent=self
)
self._layout.addWidget(self.screening_image_time_enter, 5, 1, 1, 3)
self._layout.addWidget(QLabel("s", parent=self), 5, 4)
self._layout.addWidget(QLabel("Image angle", parent=self), 6, 0)
self.screening_image_angle = NumberLineEdit(0, 10.0, 0.5, decimals=3, parent=self)
self._layout.addWidget(self.screening_image_angle, 6, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 6, 4)
self.screening_type = QComboBox(parent=self)
self.screening_type.addItem("1 image", {"steps": 1, "omega_step_deg": 0})
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("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._layout.addWidget(self.screening_type, 7, 0, 1, 5)
self.screening_button = QPushButton("Run screening")
self.screening_button.setStyleSheet("color: rgb(78, 154, 6);")
self.screening_button.clicked.connect(self.run_screening)
self._layout.addWidget(self.screening_button, 8, 0, 1, 5)
self._layout.addWidget(QLabel("<br/><center><B><u>Rotation</u></B></center>", parent=self), 9, 0, 1,5)
self._layout.addWidget(QLabel("Total angle", parent=self), 10, 0)
self.total_angle = NumberLineEdit(0, 999.0, 180.0, decimals=3, parent=self)
self._layout.addWidget(self.total_angle, 10, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 10, 4)
self._layout.addWidget(QLabel("Image angle", parent=self), 11, 0)
self.image_angle = NumberLineEdit(0, 10.0, 0.1, 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(QLabel("Image time", parent=self), 12, 0)
self.image_time_enter = NumberLineEdit(
0.0005, 10.0, 0.005, 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.measurement_button = QPushButton("Run rotation")
self.measurement_button.setStyleSheet("color: rgb(78, 154, 6);")
self.measurement_button.clicked.connect(self.run_measurement)
self._layout.addWidget(self.measurement_button, 13, 0, 1, 5)
@Slot()
def run_screening(self):
screening_settings = self.screening_type.currentData()
r = RotationScanRequest(
file_prefix=self._filename,
start_omega_deg=self.start_angle.value,
wedge_omega_deg=self.screening_image_angle.value,
incr_omega_deg=screening_settings["omega_step_deg"],
steps=screening_settings["steps"],
dtz=self._dtz,
transmission=self._transmission,
screening=True,
exp_time_s=self.screening_image_time_enter.value)
self.rotation_scan.emit(r)
@Slot()
def run_measurement(self):
total_angle = self.total_angle.value
image_angle = self.image_angle.value
if total_angle <= 0 or total_angle < image_angle:
print("Total angle is not valid.")
return
image_number = round(total_angle / image_angle)
r = RotationScanRequest(
file_prefix=self._filename,
start_omega_deg=self.start_angle.value,
steps=image_number,
incr_omega_deg=self.image_angle.value,
dtz=self._dtz,
transmission=self._transmission,
screening=False,
exp_time_s=self.image_time_enter.value)
self.rotation_scan.emit(r)
@Slot(str)
def update_filename(self, filename: str):
self._filename = filename
@@ -1,5 +1,5 @@
from PySide6.QtCore import Slot, Signal
from PySide6.QtWidgets import QWidget, QGridLayout, QLabel
from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QFrame
from aaredaqlib.diffraction_geometry import DiffractionGeometry
from aaredaqlib.models import DAQStatusModel
@@ -1,55 +0,0 @@
from PySide6.QtWidgets import (
QWidget,
QGridLayout,
QLabel,
QComboBox,
QSizePolicy,
QSpacerItem,
)
from aaredaqlib.diffraction_geometry import DiffractionGeometry
from aaregui.panels.scan_settings_panel import ScanSettingsPanel
from aaregui.widgets.number_line_edit import NumberLineEdit
class ScreeningDataCollectionPanel(ScanSettingsPanel):
def __init__(self, diffraction: DiffractionGeometry,
default_dtz: float = 200.0,
default_transmission: float = 1.0,
parent=None):
super().__init__(parent=parent,
diffraction=diffraction,
default_dtz=default_dtz,
default_transmission=default_transmission)
self._layout.addWidget(QLabel("Start angle", parent=self), 3, 0)
self.start_angle = NumberLineEdit(-720, 720.0, 0.0, decimals=3, parent=self)
self._layout.addWidget(self.start_angle, 3, 1, 1, 3)
self._layout.addWidget(QLabel("°", parent=self), 3, 4)
self._layout.addWidget(QLabel("<B>Screening</B>", parent=self), 4, 0, 1,5)
self._layout.addWidget(QLabel("Image time", parent=self), 5, 0)
self.screening_image_time_enter = NumberLineEdit(
0.0005, 10.0, 0.005, decimals=4, parent=self
)
self._layout.addWidget(self.screening_image_time_enter, 5, 1, 1, 3)
self._layout.addWidget(QLabel("s", parent=self), 5, 4)
self.screening_type = QComboBox(parent=self)
self.screening_type.addItem("1 image", {"steps": 1, "omega_step_deg": 0})
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("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._layout.addWidget(self.screening_type, 6, 0, 1, 5)
self._layout.addWidget(QLabel("<B>Measurement</B>", parent=self), 8, 0, 1, 5)
horizontal_spacer = QSpacerItem(
40, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
)
self._layout.addItem(horizontal_spacer, 9, 0, 1, 5)
@@ -1,54 +0,0 @@
from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QSpacerItem, QSizePolicy
from aaregui.widgets.number_line_edit import NumberLineEdit
class StandardDataCollectionPanel(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
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)
grid_layout.addWidget(QLabel("Å", parent=self), 0, 2)
grid_layout.addWidget(QLabel("Detector distance", parent=self), 1, 0)
self.dtz_enter = NumberLineEdit(60, 1000, decimals=2, default=120, parent=self)
grid_layout.addWidget(self.dtz_enter, 1, 1)
grid_layout.addWidget(QLabel("mm", parent=self), 1, 2)
grid_layout.addWidget(QLabel("Beam transmission", parent=self), 2, 0)
self.transmission_enter = NumberLineEdit(
0, 1.0, decimals=4, default=1.0, parent=self
)
grid_layout.addWidget(self.transmission_enter, 2, 1)
grid_layout.addWidget(QLabel("Start angle", parent=self), 3, 0)
self.start_angle = NumberLineEdit(-720, 720.0, 0.0, decimals=3, parent=self)
grid_layout.addWidget(self.start_angle, 3, 1)
grid_layout.addWidget(QLabel("°", parent=self), 3, 2)
grid_layout.addWidget(QLabel("Total angle", parent=self), 4, 0)
self.total_angle = NumberLineEdit(0, 999.0, 180.0, decimals=3, parent=self)
grid_layout.addWidget(self.total_angle, 4, 1)
grid_layout.addWidget(QLabel("°", parent=self), 4, 2)
grid_layout.addWidget(QLabel("Image angle", parent=self), 5, 0)
self.image_angle = NumberLineEdit(0, 10.0, 0.1, decimals=3, parent=self)
grid_layout.addWidget(self.image_angle, 5, 1)
grid_layout.addWidget(QLabel("°", parent=self), 5, 2)
grid_layout.addWidget(QLabel("Image time", parent=self), 6, 0)
self.image_time_enter = NumberLineEdit(
0.0005, 10.0, 0.005, decimals=4, parent=self
)
grid_layout.addWidget(self.image_time_enter, 6, 1)
grid_layout.addWidget(QLabel("s", parent=self), 6, 2)
horizontal_spacer = QSpacerItem(
40, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
)
grid_layout.addItem(horizontal_spacer, 7, 0, 1, 3)
+1
View File
@@ -183,6 +183,7 @@ class DAQWorker(QObject):
@Slot(RotationScanRequest)
def standard_scan(self, r: RotationScanRequest):
self.run_number_incremented.emit()
self.generic_post("scan/rotation", r.model_dump_json())
@Slot(RasterGridRequest)