Merge branch 'x07ma_devices' into 'master'
X07ma devices See merge request bec/ophyd_devices!15
This commit is contained in:
commit
139418f531
@ -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 *
|
||||
|
111
ophyd_devices/epics/db/x07ma_database.yml
Normal file
111
ophyd_devices/epics/db/x07ma_database.yml
Normal 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}
|
@ -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(
|
||||
|
189
ophyd_devices/epics/devices/X07MADevices.py
Normal file
189
ophyd_devices/epics/devices/X07MADevices.py
Normal 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)
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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"])
|
||||
|
@ -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"])
|
||||
|
@ -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":
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user