From 5183a2832e0538dab5362ddd74e4ee32af480e68 Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Fri, 15 Mar 2024 15:13:33 +0100 Subject: [PATCH 1/7] make sure motor reaches destination --- mxcubecore/HardwareObjects/mockup/MotorMockup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mxcubecore/HardwareObjects/mockup/MotorMockup.py b/mxcubecore/HardwareObjects/mockup/MotorMockup.py index d44311ad46..670224e8ab 100644 --- a/mxcubecore/HardwareObjects/mockup/MotorMockup.py +++ b/mxcubecore/HardwareObjects/mockup/MotorMockup.py @@ -104,7 +104,6 @@ def _move(self, value): ) val = val if not self._wrap_range else val % self._wrap_range - self.update_value(val) time.sleep(0.02) @@ -118,8 +117,8 @@ def _move(self, value): else: self.update_specific_state(None) + self.update_value(value) return value - + def is_moving(self): return ( (self.get_state() == self.STATES.BUSY ) or (self.get_state() == self.SPECIFIC_STATES.MOVING)) - From 520a29aab928cf07360836d73a9e8477cd6bdbf5 Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Fri, 15 Mar 2024 15:14:18 +0100 Subject: [PATCH 2/7] adding beam definer logic to BeamInfo --- .../HardwareObjects/abstract/AbstractBeam.py | 9 ++- .../HardwareObjects/mockup/BeamMockup.py | 72 +++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) 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 From 89302626207c41ad2df1ab3ce96cb331ce07063c Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Fri, 15 Mar 2024 15:19:15 +0100 Subject: [PATCH 3/7] beam definer mockup --- .../mockup/BeamDefinerMockup.py | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py diff --git a/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py b/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py new file mode 100644 index 0000000000..7cf88221ba --- /dev/null +++ b/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py @@ -0,0 +1,77 @@ +# encoding: utf-8 +# +# Project: MXCuBE +# https://github.com/mxcube +# +# This file is part of MXCuBE software. +# +# MXCuBE is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# MXCuBE is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with MXCuBE. If not, see . + +""" +BeamDefinerMockup class +""" + +from mxcubecore.BaseHardwareObjects import HardwareObject +from mxcubecore.HardwareObjects.abstract.AbstractNState import AbstractNState + +class BeamDefinerMockup(AbstractNState): + + def __init__(self, *args): + super().__init__(*args) + self.beam_size_hor = None + self.beam_size_ver = None + + def init(self): + AbstractNState.init(self) + + self.beam_size_hor = self.get_object_by_role("beam_size_hor") + self.beam_size_ver = self.get_object_by_role("beam_size_ver") + self.beam_size_hor.connect + + self.connect(self.beam_size_hor, "valueChanged", self.motors_changed) + self.connect(self.beam_size_ver, "valueChanged", self.motors_changed) + + def motors_changed(self, value): + _val = self.get_value() + self.emit("valueChanged", _val) + + def get_state(self): + """Get the device state. + Returns: + (enum 'HardwareObjectState'): Device state. + """ + return self.STATES.READY + + def get_value(self): + """Get the device value + Returns: + """ + try: + hor = int(self.beam_size_hor.get_value()) + ver = int(self.beam_size_ver.get_value()) + _val = f"{hor}x{ver}" + en = self.value_to_enum(_val) + return en + except ValueError: + return -1 + + def set_value(self, val): + """Set the beam size. + Args: + size_x: horizontal size + size_y: vertical size + """ + size_x, size_y = val.split('x') + self.beam_size_hor._move(float(size_x)) + self.beam_size_ver._move(float(size_y)) From 874e6a792203130fdd40a082dc3aa92e5c77c6e1 Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Fri, 15 Mar 2024 15:19:29 +0100 Subject: [PATCH 4/7] less verbose --- mxcubecore/HardwareObjects/mockup/BeamMockup.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mxcubecore/HardwareObjects/mockup/BeamMockup.py b/mxcubecore/HardwareObjects/mockup/BeamMockup.py index 4f68f20e90..11f265edb7 100644 --- a/mxcubecore/HardwareObjects/mockup/BeamMockup.py +++ b/mxcubecore/HardwareObjects/mockup/BeamMockup.py @@ -105,7 +105,6 @@ def slits_gap_changed(self, size): 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: @@ -127,8 +126,6 @@ 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): @@ -208,5 +205,4 @@ def evaluate_beam_info(self): 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 From 65674506f65e41591995ed6ad339b8ac76a54fdc Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Fri, 15 Mar 2024 15:30:41 +0100 Subject: [PATCH 5/7] running black --- mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py | 4 ++-- mxcubecore/HardwareObjects/mockup/BeamMockup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py b/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py index 7cf88221ba..dc7a2d58ee 100644 --- a/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py +++ b/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py @@ -25,8 +25,8 @@ from mxcubecore.BaseHardwareObjects import HardwareObject from mxcubecore.HardwareObjects.abstract.AbstractNState import AbstractNState -class BeamDefinerMockup(AbstractNState): +class BeamDefinerMockup(AbstractNState): def __init__(self, *args): super().__init__(*args) self.beam_size_hor = None @@ -72,6 +72,6 @@ def set_value(self, val): size_x: horizontal size size_y: vertical size """ - size_x, size_y = val.split('x') + size_x, size_y = val.split("x") self.beam_size_hor._move(float(size_x)) self.beam_size_ver._move(float(size_y)) diff --git a/mxcubecore/HardwareObjects/mockup/BeamMockup.py b/mxcubecore/HardwareObjects/mockup/BeamMockup.py index 11f265edb7..659e5299c1 100644 --- a/mxcubecore/HardwareObjects/mockup/BeamMockup.py +++ b/mxcubecore/HardwareObjects/mockup/BeamMockup.py @@ -105,7 +105,7 @@ def slits_gap_changed(self, size): self.re_emit_values() def beam_definer_changed(self, definer): - if definer.value != 'UNKNOWN': + if definer.value != "UNKNOWN": sx, sy = definer.value.split("x") else: _aperture = self._aperture.get_diameter_size() From 8eba433b7db689e6432389df6125fd2d69da180f Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Thu, 21 Mar 2024 09:57:53 +0100 Subject: [PATCH 6/7] added custom styling property --- .../mockup/BeamDefinerMockup.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py b/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py index dc7a2d58ee..1296640018 100644 --- a/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py +++ b/mxcubecore/HardwareObjects/mockup/BeamDefinerMockup.py @@ -20,6 +20,17 @@ """ BeamDefinerMockup class + + + beamDefiner + + + {"50x50": "50x50", "100x100": "100x100", "20x5": "20x5"} + {"50x50":{100: "disable", 50: "default", 20: "normal", 10: "warning", 5: "warning"}, + "100x100": {100: 'default',50: 'normal',20: 'normal',10: 'warning', 5: 'warning'},'20x5': {100: 'disable',50: 'disable',20: 'normal',10: 'default',5: 'normal'}, "UNKNOWN": {100: 'default',50: 'normal',20: 'normal',10: 'normal',5: 'normal'}} + + + """ from mxcubecore.BaseHardwareObjects import HardwareObject @@ -31,7 +42,7 @@ def __init__(self, *args): super().__init__(*args) self.beam_size_hor = None self.beam_size_ver = None - + self.custom_styling = None def init(self): AbstractNState.init(self) @@ -41,11 +52,20 @@ def init(self): self.connect(self.beam_size_hor, "valueChanged", self.motors_changed) self.connect(self.beam_size_ver, "valueChanged", self.motors_changed) - + self.get_custom_styling() def motors_changed(self, value): _val = self.get_value() self.emit("valueChanged", _val) + def get_custom_styling(self): + try: + _ap = eval(self.get_property("styling")) + except: + print("malformed xml") + _ap = None + self.custom_styling = _ap + return self.custom_styling + def get_state(self): """Get the device state. Returns: From 02ac26a4d43029ad92a35116a93ee040890d03e5 Mon Sep 17 00:00:00 2001 From: Mikel Eguiraun Date: Fri, 22 Mar 2024 13:06:58 +0100 Subject: [PATCH 7/7] increase robustness --- mxcubecore/HardwareObjects/mockup/BeamMockup.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mxcubecore/HardwareObjects/mockup/BeamMockup.py b/mxcubecore/HardwareObjects/mockup/BeamMockup.py index 659e5299c1..b27cb84c07 100644 --- a/mxcubecore/HardwareObjects/mockup/BeamMockup.py +++ b/mxcubecore/HardwareObjects/mockup/BeamMockup.py @@ -158,7 +158,10 @@ def get_available_size(self): return {"type": "enum", "values": aperture_list} def get_available_definer(self): - definer_list = [item.value for item in self._beam_definer.VALUES] + if self._beam_definer is not None: + definer_list = [item.value for item in self._beam_definer.VALUES] + else: + return {} return {"type": "enum", "values": definer_list} def set_value(self, value):