#
# 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/>.
"""
EMBLImageTracking
Hardware object used to control image tracking
By default ADXV is used
"""
from mxcubecore.BaseHardwareObjects import HardwareObject
__credits__ = ["EMBL Hamburg"]
__license__ = "LGPLv3+"
__category__ = "General"
[docs]class EMBLImageTracking(HardwareObject):
"""
EMBLImageTracking
"""
def __init__(self, *args):
super().__init__(*args)
self.state = None
self.state_dict = {"image_tracking": False, "filter_frames": False}
self.chan_state = None
self.chan_enable_image_tracking = None
self.chan_filter_frames = None
self.chan_spot_list = None
self.cmd_load_image = None
[docs] def init(self):
self.chan_enable_image_tracking = self.get_channel_object(
"chanImageTrackingEnabled", optional=True
)
self.chan_enable_image_tracking.connect_signal(
"update", self.image_tracking_state_changed
)
self.chan_filter_frames = self.get_channel_object(
"chanFilterFramesEnabled", optional=True
)
if self.chan_filter_frames is not None:
self.chan_filter_frames.connect_signal(
"update", self.filter_frames_enabled_changed
)
self.chan_spot_list = self.get_channel_object(
"chanSpotListEnabled", optional=True
)
if self.chan_spot_list is not None:
self.chan_spot_list.connect_signal("update", self.spot_list_enabled_changed)
self.chan_spot_list.set_value(True)
self.chan_state = self.get_channel_object("chanState")
self.chan_state.connect_signal("update", self.state_changed)
self.cmd_load_image = self.get_command_object("cmdLoadImage")
[docs] def image_tracking_state_changed(self, state):
"""
Updates image tracking state
:param state:
:return:
"""
self.state_dict["image_tracking"] = state
self.emit("imageTrackingStateChanged", (self.state_dict,))
[docs] def filter_frames_enabled_changed(self, state):
"""
Updates filter frames state
:param state:
:return:
"""
self.state_dict["filter_frames"] = state
self.emit("imageTrackingStateChanged", (self.state_dict,))
[docs] def state_changed(self, state):
"""
Updates overall state
:param state:
:return:
"""
if self.state != state:
self.state = state
self.emit("stateChanged", (self.state,))
[docs] def is_tracking_enabled(self):
"""
Returns True if image tracking is enabled
:return:
"""
return self.chan_enable_image_tracking.get_value()
[docs] def set_image_tracking_state(self, state):
"""
Enables/disables image tracking
:param state:
:return:
"""
self.chan_enable_image_tracking.set_value(state)
[docs] def set_filter_frames_state(self, state):
"""
Enables/disables image filtering based on the dozor score
:param state:
:return:
"""
self.chan_filter_frames.set_value(state)
[docs] def set_spot_list_enabled(self, state):
"""
Enables/disables spot indication on Adxv
:param state:
:return:
"""
self.chan_spot_list.set_value(state)
def spot_list_enabled_changed(self, state):
self.state_dict["spot_list"] = state
self.emit("imageTrackingStateChanged", (self.state_dict,))
[docs] def load_image(self, image_name):
"""
Load image in the image viewer
:param image_name:
:return:
"""
if self.is_tracking_enabled():
self.set_image_tracking_state(False)
self.cmd_load_image(str(image_name))
[docs] def re_emit_values(self):
"""
Reemits values
:return:
"""
self.emit("stateChanged", self.state)
self.emit("imageTrackingStateChanged", (self.state_dict,))