# This function converts a TomBox table (motive list) into xmipp (scipion) metadata file
# given a metadata input containing a list of the subtomograms
from pwem.emlib import metadata as md
import numpy as np
from math import sin, cos
import math
[docs]def TomboxRotationMatrix(phi, psi, theta, shiftx, shifty, shiftz):
rotMat = np.zeros([4, 4])
phi = np.deg2rad(phi)
psi = np.deg2rad(psi)
theta = np.deg2rad(theta)
rotMat[0,0] = cos(psi) * cos(phi) - cos(theta) * sin(psi) * sin(phi)
rotMat[1,0] = sin(psi) * cos(phi) + cos(theta) * cos(psi) * sin(phi)
rotMat[2,0] = sin(theta) * sin(phi)
rotMat[0,1] = -cos(psi) * sin(phi) - cos(theta) * sin(psi) * cos(phi)
rotMat[1,1] = -sin(psi) * sin(phi) + cos(theta) * cos(psi) * cos(phi)
rotMat[2,1] = sin(theta) * cos(phi)
rotMat[0,2] = sin(theta) * sin(psi)
rotMat[1,2] = -sin(theta) * cos(psi)
rotMat[2,2] = cos(theta)
rotMat[0,3] = shiftx
rotMat[1,3] = shifty
rotMat[2,3] = shiftz
rotMat[3,3] = 1
return rotMat
[docs]def matrix2eulerAngles(A):
abs_sb = np.sqrt(A[0, 2] * A[0, 2] + A[1, 2] * A[1, 2])
if (abs_sb > 16 * np.exp(-5)):
gamma = math.atan2(A[1, 2], -A[0, 2])
alpha = math.atan2(A[2, 1], A[2, 0])
if (abs(np.sin(gamma)) < np.exp(-5)):
sign_sb = np.sign(-A[0, 2] / np.cos(gamma))
else:
if np.sin(gamma) > 0:
sign_sb = np.sign(A[1, 2])
else:
sign_sb = -np.sign(A[1, 2])
beta = math.atan2(sign_sb * abs_sb, A[2, 2])
else:
if (np.sign(A[2, 2]) > 0):
alpha = 0
beta = 0
gamma = math.atan2(-A[1, 0], A[0, 0])
else:
alpha = 0
beta = np.pi
gamma = math.atan2(A[1, 0], -A[0, 0])
gamma = np.rad2deg(gamma)
beta = np.rad2deg(beta)
alpha = np.rad2deg(alpha)
return alpha, beta, gamma, A[0, 3], A[1, 3], A[2, 3]
# a test here:
# mtlist = '/home/guest/Downloads/motl1.csv'
# mdfni = '/home/guest/ScipionUserData/projects/TestXmipp2Mltomo/Runs/000172_FlexProtSubtomogramAveraging/extra/volumes.xmd'
# mdfno = '/home/guest/ScipionUserData/projects/TestXmipp2Mltomo/Runs/000172_FlexProtSubtomogramAveraging/extra/volumes2.xmd'
# motivelist2metadata(mtlist, mdfni,mdfno)