Source code for mxcubecore.HardwareObjects.DESY.Centring

# 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 DeviceProxy function and DevState:

from mxcubecore.BaseHardwareObjects import HardwareObject

last_centred_position = [200, 200]


[docs]class Centring(HardwareObject): """ Description: This class controls the operation of Tango Motor """ def __init__(self, *args): """ Description: """ HardwareObject.__init__(self, *args) self.proxyMotor = None # Hardware object to change motor attributes self.motor_name = None # Tango name of DeviceServer controlling the motor
[docs] def init(self): self.gonioAxes = [] # self.gonioAxes = [] # for axis in self['gonioAxes']: # self.gonioAxes.append({'type':axis.type,'direction':eval(axis.direction),\ # 'motor_name':axis.motorname,'motor_HO': # HardwareRepository.get_hardware_repository().get_hardware_object(axis.motorHO) # }) print("Centring Init") print("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
def initCentringProcedure(self): print("initCentringProcedure(self)") """ Descript. : call before starting rotate-click sequence """ self.centringDataTensor = [] self.centringDataMatrix = [] self.motorConstraints = [] # self.centeingPoints = [Point(0.0,0.0), Point(0.0,0.0), Point(0.0,0.0)] # array of 3 points, initial values - zeroes # print( "self.centeingPoints[0] = (", self.centeingPoints[0].x, ", ", self.centeingPoints[0].y, ")") # print( "self.centeingPoints[1] = (", self.centeingPoints[1].x, ", ", self.centeingPoints[1].y, ")") # print( "self.centeingPoints[2] = (", self.centeingPoints[2].x, ", ", self.centeingPoints[2].y, ")") print("Centring initCentringProcedure") print("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
[docs] def appendCentringDataPoint(self, camera_coordinates): """ Descript. : call after each click and send click points - but relative in mm """ # self.centringDataTensor.append(self.factor_matrix()) self.centringDataMatrix.append( self.camera_coordinates_to_vector(camera_coordinates) ) ll = len(self.centringDataMatrix) print(("len(self.centringDataMatrix) = ", ll)) print(("self.centringDataMatrix = ", self.centringDataMatrix[ll - 1])) print("appendCentringDataPoint(self)") print("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
# def setCentringDataPoint(self, i, camera_coordinates): # print("camera_coordinates['X'] = ", camera_coordinates['X']) # print("camera_coordinates['Y'] = ", camera_coordinates['Y']) # #self.centeingPoints[i] = point(camera_coordinates['X'], camera_coordinates['Y']]) # print("appendCentringDataPoint(self)") # print( '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+')
[docs] def centeredPosition(self, return_by_name=False): """ Descript. : call after appending the last click. Return : {motorHO:position} dictionary. M=numpy.zeros(shape=(self.translationAxesCount,self.translationAxesCount)) V=numpy.zeros(shape=(self.translationAxesCount)) for l in range(0,self.translationAxesCount): for i in range (0,len(self.centringDataMatrix)): for k in range(0,len(self.cameraAxes)): V[l] += self.centringDataTensor[i][l][k]*self.centringDataMatrix[i][k] for m in range(0,self.translationAxesCount): for i in range (0,len(self.centringDataMatrix)): for k in range(0,len(self.cameraAxes)): M[l][m] += self.centringDataTensor[i][l][k]*self.centringDataTensor[i][m][k] tau_cntrd = numpy.dot(numpy.linalg.pinv(M,rcond=1e-6),V) tau_cntrd = self.apply_constraints(M,tau_cntrd) """ # return self.vector_to_centred_positions( - tau_cntrd + # self.translation_datum(), return_by_name) print("centeredPosition(self)") print("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+") return self.vector_to_centred_positions(123, 456)
def vector_to_centred_positions(self, vector, return_by_name=False): dic = {} index = 0 # for axis in self.gonioAxes: # if axis['type'] == "translation": # if return_by_name: # dic[axis['motor_name']]=vector[index] # else: # dic[axis['motor_HO']]=vector[index] # index += 1 print("vector_to_centred_positions(self)") print("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+") return dic def camera_coordinates_to_vector(self, camera_coordinates_dictionary): vector = [] vector.append(camera_coordinates_dictionary["X"]) vector.append(camera_coordinates_dictionary["Y"]) return vector