Source code for mxcubecore.HardwareObjects.DESY.P11Zoom

# 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+"

import ast
from enum import Enum

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

redis_flag = False
try:
    import redis

    redis_flag = True
except:
    print("impossible to import redis")


[docs]class P11Zoom(AbstractNState): def __init__(self, name): self.camera_hwobj = None self.pixels_per_mm = None self.closest_zoom = None self.redis = redis.StrictRedis() super().__init__(name)
[docs] def init(self): self._pixels_per_mm = self.get_property("pixels_per_mm") self._overview_pixels_per_mm = self.get_property("overview_pixels_per_mm") self.camera_hwobj = self.get_object_by_role("camera") self.connect(self.camera_hwobj, "zoomChanged", self.zoom_value_changed) if self.camera_hwobj is None: self.log.debug("P11Zoom.py - cannot connect to camera hardware object") AbstractNState.init(self)
[docs] def initialise_values(self): self.VALUES = Enum("ZoomEnum", ast.literal_eval(self.get_property("values")))
[docs] def get_state(self): return self.STATES.READY
def is_moving(self): return False
[docs] def get_value(self): return self.get_zoom()
def _set_value(self, value): self.set_zoom(value) def get_pixels_per_mm(self): current_zoom = self.get_zoom() if current_zoom == 0: px_per_mm = self._overview_pixels_per_mm else: self.log.debug( "getting pixels per mm: %s - %s" % (str(self._pixels_per_mm), str(current_zoom)) ) px_per_mm = self._pixels_per_mm * current_zoom scale = self.camera_hwobj.get_scale() pixels_per_mm = [int(px_per_mm * scale), int(px_per_mm * scale)] if redis_flag: print("saving calibration to redis", pixels_per_mm) self.redis.set("pixels_per_mm", str(pixels_per_mm)) return pixels_per_mm def get_zoom(self): zoom = self.camera_hwobj.get_zoom() if zoom is not None: self.current_value = zoom return self.current_value def set_zoom_value(self, value): self.camera_hwobj.set_zoom(value) def set_zoom(self, zoom): self.camera_hwobj.set_zoom(zoom.value) def get_current_zoom(self): self.get_zoom() self.update_zoom() return self.closest_zoom, self.get_zoom() def zoom_value_changed(self, value): print("zoom_value_changed") self.current_value = value self.update_value(value) self.update_zoom() # self.get_pixels_per_mm() def update_zoom(self): dist = None value = self.get_value() for zoom in self.VALUES: if value == 0: self.closest_zoom = zoom break _dist = abs(value - zoom.value) if dist is None or _dist < dist: dist = _dist self.closest_zoom = zoom if self.closest_zoom is not None: self.emit("predefinedPositionChanged", (self.closest_zoom, value)) else: self.emit("predefinedPositionChanged", (None, None))