Belle II Software  light-2205-abys
RotationTools.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 
11 #include <framework/geometry/B2Vector3.h>
12 
13 /* External headers. */
14 #include <TMatrixDSym.h>
15 #include <TMatrixD.h>
16 #include <TVectorD.h>
17 #include <TRotation.h>
18 #include <Math/Vector3D.h>
19 
20 namespace Belle2 {
26  namespace RotationTools {
27 
32  inline TMatrixD toMatrix(TRotation r)
33  {
34  TMatrixD rM(3, 3);
35  for (int i = 0; i < 3; ++i)
36  for (int j = 0; j < 3; ++j)
37  rM(i, j) = r(i, j);
38  return rM;
39  }
40 
41 
48  inline TMatrixD getRotationMatrixYZ(double angleY, double angleZ)
49  {
50  TRotation r;
51  r.RotateY(angleY);
52  r.RotateZ(angleZ);
53  return toMatrix(r);
54  }
55 
56 
63  inline TMatrixD getRotationMatrixXY(double angleX, double angleY)
64  {
65  TRotation r;
66  r.RotateX(angleX);
67  r.RotateY(angleY);
68  return toMatrix(r);
69  }
70 
71 
72 
79  inline TMatrixD rotateTensor(const B2Vector3D& vTo, const TMatrixD& orgMat)
80  {
81  TMatrixD r = getRotationMatrixYZ(vTo.Theta(), vTo.Phi());
82  TMatrixD rT = r; rT.T();
83  return r * orgMat * rT;
84  }
85 
92  inline TMatrixD rotateTensorInv(const ROOT::Math::XYZVector& vTo, const TMatrixD& orgMat)
93  {
94  TMatrixD r = getRotationMatrixYZ(vTo.Theta(), vTo.Phi());
95  TMatrixD rT = r; rT.T();
96  return rT * orgMat * r;
97  }
98 
99 
106  inline TMatrixDSym toSymMatrix(const TMatrixD& m)
107  {
108  TMatrixDSym mS(m.GetNrows());
109  for (int i = 0; i < m.GetNrows(); ++i)
110  for (int j = 0; j < m.GetNcols(); ++j) {
111  mS(i, j) = (m(i, j) + m(j, i)) / 2;
112  }
113  return mS;
114  }
115 
116 
121  inline TVectorD toVec(B2Vector3D v)
122  {
123  return TVectorD(0, 2, v.X(), v.Y(), v.Z(), "END");
124  }
125 
130  B2Vector3D getUnitOrthogonal(B2Vector3D v)
131  {
132  return B2Vector3D(v.Z(), 0, -v.X()).Unit();
133  }
134 
135  }
136 
138 }
B2Vector3< DataType > Unit() const
Unit vector parallel to this.
Definition: B2Vector3.h:263
B2Vector3< double > B2Vector3D
typedef for common usage with double
Definition: B2Vector3.h:502
Abstract base class for different kinds of events.
Definition: ClusterUtils.h:23