added name attribute to gps, modified runtable to use pvname attribute instead of old Id attribute

This commit is contained in:
2020-11-19 11:48:29 +01:00
parent ebf11f6e7a
commit ad10aa9a56
12 changed files with 380 additions and 187 deletions
+5 -3
View File
@@ -41,10 +41,11 @@ class Daq:
self.name = name
self._default_file_path = None
def acquire(self, file_name=None, Npulses=100, acq_pars = {}):
def acquire(self, file_name=None, Npulses=100, acq_pars={}):
print(file_name, Npulses)
acquisition = Acquisition(
acquire=None, acquisition_kwargs={"Npulses": Npulses},
acquire=None,
acquisition_kwargs={"Npulses": Npulses},
)
def acquire():
@@ -68,7 +69,7 @@ class Daq:
def acquire_pulses(self, Npulses, label=None, wait=True, **kwargs):
ix = self.start(label=label, **kwargs)
return self.stop(
stop_id=self.running[ix]["start_id"] + Npulses -1, acq_ix=ix, wait=wait
stop_id=self.running[ix]["start_id"] + Npulses - 1, acq_ix=ix, wait=wait
)
def start(self, label=None, **kwargs):
@@ -117,6 +118,7 @@ class Daq:
filename_format="run_{:06d}",
**kwargs,
):
print("This is tha additional input:", kwargs)
if not pgroup:
pgroup = self.pgroup
if not pgroup:
+33 -20
View File
@@ -360,13 +360,13 @@ components = [
"kwargs": {},
},
# {
# "name": "spatial_tt",
# "args": [],
# "kwargs": {"reduction_client_address": "http://sf-daqsync-02:12003/"},
# "z_und": 141,
# "desc": "spatial encoding timing diagnostics before sample.",
# "type": "eco.xdiagnostics.timetools:SpatialEncoder",
# "lazy": True,
# "name": "spatial_tt",
# "args": [],
# "kwargs": {"reduction_client_address": "http://sf-daqsync-02:12003/"},
# "z_und": 141,
# "desc": "spatial encoding timing diagnostics before sample.",
# "type": "eco.xdiagnostics.timetools:SpatialEncoder",
# "lazy": True,
# },
# {
# "name": "slit_kb",
@@ -384,20 +384,33 @@ components = [
"desc": "General purpose station",
"type": "eco.endstations.bernina_diffractometers:GPS",
"kwargs": {
"Id": "SARES22-GPS",
"pvname": "SARES22-GPS",
"configuration": config["gps_config"],
"fina_hex_angle_offset": "~/eco/reference_values/hex_pi_angle_offset.json",
},
"lazy": True,
},
{
"args": [],
"name": "xrd_old",
"z_und": 142,
"desc": "Xray diffractometer",
"type": "eco.endstations.bernina_diffractometers:XRD_old",
"kwargs": {"Id": "SARES21-XRD", "configuration": config["xrd_config"]},
},
# {
# "args": [],
# "name": "gps_old",
# "z_und": 142,
# "desc": "General purpose station",
# "type": "eco.endstations.bernina_diffractometers:GPS_old",
# "kwargs": {
# "Id": "SARES22-GPS",
# "configuration": config["gps_config"],
# "fina_hex_angle_offset": "~/eco/reference_values/hex_pi_angle_offset.json",
# },
# "lazy": True,
# },
# {
# "args": [],
# "name": "xrd_old",
# "z_und": 142,
# "desc": "Xray diffractometer",
# "type": "eco.endstations.bernina_diffractometers:XRD_old",
# "kwargs": {"Id": "SARES21-XRD", "configuration": config["xrd_config"]},
# },
{
"args": [],
"name": "xrd",
@@ -801,11 +814,11 @@ components = [
},
{
"args": [],
"name": "bsen",
"z_und": 142,
"desc": "bsen targets",
"name": "tt_usd",
"z_und": 141,
"desc": "timetool in upstream diagnostics",
"type": "eco.xdiagnostics.bsen_usd:Bsen",
"kwargs": {"Id": "SARES23"},
"kwargs": {},
},
{
"args": [],
+1
View File
@@ -269,6 +269,7 @@ class AdjustableFS:
if not self.file_path.parent.exists():
self.file_path.parent.mkdir()
self._write_value(default_value)
self.alias = Alias(name)
self.name = name
def get_current_value(self):
+2 -2
View File
@@ -462,11 +462,11 @@ class MotorRecord(Assembly):
""" Adjustable convention"""
cmd = ["caqtdm", "-macro"]
cmd.append('"P=%s:,M=%s"' % tuple(self.Id.split(":")))
cmd.append('"P=%s:,M=%s"' % tuple(self.pvname.split(":")))
# cmd.append('/sf/common/config/qt/motorx_more.ui')
cmd.append("motorx_more.ui")
# os.system(' '.join(cmd))
return subprocess.Popen(" ".join(cmd), shell=True)
return subprocess.Popen(" ".join(cmd), shell=True, stdout=subprocess.DEVNULL)
# return string with motor value as variable representation
def __str__(self):
+89 -1
View File
@@ -21,7 +21,95 @@ def addMotorRecordToSelf(self, name=None, Id=None):
print(f"Warning! Could not find motor {name} (Id:{Id})")
class GPS:
class GPS(Assembly):
def __init__(
self,
name=None,
pvname=None,
configuration=["base"],
alias_namespace=None,
fina_hex_angle_offset=None,
):
super().__init__()
self.pvname = pvname
self.name = name
self.configuration = configuration
if "base" in self.configuration:
### motors base platform ###
self._append(MotorRecord, pvname + ":MOT_TX", name="xbase", is_setting=True)
self._append(MotorRecord, pvname + ":MOT_TY", name="ybase", is_setting=True)
self._append(
MotorRecord, pvname + ":MOT_RX", name="rxbase", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_MY_RYTH", name="alpha", is_setting=True
)
### motors XRD detector arm ###
self._append(
MotorRecord, pvname + ":MOT_NY_RY2TH", name="gamma", is_setting=True
)
if "phi_table" in self.configuration:
### motors phi table ###
self._append(
MotorRecord, pvname + ":MOT_HEX_RX", name="phi", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_HEX_TX", name="tphi", is_setting=True
)
if "phi_hex" in self.configuration:
### motors PI hexapod ###
if fina_hex_angle_offset:
fina_hex_angle_offset = Path(fina_hex_angle_offset).expanduser()
self._append(
HexapodPI,
"SARES20-HEX_PI",
name="hex",
fina_angle_offset=fina_hex_angle_offset,
is_setting=False,
)
if "hlxz" in self.configuration:
### motors heavy load goniometer ###
self._append(
MotorRecord, pvname + ":MOT_TBL_TX", name="xhl", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_TBL_TZ", name="zhl", is_setting=True
)
if "hly" in self.configuration:
self._append(
MotorRecord, pvname + ":MOT_TBL_TY", name="yhl", is_setting=True
)
if "hlrxrz" in self.configuration:
self._append(
MotorRecord, pvname + ":MOT_TBL_RX", name="rxhl", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_TBL_RZ", name="rzhl", is_setting=True
)
# def get_adjustable_positions_str(self):
# ostr = "*****GPS motor positions******\n"
# for tkey, item in self.__dict__.items():
# if hasattr(item, "get_current_value"):
# pos = item.get_current_value()
# ostr += " " + tkey.ljust(17) + " : % 14g\n" % pos
# return ostr
# def __repr__(self):
# return self.get_adjustable_positions_str()
class GPS_old:
def __init__(
self,
name=None,
@@ -392,16 +392,16 @@ class Electro_optic_sampling:
"home_direction": "back",
},
"rx": {
"id": "-LIC11",
"pv_descr": "Motor6:2 EOS prism rx ",
"id": "-ESB5",
"pv_descr": "Motor4:1 EOS prism rx ",
"type": 1,
"sensor": 0,
"speed": 250,
"home_direction": "back",
},
"x": {
"id": "-LIC10",
"pv_descr": "Motor6:1 EOS prism x ",
"id": "-ESB4",
"pv_descr": "Motor4:2 EOS prism x ",
"type": 1,
"sensor": 0,
"speed": 250,
+175 -1
View File
@@ -9,6 +9,7 @@ from time import sleep
from ..aliases import append_object_to_object, Alias
from scipy.spatial.transform import Rotation
import datetime
from ..elements.assembly import Assembly
class Hexapod_PI:
@@ -28,7 +29,180 @@ class Hexapod_PI:
]
class HexapodPI:
class HexapodPI(Assembly):
def __init__(self, pvname, name=None, fina_angle_offset=None):
super().__init__(name=name)
self.pvname = pvname
self._append(
PvRecord,
self.pvname + ":SET-POSI-X",
pvreadbackname=self.pvname + ":POSI-X",
accuracy=0.001,
name="x_raw",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-POSI-Y",
pvreadbackname=self.pvname + ":POSI-Y",
accuracy=0.001,
name="y_raw",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-POSI-Z",
pvreadbackname=self.pvname + ":POSI-Z",
accuracy=0.001,
name="z_raw",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-POSI-U",
pvreadbackname=self.pvname + ":POSI-U",
accuracy=0.001,
name="rx_raw",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-POSI-V",
pvreadbackname=self.pvname + ":POSI-V",
accuracy=0.001,
name="ry_raw",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-POSI-W",
pvreadbackname=self.pvname + ":POSI-W",
accuracy=0.001,
name="rz_raw",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-PIVOT-R",
pvreadbackname=self.pvname + ":PIVOT-R",
accuracy=0.001,
name="pivot_x",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-PIVOT-S",
pvreadbackname=self.pvname + ":PIVOT-S",
accuracy=0.001,
name="pivot_y",
is_setting=True,
)
self._append(
PvRecord,
self.pvname + ":SET-PIVOT-T",
pvreadbackname=self.pvname + ":PIVOT-T",
accuracy=0.001,
name="pivot_z",
is_setting=True,
)
if fina_angle_offset:
self._append(
AdjustableFS, fina_angle_offset, name="ref_frame_angle", is_setting=True
)
self._append(
AdjustableVirtual,
[self.x_raw, self.y_raw, self.z_raw],
lambda xraw, yraw, zraw: self._calc_xyz(xraw, yraw, zraw)[0],
lambda x: self._calc_xyzraw(
x, self.y.get_current_value(), self.z.get_current_value()
),
reset_current_value_to=False,
append_aliases=False,
change_simultaneously=False,
name="x",
is_setting=True,
)
self._append(
AdjustableVirtual,
[self.x_raw, self.y_raw, self.z_raw],
lambda xraw, yraw, zraw: self._calc_xyz(xraw, yraw, zraw)[1],
lambda y: self._calc_xyzraw(
self.x.get_current_value(), y, self.z.get_current_value()
),
reset_current_value_to=False,
change_simultaneously=False,
append_aliases=False,
name="y",
is_setting=True,
)
self._append(
AdjustableVirtual,
[self.x_raw, self.y_raw, self.z_raw],
lambda xraw, yraw, zraw: self._calc_xyz(xraw, yraw, zraw)[2],
lambda z: self._calc_xyzraw(
self.x.get_current_value(), self.y.get_current_value(), z
),
reset_current_value_to=False,
append_aliases=False,
change_simultaneously=False,
name="z",
is_setting=True,
)
@property
def rotation(self):
angs = self.ref_frame_angle.get_current_value()
angs = [angs["rx"], angs["ry"], angs["rz"]]
return Rotation.from_euler("xyz", angs, degrees=True)
def _calc_xyz(self, xraw, yraw, zraw):
return self.rotation.apply([xraw, yraw, zraw])
def _calc_xyzraw(self, x, y, z):
print(self.rotation.inv().apply([x, y, z]))
return self.rotation.inv().apply([x, y, z])
# # def get_status(self):
# # s = f'Hexapod {self.alias.get_full_name()} status ({datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")})\n'
# # if hasattr(self, "ref_frame_angle"):
# # for var in ["x", "y", "z"]:
# # s += (
# # " " * 4
# # + var.ljust(16)
# # + f"{self.__dict__[var].get_current_value():g}\n"
# # )
# # s += (
# # " " * 4
# # + "ref_frame_angle".ljust(16)
# # + str(self.ref_frame_angle.get_current_value())
# # + "\n"
# # )
# # for var in [
# # "x_raw",
# # "y_raw",
# # "z_raw",
# # "rx_raw",
# # "ry_raw",
# # "rz_raw",
# # "pivot_x",
# # "pivot_y",
# # "pivot_z",
# # ]:
# # s += (
# # " " * 4
# # + var.ljust(16)
# # + f"{self.__dict__[var].get_current_value():g}\n"
# # )
# # return s
# def __str__(self):
# return self.get_status()
# def __repr__(self):
# return self.__str__()
class HexapodPI_old:
def __init__(self, pvname, name=None, fina_angle_offset=None):
self.name = name
self.alias = Alias(name)
+21 -35
View File
@@ -220,15 +220,14 @@ class MasterEventSystem(Assembly):
class EvrPulser(Assembly):
def __init__(self, pv_base, outputs=None, name=None):
def __init__(self, pv_base, name=None):
super().__init__(name=name)
self.pv_base = pv_base
self.name = name
self._append(
PvEnum, f"{self.pv_base}-Polarity-Sel", name="polarity", is_setting=True
)
self._append(
self, PvEnum, f"{self.pv_base}-Ena-Sel", name="enable", is_setting=True
PvEnum, f"{self.pv_base}-Ena-Sel", name="enable", is_setting=True
)
self._append(
PvRecord, f"{self.pv_base}-Evt-Trig0-SP", name="eventcode", is_setting=True
@@ -252,7 +251,7 @@ class EvrPulser(Assembly):
)
self._append(
PvRecord,
f"{self.pv_base}-Delay-SP",
f"{self.pv_base}-Width-SP",
pvreadbackname=f"{self.pv_base}-Width-RB",
name="width",
is_setting=True,
@@ -260,27 +259,24 @@ class EvrPulser(Assembly):
self.description = EpicsString(pv_base + "-Name-I")
class EvrOutput:
def __init__(self, pv_base, name=None):
class EvrOutput(Assembly):
def __init__(self, pv_base, pulsers=None, name=None):
super().__init__(name=name)
self.pv_base = pv_base
self.name = name
self.alias = Alias(name)
self._pulsers = None
self._pulsers = pulsers
# self._update_connected_pulsers()
append_object_to_object(self, PvEnum, f"{self.pv_base}-Ena-SP", name="enable")
self.pulsers_numbers = (
PvEnum(f"{self.pv_base}-Src-Pulse-SP", name="pulserA"),
PvEnum(f"{self.pv_base}-Src2-Pulse-SP", name="pulserB"),
)
self._append(PvEnum, f"{self.pv_base}-Ena-SP", name="enable",is_setting=True)
self._append(PvEnum, f"{self.pv_base}-Src-Pulse-SP", name="pulser_number_A", is_setting=True)
self._append(PvEnum, f"{self.pv_base}-Src2-Pulse-SP", name="pulser_number_B", is_setting=True)
self.description = EpicsString(pv_base + "-Name-I")
def _get_pulserA(self):
return self._pulsers[self.pulsers_numbers[0].get_current_value()]
return self._pulsers[self.pulser_number_A.get_current_value()]
pulserA = property(_get_pulserA)
def _get_pulserB(self):
return self._pulsers[self.pulsers_numbers[1].get_current_value()]
return self._pulsers[self.pulser_number_B.get_current_value()]
pulserB = property(_get_pulserB)
@@ -294,40 +290,30 @@ class EvrOutput:
# self.pulsers = ()
def get_status(self):
pass
class EventReceiver:
class EventReceiver(Assembly):
def __init__(
self, pvname, n_pulsers=24, n_output_front=8, n_output_rear=16, name=None
):
self.name = name
self.alias = Alias(name)
super().__init__(name=name)
self.pvname = pvname
pulsers = []
for n in range(n_pulsers):
append_object_to_object(
self, EvrPulser, f"{self.pvname}:Pul{n}", name=f"pulser{n}"
)
self._append(EvrPulser, f"{self.pvname}:Pul{n}", name=f"pulser{n}", is_setting=True)
pulsers.append(self.__dict__[f"pulser{n}"])
self.pulsers = tuple(pulsers)
outputs = []
for n in range(n_output_front):
append_object_to_object(
self,
EvrOutput,
f"{self.pvname}:FrontUnivOut{n}",
name=f"output_front{n}",
)
self._append(EvrOutput,
f"{self.pvname}:FrontUnivOut{n}", pulsers=pulsers,
name=f"output_front{n}", is_setting=True)
outputs.append(self.__dict__[f"output_front{n}"])
for n in range(n_output_rear):
append_object_to_object(
self, EvrOutput, f"{self.pvname}:RearUniv{n}", name=f"output_rear{n}"
)
self._append(EvrOutput, f"{self.pvname}:RearUniv{n}", pulsers=pulsers, name=f"output_rear{n}", is_setting=True)
outputs.append(self.__dict__[f"output_rear{n}"])
for to in outputs:
to._pulsers = self.pulsers
# for to in outputs:
# to._pulsers = self.pulsers
self.outputs = outputs
+5 -6
View File
@@ -29,12 +29,11 @@ class Elog:
self._screenshot = Screenshot(screenshot_directory)
self.read = self._log.read
def post(self, *args, **kwargs):
"""
"""
if not ("Author" in kwargs):
kwargs["Author"] = self.user
return self._log.post(*args, **kwargs)
def post(self, *args, Title=None, Author=None, **kwargs):
""""""
if not Author:
Author = self.user
return self._log.post(*args, Title=Title, Author=Author, **kwargs)
def screenshot(self, message="", window=False, desktop=False, delay=3, **kwargs):
filepath = self._screenshot.shoot()[0]
+7 -7
View File
@@ -284,19 +284,19 @@ class Run_Table():
else:
name = device.name
self.adjustables[name] = {key: value for key, value in device.__dict__.items() if hasattr(value, 'get_current_value')}
self.adjustables[name].update({key+'_offset': PvRecord(pvsetname = value.Id+'.OFF') for key, value in device.__dict__.items() if hasattr(value, '_motor')})
self.units[name] = {key: caget(value.Id+'.EGU') for key, value in device.__dict__.items() if hasattr(value, '_motor')}
self.adjustables[name].update({key+'_offset': PvRecord(pvsetname = value.pvname+'.OFF') for key, value in device.__dict__.items() if hasattr(value, '_motor')})
self.units[name] = {key: caget(value.pvname+'.EGU') for key, value in device.__dict__.items() if hasattr(value, '_motor')}
if hasattr(device, 'get_current_value'):
self.adjustables[name]['_'.join([name, 'self'])]=device
def _parse_child_instances(self, parent_class, pp_name=None):
try:
self._get_all_adjustables(parent_class, pp_name)
except:
print(f'Getting adjustables from {parent_class.name} failed')
pass
#try:
self._get_all_adjustables(parent_class, pp_name)
#except:
# print(f'Getting adjustables from {parent_class.name} failed')
# pass
if pp_name is not None:
pp_name = '_'.join([pp_name, parent_class.name])
else:
+24 -108
View File
@@ -1,9 +1,10 @@
import sys
sys.path.append("..")
from ..devices_general.motors import MotorRecord
from ..devices_general.motors import MotorRecord, SmaractStreamdevice
from ..devices_general.smaract import SmarActRecord
from ..devices_general.adjustable import PvRecord
from ..devices_general.cameras_swissfel import CameraBasler
from epics import PV
from ..aliases import Alias, append_object_to_object
@@ -20,6 +21,7 @@ from collections import deque
from matplotlib.animation import FuncAnimation
from threading import Thread
from time import sleep
from ..elements.assembly import Assembly
def addPvRecordToSelf(
@@ -27,7 +29,10 @@ def addPvRecordToSelf(
):
try:
self.__dict__[name] = PvRecord(
pvsetname, pvreadbackname=pvreadbackname, accuracy=accuracy, name=name,
pvsetname,
pvreadbackname=pvreadbackname,
accuracy=accuracy,
name=name,
)
self.alias.append(self.__dict__[name].alias)
except:
@@ -49,68 +54,37 @@ def addSmarActRecordToSelf(self, Id=None, name=None):
self.alias.append(self.__dict__[name].alias)
class Bsen:
class Bsen(Assembly):
def __init__(
self,
name=None,
Id=None,
processing_pipeline="SARES20-CAMS142-M5_psen_db",
processing_instance="SARES20-CAMS142-M5_psen_db1",
spectrometer_camera_channel="SARES20-CAMS142-M5:FPICTURE",
):
self.Id = Id
self.name = name
self.alias = Alias(name)
super().__init__(name=name)
self.proc_client = PipelineClient()
self.proc_pipeline = processing_pipeline
self.proc_instance = processing_instance
self.spectrometer_camera_channel = spectrometer_camera_channel
self.motor_configuration = {
"transl": {
"id": "-ESB17",
"pv_descr": "Motor8:2 BSEN_transl",
"type": 2,
"sensor": 1,
"speed": 400,
"home_direction": "back",
},
}
## white light beam pointing mirrors
addPvRecordToSelf(
self,
pvsetname="SLAAR21-LMNP-ESBIR11:DRIVE",
pvreadbackname="SLAAR21-LMNP-ESBIR11:MOTRBV",
accuracy=10,
name="mirr1_ry",
self._append(
SmaractStreamdevice,
"SARES23-LIC5",
name="x_mirror_microscope",
is_setting=True,
)
addPvRecordToSelf(
self,
pvsetname="SLAAR21-LMNP-ESBIR12:DRIVE",
pvreadbackname="SLAAR21-LMNP-ESBIR12:MOTRBV",
accuracy=10,
name="mirr1_rx",
self._append(MotorRecord, "SARES20-MF2:MOT_1", name="x_target", is_setting=True)
self._append(MotorRecord, "SARES20-MF2:MOT_2", name="y_target", is_setting=True)
self._append(MotorRecord, "SARES20-MF2:MOT_3", name="z_target", is_setting=True)
self._append(
MotorRecord, "SARES20-MF2:MOT_4", name="zoom_microscope", is_setting=True
)
addPvRecordToSelf(
self,
pvsetname="SLAAR21-LMNP-ESBIR13:DRIVE",
pvreadbackname="SLAAR21-LMNP-ESBIR13:MOTRBV",
accuracy=10,
name="mirr2_rx",
self._append(
CameraBasler,
"SARES20-PROF141-M1",
name="camera_microscope",
is_setting=True,
)
addPvRecordToSelf(
self,
pvsetname="SLAAR21-LMNP-ESBIR14:DRIVE",
pvreadbackname="SLAAR21-LMNP-ESBIR14:MOTRBV",
accuracy=10,
name="mirr2_ry",
)
### BSEN target position ###
for name, config in self.motor_configuration.items():
addSmarActRecordToSelf(self, Id=Id + config["id"], name=name)
def get_proc_config(self):
return self.proc_client.get_pipeline_config(self.proc_pipeline)
@@ -137,63 +111,6 @@ class Bsen:
ax = fig.add_subplot(111)
ax.imshow(im)
def set_stage_config(self):
for name, config in self.motor_configuration.items():
mot = self.__dict__[name]._device
mot.put("NAME", config["pv_descr"])
mot.put("STAGE_TYPE", config["type"])
mot.put("SET_SENSOR_TYPE", config["sensor"])
mot.put("CL_MAX_FREQ", config["speed"])
sleep(0.5)
mot.put("CALIBRATE.PROC", 1)
def home_smaract_stages(self, stages=None):
if stages == None:
stages = self.motor_configuration.keys()
print("#### Positions before homing ####")
print(self.__repr__())
for name in stages:
config = self.motor_configuration[name]
mot = self.__dict__[name]._device
print(
"#### Homing {} in {} direction ####".format(
name, config["home_direction"]
)
)
sleep(1)
if config["home_direction"] == "back":
mot.put("FRM_BACK.PROC", 1)
while mot.get("STATUS") == 7:
sleep(1)
if mot.get("GET_HOMED") == 0:
print(
"Homing failed, try homing {} in forward direction".format(name)
)
mot.put("FRM_FORW.PROC", 1)
elif config["home_direction"] == "forward":
mot.put("FRM_FORW.PROC", 1)
while mot.get("STATUS") == 7:
sleep(1)
if mot.get("GET_HOMED") == 0:
print(
"Homing failed, try homing {} in backward direction".format(
name
)
)
mot.put("FRM_BACK.PROC", 1)
def get_adjustable_positions_str(self):
ostr = "*****BSEN target position******\n"
for tkey, item in self.__dict__.items():
if hasattr(item, "get_current_value"):
pos = item.get_current_value()
ostr += " " + tkey.ljust(17) + " : % 14g\n" % pos
return ostr
def __repr__(self):
return self.get_adjustable_positions_str()
class TtProcessor:
def __init__(self, Nbg=10):
@@ -256,4 +173,3 @@ class TtProcessor:
self.fig, self.update_plot, init_func=self.setup_plot
)
plt.show()
+14
View File
@@ -9,12 +9,14 @@ from ..devices_general.adjustable import (
PvEnum,
spec_convenience,
default_representation,
update_changes,
)
from ..devices_general.utilities import Changer
from ..elements.assembly import Assembly
@spec_convenience
@update_changes
class DoubleCrystalMono(Assembly):
def __init__(
self,
@@ -78,6 +80,18 @@ class DoubleCrystalMono(Assembly):
def get_current_value(self, *args, **kwargs):
return self.energy.get_current_value(*args, **kwargs)
def __str__(self):
return f"{self.name} @ {self.get_current_value()} eV"
def add_value_callback(self, callback, index=None):
return self.energy._pvreadback.add_callback(callback=callback, index=index)
def clear_value_callback(self, index=None):
if index:
self.energy._pvreadback.remove_callback(index)
else:
self.energy._pvreadback.clear_callbacks()
@spec_convenience
@default_representation