00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _GEOPRIMITIVES_EULERANGLESHELPERS_H
00011 #define _GEOPRIMITIVES_EULERANGLESHELPERS_H
00012
00013 #include "GeoPrimitives/GeoPrimitives.h"
00014
00015 #include "CLHEPtoEigenEulerAnglesConverters.h"
00016
00017 namespace Amg {
00018
00037 inline Amg::Vector3D getPhiThetaPsi(Amg::RotationMatrix3D mat, int convention = 0)
00038 {
00039 double phi;
00040 double theta;
00041 double psi;
00042
00043 Amg::Vector3D ea;
00044
00050
00051 if (convention == 0) {
00052 ea = mat.eulerAngles(2, 0, 2);
00053 }
00054
00055 else {
00056 ea = mat.eulerAngles(2, 1, 2);
00057 }
00058
00059
00060 ea = convert_EigenEulerAngles_to_CLHEPPhiThetaPsi( ea, convention );
00061
00062 phi = ea[0];
00063 theta = ea[1];
00064 psi = ea[2];
00065
00066 Amg::Vector3D phiThetaPsi_angles;
00067 phiThetaPsi_angles(0) = phi;
00068 phiThetaPsi_angles(1) = theta;
00069 phiThetaPsi_angles(2) = psi;
00070
00071 return phiThetaPsi_angles;
00072
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 inline Amg::RotationMatrix3D setPhi(Amg::RotationMatrix3D mat, double angle, int convention = 0)
00099 {
00100
00101
00102 Amg::Vector3D phi_theta_psi;
00103
00104
00105
00106 if (convention == 0) {
00107 phi_theta_psi = getPhiThetaPsi(mat, 0);
00108 }
00109 else {
00110 phi_theta_psi = getPhiThetaPsi(mat, 1);
00111 }
00112
00113 double phi = phi_theta_psi(0);
00114 double theta = phi_theta_psi(1);
00115 double psi = phi_theta_psi(2);
00116
00117
00118
00119
00120
00121 phi = angle;
00122
00123
00124
00125
00126 Amg::Vector3D clhep_phiThetaPsi(phi, theta, psi);
00127 Amg::Vector3D eigen_euler_angles;
00128
00129 if (convention == 0) {
00130 eigen_euler_angles = convert_CLHEPPhiThetaPsi_to_EigenEulerAngles(clhep_phiThetaPsi, 0);
00131 }
00132 else {
00133 eigen_euler_angles = convert_CLHEPPhiThetaPsi_to_EigenEulerAngles(clhep_phiThetaPsi, 1);
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 if (convention == 0) {
00154 mat = Amg::AngleAxis3D(eigen_euler_angles(0), Amg::Vector3D::UnitZ())
00155 * Amg::AngleAxis3D(eigen_euler_angles(1), Amg::Vector3D::UnitX())
00156 * Amg::AngleAxis3D(eigen_euler_angles(2), Amg::Vector3D::UnitZ());
00157 }
00158 else {
00159 mat = Amg::AngleAxis3D(eigen_euler_angles(0), Amg::Vector3D::UnitZ())
00160 * Amg::AngleAxis3D(eigen_euler_angles(1), Amg::Vector3D::UnitY())
00161 * Amg::AngleAxis3D(eigen_euler_angles(2), Amg::Vector3D::UnitZ());
00162 }
00163
00164 return mat;
00165
00166 }
00167
00168
00169
00170
00171 }
00172
00173
00174 #endif
00175