#
# 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/>.
"""Abstract hardware object for the aperture."""
from __future__ import annotations
import ast
from warnings import warn
from mxcubecore.BaseHardwareObjects import HardwareObject
__copyright__ = """ Copyright © 2010-2022 by the MXCuBE collaboration """
__license__ = "LGPLv3+"
[docs]class AbstractAperture(HardwareObject):
"""Abstract hardware object for the aperture.
Emits:
diameterIndexChanged (int, float):
Two-item tuple: current index and diameter in millimeters.
valueChanged (str):
Current position name.
"""
def __init__(self, name: str) -> None:
warn(
"AbstractAperture is deprecated. Use AbstractNState instead",
DeprecationWarning,
)
HardwareObject.__init__(self, name)
self._current_position_name = None
self._current_diameter_index = None
self._diameter_size_list = []
self._position_list = []
[docs] def init(self):
self._diameter_size_list = self.get_property("diameter_size_list", [])
if isinstance(self._diameter_size_list, str):
self._diameter_size_list = ast.literal_eval(self._diameter_size_list)
if not self._diameter_size_list:
self.log.warning("diameter_size_list is empty")
self._position_list = self.get_property("position_list", [])
if isinstance(self._position_list, str):
self._position_list = ast.literal_eval(self._position_list)
if not self._position_list:
self.log.warning("position_list is empty")
[docs] def get_diameter_size_list(self) -> list[float]:
"""Get list of diameter sizes.
Returns:
List of diameter sizes in microns.
"""
return self._diameter_size_list
[docs] def get_position_list(self) -> list[str]:
"""Get list of positions.
Returns:
Position names as a list of strings.
"""
return self._position_list
[docs] def get_diameter_index(self) -> int:
"""Get current diameter index.
Returns:
Current diameter index.
"""
return self._current_diameter_index
[docs] def set_diameter_index(self, diameter_index: int) -> None:
"""Set active diameter index.
Args:
diameter_index: Selected diameter index.
"""
if diameter_index < len(self._diameter_size_list):
self._current_diameter_index = diameter_index
self.emit(
"diameterIndexChanged",
self._current_diameter_index,
self._diameter_size_list[self._current_diameter_index] / 1000.0,
)
else:
self.log.warning(
"Aperture: Diameter index %d is not valid" % diameter_index
)
[docs] def get_diameter_size(self) -> float:
"""Get diameter size.
Returns:
Current diameter size in millimeters.
"""
return self._diameter_size_list[self._current_diameter_index]
[docs] def set_diameter_size(self, diameter_size: int) -> None:
"""Set diameter size.
Args:
diameter_size: selected diameter index
"""
if diameter_size in self._diameter_size_list:
self.set_diameter_index(self._diameter_size_list.index(diameter_size))
else:
self.log.warning("Aperture: Selected diameter is not in the diameter list")
[docs] def get_position_name(self) -> str:
"""Get current position name.
Returns:
Current position name.
"""
return self._current_position_name
def set_position(self, position_index: int) -> None:
warn(
"set_position is deprecated. Use set_position_index(position_index) instead",
DeprecationWarning,
)
self.set_position_index(position_index)
[docs] def set_position_name(self, position_name: str) -> None:
"""Set aperture position based on a position name.
Args:
position_name: Selected position name.
"""
if position_name in self._position_list:
self._current_position_name = position_name
self.emit("valueChanged", self._current_position_name)
else:
self.log.warning(
"Aperture: Position %s is not in the position list" % position_name
)
[docs] def set_position_index(self, position_index: int) -> None:
"""Set aperture position based on a position index.
Args:
position_index: Selected position index.
"""
if position_index < len(self._position_list):
self._current_position_name = self._position_list[position_index]
self.emit("valueChanged", self._current_position_name)
else:
self.log.warning("Aperture: Selected position is not in the position list")
[docs] def set_in(self):
"""Set aperture in the beam."""
[docs] def set_out(self):
"""Remove aperture from the beam."""
[docs] def is_out(self) -> bool:
"""
Returns:
``True`` if aperture is in the beam, otherwise returns ``False``.
"""
[docs] def force_emit_signals(self) -> None:
"""Reemit all signals."""
self.emit("valueChanged", self._current_position_name)
self.emit(
"diameterIndexChanged",
self._current_diameter_index,
self._diameter_size_list[self._current_diameter_index] / 1000.0,
)