1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
/** \file RigidBodyAlignmentParameters.cc
*
* Version : $Revision: 1.13 $
* last update: $Date: 2007/10/08 15:56:01 $
* by : $Author: cklae $
*/
#include "FWCore/Utilities/interface/Exception.h"
#include "Alignment/CommonAlignment/interface/Alignable.h"
#include "Alignment/CommonAlignment/interface/AlignableDetOrUnitPtr.h"
#include "Alignment/CommonAlignmentParametrization/interface/AlignmentParametersFactory.h"
#include "Alignment/CommonAlignmentParametrization/interface/FrameToFrameDerivative.h"
#include "Alignment/CommonAlignmentParametrization/interface/KarimakiAlignmentDerivatives.h"
#include "CondFormats/Alignment/interface/Definitions.h"
// This class's header
#include "Alignment/CommonAlignmentParametrization/interface/RigidBodyAlignmentParameters.h"
//__________________________________________________________________________________________________
RigidBodyAlignmentParameters::RigidBodyAlignmentParameters(Alignable *ali, bool calcMis)
: AlignmentParameters(ali, displacementFromAlignable(calcMis ? ali : nullptr), AlgebraicSymMatrix(N_PARAM, 0)) {}
//__________________________________________________________________________________________________
RigidBodyAlignmentParameters::RigidBodyAlignmentParameters(Alignable *alignable,
const AlgebraicVector ¶meters,
const AlgebraicSymMatrix &covMatrix)
: AlignmentParameters(alignable, parameters, covMatrix) {
if (parameters.num_row() != N_PARAM) {
throw cms::Exception("BadParameters")
<< "in RigidBodyAlignmentParameters(): " << parameters.num_row() << " instead of " << N_PARAM << " parameters.";
}
}
//__________________________________________________________________________________________________
RigidBodyAlignmentParameters::RigidBodyAlignmentParameters(Alignable *alignable,
const AlgebraicVector ¶meters,
const AlgebraicSymMatrix &covMatrix,
const std::vector<bool> &selection)
: AlignmentParameters(alignable, parameters, covMatrix, selection) {
if (parameters.num_row() != N_PARAM) {
throw cms::Exception("BadParameters")
<< "in RigidBodyAlignmentParameters(): " << parameters.num_row() << " instead of " << N_PARAM << " parameters.";
}
}
//__________________________________________________________________________________________________
RigidBodyAlignmentParameters *RigidBodyAlignmentParameters::clone(const AlgebraicVector ¶meters,
const AlgebraicSymMatrix &covMatrix) const {
RigidBodyAlignmentParameters *rbap = new RigidBodyAlignmentParameters(alignable(), parameters, covMatrix, selector());
if (userVariables())
rbap->setUserVariables(userVariables()->clone());
rbap->setValid(isValid());
return rbap;
}
//__________________________________________________________________________________________________
RigidBodyAlignmentParameters *RigidBodyAlignmentParameters::cloneFromSelected(
const AlgebraicVector ¶meters, const AlgebraicSymMatrix &covMatrix) const {
RigidBodyAlignmentParameters *rbap = new RigidBodyAlignmentParameters(
alignable(), expandVector(parameters, selector()), expandSymMatrix(covMatrix, selector()), selector());
if (userVariables())
rbap->setUserVariables(userVariables()->clone());
rbap->setValid(isValid());
return rbap;
}
//__________________________________________________________________________________________________
AlgebraicMatrix RigidBodyAlignmentParameters::derivatives(const TrajectoryStateOnSurface &tsos,
const AlignableDetOrUnitPtr &alidet) const {
const Alignable *ali = this->alignable(); // Alignable of these parameters
if (ali == alidet) { // same alignable => same frame
return KarimakiAlignmentDerivatives()(tsos);
} else { // different alignable => transform into correct frame
const AlgebraicMatrix deriv = KarimakiAlignmentDerivatives()(tsos);
FrameToFrameDerivative ftfd;
return ftfd.frameToFrameDerivative(alidet, ali).T() * deriv;
}
}
//__________________________________________________________________________________________________
AlgebraicMatrix RigidBodyAlignmentParameters::selectedDerivatives(const TrajectoryStateOnSurface &tsos,
const AlignableDetOrUnitPtr &alignableDet) const {
const AlgebraicMatrix dev = this->derivatives(tsos, alignableDet);
int ncols = dev.num_col();
int nrows = dev.num_row();
int nsel = numSelected();
AlgebraicMatrix seldev(nsel, ncols);
int ir2 = 0;
for (int irow = 0; irow < nrows; ++irow) {
if (selector()[irow]) {
for (int icol = 0; icol < ncols; ++icol)
seldev[ir2][icol] = dev[irow][icol];
++ir2;
}
}
return seldev;
}
//__________________________________________________________________________________________________
AlgebraicVector RigidBodyAlignmentParameters::translation(void) const {
AlgebraicVector shift(3);
for (int i = 0; i < 3; ++i)
shift[i] = theData->parameters()[i];
return shift;
}
//__________________________________________________________________________________________________
AlgebraicVector RigidBodyAlignmentParameters::rotation(void) const {
AlgebraicVector rot(3);
for (int i = 0; i < 3; ++i)
rot[i] = theData->parameters()[i + 3];
return rot;
}
//__________________________________________________________________________________________________
void RigidBodyAlignmentParameters::apply() {
Alignable *alignable = this->alignable();
if (!alignable) {
throw cms::Exception("BadParameters") << "RigidBodyAlignmentParameters::apply: parameters without alignable";
}
// Translation in local frame
AlgebraicVector shift = this->translation(); // fixme: should be LocalVector
// Translation local->global
align::LocalVector lv(shift[0], shift[1], shift[2]);
alignable->move(alignable->surface().toGlobal(lv));
// Rotation in local frame
align::EulerAngles angles = this->rotation();
// original code:
// alignable->rotateInLocalFrame( align::toMatrix(angles) );
// correct for rounding errors:
align::RotationType rot = alignable->surface().toGlobal(align::toMatrix(angles));
align::rectify(rot);
alignable->rotateInGlobalFrame(rot);
}
//__________________________________________________________________________________________________
int RigidBodyAlignmentParameters::type() const { return AlignmentParametersFactory::kRigidBody; }
//__________________________________________________________________________________________________
AlgebraicVector RigidBodyAlignmentParameters::globalParameters(void) const {
AlgebraicVector m_GlobalParameters(N_PARAM, 0);
const AlgebraicVector shift = translation(); // fixme: should return LocalVector
const align::LocalVector lv(shift[0], shift[1], shift[2]);
const align::GlobalVector dg = theAlignable->surface().toGlobal(lv);
m_GlobalParameters[0] = dg.x();
m_GlobalParameters[1] = dg.y();
m_GlobalParameters[2] = dg.z();
const align::EulerAngles eulerglob = theAlignable->surface().toGlobal(rotation());
m_GlobalParameters[3] = eulerglob(1);
m_GlobalParameters[4] = eulerglob(2);
m_GlobalParameters[5] = eulerglob(3);
return m_GlobalParameters;
}
//__________________________________________________________________________________________________
void RigidBodyAlignmentParameters::print(void) const {
std::cout << "Contents of RigidBodyAlignmentParameters:"
<< "\nParameters: " << theData->parameters() << "\nCovariance: " << theData->covariance() << std::endl;
}
//__________________________________________________________________________________________________
AlgebraicVector RigidBodyAlignmentParameters::displacementFromAlignable(const Alignable *ali) {
AlgebraicVector displacement(N_PARAM);
if (ali) {
const align::RotationType &dR = ali->rotation();
const align::LocalVector shifts(ali->globalRotation() * (dR.transposed() * ali->displacement().basicVector()));
const align::EulerAngles angles = align::toAngles(ali->surface().toLocal(dR));
displacement[0] = shifts.x();
displacement[1] = shifts.y();
displacement[2] = shifts.z();
displacement[3] = angles(1);
displacement[4] = angles(2);
displacement[5] = angles(3);
}
return displacement;
}
|