mirror of
https://github.com/bec-project/ophyd_devices.git
synced 2026-01-16 15:29:20 +01:00
Merge branch 'sls_info' into 'master'
Sls info See merge request bec/ophyd_devices!6
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from .eiger1p5m_csaxs.eiger1p5m import Eiger1p5MDetector
|
||||
from .galil.galil_ophyd import GalilMotor
|
||||
from .npoint.npoint import NPointAxis
|
||||
from .rt_lamni import RtLamniMotor
|
||||
from .sim.sim import SynAxisMonitor, SynAxisOPAAS, SynFlyer, SynSignalRO, SynSLSDetector
|
||||
from .sls_devices.sls_devices import SLSOperatorMessages
|
||||
from .sls_devices.sls_devices import SLSInfo, SLSOperatorMessages
|
||||
from .smaract.smaract_ophyd import SmaractMotor
|
||||
|
||||
167
ophyd_devices/eiger1p5m_csaxs/eiger1p5m.py
Normal file
167
ophyd_devices/eiger1p5m_csaxs/eiger1p5m.py
Normal file
@@ -0,0 +1,167 @@
|
||||
import os
|
||||
import time
|
||||
from typing import List
|
||||
|
||||
from bec_utils import BECMessage, MessageEndpoints, bec_logger
|
||||
from ophyd import Component as Cpt
|
||||
from ophyd import Device, DeviceStatus, EpicsSignal, Signal, EpicsSignalRO
|
||||
|
||||
logger = bec_logger.logger
|
||||
|
||||
|
||||
class _SLSDetectorConfigSignal(Signal):
|
||||
def put(self, value, *, timestamp=None, force=False):
|
||||
self._readback = value
|
||||
self.parent.sim_state[self.name] = value
|
||||
|
||||
def get(self):
|
||||
self._readback = self.parent.sim_state[self.name]
|
||||
return self.parent.sim_state[self.name]
|
||||
|
||||
|
||||
# if (_eigerinvac_is_on == 1) {
|
||||
# tic("setup eiger in vac")
|
||||
# epics_put("X12SA-ES1-DOUBLE-02",0)
|
||||
# unix(sprintf("mkdir -p /sls/X12SA/data/%s/Data10/eiger_4/S%05d-%05d/S%05d",_username,int((SCAN_N+1)/1000)*1000,int((SCAN_N+1)/1000)*1000+999,SCAN_N+1))
|
||||
|
||||
# epics_put("XOMNYI-DET-OUTDIR:0.DESC",sprintf("/sls/X12SA/data/%s/Data10/eiger_4/",_username))
|
||||
# epics_put("XOMNYI-DET-OUTDIR:1.DESC",sprintf("S%05d-%05d/S%05d",int((SCAN_N+1)/1000)*1000,int((SCAN_N+1)/1000)*1000+999,SCAN_N+1))
|
||||
# epics_put("XOMNYI-DET-CYCLES:0", _lamni_scan_numberofpts)
|
||||
# epics_put("XOMNYI-DET-EXPTIME:0", $2)
|
||||
# epics_put("XOMNYI-DET-INDEX:0", SCAN_N+1)
|
||||
|
||||
# epics_put("XOMNYI-DET-CONTROL:0.DESC", "begin")
|
||||
# if(_eigerinvac_burst==0)
|
||||
# {
|
||||
# epics_put("XOMNYI-DET-CYCLES:0", _lamni_scan_numberofpts)
|
||||
# epics_put("XOMNYI-DET-EXPTIME:0", $2)
|
||||
# metadata_set("eiger_burst", "int", 1, 1)
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# metadata_set("eiger_burst", "int", 1, (int($2/0.0085)))
|
||||
# epics_put("XOMNYI-DET-CYCLES:0", _lamni_scan_numberofpts*(int($2/0.0085)))
|
||||
# epics_put("XOMNYI-DET-EXPTIME:0", 0.005)
|
||||
# }
|
||||
# global _DC_acquisition_ID
|
||||
# _DC_acquisition_ID = SCAN_N+1
|
||||
|
||||
|
||||
class Eiger1p5MDetector(Device):
|
||||
USER_ACCESS = []
|
||||
file_path = Cpt(EpicsSignal, name="file_path", read_pv="XOMNYI-DET-OUTDIR:0.DESC")
|
||||
detector_out_scan_dir = Cpt(
|
||||
EpicsSignal, name="detector_out_scan_dir", read_pv="XOMNYI-DET-OUTDIR:1.DESC"
|
||||
)
|
||||
frames = Cpt(EpicsSignal, name="frames", read_pv="XOMNYI-DET-CYCLES:0")
|
||||
exp_time = Cpt(EpicsSignal, name="exp_time", read_pv="XOMNYI-DET-EXPTIME:0")
|
||||
index = Cpt(EpicsSignal, name="index", read_pv="XOMNYI-DET-INDEX:0")
|
||||
detector_control = Cpt(
|
||||
EpicsSignal, name="detector_control", read_pv="XOMNYI-DET-CONTROL:0.DESC"
|
||||
)
|
||||
framescaught = Cpt(EpicsSignalRO, name="framescaught", read_pv="XOMNYI-DET-CONTROL:0.VAL")
|
||||
|
||||
file_pattern = Cpt(_SLSDetectorConfigSignal, name="file_pattern", value="")
|
||||
burst = Cpt(_SLSDetectorConfigSignal, name="burst", value=1)
|
||||
save_file = Cpt(_SLSDetectorConfigSignal, name="save_file", value=False)
|
||||
|
||||
def __init__(self, *, name, kind=None, parent=None, device_manager=None, **kwargs):
|
||||
self.device_manager = device_manager
|
||||
super().__init__(name=name, parent=parent, kind=kind, **kwargs)
|
||||
self.sim_state = {
|
||||
f"{self.name}_file_path": "~/Data10/data/",
|
||||
f"{self.name}_file_pattern": f"{self.name}_{{:05d}}.h5",
|
||||
f"{self.name}_frames": 1,
|
||||
f"{self.name}_burst": 1,
|
||||
f"{self.name}_save_file": False,
|
||||
f"{self.name}_exp_time": 0,
|
||||
}
|
||||
self._stopped = False
|
||||
self.file_name = ""
|
||||
self.metadata = {}
|
||||
self.username = "e20588" # TODO get from config
|
||||
|
||||
def _get_current_scan_msg(self) -> BECMessage.ScanStatusMessage:
|
||||
msg = self.device_manager.producer.get(MessageEndpoints.scan_status())
|
||||
return BECMessage.ScanStatusMessage.loads(msg)
|
||||
|
||||
def _get_scan_dir(self, scan_bundle, scan_number, leading_zeros=None):
|
||||
if leading_zeros is None:
|
||||
leading_zeros = len(str(scan_bundle))
|
||||
floor_dir = scan_number // scan_bundle * scan_bundle
|
||||
return f"S{floor_dir:0{leading_zeros}d}-{floor_dir+scan_bundle-1:0{leading_zeros}d}/S{scan_number:0{leading_zeros}d}"
|
||||
|
||||
def stage(self) -> List[object]:
|
||||
scan_msg = self._get_current_scan_msg()
|
||||
self.metadata = {
|
||||
"scanID": scan_msg.content["scanID"],
|
||||
"RID": scan_msg.content["info"]["RID"],
|
||||
"queueID": scan_msg.content["info"]["queueID"],
|
||||
}
|
||||
scan_number = scan_msg.content["info"]["scan_number"]
|
||||
exp_time = scan_msg.content["info"]["exp_time"]
|
||||
|
||||
# set base path for detector output
|
||||
self.file_path.set(f"/sls/X12SA/data/{self.username}/Data10/eiger_4/")
|
||||
|
||||
# set scan directory (e.g. S00000-00999/S00020)
|
||||
scan_dir = self._get_scan_dir(scan_bundle=1000, scan_number=scan_number, leading_zeros=5)
|
||||
self.detector_out_scan_dir.set(scan_dir)
|
||||
|
||||
self.file_name = os.path.join(f"/sls/X12SA/data/{self.username}/Data10/eiger_4/", scan_dir)
|
||||
|
||||
# set the scan number
|
||||
self.index.set(scan_number)
|
||||
|
||||
# set the number of frames
|
||||
self.frames.set(scan_msg.content["info"]["num_points"])
|
||||
|
||||
# set the exposure time
|
||||
self.exp_time.set(exp_time)
|
||||
|
||||
# send the "begin" flag to start processing the above commands
|
||||
self.detector_control.set("begin")
|
||||
|
||||
# wait for detector to be "armed"
|
||||
logger.info("Waiting for detector setup")
|
||||
while True:
|
||||
det_ctrl = self.detector_control.get()
|
||||
if det_ctrl == "armed":
|
||||
break
|
||||
time.sleep(0.005)
|
||||
|
||||
self.detector_control.put("acquiring")
|
||||
|
||||
return super().stage()
|
||||
|
||||
def unstage(self) -> List[object]:
|
||||
time_waited = 0
|
||||
sleep_time = 0.2
|
||||
framesexpected = self.frames.get()
|
||||
while True:
|
||||
framescaught = self.framescaught.get()
|
||||
if self.framescaught.get() < framesexpected:
|
||||
logger.info(
|
||||
f"Waiting for frames: Transferred {framescaught} out of {framesexpected}"
|
||||
)
|
||||
time_waited += sleep_time
|
||||
time.sleep(sleep_time)
|
||||
continue
|
||||
break
|
||||
self.detector_control.put("stop")
|
||||
signals = {"config": self.read(), "data": self.file_name}
|
||||
msg = BECMessage.DeviceMessage(signals=signals, metadata=self.metadata)
|
||||
self.device_manager.producer.set_and_publish(
|
||||
MessageEndpoints.device_read(self.name), msg.dumps()
|
||||
)
|
||||
return super().unstage()
|
||||
|
||||
def stop(self, *, success=False):
|
||||
self.detector_control.put("stop")
|
||||
super().stop(success=success)
|
||||
self._stopped = True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
eiger = Eiger1p5MDetector(name="eiger1p5m", label="eiger1p5m")
|
||||
breakpoint()
|
||||
@@ -9,9 +9,9 @@ from ophyd import Component as Cpt
|
||||
from ophyd import Device, PositionerBase, Signal
|
||||
from ophyd.status import wait as status_wait
|
||||
from ophyd.utils import LimitError, ReadOnlyError
|
||||
|
||||
from ophyd_devices.utils.controller import Controller, threadlocked
|
||||
from ophyd_devices.utils.socket import SocketIO, SocketSignal, raise_if_disconnected
|
||||
from prettytable import PrettyTable
|
||||
|
||||
logger = bec_logger.logger
|
||||
|
||||
@@ -416,7 +416,7 @@ class RtLamniController(Controller):
|
||||
|
||||
def feedback_enable_with_reset(self):
|
||||
if not self.feedback_status_angle_lamni():
|
||||
self.rt_feedback_disable_and_even_reset_lamni_angle_interferometer()
|
||||
self.feedback_disable_and_even_reset_lamni_angle_interferometer()
|
||||
logger.info(f"LamNI resetting interferometer inclusive angular interferomter.")
|
||||
else:
|
||||
self.feedback_disable()
|
||||
|
||||
@@ -271,7 +271,6 @@ class SynSLSDetector(Device):
|
||||
self.metadata = {
|
||||
"scanID": scan_msg.content["scanID"],
|
||||
"RID": scan_msg.content["info"]["RID"],
|
||||
"RID": scan_msg.content["info"]["RID"],
|
||||
"queueID": scan_msg.content["info"]["queueID"],
|
||||
}
|
||||
scan_number = scan_msg.content["info"]["scan_number"]
|
||||
|
||||
9
ophyd_devices/sls_devices/cSAXS/xeye.py
Normal file
9
ophyd_devices/sls_devices/cSAXS/xeye.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from ophyd import Component as Cpt
|
||||
from ophyd import Device, EpicsSignal
|
||||
|
||||
|
||||
class Xeye(Device):
|
||||
save_frame = Cpt(EpicsSignal, "XOMNY-XEYE-SAVEFRAME:0")
|
||||
acquisition_done = Cpt(EpicsSignal, "XOMNY-XEYE-ACQDONE:0")
|
||||
acquisition = Cpt(EpicsSignal, "XOMNY-XEYE-ACQ:0")
|
||||
x_width = Cpt(EpicsSignal, "XOMNY-XEYE-XWIDTH_X:0")
|
||||
@@ -1,23 +1,32 @@
|
||||
from ophyd import Component as Cpt
|
||||
from ophyd import Component as Cpt, DynamicDeviceComponent as Dcpt
|
||||
from ophyd import Device, EpicsSignalRO
|
||||
|
||||
|
||||
class SLSOperatorMessages(Device):
|
||||
message1 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-MSG1", auto_monitor=True)
|
||||
message_date1 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-DATE1", auto_monitor=True)
|
||||
message2 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-MSG2", auto_monitor=True)
|
||||
message_date2 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-DATE2", auto_monitor=True)
|
||||
message3 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-MSG3", auto_monitor=True)
|
||||
message_date3 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-DATE3", auto_monitor=True)
|
||||
message4 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-MSG4", auto_monitor=True)
|
||||
message_date4 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-DATE4", auto_monitor=True)
|
||||
message5 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-MSG5", auto_monitor=True)
|
||||
message_date5 = Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-DATE5", auto_monitor=True)
|
||||
messages_info = {
|
||||
f"message{i}": (EpicsSignalRO, f"ACOAU-ACCU:OP-MSG{i}", {}) for i in range(1, 6)
|
||||
}
|
||||
messages = Dcpt(messages_info)
|
||||
date_info = {f"message{i}": (EpicsSignalRO, f"ACOAU-ACCU:OP-DATE{i}", {}) for i in range(1, 6)}
|
||||
date = Dcpt(date_info)
|
||||
|
||||
|
||||
# class SLSOperatorMessages(Device):
|
||||
# pass
|
||||
|
||||
# for i in range(5):
|
||||
# setattr(SLSOperatorMessages, f"message{i}", Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-MSG{i}", auto_monitor=True))
|
||||
# setattr(SLSOperatorMessages, f"message_date{i}", Cpt(EpicsSignalRO, f"ACOAU-ACCU:OP-DATE{i}", auto_monitor=True))
|
||||
class SLSInfo(Device):
|
||||
# eh_t02_avg_temperature = Cpt(EpicsSignalRO, "ILUUL-02AV:TEMP", auto_monitor=True)
|
||||
# eh_t02_temperature_t0204_axis_16 = Cpt(
|
||||
# EpicsSignalRO, "ILUUL-0200-EB104:TEMP", auto_monitor=True
|
||||
# )
|
||||
# eh_t02_temperature_t0205_axis_18 = Cpt(
|
||||
# EpicsSignalRO, "ILUUL-0200-EB105:TEMP", auto_monitor=True
|
||||
# )
|
||||
operation = Cpt(EpicsSignalRO, "ACOAU-ACCU:OP-MODE.VAL", auto_monitor=True)
|
||||
injection_mode = Cpt(EpicsSignalRO, "ALIRF-GUN:INJ-MODE", auto_monitor=True)
|
||||
current_threshold = Cpt(EpicsSignalRO, "ALIRF-GUN:CUR-LOWLIM", auto_monitor=True)
|
||||
current_deadband = Cpt(EpicsSignalRO, "ALIRF-GUN:CUR-DBAND", auto_monitor=True)
|
||||
filling_pattern = Cpt(EpicsSignalRO, "ACORF-FILL:PAT-SELECT", auto_monitor=True)
|
||||
filling_life_time = Cpt(EpicsSignalRO, "ARIDI-PCT:TAU-HOUR", auto_monitor=True)
|
||||
orbit_feedback_mode = Cpt(EpicsSignalRO, "ARIDI-BPM:OFB-MODE", auto_monitor=True)
|
||||
fast_orbit_feedback = Cpt(EpicsSignalRO, "ARIDI-BPM:FOFBSTATUS-G", auto_monitor=True)
|
||||
ring_current = Cpt(EpicsSignalRO, "ARIDI-PCT:CURRENT", auto_monitor=True)
|
||||
machine_status = Cpt(EpicsSignalRO, "ACOAU-ACCU:OP-MODE", auto_monitor=True)
|
||||
crane_usage = Cpt(EpicsSignalRO, "IBWKR-0101-QH10003:D01_H_D-WA", auto_monitor=True)
|
||||
|
||||
Reference in New Issue
Block a user