Source code for mxcubecore.HardwareObjects.DESY.P11Beam

# encoding: utf-8
#
#  Project name: 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 <http://www.gnu.org/licenses/>.

__copyright__ = """Copyright The MXCuBE Collaboration"""
__license__ = "LGPLv3+"
__credits__ = ["DESY P11"]
__category__ = "General"


from mxcubecore.HardwareObjects.abstract.AbstractBeam import (
    AbstractBeam,
)


[docs]class P11Beam(AbstractBeam):
[docs] def init(self): self.pinhole_hwobj = self.get_object_by_role("pinhole") self._beam_position_on_screen = [340, 256] self.focus_sizes = { -1: {"label": "unknown", "size": [0.2, 0.2]}, 0: {"label": "flat", "size": [0.2, 0.2]}, 1: {"label": "200x200", "size": [0.2, 0.2]}, 2: {"label": "100x100", "size": [0.1, 0.1]}, 3: {"label": "50x50", "size": [0.05, 0.05]}, 4: {"label": "20x20", "size": [0.02, 0.02]}, 5: {"label": "4x9", "size": [0.009, 0.004]}, } self.mirror_idx_ch = self.get_channel_object("beamsize") self.mirror_state_ch = self.get_channel_object("state") if self.mirror_idx_ch is not None: self.mirror_idx_ch.connect_signal("update", self.mirror_idx_changed) if self.mirror_state_ch is not None: self.mirror_state_ch.connect_signal("update", self.mirror_state_changed) self.mirror_idx_changed() self.mirror_state_changed()
[docs] def get_available_size(self): """Returns available beam sizes based on the current configuration.""" return {"type": ["focus"], "values": [self.focus_sizes]}
[docs] def get_defined_beam_size(self): """Implements the abstract method to return defined beam sizes.""" return { "label": [item["label"] for item in self.focus_sizes.values()], "size": [item["size"] for item in self.focus_sizes.values()], }
[docs] def set_value(self, size=None): """Implements the abstract method to set the beam size.""" if isinstance(size, list): self._beam_width, self._beam_height = size elif isinstance(size, str): matching_size = next( (v for k, v in self.focus_sizes.items() if v["label"] == size), None ) if matching_size: self._beam_width, self._beam_height = matching_size["size"] self.evaluate_beam_info()
[docs] def set_beam_position_on_screen(self, beam_x_y): """Sets the beam position on the screen.""" self._beam_position_on_screen = beam_x_y self.re_emit_values()
def get_beam_info_state(self): if self.mirror_state_ch is not None: tango_state = self.mirror_state_ch.get_value() return self._convert_tango_state(tango_state) return self.STATES.READY def get_slits_gap(self): return None, None def mirror_state_changed(self, state=None): if state is None: state = self.get_beam_info_state() self.update_state(self._convert_tango_state(state)) def _convert_tango_state(self, state): str_state = str(state) if str_state == "ON": _state = self.STATES.READY elif str_state == "MOVING": _state = self.STATES.BUSY else: _state = self.STATES.FAULT return _state def mirror_idx_changed(self, value=None): if value is None: value = self.mirror_idx_ch.get_value() self.log.debug(f"P11Beam - mirror idx changed. now is {value}") if value not in self.focus_sizes: value = -1 self.log.debug(f" - UNKNOWN mirror index") curr_size_item = self.focus_sizes[value] self.log.debug( f" current mirror focus is {curr_size_item['label']}: {curr_size_item['size']}" ) self._beam_size_dict["aperture"] = curr_size_item["size"] self.evaluate_beam_info() self.re_emit_values() def get_pinhole_size(self): # Keep it default as the pinhole and beamsize interaction is locked for now return 200 def get_beam_focus_label(self): value = self.mirror_idx_ch.get_value() if value not in self.focus_sizes: value = -1 return "UNKNOWN mirror index" else: curr_size_item = self.focus_sizes[value] self.log.debug( f" current mirror focus is {curr_size_item['label']}: {curr_size_item['size']}" ) return curr_size_item["label"]