real aliases, diffractometer class and more

This commit is contained in:
2018-10-11 14:26:56 +02:00
parent 30cf15829a
commit 7d9286aa0d
9 changed files with 163 additions and 21 deletions
+21 -5
View File
@@ -17,7 +17,7 @@ class Alias:
), f"Alias {subalias.alias} exists already!"
self.children.append(subalias)
def get_all(self):
def get_all(self,joiner='.'):
aa = []
if self.channel:
ta = {}
@@ -30,11 +30,11 @@ class Alias:
for tc in self.children:
taa = tc.get_all()
for ta in taa:
ta["alias"] = self.alias + ta["alias"]
aa.append(ta)
aa.append({'alias':joiner.join([self.alias,ta['alias']]),'channel':ta['channel'], 'channeltype':ta['channeltype']})
return aa
def add_children(self, *args):
self.children.append(find_aliases(*args))
# def add_children(self, *args):
# self.children.append(find_aliases(*args))
def find_aliases(*args):
@@ -54,6 +54,7 @@ class Namespace:
self._path = path
self.name = path.stem
self.data = None
self._modified = False
def read_file(self):
with self._path.open("r") as fp:
@@ -86,6 +87,21 @@ class Namespace:
json.dump(self.data, fp)
self._modified = False
def get_info(self, alias=None, channel=None):
assert alias or channel, "Either search alias or channel needs to be defined!"
assert not(alias and channel), "Only either search alias or channel can be defined"
if alias:
if alias in self.aliases:
return self.data[self.aliases.index(alias)]
else:
return None
if channel:
if channel in self.channels:
return self.data[self.channels.index(channel)]
else:
return None
class NamespaceCollection:
def __init__(self, alias_path=None):
+1 -1
View File
@@ -1 +1 @@
[{"alias": null, "channel": null, "channeltype": null}, {"alias": "name", "channel": "id2344221000", "channeltype": "bs"}]
[{"alias": "xrd.xbase.readback", "channel": "SARES21-XRD:MOT_TX.RBV", "channeltype": "CA"}, {"alias": "xrd.xbase.user_offset", "channel": "SARES21-XRD:MOT_TX.OFF", "channeltype": "CA"}, {"alias": "xrd.ybase.readback", "channel": "SARES21-XRD:MOT_TY.RBV", "channeltype": "CA"}, {"alias": "xrd.ybase.user_offset", "channel": "SARES21-XRD:MOT_TY.OFF", "channeltype": "CA"}, {"alias": "xrd.rxbase.readback", "channel": "SARES21-XRD:MOT_RX.RBV", "channeltype": "CA"}, {"alias": "xrd.rxbase.user_offset", "channel": "SARES21-XRD:MOT_RX.OFF", "channeltype": "CA"}, {"alias": "xrd.omega.readback", "channel": "SARES21-XRD:MOT_MY_RYTH.RBV", "channeltype": "CA"}, {"alias": "xrd.omega.user_offset", "channel": "SARES21-XRD:MOT_MY_RYTH.OFF", "channeltype": "CA"}, {"alias": "xrd.gamma.readback", "channel": "SARES21-XRD:MOT_NY_RY2TH.RBV", "channeltype": "CA"}, {"alias": "xrd.gamma.user_offset", "channel": "SARES21-XRD:MOT_NY_RY2TH.OFF", "channeltype": "CA"}, {"alias": "xrd.delta.readback", "channel": "SARES21-XRD:MOT_DT_RX2TH.RBV", "channeltype": "CA"}, {"alias": "xrd.delta.user_offset", "channel": "SARES21-XRD:MOT_DT_RX2TH.OFF", "channeltype": "CA"}, {"alias": "xrd.tdet.readback", "channel": "SARES21-XRD:MOT_D_T.RBV", "channeltype": "CA"}, {"alias": "xrd.tdet.user_offset", "channel": "SARES21-XRD:MOT_D_T.OFF", "channeltype": "CA"}, {"alias": "xrd.tpol.readback", "channel": "SARES21-XRD:MOT_P_T.RBV", "channeltype": "CA"}, {"alias": "xrd.tpol.user_offset", "channel": "SARES21-XRD:MOT_P_T.OFF", "channeltype": "CA"}, {"alias": "xrd.xhl.readback", "channel": "SARES21-XRD:MOT_TBL_TX.RBV", "channeltype": "CA"}, {"alias": "xrd.xhl.user_offset", "channel": "SARES21-XRD:MOT_TBL_TX.OFF", "channeltype": "CA"}, {"alias": "xrd.zhl.readback", "channel": "SARES21-XRD:MOT_TBL_TZ.RBV", "channeltype": "CA"}, {"alias": "xrd.zhl.user_offset", "channel": "SARES21-XRD:MOT_TBL_TZ.OFF", "channeltype": "CA"}, {"alias": "xrd.yhl.readback", "channel": "SARES21-XRD:MOT_TBL_TY.RBV", "channeltype": "CA"}, {"alias": "xrd.yhl.user_offset", "channel": "SARES21-XRD:MOT_TBL_TY.OFF", "channeltype": "CA"}, {"alias": "xrd.rxhl.readback", "channel": "SARES21-XRD:MOT_TBL_RX.RBV", "channeltype": "CA"}, {"alias": "xrd.rxhl.user_offset", "channel": "SARES21-XRD:MOT_TBL_RX.OFF", "channeltype": "CA"}, {"alias": "xrd.teta.readback", "channel": "SARES21-XRD:MOT_HEX_TX.RBV", "channeltype": "CA"}, {"alias": "xrd.teta.user_offset", "channel": "SARES21-XRD:MOT_HEX_TX.OFF", "channeltype": "CA"}, {"alias": "xrd.eta.readback", "channel": "SARES21-XRD:MOT_HEX_RX.RBV", "channeltype": "CA"}, {"alias": "xrd.eta.user_offset", "channel": "SARES21-XRD:MOT_HEX_RX.OFF", "channeltype": "CA"}]
+13
View File
@@ -2,8 +2,21 @@ from ..utilities.config import initFromConfigList
from epics import PV
from .config import components
from .. import ecocnf
from ..aliases import NamespaceCollection
itglobals = globals()
alias_namespaces = NamespaceCollection()
for key, value in initFromConfigList(components, lazy=ecocnf.startup_lazy).items():
globals()[key] = value
if not ecocnf.startup_lazy:
try:
for ta in value.alias.get_all():
alias_namespaces.bernina.update(ta['alias'],ta['channel'],ta['channeltype'])
except:
pass
alias_namespaces.bernina.store()
+3 -3
View File
@@ -188,12 +188,12 @@ components = [
# 'kwargs': {}
# },
{
"args": ["SARES21-XRD"],
"args": [],
"name": "xrd",
"z_und": 142,
"desc": "Xray diffractometer",
"type": "eco.endstations.bernina_xrd:XRD",
"kwargs": {},
"type": "eco.endstations.bernina_diffractometers:XRD",
"kwargs": {'Id':"SARES21-XRD"},
},
{
"args": ["SARES20-PROF142-M1"],
+1 -1
View File
@@ -46,7 +46,7 @@ class MotorRecord:
self.name = name
self.alias = Alias(name)
for an, af in alias_fields.items():
self.alias.add_children(
self.alias.append(
Alias(an, channel=".".join([pvname, af]), channeltype="CA")
)
self._currentChange = None
@@ -0,0 +1,91 @@
import sys
sys.path.append("..")
from ..devices_general.motors import MotorRecord
from epics import PV
from ..aliases import Alias
def addMotorRecordToSelf(self,name=None, Id=None):
self.__dict__[name] = MotorRecord(Id, name=name)
self.alias.append(self.__dict__[name].alias)
class XRD:
def __init__(self, name=None, Id=None, configuration=[]):
"""X-ray diffractometer platform in AiwssFEL Bernina.\
<configuration> : list of elements mounted on
the plaform, options are kappa, nutable, hlgonio, polana"""
self.Id = Id
self.name = name
self.alias = Alias(name)
### motors base platform ###
addMotorRecordToSelf(self, Id=Id + ":MOT_TX", name="xbase")
addMotorRecordToSelf(self, Id=Id + ":MOT_TY", name="ybase")
addMotorRecordToSelf(self, Id=Id + ":MOT_RX", name="rxbase")
addMotorRecordToSelf(self, Id=Id + ":MOT_MY_RYTH", name="omega")
### motors XRD detector arm ###
addMotorRecordToSelf(self, Id=Id + ":MOT_NY_RY2TH", name="gamma")
addMotorRecordToSelf(self, Id=Id + ":MOT_DT_RX2TH", name="delta")
### motors XRD area detector branch ###
addMotorRecordToSelf(self, Id=Id + ":MOT_D_T", name="tdet")
### motors XRD polarisation analyzer branch ###
addMotorRecordToSelf(self, Id=Id + ":MOT_P_T", name="tpol")
#missing: slits of flight tube
### motors heavy load goniometer ###
addMotorRecordToSelf(self, Id=Id + ":MOT_TBL_TX", name="xhl")
addMotorRecordToSelf(self, Id=Id + ":MOT_TBL_TZ", name="zhl")
addMotorRecordToSelf(self, Id=Id + ":MOT_TBL_TY", name="yhl")
try:
addMotorRecordToSelf(self, Id=Id + ":MOT_TBL_RX", name="rxhl")
except:
print("XRD.rxhl not found")
pass
try:
addMotorRecordToSelf(self, Id=Id + ":MOT_TBL_RY", name="rzhl")
except:
print("XRD.rzhl not found")
pass
### motors nu table ###
addMotorRecordToSelf(self, Id=Id + ":MOT_HEX_TX", name="teta")
addMotorRecordToSelf(self, Id=Id + ":MOT_HEX_RX", name="eta")
### motors PI hexapod ###
self.hex_x = PV("SARES20-HEX_PI:POSI-X")
self.hex_y = PV("SARES20-HEX_PI:POSI-Y")
self.hex_z = PV("SARES20-HEX_PI:POSI-Z")
self.hex_u = PV("SARES20-HEX_PI:POSI-U")
self.hex_v = PV("SARES20-HEX_PI:POSI-V")
self.hex_w = PV("SARES20-HEX_PI:POSI-W")
def __repr__(self):
s = "**Heavy Load**\n"
motors = "xmu mu tth xbase ybase".split()
for motor in motors:
s += " - %s %.4f\n" % (motor, getattr(self, motor).wm())
s += " - xhl %.4f\n" % (self.xhl.wm())
s += " - yhl %.4f\n" % (self.yhl.wm())
s += " - zhl %.4f\n" % (self.zhl.wm())
s += " - th %.4f\n" % (self.th.wm())
s += "\n"
s += "**Gonio**\n"
motors = "xmu mu tth delta det_z cam_z xbase ybase".split()
for motor in motors:
s += " - %s %.4f\n" % (motor, getattr(self, motor).wm())
s += "\n"
s += "**Hexapod**\n"
motors = "x y z u v w".split()
for motor in motors:
s += " - hex_%s %.4f\n" % (motor, getattr(self, "hex_" + motor).get())
return s
+21 -11
View File
@@ -14,8 +14,26 @@ class XRD:
self.Id = Id
self.name = name
self.alias = Alias(name)
### motors base platform ###
self.xbase = MotorRecord(Id + ":MOT_TX", name="xbase")
self.ybase = MotorRecord(Id + ":MOT_TY", name="ybase")
self.rxbase = MotorRecord(Id + ":MOT_RX", name="rxbase")
self.omega = MotorRecord(Id + ":MOT_MY_RYTH", name="omega")
### motors XRD detector arm ###
self.gamma = MotorRecord(Id + ":MOT_NY_RY2TH", name="gam")
self.delta = MotorRecord(Id + ":MOT_DT_RX2TH", name="del")
### motors heavy load table ###
### motors XRD area detector branch ###
self.tdet = MotorRecord(Id + ":MOT_D_T", name="tdet")
### motors XRD polarisation analyzer branch ###
self.tpol = MotorRecord(Id + ":MOT_P_T", name="tpol")
#missing: slits of flight tube
### motors heavy load goniometer ###
self.xhl = MotorRecord(Id + ":MOT_TBL_TX", name="xhl")
self.zhl = MotorRecord(Id + ":MOT_TBL_TZ", name="zhl")
self.yhl = MotorRecord(Id + ":MOT_TBL_TY", name="yhl")
@@ -30,19 +48,11 @@ class XRD:
print("GPS.roll not found")
pass
### motors heavy load gonio base ###
self.omega = MotorRecord(Id + ":MOT_MY_RYTH", name="omega")
### motors nu table ###
self.tnu = MotorRecord(Id + ":MOT_HEX_TX", name="tnu")
self.nu = MotorRecord(Id + ":MOT_HEX_RX", name="nu")
self.gamma = MotorRecord(Id + ":MOT_NY_RY2TH", name="gam")
self.delta = MotorRecord(Id + ":MOT_DT_RX2TH", name="del")
self.xbase = MotorRecord(Id + ":MOT_TX")
self.ybase = MotorRecord(Id + ":MOT_TY")
### motors XRD arm ###
self.tdet = MotorRecord(Id + ":MOT_D_T")
self.tpol = MotorRecord(Id + ":MOT_P_T")
### motors PI hexapod ###
self.hex_x = PV("SARES20-HEX_PI:POSI-X")
self.hex_y = PV("SARES20-HEX_PI:POSI-Y")
self.hex_z = PV("SARES20-HEX_PI:POSI-Z")
+6
View File
@@ -62,6 +62,12 @@ def initFromConfigList(config_list, lazy=False):
return op
class Exp:
def __init__(self,module):
pass
def loadConfig(fina):
with open(fina, "r") as f:
return json.load(f)
+6
View File
@@ -14,6 +14,12 @@ class Pprm:
self._led = PV(self.Id + ":LED")
self.target = EnumWrapper(self.Id + ":PROBE_SP")
def movein(self,target=1):
self.target.set(target)
def moveout(self,target=0):
self.target.set(target)
def illuminate(self, value=None):
if value:
self._led.put(value)