"""
[Name] BeamInfo
[Description]
BeamInfo hardware object is used to define final beam size and shape.
It can include aperture, slits and/or other beam definer (lenses or other eq.)
[Emitted signals]
beamInfoChanged
beamPosChanged
[Included Hardware Objects]
-----------------------------------------------------------------------
| name | signals | functions
-----------------------------------------------------------------------
aperture_hwobj apertureChanged
slits_hwobj
beam_definer_hwobj
-----------------------------------------------------------------------
"""
from mxcubecore.BaseHardwareObjects import HardwareObject
[docs]class ALBABeamInfo(HardwareObject):
"""
Description:
"""
def __init__(self, *args):
"""
Descrip. :
"""
super().__init__(*args)
self.aperture_hwobj = None
self.slits_hwobj = None
self.beam_size_slits = None
self.beam_size_aperture = None
self.beam_size_definer = None
self.beam_position = None
self.beam_info_dict = None
self.default_beam_divergence = None
[docs] def init(self):
"""
Descript. :
"""
self.beam_size_slits = [9999, 9999]
self.beam_size_aperture = [9999, 9999]
self.beam_size_definer = [9999, 9999]
self.beam_position = [0, 0]
self.beam_info_dict = {}
self.beam_width_chan = self.get_channel_object("BeamWidth")
self.beam_height_chan = self.get_channel_object("BeamHeight")
self.beam_posx_chan = self.get_channel_object("BeamPositionHorizontal")
self.beam_posy_chan = self.get_channel_object("BeamPositionVertical")
self.beam_height_chan.connect_signal("update", self.beam_height_changed)
self.beam_width_chan.connect_signal("update", self.beam_width_changed)
self.beam_posx_chan.connect_signal("update", self.beam_posx_changed)
self.beam_posy_chan.connect_signal("update", self.beam_posy_changed)
# divergence can be added as fixed properties in xml
default_beam_divergence_vertical = None
default_beam_divergence_horizontal = None
try:
default_beam_divergence_vertical = int(
self.get_property("beam_divergence_vertical")
)
default_beam_divergence_horizontal = int(
self.get_property("beam_divergence_horizontal")
)
except Exception:
self.log.exception("")
self.default_beam_divergence = [
default_beam_divergence_horizontal,
default_beam_divergence_vertical,
]
def connect_notify(self, *args):
self.evaluate_beam_info()
self.re_emit_values()
[docs] def get_beam_divergence_hor(self):
"""
Descript. :
"""
return self.default_beam_divergence[0]
[docs] def get_beam_divergence_ver(self):
"""
Descript. :
"""
return self.default_beam_divergence[1]
[docs] def get_beam_position(self):
"""
Descript. :
Arguments :
Return :
"""
self.beam_position = (
self.beam_posx_chan.get_value(),
self.beam_posy_chan.get_value(),
)
return self.beam_position
def get_slits_gap(self):
return None, None
[docs] def set_beam_position(self, beam_x, beam_y):
"""
Descript. :
Arguments :
Return :
"""
self.beam_position = (beam_x, beam_y)
[docs] def get_beam_info(self):
"""
Descript. :
Arguments :
Return :
"""
return self.evaluate_beam_info()
[docs] def get_beam_size(self):
"""
Descript. : returns beam size in millimeters
Return : list with two integers
"""
self.evaluate_beam_info()
return self.beam_info_dict["size_x"], self.beam_info_dict["size_y"]
[docs] def get_beam_shape(self):
"""
Descript. :
Arguments :
Return :
"""
return self.beam_info_dict["shape"]
def beam_width_changed(self, value):
self.beam_info_dict["size_x"] = value
self.re_emit_values()
def beam_height_changed(self, value):
self.beam_info_dict["size_y"] = value
self.re_emit_values()
def beam_posx_changed(self, value):
self.beam_position["x"] = value
self.re_emit_values()
def beam_posy_changed(self, value):
self.beam_position["y"] = value
self.re_emit_values()
[docs] def evaluate_beam_info(self):
"""
Descript. : called if aperture, slits or focusing has been changed
Return : dictionary,{size_x:0.1, size_y:0.1, shape:"rectangular"}
"""
self.beam_info_dict["size_x"] = self.beam_width_chan.get_value() / 1000.0
self.beam_info_dict["size_y"] = self.beam_height_chan.get_value() / 1000.0
self.beam_info_dict["shape"] = "rectangular"
return self.beam_info_dict
[docs] def re_emit_values(self):
"""
Descript. :
Arguments :
Return :
"""
self.log.debug(" emitting beam info")
if (
self.beam_info_dict["size_x"] != 9999
and self.beam_info_dict["size_y"] != 9999
):
self.emit(
"beamSizeChanged",
((self.beam_info_dict["size_x"], self.beam_info_dict["size_y"]),),
)
self.emit("beamInfoChanged", (self.beam_info_dict,))
def test_hwo(hwo):
print(hwo.get_beam_info())
print(hwo.get_beam_position())