Source code for mxcubecore.HardwareObjects.SOLEIL.PX1.PX1BeamInfo

"""
[Name] BeamInfo

[Description]
BeamInfo hardware object informs mxCuBE (HutchMenuBrick) about the beam position
and size.

This is the Soleil PX1 version

Beam size is hardcoded in this file.
Beam Position is updated whenever the zoom motor changes position. Values taken from
   zoom xml configuration

[Emitted signals]

beamInfoChanged
beamPosChanged

"""

import logging

from mxcubecore.BaseHardwareObjects import HardwareObject


[docs]class PX1BeamInfo(HardwareObject): def __init__(self, *args): super().__init__(*args) self.beam_position = [None, None] self.beam_size = [100, 100] self.shape = "rectangular" self.beam_size_slits = [9999, 9999] self.beam_info_dict = {} self.beam_info_dict["size_x"] = self.beam_size[0] self.beam_info_dict["size_y"] = self.beam_size[1] self.beam_info_dict["shape"] = self.shape # Zoom motor self.zoomMotor = None
[docs] def init(self): try: self.beamx_chan = self.get_channel_object("beamsizex") except KeyError: logging.getLogger().warning( "%s: cannot connect to beamsize x channel ", self.id ) try: self.beamy_chan = self.get_channel_object("beamsizey") self.beamy_chan.connect_signal("update", self.beamsize_x_changed) except KeyError: logging.getLogger().warning( "%s: cannot connect to beamsize y channel ", self.id ) self.zoomMotor = self.get_deviceby_role("zoom") if self.beamx_chan is not None: self.beamx_chan.connect_signal("update", self.beamsize_x_changed) else: logging.getLogger().info("BeamSize X channel not defined") if self.beamy_chan is not None: self.beamy_chan.connect_signal("update", self.beamsize_y_changed) else: logging.getLogger().info("BeamSize Y channel not defined") if self.zoomMotor is not None: self.connect( self.zoomMotor, "predefinedPositionChanged", self.zoomPositionChanged ) self.zoomPositionChanged() else: logging.getLogger().info("Zoom motor not defined") if None in [self.beamy_chan, self.beamx_chan]: try: beam_size = self.get_property("beam_size") if beam_size is not None: beamx, beamy = beam_size.split(",") self.beam_info_dict["size_x"] = self.beam_size[0] = float(beamx) self.beam_info_dict["size_y"] = self.beam_size[1] = float(beamy) except Exception: self.log.exception("")
def connect_notify(self, signal): if signal == "beamInfoChanged": self.sizeUpdated() elif signal == "position_changed": self.positionUpdated() def zoomPositionChanged(self, name=None, offset=None): zoom_props = self.zoomMotor.getCurrentPositionProperties() if "beamPositionX" in zoom_props: self.beam_position = [ zoom_props["beamPositionX"], zoom_props["beamPositionY"], ] self.positionUpdated() def positionUpdated(self): self.emit("beamPosChanged", (self.beam_position,)) self.sizeUpdated() def sizeUpdated(self): if None not in [self.beamx_chan, self.beamy_chan]: x_beam = self.beamx_chan.get_value() y_beam = self.beamy_chan.get_value() self.beam_info_dict["size_x"] = x_beam self.beam_info_dict["size_y"] = y_beam self.emit("beamInfoChanged", (self.beam_info_dict,)) def get_beam_info(self): return self.beam_info_dict def get_beam_position(self): return self.beam_position def get_beam_size(self): return self.beam_size def get_beam_shape(self): return self.shape def get_slits_gap(self): return self.beam_size_slits def get_beam_divergence_hor(self): return 0 def get_beam_divergence_ver(self): return 0 def beamsize_x_changed(self, value=None): self.sizeUpdated() def beamsize_y_changed(self, value=None): self.sizeUpdated()
def test_hwo(hwo): print("BEAM info: ", hwo.get_beam_info()) print("BEAM position: ", hwo.get_beam_position())