added xrd in you convention

This commit is contained in:
2021-02-01 18:58:56 +01:00
parent ffeac3d253
commit fbc3e37cef
4 changed files with 3267 additions and 2 deletions
+20 -1
View File
@@ -38,7 +38,26 @@ namespace.append_obj(
name="cam_south",
module_name="eco.devices_general.cameras_ptz",
)
namespace.append_obj(
"XRDYou",
module_name="eco.endstations.bernina_diffractometers",
Id="SARES21-XRD",
configuration=config_berninamesp["xrd_config"],
diff_detector={"jf_id": "JF01T03V01"},
name="xrd_you",
)
# {
# "args": [],
# "name": "xrd",
# "z_und": 142,
# "desc": "Xray diffractometer",
# "type": "eco.endstations.bernina_diffractometers:XRD",
# "kwargs": {
# "Id": "SARES21-XRD",
# "configuration": config["xrd_config"],
# "diff_detector": {"jf_id": "JF01T03V01"},
# },
# },
namespace.append_obj(
"Daq",
instrument="bernina",
@@ -0,0 +1,295 @@
*-------------------------------------------------------
* itemType: Rectangle
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Line
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Triangle
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Circle
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2,11,12
contextActions(editmode)=10(ClosePath),21(Pie),20(Arc),30(90deg),31(180deg),32(270deg),33(360deg)
*-------------------------------------------------------
* itemType: Polygon
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Path
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
contextActions(editmode)=10(ClosePath),11(FillSolid),20(OddEven),21(Winding)
*-------------------------------------------------------
* itemType: Text
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Image
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Symbol
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: AttachLabel
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: AttachTransform
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Frame
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ScrollArea
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: GroupBox
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Stacked
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
contextActions(editmode)=100(Add Tab),101(Delete Tab)
*-------------------------------------------------------
* itemType: SubPicture
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: MonitorText
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
controlPoints=1,2,10
contextActions(editmode)=1(Show Unit)
*-------------------------------------------------------
* itemType: MonitorBar
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor),3(Monitor)
controlPoints=1,2,10,11
contextActions(editmode)=30(No),31(Gradient),32(Solid),33(Warning&Alarm Gradient),34(Warning&Alarm Solid),35(Alarm Solid),36(Warning Solid),20(No),21(Inside),22(Outside)
*-------------------------------------------------------
* itemType: MonitorMeter
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor),3(Monitor)
controlPoints=1,2,10,11
contextActions(editmode)=30(No),31(Gradient),32(Solid),33(Warning&Alarm Gradient),34(Warning&Alarm Solid),35(Alarm Solid),36(Warning Solid),20(No),21(Inside),22(Outside),50(Two Third),51(Three Quarters),60(Upper Half),70(TopRight Quarter),71(TopLeft Quarter),72(BotRight Quarter),73(BotLeft Quarter)
*-------------------------------------------------------
* itemType: MonitorIndic
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
controlPoints=1,2
*-------------------------------------------------------
* itemType: MonitorBits
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
controlPoints=1,2
contextActions(editmode)=1(Up),2(Down),3(Left),4(Right)
*-------------------------------------------------------
* itemType: MonitorBitnames
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor),3(Monitor)
controlPoints=1,2
contextActions(editmode)=1(Up),2(Down),3(Left),4(Right)
*-------------------------------------------------------
* itemType: StateSymbol
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
controlPoints=1,2
*-------------------------------------------------------
* itemType: MonitorStripChart
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor),3(Monitor),4(Monitor),5(Monitor),6(Monitor),7(Monitor),8(Monitor),9(Monitor),10(Monitor)
controlPoints=1,2
contextActions(editmode)=30(PV),31(Received),10(None),11(TopLeft),12(Top),13(TopRight),14(Right),15(BottomRight),16(Bottom),17(BottomLeft),18(Left),40(Absolut),41(Relative),60(Right to Left),61(Left to Right),50(None),51(Horizontal),52(Vertical),53(Hor&Vert)
contextActions(runtime)=80(Clear Curve),30(PV),31(Received),10(None),11(TopLeft),12(Top),13(TopRight),14(Right),15(BottomRight),16(Bottom),17(BottomLeft),18(Left),40(Absolut),41(Relative),60(Right to Left),61(Left to Right),50(None),51(Horizontal),52(Vertical),53(Hor&Vert)
*-------------------------------------------------------
* itemType: MonitorXYPlot
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),10(Monitor),18(Monitor),11(Monitor),19(Monitor),12(Monitor),20(Monitor),13(Monitor),21(Monitor),14(Monitor),22(Monitor),15(Monitor),23(Monitor),16(Monitor),24(Monitor),17(Monitor),25(Monitor),3(Monitor),2(Monitor),4(Monitor),50(Monitor),52(Monitor),51(Monitor),53(Monitor)
controlPoints=1,2
contextActions(editmode)=30(PV),31(Received),10(None),11(TopLeft),12(Top),13(TopRight),14(Right),15(BottomRight),16(Bottom),17(BottomLeft),18(Left),50(None),51(Horizontal),52(Vertical),53(Hor&Vert)
contextActions(runtime)=80(Clear Plot),30(PV),31(Received),10(None),11(TopLeft),12(Top),13(TopRight),14(Right),15(BottomRight),16(Bottom),17(BottomLeft),18(Left),50(None),51(Horizontal),52(Vertical),53(Hor&Vert)
*-------------------------------------------------------
* itemType: MonitorCamera
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor),3(Monitor),4(Monitor),5(Monitor),6(Monitor)
controlPoints=1,2,10,11
contextActions(editmode)=21(Information),20(Histogram),22(Level Bar),11(<Disable All>),1(Default),2(Grey),3(Spectrum),4(Automatic Levels)
contextActions(runtime)=21(Information),20(Histogram),22(Level Bar),11(<Disable All>),1(Default),2(Grey),3(Spectrum),4(Automatic Levels)
*-------------------------------------------------------
* itemType: MonitorTable
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2,100,101,102
*-------------------------------------------------------
* itemType: MonitorWaterfallPlot
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor),3(Monitor),4(Monitor)
controlPoints=1,2,10,11
contextActions(editmode)=30(Scroll),31(Repeate),32(Single),40(Down),41(Up),21(Information),20(Intensity),22(Grid),11(<Disable All>),2(Grey),3(Spectrum0),4(Spectrum1)
contextActions(runtime)=90(Clear Plot),30(Scroll),31(Repeate),32(Single),40(Down),41(Up),21(Information),20(Intensity),22(Grid),11(<Disable All>),2(Grey),3(Spectrum0),4(Spectrum1)
*-------------------------------------------------------
* itemType: ControlKnob
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control)
controlPoints=1,2,10,11
contextActions(editmode)=10(Unit),30(No),31(Gradient),32(Solid),33(Warning&Alarm Gradient),34(Warning&Alarm Solid),35(Alarm Solid),36(Warning Solid)
*-------------------------------------------------------
* itemType: ControlSlider
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control),3(Monitor)
controlPoints=1,2,10,11
contextActions(editmode)=30(No),31(Gradient),32(Solid),33(Warning&Alarm Gradient),34(Warning&Alarm Solid),35(Alarm Solid),36(Warning Solid),20(No),21(Inside),22(Outside)
*-------------------------------------------------------
* itemType: ControlTextEntry
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control)
controlPoints=1,2,10
contextActions(editmode)=1(Show Unit)
*-------------------------------------------------------
* itemType: ControlNumeric
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control)
controlPoints=1,2,10
contextActions(editmode)=1(Show Unit)
*-------------------------------------------------------
* itemType: ControlMessageButton
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ControlChoiceButton
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ControlCheckBox
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Control)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ActionDisplayGroup
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ActionLoadPicture
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ActionShellCommand
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: PropertyModifierCheckBox
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ScriptContext2d
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: ScriptActionButton
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: BackgroundImage
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
*-------------------------------------------------------
* itemType: TestEvents
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: TestTGeneric
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: TestArea
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: Button
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
*-------------------------------------------------------
* itemType: SymOriginPosition
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
*-------------------------------------------------------
* itemType: SymConnectionPoint
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
*-------------------------------------------------------
* itemType: SymConnectionLine
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=100
*-------------------------------------------------------
* itemType: SymElmFrame
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
*-------------------------------------------------------
* itemType: SymElmRectangle
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
*-------------------------------------------------------
* itemType: SymElmCircle
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=11,12
contextActions(editmode)=10(ClosePath),21(Pie),20(Arc),30(90deg),31(180deg),32(270deg),33(360deg)
*-------------------------------------------------------
* itemType: SymElmText
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
*-------------------------------------------------------
* itemType: SymElmPath
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
contextActions(editmode)=10(ClosePath),11(FillSolid),20(OddEven),21(Winding)
*-------------------------------------------------------
* itemType: SymElmImage
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm),2(Monitor)
*-------------------------------------------------------
* itemType: Cross
*-------------------------------------------------------
pvs=0(Visibility),1(Alarm)
controlPoints=1,2
File diff suppressed because it is too large Load Diff
+288 -1
View File
@@ -2,7 +2,7 @@ import sys
sys.path.append("..")
from ..devices_general.motors import MotorRecord, MotorRecord_new
from ..devices_general.adjustable import PvRecord
from ..devices_general.adjustable import PvRecord, AdjustableVirtual
from epics import PV
from ..aliases import Alias, append_object_to_object
@@ -12,6 +12,7 @@ import subprocess
from ..elements.assembly import Assembly
from ..detector.jungfrau import Jungfrau
from .kappa_conversion import kappa2you, you2kappa
import numpy as np
def addMotorRecordToSelf(self, name=None, Id=None):
@@ -189,6 +190,292 @@ class DeltaTauCurrOff:
self.set_off()
class XRDYou(Assembly):
def __init__(self, name=None, Id=None, configuration=["base"], diff_detector=None):
"""X-ray diffractometer platform in AiwssFEL Bernina.\
<configuration> : list of elements mounted on
the plaform, options are kappa, nutable, hlgonio, polana"""
# self.Id = Id
super().__init__(name=name)
self.configuration = configuration
if "base" in self.configuration:
### motors base platform ###
### motors base platform ###
self._append(MotorRecord_new, Id + ":MOT_TX", name="xbase", is_setting=True)
self._append(MotorRecord_new, Id + ":MOT_TY", name="ybase", is_setting=True)
self._append(
MotorRecord_new, Id + ":MOT_RX", name="rxbase", is_setting=True
)
self._append(
MotorRecord_new, Id + ":MOT_MY_RYTH", name="mu", is_setting=True
)
self.set_base_off = DeltaTauCurrOff("SARES21-XRD:asyn4.AOUT")
if "arm" in self.configuration:
### motors XRD detector arm ###
self._append(
MotorRecord_new, Id + ":MOT_NY_RY2TH", name="nu", is_setting=True
)
self._append(
MotorRecord_new, Id + ":MOT_DT_RX2TH", name="delta", is_setting=True
)
### motors XRD area detector branch ###
self._append(MotorRecord_new, Id + ":MOT_D_T", name="tdet", is_setting=True)
### motors XRD polarisation analyzer branch ###
self._append(MotorRecord_new, Id + ":MOT_P_T", name="tpol", is_setting=True)
# missing: slits of flight tube
self.set_detarm_off = DeltaTauCurrOff("SARES21-XRD:asyn3.AOUT")
if "hlxz" in self.configuration:
### motors heavy load goniometer ###
self._append(
MotorRecord_new, Id + ":MOT_TBL_TX", name="xhl", is_setting=True
)
self._append(
MotorRecord_new, Id + ":MOT_TBL_TZ", name="zhl", is_setting=True
)
self.set_phi_off = DeltaTauCurrOff("SARES21-XRD:asyn1.AOUT")
if "hly" in self.configuration:
self._append(
MotorRecord_new, Id + ":MOT_TBL_TY", name="yhl", is_setting=True
)
self.set_phi_off = DeltaTauCurrOff("SARES21-XRD:asyn1.AOUT")
if "hlrxrz" in self.configuration:
try:
self._append(
MotorRecord_new, Id + ":MOT_TBL_RX", name="rxhl", is_setting=True
)
except:
print("XRD.rxhl not found")
pass
try:
self._append(
MotorRecord_new, Id + ":MOT_TBL_RY", name="rzhl", is_setting=True
)
except:
print("XRD.rzhl not found")
self.set_phi_off = DeltaTauCurrOff("SARES21-XRD:asyn1.AOUT")
if "phi_table" in self.configuration:
### motors nu table ###
self._append(
MotorRecord_new, Id + ":MOT_HEX_TX", name="tphi", is_setting=True
)
self._append(
MotorRecord_new, Id + ":MOT_HEX_RX", name="phi", is_setting=True
)
if "phi_hex" in self.configuration:
### motors PI hexapod ###
append_object_to_object(
self,
PvRecord,
"SARES20-HEX_PI:SET-POSI-X",
pvreadbackname="SARES20-HEX_PI:POSI-X",
name="xhex",
)
append_object_to_object(
self,
PvRecord,
"SARES20-HEX_PI:SET-POSI-Y",
pvreadbackname="SARES20-HEX_PI:POSI-Y",
name="yhex",
)
append_object_to_object(
self,
PvRecord,
"SARES20-HEX_PI:SET-POSI-Z",
pvreadbackname="SARES20-HEX_PI:POSI-Z",
name="zhex",
)
append_object_to_object(
self,
PvRecord,
"SARES20-HEX_PI:SET-POSI-U",
pvreadbackname="SARES20-HEX_PI:POSI-U",
name="uhex",
)
append_object_to_object(
self,
PvRecord,
"SARES20-HEX_PI:SET-POSI-V",
pvreadbackname="SARES20-HEX_PI:POSI-V",
name="vhex",
)
append_object_to_object(
self,
PvRecord,
"SARES20-HEX_PI:SET-POSI-W",
pvreadbackname="SARES20-HEX_PI:POSI-W",
name="whex",
)
if "kappa" in self.configuration:
self._append(
MotorRecord_new,
"SARES21-XRD:MOT_KAP_KRX",
name="eta_kap",
is_setting=True,
)
self._append(
MotorRecord_new,
"SARES21-XRD:MOT_KAP_KAP",
name="kappa",
is_setting=True,
)
self._append(
MotorRecord_new,
"SARES21-XRD:MOT_KAP_KPH",
name="phi_kap",
is_setting=True,
)
self._append(
MotorRecord_new, "SARES21-XRD:MOT_KAP_DTY", name="zkap", is_setting=True
)
self._append(
MotorRecord_new, "SARES21-XRD:MOT_KAP_DTX", name="xkap", is_setting=True
)
self._append(
MotorRecord_new, "SARES21-XRD:MOT_KAP_DTZ", name="ykap", is_setting=True
)
self._append(
MotorRecord_new,
"SARES21-XRD:MOT_KAP_DRX",
name="rxkap",
is_setting=True,
)
self._append(
MotorRecord_new,
"SARES21-XRD:MOT_KAP_DRZ",
name="rykap",
is_setting=True,
)
self.set_kappa_off = DeltaTauCurrOff("SARES21-XRD:asyn1.AOUT")
def get_current_kappa2you(self):
return self.calc_kappa2you(
self.eta_kap.get_current_value(),
self.kappa.get_current_value(),
self.phi_kap.get_current_value(),
)
def set_youvar_value_to_current_kappa(value, varind):
vars = list(get_current_kappa2you())
vars[varind] = value
return self.calc_you2kappa(*vars)
self._append(
AdjustableVirtual,
[self.eta_kap, self.kappa, self.phi_kap],
lambda eta_kap, kappa, phi_kap: self.calc_kappa2you(
eta_kap, kappa, phi_kap
)[0],
lambda value_eta: set_youvar_value_to_current_kappa(value_eta, 0),
name="eta",
)
self._append(
AdjustableVirtual,
[self.eta_kap, self.kappa, self.phi_kap],
lambda eta_kap, kappa, phi_kap: self.calc_kappa2you(
eta_kap, kappa, phi_kap
)[1],
lambda value_chi: set_youvar_value_to_current_kappa(value_eta, 1),
name="chi",
)
self._append(
AdjustableVirtual,
[self.eta_kap, self.kappa, self.phi_kap],
lambda eta_kap, kappa, phi_kap: self.calc_kappa2you(
eta_kap, kappa, phi_kap
)[2],
lambda value_eta: set_youvar_value_to_current_kappa(value_eta, 2),
name="phi",
)
if diff_detector:
self._append(
Jungfrau,
diff_detector["jf_id"],
name="det_diff",
is_setting=False,
is_status=True,
view_toplevel_only=True,
)
def get_adjustable_positions_str(self):
ostr = "*****XRD 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 gui(self, guiType="xdm"):
""" Adjustable convention"""
cmd = ["caqtdm", "-macro"]
cmd = [
"-noMsg",
"-stylefile",
"sfop.qss",
"-macro",
"P=SARES21-XRD",
"/sf/common/config/qt/ESB_XRD_exp.ui",
]
return subprocess.Popen(" ".join(cmd), shell=True)
# def calc_kappa2you(self, eta_k, kappa, phi_k):
# return kappa2you(eta_k, kappa, phi_k)
# def calc_you2kappa(self, eta, chi, phi):
# return you2kappa(eta, chi, phi)
def calc_you2kappa(
self, eta, chi, phi, kappa_angle=60, degrees=True, bernina_kappa=True
):
"""tool to convert from you definition angles to kappa angles, in
particular the bernina kappa where the"""
if degrees:
eta, chi, phi, kappa_angle = np.deg2rad([eta, chi, phi, kappa_angle])
delta_angle = np.arcsin(-np.tan(chi / 2) / np.tan(kappa_angle))
eta_k = eta - delta_angle
kappa = 2 * np.arcsin(np.sin(chi / 2) / np.sin(kappa_angle))
phi_k = phi - delta_angle
if bernina_kappa:
eta_k = eta_k - np.pi / 2
kappa = -kappa
phi_k = -phi_k
if degrees:
eta_k, kappa, phi_k = np.rad2deg([eta_k, kappa, phi_k])
return eta_k, kappa, phi_k
def calc_kappa2you(
self, eta_k, kappa, phi_k, kappa_angle=60, degrees=True, bernina_kappa=True
):
if degrees:
eta_k, kappa, phi_k, kappa_angle = np.deg2rad(
[eta_k, kappa, phi_k, kappa_angle]
)
if bernina_kappa:
eta_k = eta_k + np.pi / 2
kappa = -kappa
phi_k = -phi_k
delta_angle = np.arctan(np.tan(kappa / 2) * np.cos(kappa_angle))
eta = eta_k - delta_angle
chi = 2 * np.arcsin(np.sin(kappa / 2) * np.sin(kappa_angle))
phi = phi_k - delta_angle
if degrees:
eta, chi, phi = np.rad2deg([eta, chi, phi])
return eta, chi, phi
# def __repr__(self):
# return self.get_adjustable_positions_str()
class XRD(Assembly):
def __init__(self, name=None, Id=None, configuration=["base"], diff_detector=None):
"""X-ray diffractometer platform in AiwssFEL Bernina.\