CMS 3D CMS Logo

BowedSurfaceAlignmentParameters.cc
Go to the documentation of this file.
1 
10 
12 
19 
20 // This class's header
22 
23 #include <iostream>
24 //_________________________________________________________________________________________________
26  : AlignmentParameters(ali, AlgebraicVector(N_PARAM), AlgebraicSymMatrix(N_PARAM, 0)) {}
27 
28 //_________________________________________________________________________________________________
31  const AlgebraicSymMatrix &covMatrix)
32  : AlignmentParameters(alignable, parameters, covMatrix) {
33  if (parameters.num_row() != N_PARAM) {
34  throw cms::Exception("BadParameters") << "in BowedSurfaceAlignmentParameters(): " << parameters.num_row()
35  << " instead of " << N_PARAM << " parameters.";
36  }
37 }
38 
39 //_________________________________________________________________________________________________
42  const AlgebraicSymMatrix &covMatrix,
43  const std::vector<bool> &selection)
44  : AlignmentParameters(alignable, parameters, covMatrix, selection) {
45  if (parameters.num_row() != N_PARAM) {
46  throw cms::Exception("BadParameters") << "in BowedSurfaceAlignmentParameters(): " << parameters.num_row()
47  << " instead of " << N_PARAM << " parameters.";
48  }
49 }
50 
51 //_________________________________________________________________________________________________
53  const AlgebraicSymMatrix &covMatrix) const {
55  new BowedSurfaceAlignmentParameters(this->alignable(), parameters, covMatrix, selector());
56 
57  if (this->userVariables())
58  rbap->setUserVariables(this->userVariables()->clone());
59  rbap->setValid(this->isValid());
60 
61  return rbap;
62 }
63 
64 //_________________________________________________________________________________________________
66  const AlgebraicVector &parameters, const AlgebraicSymMatrix &covMatrix) const {
67  return this->clone(this->expandVector(parameters, this->selector()),
68  this->expandSymMatrix(covMatrix, this->selector()));
69 }
70 
71 //_________________________________________________________________________________________________
73  const AlignableDetOrUnitPtr &alidet) const {
74  const Alignable *ali = this->alignable(); // Alignable of these parameters
75 
76  if (ali == alidet) {
77  const AlignableSurface &surf = ali->surface();
78  return BowedDerivs()(tsos, surf.width(), surf.length());
79  } else {
80  // We could give this a meaning by applying frame-to-frame derivatives
81  // to the first six parameters (be careful that alpha and beta changed
82  // their scale and switched their place compared to RigidBody!) and
83  // keep the remaining three untouched in local meaning.
84  // In this way we could do higher level alignment and determine 'average'
85  // surface structures for the components.
86  throw cms::Exception("MisMatch") << "BowedSurfaceAlignmentParameters::derivatives: The hit alignable "
87  "must match the "
88  << "aligned one (i.e. bowed surface parameters cannot be used for "
89  "composed alignables)\n";
90  return AlgebraicMatrix(N_PARAM, 2); // please compiler
91  }
92 }
93 
94 //_________________________________________________________________________________________________
96  // align::LocalVector uses double while LocalVector uses float only!
97  const AlgebraicVector &params = theData->parameters();
98  return align::LocalVector(params[dx], params[dy], params[dz]);
99 }
100 
101 //_________________________________________________________________________________________________
103  const AlgebraicVector &params = theData->parameters();
104  const Alignable *alignable = this->alignable();
105  const AlignableSurface &surface = alignable->surface();
106 
107  align::EulerAngles eulerAngles(3);
108  // Note that dslopeX <-> -beta and dslopeY <-> alpha:
109  // Should we use atan of these values? Anyway it is small...
110  eulerAngles[0] = params[dslopeY] * 2. / surface.length();
111  eulerAngles[1] = -params[dslopeX] * 2. / surface.width();
112  const double aScale = BowedDerivs::gammaScale(surface.width(), surface.length());
113  eulerAngles[2] = params[drotZ] / aScale;
114 
115  return eulerAngles;
116 }
117 
118 //_________________________________________________________________________________________________
120  Alignable *alignable = this->alignable();
121  if (!alignable) {
122  throw cms::Exception("BadParameters") << "BowedSurfaceAlignmentParameters::apply: parameters without "
123  "alignable";
124  }
125 
126  // Get translation in local frame, transform to global and apply:
127  alignable->move(alignable->surface().toGlobal(this->translation()));
128 
129  // Rotation in local frame
130  const align::EulerAngles angles(this->rotation());
131  // original code:
132  // alignable->rotateInLocalFrame( align::toMatrix(angles) );
133  // correct for rounding errors:
134  align::RotationType rot(alignable->surface().toGlobal(align::toMatrix(angles)));
136  alignable->rotateInGlobalFrame(rot);
137 
138  // only update the surface deformations if they were selected for alignment
140  const auto &params = theData->parameters();
141  const BowedSurfaceDeformation deform{params[dsagittaX], params[dsagittaXY], params[dsagittaY]};
142 
143  // FIXME: true to propagate down?
144  // Needed for hierarchy with common deformation parameter,
145  // but that is not possible now anyway.
146  alignable->addSurfaceDeformation(&deform, false);
147  }
148 }
149 
150 //_________________________________________________________________________________________________
152 
153 //_________________________________________________________________________________________________
155  std::cout << "Contents of BowedSurfaceAlignmentParameters:"
156  << "\nParameters: " << theData->parameters() << "\nCovariance: " << theData->covariance() << std::endl;
157 }
align::Scalar width() const
selection
main part
Definition: corrVsCorr.py:100
BowedSurfaceAlignmentParameters * cloneFromSelected(const AlgebraicVector &parameters, const AlgebraicSymMatrix &covMatrix) const override
Clone selected parameters (for update of parameters)
AlgebraicSymMatrix expandSymMatrix(const AlgebraicSymMatrix &m, const std::vector< bool > &sel) const
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
BowedSurfaceAlignmentParameters(Alignable *alignable)
Constructor with empty parameters/covariance.
align::LocalVector translation() const
Get translation parameters in double precision.
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
void print() const
print parameters to screen
align::EulerAngles rotation() const
Get rotation parameters.
CLHEP::HepMatrix AlgebraicMatrix
void rectify(RotationType &)
Correct a rotation matrix for rounding errors.
Definition: Utilities.cc:198
void setValid(bool v)
Set validity flag.
virtual void addSurfaceDeformation(const SurfaceDeformation *deformation, bool propagateDown)=0
void apply() override
apply parameters to alignable
int type() const override
tell type (AlignmentParametersFactory::ParametersType - but no circular dependency) ...
AlgebraicMatrix derivatives(const TrajectoryStateOnSurface &tsos, const AlignableDetOrUnitPtr &aliDet) const override
Get all derivatives.
static double gammaScale(double width, double splitLength)
Alignable * alignable(void) const
Get pointer to corresponding alignable.
Vector3DBase< Scalar, LocalTag > LocalVector
Definition: Definitions.h:34
BowedSurfaceAlignmentParameters * clone(const AlgebraicVector &parameters, const AlgebraicSymMatrix &covMatrix) const override
Clone all parameters (for update of parameters)
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
Definition: Alignable.h:135
CLHEP::HepVector AlgebraicVector
AlgebraicVector EulerAngles
Definition: Definitions.h:36
align::Scalar length() const
AlgebraicVector expandVector(const AlgebraicVector &m, const std::vector< bool > &sel) const
void setUserVariables(AlignmentUserVariables *auv)
Set pointer to user variables.
virtual void rotateInGlobalFrame(const RotationType &rotation)=0
BowedSurfaceAlignmentDerivatives BowedDerivs
Give parameters a name.
bool isValid(void) const
Get validity flag.
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
Definition: Utilities.cc:42
CLHEP::HepSymMatrix AlgebraicSymMatrix