CMS 3D CMS Logo

FrameToFrameDerivative.cc
Go to the documentation of this file.
1 
8 
10 
11 // already in header: #include
12 // "DataFormats/Math/interface/AlgebraicROOTObjects.h"
14 
15 //__________________________________________________________________________________________________
17  const Alignable *composedObject) const {
18  return getDerivative(object->globalRotation(),
19  composedObject->globalRotation(),
20  composedObject->globalPosition() - object->globalPosition());
21 }
22 
23 //__________________________________________________________________________________________________
25  const align::RotationType &composeRot,
26  const align::GlobalPoint &objectPos,
27  const align::GlobalPoint &composePos) const {
28  return asSMatrix<6, 6>(this->getDerivative(objectRot, composeRot, composePos - objectPos));
29 }
30 
31 //__________________________________________________________________________________________________
33  const align::RotationType &composeRot,
34  const align::GlobalVector &posVec) const {
35  AlgebraicMatrix rotDet = transform(objectRot);
36  AlgebraicMatrix rotCompO = transform(composeRot);
37 
38  AlgebraicVector diffVec(3);
39 
40  diffVec(1) = posVec.x();
41  diffVec(2) = posVec.y();
42  diffVec(3) = posVec.z();
43 
45 
46  AlgebraicMatrix derivAA(3, 3);
47  AlgebraicMatrix derivAB(3, 3);
48  AlgebraicMatrix derivBB(3, 3);
49 
50  derivAA = derivativePosPos(rotDet, rotCompO);
51  derivAB = derivativePosRot(rotDet, rotCompO, diffVec);
52  derivBB = derivativeRotRot(rotDet, rotCompO);
53 
54  derivative[0][0] = derivAA[0][0];
55  derivative[0][1] = derivAA[0][1];
56  derivative[0][2] = derivAA[0][2];
57  derivative[0][3] = derivAB[0][0];
58  derivative[0][4] = derivAB[0][1];
59  derivative[0][5] = derivAB[0][2];
60  derivative[1][0] = derivAA[1][0];
61  derivative[1][1] = derivAA[1][1];
62  derivative[1][2] = derivAA[1][2];
63  derivative[1][3] = derivAB[1][0];
64  derivative[1][4] = derivAB[1][1];
65  derivative[1][5] = derivAB[1][2];
66  derivative[2][0] = derivAA[2][0];
67  derivative[2][1] = derivAA[2][1];
68  derivative[2][2] = derivAA[2][2];
69  derivative[2][3] = derivAB[2][0];
70  derivative[2][4] = derivAB[2][1];
71  derivative[2][5] = derivAB[2][2];
72  derivative[3][0] = 0;
73  derivative[3][1] = 0;
74  derivative[3][2] = 0;
75  derivative[3][3] = derivBB[0][0];
76  derivative[3][4] = derivBB[0][1];
77  derivative[3][5] = derivBB[0][2];
78  derivative[4][0] = 0;
79  derivative[4][1] = 0;
80  derivative[4][2] = 0;
81  derivative[4][3] = derivBB[1][0];
82  derivative[4][4] = derivBB[1][1];
83  derivative[4][5] = derivBB[1][2];
84  derivative[5][0] = 0;
85  derivative[5][1] = 0;
86  derivative[5][2] = 0;
87  derivative[5][3] = derivBB[2][0];
88  derivative[5][4] = derivBB[2][1];
89  derivative[5][5] = derivBB[2][2];
90 
91  return derivative;
92 }
93 
94 //__________________________________________________________________________________________________
96  const AlgebraicMatrix &RotRot) const {
97  return RotDet * RotRot.T();
98 }
99 
100 //__________________________________________________________________________________________________
102  const AlgebraicMatrix &RotRot,
103  const AlgebraicVector &S) const {
104  AlgebraicVector dEulerA(3);
105  AlgebraicVector dEulerB(3);
106  AlgebraicVector dEulerC(3);
107  AlgebraicMatrix RotDa(3, 3);
108  AlgebraicMatrix RotDb(3, 3);
109  AlgebraicMatrix RotDc(3, 3);
110 
111  RotDa[1][2] = 1;
112  RotDa[2][1] = -1;
113  RotDb[0][2] = -1;
114  RotDb[2][0] = 1; // New beta sign
115  RotDc[0][1] = 1;
116  RotDc[1][0] = -1;
117 
118  dEulerA = RotDet * (RotRot.T() * RotDa * RotRot * S);
119  dEulerB = RotDet * (RotRot.T() * RotDb * RotRot * S);
120  dEulerC = RotDet * (RotRot.T() * RotDc * RotRot * S);
121 
122  AlgebraicMatrix eulerDeriv(3, 3);
123  eulerDeriv[0][0] = dEulerA[0];
124  eulerDeriv[1][0] = dEulerA[1];
125  eulerDeriv[2][0] = dEulerA[2];
126  eulerDeriv[0][1] = dEulerB[0];
127  eulerDeriv[1][1] = dEulerB[1];
128  eulerDeriv[2][1] = dEulerB[2];
129  eulerDeriv[0][2] = dEulerC[0];
130  eulerDeriv[1][2] = dEulerC[1];
131  eulerDeriv[2][2] = dEulerC[2];
132 
133  return eulerDeriv;
134 }
135 
136 //__________________________________________________________________________________________________
138  const AlgebraicMatrix &RotRot) const {
139  AlgebraicVector dEulerA(3);
140  AlgebraicVector dEulerB(3);
141  AlgebraicVector dEulerC(3);
142  AlgebraicMatrix RotDa(3, 3);
143  AlgebraicMatrix RotDb(3, 3);
144  AlgebraicMatrix RotDc(3, 3);
145 
146  RotDa[1][2] = 1;
147  RotDa[2][1] = -1;
148  RotDb[0][2] = -1;
149  RotDb[2][0] = 1; // New beta sign
150  RotDc[0][1] = 1;
151  RotDc[1][0] = -1;
152 
153  dEulerA = linearEulerAngles(RotDet * RotRot.T() * RotDa * RotRot * RotDet.T());
154  dEulerB = linearEulerAngles(RotDet * RotRot.T() * RotDb * RotRot * RotDet.T());
155  dEulerC = linearEulerAngles(RotDet * RotRot.T() * RotDc * RotRot * RotDet.T());
156 
157  AlgebraicMatrix eulerDeriv(3, 3);
158 
159  eulerDeriv[0][0] = dEulerA[0];
160  eulerDeriv[1][0] = dEulerA[1];
161  eulerDeriv[2][0] = dEulerA[2];
162  eulerDeriv[0][1] = dEulerB[0];
163  eulerDeriv[1][1] = dEulerB[1];
164  eulerDeriv[2][1] = dEulerB[2];
165  eulerDeriv[0][2] = dEulerC[0];
166  eulerDeriv[1][2] = dEulerC[1];
167  eulerDeriv[2][2] = dEulerC[2];
168 
169  return eulerDeriv;
170 }
171 
172 //__________________________________________________________________________________________________
174  AlgebraicMatrix eulerAB(3, 3);
175  AlgebraicVector aB(3);
176  eulerAB[0][1] = 1;
177  eulerAB[1][0] = -1; // New beta sign
178  aB[2] = 1;
179 
180  AlgebraicMatrix eulerC(3, 3);
181  AlgebraicVector C(3);
182  eulerC[2][0] = 1;
183  C[1] = 1;
184 
185  AlgebraicVector eulerAngles(3);
186  eulerAngles = eulerAB * rotDelta * aB + eulerC * rotDelta * C;
187  return eulerAngles;
188 }
Derivative< X, A >::type derivative(const A &_)
Definition: Derivative.h:18
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepStd< double, 6, 6 > > AlgebraicMatrix66
T y() const
Definition: PV3DBase.h:63
const RotationType & globalRotation() const
Return the global orientation of the object.
Definition: Alignable.h:141
static AlgebraicMatrix transform(const align::RotationType &)
Helper to transform from RotationType to AlgebraicMatrix.
AlgebraicMatrix66 getDerivative(const align::RotationType &objectRot, const align::RotationType &composeRot, const align::GlobalPoint &objectPos, const align::GlobalPoint &composePos) const
CLHEP::HepMatrix AlgebraicMatrix
T z() const
Definition: PV3DBase.h:64
AlgebraicMatrix frameToFrameDerivative(const Alignable *object, const Alignable *composedObject) const
CLHEP::HepVector AlgebraicVector
AlgebraicMatrix derivativeRotRot(const AlgebraicMatrix &RotDet, const AlgebraicMatrix &RotRot) const
Calculates the derivative DRot/DRot.
double S(const TLorentzVector &, const TLorentzVector &)
Definition: Particle.cc:99
AlgebraicMatrix derivativePosRot(const AlgebraicMatrix &RotDet, const AlgebraicMatrix &RotRot, const AlgebraicVector &S) const
Calculates the derivative DPos/DRot.
const PositionType & globalPosition() const
Return the global position of the object.
Definition: Alignable.h:138
T x() const
Definition: PV3DBase.h:62
AlgebraicMatrix derivativePosPos(const AlgebraicMatrix &RotDet, const AlgebraicMatrix &RotRot) const
Calculates the derivative DPos/DPos.
AlgebraicVector linearEulerAngles(const AlgebraicMatrix &rotDelta) const
Gets linear approximated euler Angles.