diff --git a/mxcubecore/HardwareObjects/abstract/AbstractBeam.py b/mxcubecore/HardwareObjects/abstract/AbstractBeam.py index 753693b2ef..9d3cbf1607 100644 --- a/mxcubecore/HardwareObjects/abstract/AbstractBeam.py +++ b/mxcubecore/HardwareObjects/abstract/AbstractBeam.py @@ -186,12 +186,15 @@ def evaluate_beam_info(self): Method called if aperture, slits or focusing has been changed Returns: dictionary, {size_x: 0.1, size_y: 0.1, shape: BeamShape enum} """ - size_x = min( - self._beam_size_dict["aperture"][0], self._beam_size_dict["slits"][0] + self._beam_size_dict["aperture"][0], + self._beam_size_dict["slits"][0], + self._beam_size_dict["definer"][0], ) size_y = min( - self._beam_size_dict["aperture"][1], self._beam_size_dict["slits"][1] + self._beam_size_dict["aperture"][1], + self._beam_size_dict["slits"][1], + self._beam_size_dict["definer"][1], ) self._beam_width = size_x diff --git a/mxcubecore/HardwareObjects/mockup/BeamMockup.py b/mxcubecore/HardwareObjects/mockup/BeamMockup.py index 1a44198adb..4f68f20e90 100644 --- a/mxcubecore/HardwareObjects/mockup/BeamMockup.py +++ b/mxcubecore/HardwareObjects/mockup/BeamMockup.py @@ -38,8 +38,10 @@ def __init__(self, name): self._beam_size_dict["slits"] = [9999, 9999] self._beam_size_dict["aperture"] = [9999, 9999] + self._beam_size_dict["definer"] = [9999, 9999] self._beam_position_on_screen = [680, 512] self._beam_divergence = (0, 0) + self.beam_size_determination = None def init(self): AbstractBeam.init(self) @@ -48,6 +50,7 @@ def init(self): self.get_property("beam_position", "[318, 238]") ) + self.beam_size_determination = self.get_property("beam_size_determination") self._aperture = self.get_object_by_role("aperture") if self._aperture is not None: self.connect( @@ -67,6 +70,14 @@ def init(self): sx, sy = self._slits.get_gaps() self._beam_size_dict["slits"] = [sx, sy] + self._beam_definer = self.get_object_by_role("beam_definer") + if self._beam_definer is not None: + self.connect(self._beam_definer, "valueChanged", self.beam_definer_changed) + + _definer = self._beam_definer.get_value() + sx, sy = _definer.value.split("x") + self._beam_size_dict["definer"] = [float(sx), float(sy)] + self.evaluate_beam_info() self.re_emit_values() self.emit("beamPosChanged", (self._beam_position_on_screen,)) @@ -93,6 +104,17 @@ def slits_gap_changed(self, size): self.evaluate_beam_info() self.re_emit_values() + def beam_definer_changed(self, definer): + print('beam_definer_changed', definer) + if definer.value != 'UNKNOWN': + sx, sy = definer.value.split("x") + else: + _aperture = self._aperture.get_diameter_size() + sx, sy = [_aperture, _aperture] + self._beam_size_dict["definer"] = [float(sx), float(sy)] + self.evaluate_beam_info() + self.re_emit_values() + def set_beam_position_on_screen(self, beam_x, beam_y): """ Sets beam mark position on screen @@ -105,6 +127,8 @@ def set_beam_position_on_screen(self, beam_x, beam_y): self.emit("beamPosChanged", (self._beam_position_on_screen,)) def get_value(self): + print('beam get value', list(self.get_beam_info_dict().values())) + return list(self.get_beam_info_dict().values()) def get_slits_gap(self): @@ -136,5 +160,53 @@ def get_available_size(self): aperture_list = self._aperture.get_diameter_size_list() return {"type": "enum", "values": aperture_list} + def get_available_definer(self): + definer_list = [item.value for item in self._beam_definer.VALUES] + return {"type": "enum", "values": definer_list} + def set_value(self, value): self._aperture.set_diameter_size(value) + + def set_beam_definer(self, value): + if self._beam_definer is not None: + self._beam_definer.set_value(value) + + def evaluate_beam_info(self): + """ + Method called if aperture, slits or focusing has been changed + Returns: dictionary, {size_x: 0.1, size_y: 0.1, shape: BeamShape enum} + """ + if self.beam_size_determination is None: + # we keep the minumum + size_x = min( + self._beam_size_dict["aperture"][0], + self._beam_size_dict["slits"][0], + self._beam_size_dict["definer"][0], + ) + size_y = min( + self._beam_size_dict["aperture"][1], + self._beam_size_dict["slits"][1], + self._beam_size_dict["definer"][1], + ) + elif self.beam_size_determination == "definer": + size_x = self._beam_size_dict["definer"][0] + size_y = self._beam_size_dict["definer"][1] + elif self.beam_size_determination == "slits": + size_x = self._beam_size_dict["slits"][0] + size_y = self._beam_size_dict["slits"][1] + + self._beam_width = size_x + self._beam_height = size_y + + if tuple(self._beam_size_dict["aperture"]) < tuple( + self._beam_size_dict["slits"] + ): + self._beam_shape = BeamShape.ELIPTICAL + else: + self._beam_shape = BeamShape.RECTANGULAR + + self._beam_info_dict["size_x"] = size_x + self._beam_info_dict["size_y"] = size_y + self._beam_info_dict["shape"] = self._beam_shape + print(self._beam_size_dict) + return self._beam_info_dict