Merge branch 'x07ma_devices' into 'master'

X07ma devices

See merge request bec/ophyd_devices!15
This commit is contained in:
wakonig_k 2023-03-02 17:26:51 +00:00
commit 139418f531
10 changed files with 305 additions and 5 deletions

View File

@ -21,3 +21,6 @@ from .devices.specMotors import (
)
from .devices.SpmBase import SpmBase
from .devices.XbpmBase import XbpmBase, XbpmCsaxsOp
# X07MA specific devices
from .devices.X07MADevices import *

View File

@ -0,0 +1,111 @@
slsinfo:
desc: 'SLS beam info'
deviceClass: SLSInfo
deviceConfig: {name: slsinfo}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
undulator:
desc: 'Undulator'
deviceClass: X07MAUndulator
deviceConfig: {name: undulator, prefix: 'X07MA-ID:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
aperture:
desc: 'Frontend aperture'
deviceClass: EpicsSignal
deviceConfig: {name: aperture, read_pv: 'X07MA-FE-DSAPER'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
mono:
desc: 'PGM Monochromator'
deviceClass: PGMMonochromator
deviceConfig: {name: mono, prefix: 'X07MA-'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
otf:
desc: 'PGM on-the-fly scan'
deviceClass: PGMOtFScan
deviceConfig: {name: temperature}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
valve:
desc: 'Endstation valve'
deviceClass: VacuumValve
deviceConfig: {name: valve, prefix: 'X07MA-OP-VG13:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
exit_slit:
desc: 'Exit slit'
deviceClass: X07MAExitSlit
deviceConfig: {name: exit_slit, prefix: 'X07MA-OP-SL1SV1:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
goldmesh1:
desc: 'Gold mesh 1'
deviceClass: EpicsMotor
deviceConfig: {name: goldmesh1, prefix: 'X07MA-OP-IO1:TR1'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
goldmesh2:
desc: 'Gold mesh 2'
deviceClass: EpicsMotor
deviceConfig: {name: goldmesh2, prefix: 'X07MA-OP-IO2:TR1'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
field:
desc: 'Magnetic field'
deviceClass: X07MAMagnet
deviceConfig: {name: field, prefix: 'X07MA-PC-MAG:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
signals:
desc: 'ADC signals'
deviceClass: X07MAAnalogSignals
deviceConfig: {name: signals, prefix: 'X07MA-ES1-AI:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
manipulator:
desc: 'Sample Manipulator'
deviceClass: X07MASampleManipulator
deviceConfig: {name: manipulator, prefix: 'X07MA-ES1-MAG:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
temperature:
desc: 'Temperature controller'
deviceClass: X07MATemperatureController
deviceConfig: {name: temperature, prefix: 'X07MA-PC-TC:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}
TControl:
desc: 'Automatic temperature control'
deviceClass: X07MAAutoTemperatureControl
deviceConfig: {name: 'TControl', prefix: 'X07MA-ES1-TEMP:'}
acquisitionConfig: {acquisitionGroup: monitor, readoutPriority: baseline, schedule: sync}
onFailure: raise
status: {enabled: true}

View File

@ -54,6 +54,7 @@ class SpmSim(SpmBase):
def _simFrame(self):
"""Generator to simulate a jumping gaussian"""
# Define normalized 2D gaussian
def gaus2d(x=0, y=0, mx=0, my=0, sx=1, sy=1):
return np.exp(

View File

@ -0,0 +1,189 @@
"""
ophyd device classes for X07MA beamline
"""
from typing import Any
from ophyd import Component as Cpt
from ophyd import FormattedComponent as FCpt
from ophyd import Device, EpicsSignal, EpicsSignalRO, Kind, PVPositioner, EpicsMotor
from ophyd.pv_positioner import PVPositionerComparator
__all__ = [
"X07MAUndulator",
"PGMMonochromator",
"PGMOtFScan",
"VacuumValve",
"X07MAExitSlit",
"X07MAMagnet",
"X07MAAnalogSignals",
"X07MASampleManipulator",
"X07MATemperatureController",
"X07MAAutoTemperatureControl",
]
class X07MAUndulator(PVPositioner):
"""
X07MA undulator
"""
setpoint = Cpt(EpicsSignal, "ENERGY", auto_monitor=True)
readback = Cpt(EpicsSignalRO, "ENERGY-READ", kind=Kind.hinted, auto_monitor=True)
done = Cpt(EpicsSignalRO, "DONE", kind=Kind.omitted, auto_monitor=True)
stop_signal = Cpt(EpicsSignal, "STOP", kind=Kind.omitted)
energy_offset = Cpt(EpicsSignal, "ENERGY-OFFS", kind=Kind.config)
pol_mode = Cpt(EpicsSignal, "MODE")
pol_angle = Cpt(EpicsSignal, "ALPHA")
harmonic = Cpt(EpicsSignal, "HARMONIC")
class PGMMonochromator(PVPositioner):
"""
PGM monochromator
"""
setpoint = Cpt(EpicsSignal, "PHS-E:GO.A", auto_monitor=True)
readback = Cpt(EpicsSignalRO, "PGM:CERBK", kind=Kind.hinted, auto_monitor=True)
done = Cpt(EpicsSignalRO, "PHS:alldone", kind=Kind.omitted, auto_monitor=True)
stop_signal = Cpt(EpicsSignal, "PGM:stop", kind=Kind.omitted)
cff = Cpt(EpicsSignal, "PGM:rbkcff", write_pv="PGM:cff.A", kind=Kind.config)
with_undulator = Cpt(EpicsSignal, "PHS-E:OPT", kind=Kind.config)
class PGMOtFScan(Device):
"""
PGM on-the-fly scan
"""
e1 = Cpt(EpicsSignal, "E1")
e2 = Cpt(EpicsSignal, "E2")
time = Cpt(EpicsSignal, "TIME")
folder = Cpt(EpicsSignal, "FOLDER")
file = Cpt(EpicsSignal, "FILE")
start = Cpt(EpicsSignal, "START")
class VacuumValve(PVPositionerComparator):
"""
EPS vacuum valve.
The setpoint is of 2 choices
0 - Close
1 - Try open
The readback is of 8 choices
0 - TO CONNECT
1 - MAN OPEN
2 - CLOSED
3 - ERROR
4 - MOVING
5 - OPEN
6 - ERROR
7 - ERROR
"""
setpoint = Cpt(EpicsSignal, "WT_SET")
readback = Cpt(EpicsSignalRO, "POSITION")
def __init__(self, prefix: str, *, name: str, **kwargs):
kwargs.update({"limits": (0, 1)})
super().__init__(prefix, name=name, **kwargs)
def done_comparator(self, readback: Any, setpoint: Any) -> bool:
return readback != 4
class X07MAExitSlit(PVPositioner):
"""
Exit slit
"""
setpoint = Cpt(EpicsSignal, "TR_AP")
readback = Cpt(EpicsSignalRO, "TR_ISAP", kind=Kind.hinted, auto_monitor=True)
done = Cpt(EpicsSignalRO, "TR.DMOV", kind=Kind.omitted, auto_monitor=True)
class X07MAMagnet(Device):
"""
Magnet fields.
"""
class MagnetAxis(PVPositioner):
"""
A single magnet field axis.
"""
done_value = 2
actuate_value = 1
setpoint = FCpt(EpicsSignal, "{prefix}{_axis_id}:DMD")
readback = FCpt(
EpicsSignalRO, "{prefix}{_axis_id}:RBV", kind=Kind.hinted, auto_monitor=True
)
actuate = Cpt(EpicsSignal, "STARTRAMP.PROC", kind=Kind.omitted)
done = FCpt(
EpicsSignalRO, "{_ps_prefix}STS:RAMP:MADE", kind=Kind.omitted, auto_monitor=True
)
ramprate = FCpt(
EpicsSignal, "{_ps_prefix}STS:RAMPRATE:TPM", write_pv="{_ps_prefix}SET:DMD:RAMPRATE:TPM"
)
def __init__(self, prefix="", axis_id="", ps_prefix="", *, name=None, **kwargs):
self._axis_id = axis_id
self._ps_prefix = ps_prefix
super().__init__(prefix, name=name, **kwargs)
x = Cpt(MagnetAxis, "", axis_id="X", ps_prefix="X07MA-PC-PS2:", name="x")
z = Cpt(MagnetAxis, "", axis_id="Z", ps_prefix="X07MA-PC-PS1:", name="z")
class X07MAAnalogSignals(Device):
"""
ADC inputs
"""
s1 = Cpt(EpicsSignalRO, "SIGNAL0")
s2 = Cpt(EpicsSignalRO, "SIGNAL1")
s3 = Cpt(EpicsSignalRO, "SIGNAL2")
s4 = Cpt(EpicsSignalRO, "SIGNAL3")
s5 = Cpt(EpicsSignalRO, "SIGNAL4")
s6 = Cpt(EpicsSignalRO, "SIGNAL5")
s7 = Cpt(EpicsSignalRO, "SIGNAL6")
# Aliases
tey = s1
i0 = s2
trans = s3
field_z = s4
field_x = s5
class X07MASampleManipulator(Device):
"""
Sample manipulator
"""
hor = Cpt(EpicsMotor, "TRZS")
vert = Cpt(EpicsMotor, "TRY1")
rot = Cpt(EpicsMotor, "ROY1")
class X07MATemperatureController(Device):
"""
Temperature controller
"""
needle_valve = Cpt(EpicsSignal, "STS:LOOP2:MANUAL", write_pv="DMD:LOOP2:MANUAL")
setpoint = Cpt(EpicsSignal, "STS:LOOP1:SETPOINT", write_pv="DMD:LOOP1:SETPOINT")
readback = Cpt(EpicsSignalRO, "STS:T1", kind=Kind.hinted, auto_monitor=True)
class X07MAAutoTemperatureControl(Device):
"""
Automatic temperature control.
"""
control = Cpt(EpicsSignal, "CONTROL")
status = Cpt(EpicsSignalRO, "STATUS", kind=Kind.hinted, string=True, auto_monitor=True)

View File

@ -84,6 +84,7 @@ class XbpmSim(XbpmBase):
def _simFrame(self):
"""Generator to simulate a jumping gaussian"""
# define normalized 2D gaussian
def gaus2d(x=0, y=0, mx=0, my=0, sx=1, sy=1):
return np.exp(

View File

@ -559,7 +559,6 @@ class GalilMotor(Device, PositionerBase):
if __name__ == "__main__":
mock = False
if not mock:
leyey = GalilMotor("H", name="leyey", host="mpc2680.psi.ch", port=8081, sign=-1)

View File

@ -174,7 +174,6 @@ class NPointController(SingletonController):
@channel_checked
def _get_current_pos(self, channel: int) -> float:
# for first channel: 0x11 83 13 34
addr = self._channel_base.copy()
addr.extend([f"{19 + 16 * channel:x}", "34"])

View File

@ -137,7 +137,6 @@ class NPointController(SingletonController):
@channel_checked
def _get_current_pos(self, channel: int) -> float:
# for first channel: 0x11 83 13 34
addr = self._channel_base.copy()
addr.extend([f"{19 + 16 * channel:x}", "34"])

View File

@ -27,7 +27,6 @@ def is_serializable(f) -> bool:
def get_user_interface(obj, obj_interface):
# user_funcs = get_user_functions(obj)
for f in [f for f in dir(obj) if f in obj.USER_ACCESS]:
if f == "controller" or f == "on":

View File

@ -51,7 +51,6 @@ class Controller(OphydObject):
labels=None,
kind=None,
):
if not hasattr(self, "_initialized"):
super().__init__(
name=name, attr_name=attr_name, parent=parent, labels=labels, kind=kind