DAQ: Modifications of June 18th

This commit is contained in:
leonarski_f committed 2025-06-18 13:27:00 +02:00
1 parent d66f758ff3
commit 8c517d4bab
11 files changed
+142 -33

No files matched your search

+1
View File
@@ -153,6 +153,7 @@ class BeamlineStatus(BaseModel):
shutter_open: bool
flux_ph_s: float
sample_camera: SampleCameraSettings
transmission: Annotated[float, Field(ge=0.0, le=1.0)] | None
class SessionStatus(BaseModel):
session: SessionsStateEnum = SessionsStateEnum.Vacant
+2 -2
View File
@@ -249,7 +249,7 @@ class AareWrapper:
ringCurrent_mA=d.bl.ring_current_mA,
ringMode="Beamline Development",
monochromator="Si111",
transmission=r.transmission,
transmission=d.bl.transmission,
focusingOptic="Kirkpatrick-Baez",
beamlineFluxAtSample_ph_s=d.bl.flux_ph_s,
beamSizeWidth=d.geom.beam_size_mm.x * 100,
@@ -312,7 +312,7 @@ class AareWrapper:
ringCurrent_mA=d.bl.ring_current_mA,
ringMode="Beamline Development",
monochromator="Si111",
transmission=r.transmission,
transmission=d.bl.transmission,
focusingOptic="Kirkpatrick-Baez",
beamlineFluxAtSample_ph_s=d.bl.flux_ph_s,
beamSizeWidth=d.geom.beam_size_mm.x * 100,
+18 -7
View File
@@ -253,12 +253,17 @@ class AareDAQ:
max_time = r.exp_time_s * r.n_y * r.n_x + 60
self.__cfg.dtz = r.dtz
self.__set_state(BeamlineStateEnum.DataCollection)
self.__jfjoch.measure_raster(r, self.diffraction_geometry, self.sample)
self.__devs.aerotech.move(r.omega_deg, wait=True, speed=360.0)
save_smargon_position = self.__devs.smargon.readback
self.__devs.smargon.target = r.smargon
self.__devs.transmission.set(r.transmission, wait=False)
self.__devs.aerotech.move(r.omega_deg, wait=True, speed=360.0)
self.__devs.transmission.wait()
self.__devs.smargon.wait()
self.__aare.create_gridscan_run(self.sample, r, self.status)
status = self.status
self.__jfjoch.measure_raster(r, status)
self.__aare.create_gridscan_run(self.sample, r, status)
self.__devs.aerotech.measure_raster_simple(
r.exp_time_s, r.grid_size_mm.x, r.grid_size_mm.y, r.n_x, r.n_y
@@ -287,13 +292,18 @@ class AareDAQ:
self.__cfg.dtz = request.dtz
self.__set_state(BeamlineStateEnum.DataCollection)
self.__devs.transmission.set(request.transmission, wait=False)
if request.start is not None:
self.__devs.smargon.target = request.start
self.__devs.transmission.wait()
if request.start is not None:
self.__devs.smargon.wait()
self.__jfjoch.measure_rotation(request, self.diffraction_geometry, self.sample)
self.__aare.create_rotation_run(self.sample, request, self.status)
status = self.status
self.__jfjoch.measure_rotation(request, status)
self.__aare.create_rotation_run(self.sample, request, status)
if request.screening:
self.__devs.aerotech.measure_screening(request.start_omega_deg,
request.wedge_omega_deg,
@@ -767,7 +777,8 @@ class AareDAQ:
shutter_open=self.__devs.shutter,
flux_ph_s=3.0e12,
sample_camera=self.__devs.samcam_settings,
name=self.__bl
name=self.__bl,
transmission=self.__devs.transmission.get()
)
@property
+4 -1
View File
@@ -6,6 +6,7 @@ from aaredaqlib.models import SampleCameraSettings
from mxlibs3 import aerotech, smargon
from mxlibs3.area_detector import epicsAD
from mxlibs3.enum_pv import EnumPv
from mxlibs3.filter_transmission import FilterTransmission
from mxlibs3.my_motor import MyMotor
from mxlibs3.non_standard import NonStandard
from mxlibs3.tell_client import TellClient
@@ -59,6 +60,8 @@ class BeamlineDevices:
move_done_when=(f"{BEAMLINE}-ES-DF1:GMX-DONE", 1),
)
self.transmission = FilterTransmission(beamline)
self.gmy = NonStandard(
name="GMY",
setpv=f"{BEAMLINE}-ES-DF1:GMY-VAL",
@@ -259,4 +262,4 @@ class BeamlineDevices:
@samcam_settings.setter
def samcam_settings(self, settings: SampleCameraSettings):
print(settings)
self.sample_cam.setup(settings.gain, settings.exposure)
self.sample_cam.setup(settings.gain, settings.exposure)
+54
View File
@@ -0,0 +1,54 @@
import time
from epics import PV, poll
from aaredaqlib.beamline import MXBeamline
class FilterTransmission:
def __init__(self, bl: MXBeamline, timeout=60.0, fail_on_timeout=True):
BEAMLINE = bl.value.upper()
self.device_name = "FilterTransmission"
self._fail_on_timeout = fail_on_timeout
self._timeout = timeout
self.__set = PV(f"{BEAMLINE}-ES-FI:TRANSM-SET")
self.__get = PV(f"{BEAMLINE}-ES-FI:TRANSM-GET")
self.__done = PV(f"{BEAMLINE}-ES-FI:DONE")
def __repr__(self):
return f"<FilterTransmission: {self.__set.get():.4f}>"
def __str__(self):
return f"{self.__get.get():.4f}"
def is_done(self):
return 1 == int(self.__done.value)
def is_busy(self):
return not self.is_done()
def set(self, val, wait=False):
val = float(val)
if not (0.0 <= val <= 1.0):
raise RuntimeError(
f"requested transmission ({val:.4f}) is out of bounds --- valid range : 0 <= trans <= 1.0"
)
self.__set.put(val)
poll(0.2)
if wait:
self.wait()
def get(self) -> float | None:
if self.is_busy():
return None
return round(self.__get.value, 5)
def wait(self):
timeisup = False
timeout = self._timeout + time.time()
while not timeisup and self.is_busy():
timeisup = time.time() > timeout
poll(0.1)
if timeisup and self._fail_on_timeout:
raise RuntimeError("timeout waiting for filters to achieve requested transmission.")
+21 -21
View File
@@ -4,7 +4,7 @@ import jfjoch_client
from aaredaqlib.beamline import MXBeamline
from aaredaqlib.diffraction_geometry import DiffractionGeometry
from aaredaqlib.models import SampleShortInfo
from aaredaqlib.models import SampleShortInfo, DAQStatusModel
from aaredaqlib.raster_grid import RasterGridRequest
from aaredaqlib.rotation_scan import RotationScanRequest
@@ -34,14 +34,13 @@ class JFJochWrapper:
def measure_rotation(self,
r: RotationScanRequest,
d: DiffractionGeometry,
s: SampleShortInfo | None) -> None:
if s is None:
s: DAQStatusModel) -> None:
if s.sample is None:
pgroup = "p16371"
sample = None
else:
pgroup = s.user
sample = s.sample_name
pgroup = s.sample.user
sample = s.sample.sample_name
goniometer_settings = jfjoch_client.RotationAxis(
step=r.incr_omega_deg,
@@ -58,30 +57,30 @@ class JFJochWrapper:
trigger = 1
dataset_settings = jfjoch_client.DatasetSettings(
beam_x_pxl=d.beam_center_pxl[0],
beam_y_pxl=d.beam_center_pxl[1],
beam_x_pxl=s.diffraction.beam_center_pxl[0],
beam_y_pxl=s.diffraction.beam_center_pxl[1],
ntrigger= trigger,
images_per_trigger=images,
detector_distance_mm=d.dtz_mm,
detector_distance_mm=s.diffraction.dtz_mm,
file_prefix=f"{pgroup}/raw/{r.file_prefix}",
incident_energy_keV=d.energy_keV,
incident_energy_keV=s.diffraction.energy_keV,
goniometer=goniometer_settings,
sample_name=sample,
image_time_us=round(r.exp_time_s * 1e6),
experiment_group=pgroup
experiment_group=pgroup,
transmission=s.bl.transmission
)
self.__api.start_post(dataset_settings=dataset_settings)
def measure_raster(self,
r: RasterGridRequest,
d: DiffractionGeometry,
s: SampleShortInfo | None):
if s is None:
s: DAQStatusModel):
if s.sample is None:
pgroup = "p16371"
sample = None
else:
pgroup = s.user
sample = s.sample_name
pgroup = s.sample.user
sample = s.sample.sample_name
grid_settings = jfjoch_client.GridScan(
n_fast= r.n_x,
@@ -92,17 +91,18 @@ class JFJochWrapper:
)
dataset_settings = jfjoch_client.DatasetSettings(
beam_x_pxl=d.beam_center_pxl[0],
beam_y_pxl=d.beam_center_pxl[1],
beam_x_pxl=s.diffraction.beam_center_pxl[0],
beam_y_pxl=s.diffraction.beam_center_pxl[1],
ntrigger= r.n_y,
images_per_trigger=r.n_x,
detector_distance_mm=d.dtz_mm,
detector_distance_mm=s.diffraction.dtz_mm,
file_prefix=f"{pgroup}/raw/{r.file_prefix}",
incident_energy_keV=d.energy_keV,
incident_energy_keV=s.diffraction.energy_keV,
grid_scan=grid_settings,
sample_name=sample,
image_time_us=round(r.exp_time_s * 1e6),
experiment_group=pgroup
experiment_group=pgroup,
transmission=s.bl.transmission
)
self.__api.start_post(dataset_settings=dataset_settings)
+1
View File
@@ -133,6 +133,7 @@ class MainWindow(QMainWindow):
self.daq.update.connect(self.beamline.abr_tweak.update_daq_status)
self.daq.update.connect(self.status_bar.update_daq_status)
self.daq.update.connect(self.beamline.samcam.update_daq_status)
self.daq.raster_scan_completed.connect(self.raster.grid_scan_completed)
self.beamline.samcam.changed.connect(self.daq.samcam_settings)
@@ -68,3 +68,4 @@ class DataCollectionSettings(QFrame):
@Slot(DAQStatusModel)
def update_daq_status(self, s: DAQStatusModel):
self.raster.update_daq_status(s)
self.file_path_panel.update_daq_status(s)
+25 -2
View File
@@ -3,6 +3,7 @@ from datetime import datetime
from PySide6.QtCore import Signal, Slot, Qt
from PySide6.QtWidgets import QWidget, QGridLayout, QLabel, QLineEdit, QSpinBox, QCheckBox
from aaredaqlib.models import DAQStatusModel
from aaregui.widgets.title_label import TitleLabel
@@ -12,6 +13,9 @@ class FilePathPanel(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
grid_layout = QGridLayout(self)
self.__sample_name = "sample"
self.__sample_id = -1
self.__dewar_pos = "None"
self.__filename = ""
self.__formatted_date = datetime.now().strftime('%y%m%d')
@@ -30,7 +34,7 @@ class FilePathPanel(QWidget):
grid_layout.addWidget(self.directory_edit, 2, 1)
grid_layout.addWidget(QLabel("File prefix", parent=self), 3, 0)
self.file_prefix_edit = QLineEdit(parent=self)
self.file_prefix_edit = QLineEdit("{sample_name}", parent=self)
self.file_prefix_edit.setStyleSheet("background-color: rgb(255, 255, 255);")
grid_layout.addWidget(self.file_prefix_edit, 3, 1)
@@ -78,6 +82,8 @@ class FilePathPanel(QWidget):
self.__filename += f"_{run_number:03d}"
self.__filename = self.__filename.replace('{date}', self.__formatted_date)
self.__filename = self.__filename.replace('{sample_name}', self.__sample_name)
self.__filename = self.__filename.replace('{sample_id}', f"{self.__sample_id}")
self.file_name_label.setText(self.__filename + "_master.h5")
self.file_name_label.setStyleSheet("color: rgb(0, 0, 0);")
@@ -106,4 +112,21 @@ class FilePathPanel(QWidget):
@property
def filename(self) -> str:
return self.__filename
return self.__filename
@Slot(DAQStatusModel)
def update_daq_status(self, status: DAQStatusModel):
if status.sample is None:
self.__sample_id = -1
self.__sample_name = "sample"
self.__dewar_pos = "None"
else:
self.__sample_name = status.sample.sample_name
self.__dewar_pos = status.sample.loc_str()
self.update_filename()
sample_id_old = self.__sample_id
self.__sample_id = status.sample.db_id
if self.__sample_id != sample_id_old:
self.run_number_edit.setValue(1)
@@ -75,6 +75,9 @@ class RasterGridManager(QObject):
def __init__(self, geom):
super().__init__()
self.__sample_id = -1
self.__geom = geom
self.__metric = RasterGridMetric.SPOTS
@@ -109,6 +112,11 @@ class RasterGridManager(QObject):
@Slot(DAQStatusModel)
def update_daq_status(self, s: DAQStatusModel):
if s.sample is not None and s.sample.db_id != self.__sample_id:
self.__sample_id = s.sample.db_id
self.clear_completed_grids()
self.clear_active_grid()
self.__geom = s.geom
def resize_active_grid(self, end_point: QPointF):
+7
View File
@@ -21,6 +21,7 @@ class StatusBar(QStatusBar):
super().__init__(parent)
self.__decoded_token = token
self.transmission = ValueLabel("Transmission", "", self)
self.ring_current = ValueLabel("Ring current", "mA", self)
self.wvl = ValueLabel("Wavelength", "&Aring;", self)
self.cryo_label = ValueLabel("Cryo", "K", self)
@@ -39,6 +40,7 @@ class StatusBar(QStatusBar):
self.shutter_label = ClickableLabel(parent=self)
self.shutter_label.clicked.connect(self.show_shutter_menu)
self.addPermanentWidget(self.transmission)
self.addPermanentWidget(self.ring_current)
self.addPermanentWidget(self.wvl)
self.addPermanentWidget(self.cryo_label)
@@ -51,6 +53,11 @@ class StatusBar(QStatusBar):
@Slot(DAQStatusModel)
def update_daq_status(self, status: DAQStatusModel):
if status.bl.transmission is None:
self.transmission.set_value(f"(moving)")
else:
self.transmission.set_value(f"{status.bl.transmission:.5f}")
if status.bl.ring_current_mA < 5.0:
self.ring_current.set_value(f"{status.bl.ring_current_mA:.2f}", "red")
elif status.bl.ring_current_mA < 390.0: