From 6cfef536e248983de432012853ea7f71b1fa3d6e Mon Sep 17 00:00:00 2001 From: GotthardG <51994228+GotthardG@users.noreply.github.com> Date: Wed, 18 Jun 2025 09:02:24 +0200 Subject: [PATCH] Added functions to create rotation and gridscans runs into aaredb.py --- common/pyproject.toml | 2 +- daq/pyproject.toml | 2 +- daq/src/aaredaq/aaredb.py | 173 +++++++++++++++++++++++++++++++++++++- 3 files changed, 173 insertions(+), 4 deletions(-) diff --git a/common/pyproject.toml b/common/pyproject.toml index d5cc3433..f7b9e9ec 100644 --- a/common/pyproject.toml +++ b/common/pyproject.toml @@ -8,7 +8,7 @@ dependencies = [ "pydantic==2.11.4", "numpy==2.2.5", "jfjoch_client==1.0.0rc45", - "aareDB==0.1.1a6" + "aareDB==0.1.1a8" ] [lint] diff --git a/daq/pyproject.toml b/daq/pyproject.toml index 72764df5..7c7c95a8 100644 --- a/daq/pyproject.toml +++ b/daq/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "fastapi==0.115.12", "uvicorn==0.34.2", "ultralytics==8.3.133", - "aareDB==0.1.1a6", + "aareDB==0.1.1a8", "opencv-python-headless==4.11.0.86", "python_multipart==0.0.20", "websocket-client" diff --git a/daq/src/aaredaq/aaredb.py b/daq/src/aaredaq/aaredb.py index de7a57c4..bb56245a 100644 --- a/daq/src/aaredaq/aaredb.py +++ b/daq/src/aaredaq/aaredb.py @@ -1,3 +1,4 @@ +import datetime import io import os from typing import List, Optional @@ -9,15 +10,26 @@ import requests from aareDBclient import ( SetTellPosition, SampleEventCreate, - SetTellPositionRequest ) + SetTellPositionRequest, + RotationParameters, + GridScanParameters, + Detector as DetectorParameters, + BeamlineParameters, + ExperimentParametersCreate) + +from aaredaqlib.diffraction_geometry import DiffractionGeometry from aaredaqlib.models import ( SampleShortInfo, PuckLoadedInfo, DewarAddress, SampleShortInfoList, + DAQStatusModel, ) from aaredaqlib.beamline import MXBeamline +from aaredaqlib.raster_grid import RasterGridRequest, CompletedRasterGrid +from aaredaqlib.rotation_scan import RotationScanRequest +from aaredaqlib.sample_geometry import SampleGeometryModel class AareWrapper: @@ -34,6 +46,7 @@ class AareWrapper: self.__host = host self.__tell_api = aareDBclient.TellsRunnerApi(self.client) self.__sample_api = aareDBclient.SamplesRunnerApi(self.client) + self.__proc_api = aareDBclient.ProcessingsRunnerApi(self.client) self.__bl = bl def set_pucks_beamline(self, input_list: List[PuckLoadedInfo]): @@ -102,6 +115,27 @@ class AareWrapper: except Exception as e: print(e) + def sample_centered(self, s: Optional[SampleShortInfo]): + if s is not None: + try: + self.__sample_api.create_sample_event( + sample_id=s.db_id, + sample_event_create=SampleEventCreate(event_type="Centered"), + ) + except Exception as e: + print(e) + + def sample_collected(self, s: Optional[SampleShortInfo]): + if s is None: + return + try: + self.__sample_api.create_sample_event( + sample_id=s.db_id, + sample_event_create=SampleEventCreate(event_type="Collected"), + ) + except Exception as e: + print(e) + def upload_image(self, sample_id: int, filename: str, bgr_image: np.ndarray): _, buffer = cv2.imencode('.jpg', bgr_image) jpeg_bytes = io.BytesIO(buffer) @@ -112,4 +146,139 @@ class AareWrapper: response = requests.post(url, files={'uploaded_file': (filename + ".jpg", jpeg_bytes, "image/jpeg")}, verify=False, headers=headers) - print(response.status_code) \ No newline at end of file + print(response.status_code) + + def create_rotation_run(self, s: Optional[SampleShortInfo], r:RotationScanRequest, d:DAQStatusModel, sg:SampleGeometryModel): + if s is None: + return + + try: + rotation = RotationParameters( + omegaStart_deg=r.start_omega_deg, + omegaStep=r.incr_omega_deg, + phi=r.start.phi_deg, + chi=r.start.chi_deg, + numberOfImages=r.steps, + exposureTime_s=r.exp_time_s, + ) + detector_data = DetectorParameters( + manufacturer="DECTRIS", + model=d.diffraction.detector_description, + type="photon-counting", + serialNumber=d.detector_serial_number, + detectorDistance_mm=r.dtz, + beamCenterX_px=d.diffraction.beam_center_pxl[0], + beamCenterY_px=d.diffraction.beam_center_pxl[1], + pixelSizeX_um=d.diffraction.pixel_size_mm * 1000, + pixelSizeY_um=d.diffraction.pixel_size_mm * 1000, + ) + beamline_params = BeamlineParameters( + synchrotron="Swiss Light Source", + beamline=d.bl.name, + detector=detector_data, + energy_keV=d.diffraction.energy_keV, + wavelength_Ang=d.diffraction.wavelength_angstrom, + ringCurrent_mA=d.bl.ring_current_mA, + ringMode="Beamline Development", + monochromator="Si111", + transmission=r.transmission, + focusingOptic="Kirkpatrick-Baez", + beamlineFluxAtSample_ph_s=d.flux_ph_s, + beamSizeWidth=sg.beam_size_mm * 100, + beamSizeHeight=sg.beam_size_mm * 100, + cryojetTemperature_K=d.bl.cryojet_K, + rotation=rotation + ) + experiment_params_payload = ExperimentParametersCreate( + type="standard", + beamline_parameters=beamline_params, + sample_id=s.db_id + ) + response = self.__sample_api.create_experiment_parameters_for_sample( + sample_id=s.db_id, + experiment_parameters_create=experiment_params_payload + ) + print("Experiment parameters created:", response) + except Exception as e: + print(e) + + def create_gridscan_run(self, s: Optional[SampleShortInfo], r:RasterGridRequest, d:DAQStatusModel, sg:SampleGeometryModel): + if s is None: + return + + try: + gridscan = GridScanParameters( + #xStart=90.0, + xStep=0.1, + #yStart=0.0, + yStep= 0.1, + x_col=r.n_x, + y_row=r.n_y, + omegaStart_deg=r.omega_deg, + numberOfImages=r.get_image_number, + exposureTime_s=r.exp_time_s, + ) + detector_data = DetectorParameters( + manufacturer="DECTRIS", + model=d.diffraction.detector_description, + type="photon-counting", + serialNumber=d.detector_serial_number, + detectorDistance_mm=r.dtz, + beamCenterX_px=d.diffraction.beam_center_pxl[0], + beamCenterY_px=d.diffraction.beam_center_pxl[1], + pixelSizeX_um=d.diffraction.pixel_size_mm * 1000, + pixelSizeY_um=d.diffraction.pixel_size_mm * 1000, + ) + beamline_params = BeamlineParameters( + synchrotron="Swiss Light Source", + beamline=d.bl.name, + detector=detector_data, + energy_keV=d.diffraction.energy_keV, + wavelength_Ang=d.diffraction.wavelength_angstrom, + ringCurrent_mA=d.bl.ring_current_mA, + ringMode="Beamline Development", + monochromator="Si111", + transmission=r.transmission, + focusingOptic="Kirkpatrick-Baez", + beamlineFluxAtSample_ph_s=d.flux_ph_s, + beamSizeWidth=sg.beam_size_mm * 100, + beamSizeHeight=sg.beam_size_mm * 100, + cryojetTemperature_K=d.bl.cryojet_K, + gridScan=gridscan + ) + experiment_params_payload = ExperimentParametersCreate( + type="standard", + beamline_parameters=beamline_params, + sample_id=s.db_id + ) + response = self.__sample_api.create_experiment_parameters_for_sample( + sample_id=s.db_id, + experiment_parameters_create=experiment_params_payload + ) + print("Experiment parameters created:", response) + except Exception as e: + print(e) + + def confirm_image_written(self, s: Optional[SampleShortInfo], r:RotationScanRequest): + if s is None: + return + + try: + response = self.__sample_api.update_dataset_for_experiment_run( + filepath=r.file_prefix, #need to check if this is correct + status="written", + written_at=datetime.datetime.now().isoformat(), + ) + print("Experiment run updated:", response) + + except Exception as e: + print(e) + + #def send_gridscan_result(self, s: Optional[SampleShortInfo], c: CompletedRasterGrid): + # if s is None: + # return + # + # try: + # response = self.__proc_api.create_result( + # + # ) \ No newline at end of file