Source code for mxcubecore.HardwareObjects.abstract.AbstractXrayCentring
# encoding: utf-8
#
# This file is part of MXCuBE.
#
# 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 <https://www.gnu.org/licenses/>.
"""Xray Centring Abstract Class with yaml configuration file."""
from __future__ import (
absolute_import,
division,
print_function,
unicode_literals,
)
__copyright__ = """ Copyright © 2016 - 2022 by MXCuBE Collaboration """
__license__ = "LGPLv3+"
__author__ = "rhfogh"
__date__ = "25/03/2022"
import abc
from mxcubecore import HardwareRepository as HWR
from mxcubecore.BaseHardwareObjects import HardwareObject
from mxcubecore.model import queue_model_objects
[docs]class AbstractXrayCentring(HardwareObject):
"""Xray Centring Hardware Object. Set to Yaml configuration."""
def __init__(self, name):
super().__init__(name)
# Needed to allow methods to put new actions on the queue
# And as a place to get hold of other objects, like the QMO
self._queue_entry = None
# Current data collection task group. For adding tasks to queue. if needed
self._data_collection_group = None
def _init(self):
"""This function is superfluous, but left in as a reminder in
case you need to override it.
"""
super()._init()
[docs] def init(self):
"""Initialise the state to READY"""
super().init()
self.update_state(self.STATES.READY)
[docs] def pre_execute(self, queue_entry):
"""Actions to take before the execution of the centring.
Args:
queue_entry(XrayCentring2QueueEntry): Access to queue and data model
"""
self._queue_entry = queue_entry
if self.is_ready():
self.update_state(self.STATES.BUSY)
else:
raise RuntimeError(
"Cannot execute Xray centring - HardwareObject is not ready"
)
new_dcg_model = queue_model_objects.TaskGroup()
new_dcg_model.set_enabled(True)
new_dcg_model.set_name("CentringTaskGroup")
self._data_collection_group = new_dcg_model
self._add_to_queue(self._queue_entry.get_data_model(), new_dcg_model)
[docs] @abc.abstractmethod
def execute(self):
"""Contains the actual X-ray centring code
taking parameters from the data model as needed.
"""
[docs] def post_execute(self):
"""The workflow has finished, sets the state to 'READY'."""
self._queue_entry = None
self._data_collection_group = None
self.update_state(self.STATES.READY)
def _add_to_queue(self, parent_model_obj, child_model_obj):
"""Add entries to queue while centring process is running (if needed).
Args:
parent_model_obj: Parent queue entry.
child_model_obj: Child queue entry.
"""
HWR.beamline.queue_model.add_child(parent_model_obj, child_model_obj)