Source code for mxcubecore.HardwareObjects.EMBL.EMBLAperture

#
#  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/>.

"""Inherited from AbstracAperture"""

from mxcubecore.HardwareObjects.abstract.AbstractAperture import AbstractAperture

__credits__ = ["EMBL Hamburg"]
__license__ = "LGPLv3+"
__category__ = "General"


DEFAULT_POSITION_LIST = ("BEAM", "OFF", "PARK")


[docs]class EMBLAperture(AbstractAperture): """Aperture control hwobj uses exporter or Tine channels and commands to control aperture position """ def __init__(self, name): """Inherited from AbstractAperture""" AbstractAperture.__init__(self, name) self.chan_diameter_index = None self.chan_diameters = None self.chan_position = None self.chan_state = None
[docs] def init(self): """ Connects to necessary channels Returns: """ self._position_list = DEFAULT_POSITION_LIST self.chan_diameters = self.get_channel_object("ApertureDiameters") if self.chan_diameters: self._diameter_size_list = self.chan_diameters.get_value() else: self._diameter_size_list = (10, 20) self.chan_diameter_index = self.get_channel_object( "CurrentApertureDiameterIndex" ) if self.chan_diameter_index is not None: self._current_diameter_index = self.chan_diameter_index.get_value() self.diameter_index_changed(self._current_diameter_index) self.chan_diameter_index.connect_signal( "update", self.diameter_index_changed ) else: self._current_diameter_index = 0 self.chan_position = self.get_channel_object("AperturePosition") if self.chan_position: self._current_position_name = self.chan_position.get_value() self.current_position_name_changed(self._current_position_name) self.chan_position.connect_signal( "update", self.current_position_name_changed ) self.chan_state = self.get_channel_object("State")
[docs] def diameter_index_changed(self, diameter_index): """Callback when diameter index has been changed""" self._current_diameter_index = diameter_index self.emit( "diameterIndexChanged", self._current_diameter_index, self._diameter_size_list[self._current_diameter_index] / 1000.0, )
[docs] def get_diameter_size(self): """ Returns: diameter size in mm """ return self._diameter_size_list[self._current_diameter_index] / 1000.0
[docs] def current_position_name_changed(self, position): """ Position change callback Args: position: aperture position (str) Returns: """ if position != "UNKNOWN": self.set_position_name(position)
[docs] def set_diameter_index(self, diameter_index): """ Sets aperture diameter Args: diameter_index: diameter index (int) Returns: """ self.chan_diameter_index.set_value(diameter_index)
[docs] def set_diameter(self, diameter_size, timeout=None): """ Sets new aperture size Args: diameter_size: diameter size in microns (int) timeout: wait timeout is seconds Returns: """ diameter_index = self._diameter_size_list.index(diameter_size) self.chan_diameter_index.set_value(diameter_index)
# if timeout: # while diameter_index != self.chan_diameter_index.get_value(): # gevent.sleep(0.1)
[docs] def set_position_index(self, position_index): """ Sets new aperture position Args: position_index: position index (int) Returns: """ self.chan_position.set_value(self._position_list[position_index])
[docs] def set_in(self): """ Sets aperture to the BEAM position Returns: """ self.chan_position.set_value("BEAM")
[docs] def set_out(self): """Sets aperture to the OUT position Returns: """ self.chan_position.set_value("OFF")
[docs] def wait_ready(self, timeout=20): """Waits till aperture is ready Returns: """ super(EMBLAperture, self).wait_ready(timeout=20)
[docs] def is_out(self): """Returns True if aperture is on the beam Returns: True if is in, otherwise returns False """ return self._current_position_name != "BEAM"