fix: online changes pilatus_2 e20636

This commit is contained in:
e20636 2023-09-09 10:14:02 +02:00
parent bb12181020
commit 76f88efa31

View File

@ -1,13 +1,14 @@
import enum import enum
import json import json
import os import os
import subprocess
import time import time
from typing import List from typing import List
import requests import requests
import numpy as np import numpy as np
from ophyd import EpicsSignal, EpicsSignalRO, EpicsSignalWithRBV from ophyd import EpicsSignal, EpicsSignalRO, EpicsSignalWithRBV
from ophyd import DetectorBase, Device from ophyd import DetectorBase, Device, Staged
from ophyd import ADComponent as ADCpt from ophyd import ADComponent as ADCpt
from ophyd_devices.utils import bec_utils as bec_utils from ophyd_devices.utils import bec_utils as bec_utils
@ -90,7 +91,7 @@ class SlsDetectorCam(Device): # CamBase, FileBase):
read_file_timeout = ADCpt(EpicsSignal, "ImageFileTmot") read_file_timeout = ADCpt(EpicsSignal, "ImageFileTmot")
detector_state = ADCpt(EpicsSignalRO, "StatusMessage_RBV") detector_state = ADCpt(EpicsSignalRO, "StatusMessage_RBV")
status_message_camserver = ADCpt(EpicsSignalRO, "StringFromServer_RBV") status_message_camserver = ADCpt(EpicsSignalRO, "StringFromServer_RBV", string=True)
acquire_time = ADCpt(EpicsSignal, "AcquireTime") acquire_time = ADCpt(EpicsSignal, "AcquireTime")
acquire_period = ADCpt(EpicsSignal, "AcquirePeriod") acquire_period = ADCpt(EpicsSignal, "AcquirePeriod")
threshold_energy = ADCpt(EpicsSignalWithRBV, "ThresholdEnergy") threshold_energy = ADCpt(EpicsSignalWithRBV, "ThresholdEnergy")
@ -163,6 +164,9 @@ class PilatusCsaxs(DetectorBase):
self.filewriter = FileWriterMixin(self.service_cfg) self.filewriter = FileWriterMixin(self.service_cfg)
self.readout = 1e-3 # 3 ms self.readout = 1e-3 # 3 ms
# TODO maybe needed
# self._close_file_writer()
def _get_current_scan_msg(self) -> BECMessage.ScanStatusMessage: def _get_current_scan_msg(self) -> BECMessage.ScanStatusMessage:
msg = self.device_manager.producer.get(MessageEndpoints.scan_status()) msg = self.device_manager.producer.get(MessageEndpoints.scan_status())
return BECMessage.ScanStatusMessage.loads(msg) return BECMessage.ScanStatusMessage.loads(msg)
@ -206,6 +210,10 @@ class PilatusCsaxs(DetectorBase):
a zmq service is running on xbl-daq-34 that is waiting a zmq service is running on xbl-daq-34 that is waiting
for a zmq message to start the writer for the pilatus_2 x12sa-pd-2 for a zmq message to start the writer for the pilatus_2 x12sa-pd-2
""" """
self._close_file_writer()
time.sleep(2)
self._stop_file_writer()
time.sleep(2)
self.filepath_h5 = self.filewriter.compile_full_filename( self.filepath_h5 = self.filewriter.compile_full_filename(
self.scaninfo.scan_number, "pilatus_2.h5", 1000, 5, True self.scaninfo.scan_number, "pilatus_2.h5", 1000, 5, True
) )
@ -223,7 +231,7 @@ class PilatusCsaxs(DetectorBase):
self.filewriter.get_scan_directory(self.scaninfo.scan_number, 1000, 5), self.filewriter.get_scan_directory(self.scaninfo.scan_number, 1000, 5),
) )
# Make directory if needed # Make directory if needed
os.makedirs(os.path.dirname(self.destination_path), exist_ok=True) os.makedirs(self.destination_path, exist_ok=True)
data_msg = { data_msg = {
"source": [ "source": [
@ -267,6 +275,7 @@ class PilatusCsaxs(DetectorBase):
data=json.dumps(data_msg), data=json.dumps(data_msg),
headers=headers, headers=headers,
) )
# subprocess.run("curl -i -s -X PUT http://xbl-daq-34:8091/pilatus_2/run -d '[\"zmqWriter\",\"e20636\",{\"addr\":\"tcp://x12sa-pd-2:8888\",\"dst\":[\"file\"],\"numFrm\":10,\"timeout\":2000,\"ifType\":\"PULL\",\"user\":\"e20636\"}]'", shell=True)
logger.info(f"{res.status_code} - {res.text} - {res.content}") logger.info(f"{res.status_code} - {res.text} - {res.content}")
@ -368,36 +377,47 @@ class PilatusCsaxs(DetectorBase):
return super().unstage() return super().unstage()
def _pilatus_finished(self) -> None: def _pilatus_finished(self) -> None:
timer = 0 # time.sleep(2)
while True: while True:
rtr = self.cam.status_message_camserver if self.device_manager.devices.mcs.obj._staged != Staged.yes:
if self.cam.acquire.get() == 0 and rtr == "Camserver returned OK":
break
if self._stopped == True:
break break
time.sleep(0.1) time.sleep(0.1)
timer += 0.1 # time.sleep(2)
if timer > 5: # timer = 0
self._close_file_writer() # while True:
self._stop_file_writer() # # rtr = self.cam.status_message_camserver.get()
raise PilatusTimeoutError( # #if self.cam.acquire.get() == 0 and rtr == "Camserver returned OK":
f"Pilatus timeout with detector state {self.cam.acquire.get()} and camserver return status: {rtr} " # # if rtr == "Camserver returned OK":
) # # break
self._close_file_writer() # if self._stopped == True:
# break
# time.sleep(0.1)
# timer += 0.1
# if timer > 5:
# self._close_file_writer()
# self._stop_file_writer()
# self._stopped == True
# # raise PilatusTimeoutError(
# # f"Pilatus timeout with detector state {self.cam.acquire.get()} and camserver return status: {rtr} "
# # )
self._stop_file_writer() self._stop_file_writer()
time.sleep(2)
self._close_file_writer()
def acquire(self) -> None: def acquire(self) -> None:
"""Start acquisition in software trigger mode, """Start acquisition in software trigger mode,
or arm the detector in hardware of the detector or arm the detector in hardware of the detector
""" """
self.cam.acquire.put(1) self.cam.acquire.put(1)
time.sleep(1)
def stop(self, *, success=False) -> None: def stop(self, *, success=False) -> None:
"""Stop the scan, with camera and file writer""" """Stop the scan, with camera and file writer"""
self.cam.acquire.put(0) self.cam.acquire.put(0)
self._stop_file_writer() self._stop_file_writer()
# TODO maybe needed # TODO maybe needed
# self._close_file_writer() self._close_file_writer()
# self.unstage() # self.unstage()
super().stop(success=success) super().stop(success=success)
self._stopped = True self._stopped = True