190#define TOLERANCE (1.0E-6) 
  196: fxx(1.0), fxy(0.0), fxz(0.0), fyx(0.0), fyy(1.0), fyz(0.0),
 
  197  fzx(0.0), fzy(0.0), fzz(1.0) {}
 
  203  fxx(
m.fxx), fxy(
m.fxy), fxz(
m.fxz), fyx(
m.fyx), fyy(
m.fyy), fyz(
m.fyz),
 
  204  fzx(
m.fzx), fzy(
m.fzy), fzz(
m.fzz) {}
 
  212: fxx(mxx), fxy(mxy), fxz(mxz), fyx(myx), fyy(myy), fyz(myz),
 
  213  fzx(mzx), fzy(mzy), fzz(mzz) {}
 
  220      if (j == 0) { 
return fxx; }
 
  221      if (j == 1) { 
return fxy; }
 
  222      if (j == 2) { 
return fxz; }
 
  224      if (j == 0) { 
return fyx; }
 
  225      if (j == 1) { 
return fyy; }
 
  226      if (j == 2) { 
return fyz; }
 
  228      if (j == 0) { 
return fzx; }
 
  229      if (j == 1) { 
return fzy; }
 
  230      if (j == 2) { 
return fzz; }
 
  233   Warning(
"operator()(i,j)", 
"bad indices (%d , %d)",i,j);
 
  260   double two_r2 = 2 * 
Q.fRealPart * 
Q.fRealPart;
 
  261   double two_x2 = 2 * 
Q.fVectorPart.X() * 
Q.fVectorPart.X();
 
  262   double two_y2 = 2 * 
Q.fVectorPart.Y() * 
Q.fVectorPart.Y();
 
  263   double two_z2 = 2 * 
Q.fVectorPart.Z() * 
Q.fVectorPart.Z();
 
  264   double two_xy = 2 * 
Q.fVectorPart.X() * 
Q.fVectorPart.Y();
 
  265   double two_xz = 2 * 
Q.fVectorPart.X() * 
Q.fVectorPart.Z();
 
  266   double two_xr = 2 * 
Q.fVectorPart.X() * 
Q.fRealPart;
 
  267   double two_yz = 2 * 
Q.fVectorPart.Y() * 
Q.fVectorPart.Z();
 
  268   double two_yr = 2 * 
Q.fVectorPart.Y() * 
Q.fRealPart;
 
  269   double two_zr = 2 * 
Q.fVectorPart.Z() * 
Q.fRealPart;
 
  272   double mag2 = 
Q.QMag2();
 
  276      fxx = two_r2 + two_x2;
 
  277      fyy = two_r2 + two_y2;
 
  278      fzz = two_r2 + two_z2;
 
  281      fxy = two_xy - two_zr;
 
  282      fyx = two_xy + two_zr;
 
  285      fxz = two_xz + two_yr;
 
  286      fzx = two_xz - two_yr;
 
  289      fyz = two_yz - two_xr;
 
  290      fzy = two_yz + two_xr;
 
  328         Warning(
"Rotate(angle,axis)",
" zero axis");
 
  331         Double_t dx = axis.
X()/ll, dy = axis.
Y()/ll, dz = axis.
Z()/ll;
 
  333             ca+(1-ca)*dx*dx,          (1-ca)*dx*dy-sa*dz,    (1-ca)*dx*dz+sa*dy,
 
  334             (1-ca)*dy*dx+sa*dz, ca+(1-ca)*dy*dy,          (1-ca)*dy*dz-sa*dx,
 
  335             (1-ca)*dz*dx-sa*dy,    (1-ca)*dz*dy+sa*dx, ca+(1-ca)*dz*dz );
 
  408      Warning(
"RotateAxes",
"bad axis vectors");
 
  412                                 newX.
Y(), newY.
Y(), newZ.
Y(),
 
  413                                 newX.
Z(), newY.
Z(), newZ.
Z()));
 
  583      Warning(
"GetPhi()",
" |fzz| > 1 ");
 
  589      const Double_t cscTheta = 1/sinTheta;
 
  592         Warning(
"GetPhi()",
"finds | cos phi | > 1");
 
  598      } 
else if (
fzx < 0) {
 
  600      } 
else if (
fzy > 0) {
 
  609      } 
else if (
fxy < 0) {
 
  645   double finalPsi = 0.0;
 
  649      Warning(
"GetPsi()",
" |fzz| > 1 ");
 
  655      const Double_t cscTheta = 1/sinTheta;
 
  658         Warning(
"GetPsi()",
"| cos psi | > 1 ");
 
  664      } 
else if (
fxz < 0) {
 
  672         Warning(
"GetPsi()",
"| fxx | > 1 ");
 
  678      } 
else if (
fyx < 0) {
 
  771      Warning(
"MakeBasis(X,Y,Z)",
"non-zero Z Axis is required");
 
  782   yAxis = zAxis.
Cross(xAxis)*(1.0/xmag);
 
  790   xAxis = yAxis.
Cross(zAxis);
 
Mother of all ROOT objects.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Quaternion is a 4-component mathematic object quite convenient when dealing with space rotation (or r...
The TRotation class describes a rotation of objects of the TVector3 class.
TRotation & SetToIdentity()
TRotation & SetZAxis(const TVector3 &axis)
Set Z axis.
Double_t PhiY() const
Return Phi.
TRotation & Rotate(Double_t, const TVector3 &)
Rotate along an axis.
void SetXPhi(Double_t)
Set XPhi.
Double_t GetYPhi(void) const
Return YPhi.
Double_t operator()(int, int) const
Dereferencing operator const.
Double_t ThetaY() const
Return Theta.
TRotation & RotateYEulerAngles(Double_t phi, Double_t theta, Double_t psi)
Rotate using the y-convention.
void SetYPhi(Double_t)
Set YPhi.
TRotation & SetYAxis(const TVector3 &axis)
Set Y axis.
Double_t GetXPsi(void) const
Get psi angle.
void SetXPsi(Double_t)
Set XPsi.
Double_t PhiX() const
Return Phi.
TRotation & Transform(const TRotation &)
TRotation & RotateY(Double_t)
Rotate around y.
Double_t PhiZ() const
Return Phi.
TRotation & RotateZ(Double_t)
Rotate around z.
TVector3 operator*(const TVector3 &) const
Double_t GetYPsi(void) const
Return YPsi.
Double_t GetYTheta(void) const
Return YTheta.
TRotation & RotateXEulerAngles(Double_t phi, Double_t theta, Double_t psi)
Rotate using the x-convention.
TRotation & SetXEulerAngles(Double_t phi, Double_t theta, Double_t psi)
Rotate using the x-convention (Landau and Lifshitz, Goldstein, &c) by doing the explicit rotations.
void AngleAxis(Double_t &, TVector3 &) const
Rotation defined by an angle and a vector.
Double_t ThetaZ() const
Return Theta.
void SetYPsi(Double_t)
Set YPsi.
void SetYTheta(Double_t)
Set YTheta.
TRotation & SetYEulerAngles(Double_t phi, Double_t theta, Double_t psi)
Rotate using the y-convention.
void MakeBasis(TVector3 &xAxis, TVector3 &yAxis, TVector3 &zAxis) const
Make the Z axis into a unit variable.
TRotation & RotateAxes(const TVector3 &newX, const TVector3 &newY, const TVector3 &newZ)
Rotate axes.
void SetXTheta(Double_t)
Set XTheta.
Double_t GetXPhi(void) const
Return phi angle.
TRotation & SetXAxis(const TVector3 &axis)
Set X axis.
Double_t GetXTheta(void) const
Return XTheta.
Double_t ThetaX() const
Return Theta.
TRotation & RotateX(Double_t)
Rotate around x.
TVector3 is a general three vector class, which can be used for the description of different vectors ...
Double_t Dot(const TVector3 &) const
TVector3 Orthogonal() const
TVector3 Cross(const TVector3 &) const
static constexpr double s
constexpr Double_t PiOver2()
Double_t ATan2(Double_t, Double_t)
Double_t Sqrt(Double_t x)