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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
/** \file BeamSpotAlignmentParameters.cc
*
* Version : $Revision: 1.14 $
* last update: $Date: 2008/09/02 15:08:12 $
* by : $Author: flucke $
*/
#include "FWCore/Utilities/interface/Exception.h"
#include "Alignment/CommonAlignment/interface/Alignable.h"
#include "Alignment/CommonAlignment/interface/AlignableDetOrUnitPtr.h"
#include "Alignment/CommonAlignment/interface/Utilities.h"
#include "Alignment/CommonAlignmentParametrization/interface/AlignmentParametersFactory.h"
#include "Alignment/CommonAlignmentParametrization/interface/BeamSpotAlignmentDerivatives.h"
#include "CondFormats/Alignment/interface/Definitions.h"
// This class's header
#include "Alignment/CommonAlignmentParametrization/interface/BeamSpotAlignmentParameters.h"
//__________________________________________________________________________________________________
BeamSpotAlignmentParameters::BeamSpotAlignmentParameters(Alignable *ali, bool calcMis)
: AlignmentParameters(ali, displacementFromAlignable(calcMis ? ali : nullptr), AlgebraicSymMatrix(N_PARAM, 0)) {}
//__________________________________________________________________________________________________
BeamSpotAlignmentParameters::BeamSpotAlignmentParameters(Alignable *alignable,
const AlgebraicVector ¶meters,
const AlgebraicSymMatrix &covMatrix)
: AlignmentParameters(alignable, parameters, covMatrix) {
if (parameters.num_row() != N_PARAM) {
throw cms::Exception("BadParameters")
<< "in BeamSpotAlignmentParameters(): " << parameters.num_row() << " instead of " << N_PARAM << " parameters.";
}
}
//__________________________________________________________________________________________________
BeamSpotAlignmentParameters::BeamSpotAlignmentParameters(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 BeamSpotAlignmentParameters(): " << parameters.num_row() << " instead of " << N_PARAM << " parameters.";
}
}
//__________________________________________________________________________________________________
BeamSpotAlignmentParameters::~BeamSpotAlignmentParameters() {}
//__________________________________________________________________________________________________
BeamSpotAlignmentParameters *BeamSpotAlignmentParameters::clone(const AlgebraicVector ¶meters,
const AlgebraicSymMatrix &covMatrix) const {
BeamSpotAlignmentParameters *rbap = new BeamSpotAlignmentParameters(alignable(), parameters, covMatrix, selector());
if (userVariables())
rbap->setUserVariables(userVariables()->clone());
rbap->setValid(isValid());
return rbap;
}
//__________________________________________________________________________________________________
BeamSpotAlignmentParameters *BeamSpotAlignmentParameters::cloneFromSelected(const AlgebraicVector ¶meters,
const AlgebraicSymMatrix &covMatrix) const {
BeamSpotAlignmentParameters *rbap = new BeamSpotAlignmentParameters(
alignable(), expandVector(parameters, selector()), expandSymMatrix(covMatrix, selector()), selector());
if (userVariables())
rbap->setUserVariables(userVariables()->clone());
rbap->setValid(isValid());
return rbap;
}
//__________________________________________________________________________________________________
AlgebraicMatrix BeamSpotAlignmentParameters::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 BeamSpotAlignmentDerivatives()(tsos);
} else {
throw cms::Exception("MisMatch") << "BeamSpotAlignmentParameters::derivatives: The hit alignable must "
"match the "
<< "aligned one, i.e. these parameters make only sense for "
"AlignableBeamSpot.\n";
return AlgebraicMatrix(N_PARAM, 2); // please compiler
}
}
//__________________________________________________________________________________________________
AlgebraicMatrix BeamSpotAlignmentParameters::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 BeamSpotAlignmentParameters::translation(void) const {
AlgebraicVector shift(3);
for (int i = 0; i < 2; ++i)
shift[i] = theData->parameters()[i];
shift[2] = 0.0;
return shift;
}
//__________________________________________________________________________________________________
AlgebraicVector BeamSpotAlignmentParameters::rotation(void) const {
AlgebraicVector rot(3);
double dxdz = theData->parameters()[2];
double dydz = theData->parameters()[3];
double angleY = std::atan(dxdz);
double angleX = -std::atan(dydz);
align::RotationType rotY(std::cos(angleY), 0., -std::sin(angleY), 0., 1., 0., std::sin(angleY), 0., std::cos(angleY));
align::RotationType rotX(1., 0., 0., 0., std::cos(angleX), std::sin(angleX), 0., -std::sin(angleX), std::cos(angleX));
align::EulerAngles angles = align::toAngles(rotY * rotX);
rot[0] = angles(1);
rot[1] = angles(2);
rot[2] = angles(3);
return rot;
}
//__________________________________________________________________________________________________
void BeamSpotAlignmentParameters::apply() {
Alignable *alignable = this->alignable();
if (!alignable) {
throw cms::Exception("BadParameters") << "BeamSpotAlignmentParameters::apply: parameters without alignable";
}
// Translation in local frame
AlgebraicVector shift = this->translation(); // fixme: should be LocalVector
// Translation local->global
align::GlobalVector gv(shift[0], shift[1], shift[2]);
alignable->move(gv);
// 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 BeamSpotAlignmentParameters::type() const { return AlignmentParametersFactory::kBeamSpot; }
//__________________________________________________________________________________________________
AlgebraicVector BeamSpotAlignmentParameters::globalParameters(void) const {
AlgebraicVector m_GlobalParameters(N_PARAM, 0);
const AlgebraicVector shift = translation(); // fixme: should return LocalVector
const align::GlobalVector dg(shift[0], shift[1], 0);
m_GlobalParameters[0] = dg.x();
m_GlobalParameters[1] = dg.y();
align::LocalVector lv(0.0, 0.0, 1.0);
align::GlobalVector gv = theAlignable->surface().toGlobal(lv);
double dxdz = gv.x() / gv.z();
double dydz = gv.x() / gv.z();
m_GlobalParameters[2] = dxdz;
m_GlobalParameters[3] = dydz;
return m_GlobalParameters;
}
//__________________________________________________________________________________________________
void BeamSpotAlignmentParameters::print(void) const {
std::cout << "Contents of BeamSpotAlignmentParameters:"
<< "\nParameters: " << theData->parameters() << "\nCovariance: " << theData->covariance() << std::endl;
}
//__________________________________________________________________________________________________
AlgebraicVector BeamSpotAlignmentParameters::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()));
align::GlobalVector gv(0.0, 0.0, 1.0);
align::LocalVector lv(dR.transposed() * gv.basicVector());
displacement[0] = shifts.x();
displacement[1] = shifts.y();
displacement[2] = lv.x() / lv.z();
displacement[3] = lv.y() / lv.z();
}
return displacement;
}
|