File indexing completed on 2023-03-17 10:38:57
0001
0002
0003
0004
0005
0006
0007
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/Utilities/interface/Exception.h"
0010
0011 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
0012
0013 #include "Alignment/CommonAlignment/interface/Alignable.h"
0014 #include "Alignment/CommonAlignment/interface/AlignableDetOrUnitPtr.h"
0015 #include "Alignment/CommonAlignmentParametrization/interface/AlignmentParametersFactory.h"
0016 #include "Alignment/CommonAlignmentParametrization/interface/KarimakiAlignmentDerivatives.h"
0017 #include "CondFormats/Alignment/interface/Definitions.h"
0018 #include "Geometry/CommonTopologies/interface/BowedSurfaceDeformation.h"
0019
0020
0021 #include "Alignment/CommonAlignmentParametrization/interface/BowedSurfaceAlignmentParameters.h"
0022
0023 #include <iostream>
0024
0025 BowedSurfaceAlignmentParameters::BowedSurfaceAlignmentParameters(Alignable *ali)
0026 : AlignmentParameters(ali, AlgebraicVector(N_PARAM), AlgebraicSymMatrix(N_PARAM, 0)) {}
0027
0028
0029 BowedSurfaceAlignmentParameters ::BowedSurfaceAlignmentParameters(Alignable *alignable,
0030 const AlgebraicVector ¶meters,
0031 const AlgebraicSymMatrix &covMatrix)
0032 : AlignmentParameters(alignable, parameters, covMatrix) {
0033 if (parameters.num_row() != N_PARAM) {
0034 throw cms::Exception("BadParameters") << "in BowedSurfaceAlignmentParameters(): " << parameters.num_row()
0035 << " instead of " << N_PARAM << " parameters.";
0036 }
0037 }
0038
0039
0040 BowedSurfaceAlignmentParameters ::BowedSurfaceAlignmentParameters(Alignable *alignable,
0041 const AlgebraicVector ¶meters,
0042 const AlgebraicSymMatrix &covMatrix,
0043 const std::vector<bool> &selection)
0044 : AlignmentParameters(alignable, parameters, covMatrix, selection) {
0045 if (parameters.num_row() != N_PARAM) {
0046 throw cms::Exception("BadParameters") << "in BowedSurfaceAlignmentParameters(): " << parameters.num_row()
0047 << " instead of " << N_PARAM << " parameters.";
0048 }
0049 }
0050
0051
0052 BowedSurfaceAlignmentParameters *BowedSurfaceAlignmentParameters::clone(const AlgebraicVector ¶meters,
0053 const AlgebraicSymMatrix &covMatrix) const {
0054 BowedSurfaceAlignmentParameters *rbap =
0055 new BowedSurfaceAlignmentParameters(this->alignable(), parameters, covMatrix, selector());
0056
0057 if (this->userVariables())
0058 rbap->setUserVariables(this->userVariables()->clone());
0059 rbap->setValid(this->isValid());
0060
0061 return rbap;
0062 }
0063
0064
0065 BowedSurfaceAlignmentParameters *BowedSurfaceAlignmentParameters::cloneFromSelected(
0066 const AlgebraicVector ¶meters, const AlgebraicSymMatrix &covMatrix) const {
0067 return this->clone(this->expandVector(parameters, this->selector()),
0068 this->expandSymMatrix(covMatrix, this->selector()));
0069 }
0070
0071
0072 AlgebraicMatrix BowedSurfaceAlignmentParameters::derivatives(const TrajectoryStateOnSurface &tsos,
0073 const AlignableDetOrUnitPtr &alidet) const {
0074 const Alignable *ali = this->alignable();
0075
0076 if (ali == alidet) {
0077 const AlignableSurface &surf = ali->surface();
0078 return BowedDerivs()(tsos, surf.width(), surf.length());
0079 } else {
0080
0081
0082
0083
0084
0085
0086 throw cms::Exception("MisMatch") << "BowedSurfaceAlignmentParameters::derivatives: The hit alignable "
0087 "must match the "
0088 << "aligned one (i.e. bowed surface parameters cannot be used for "
0089 "composed alignables)\n";
0090 return AlgebraicMatrix(N_PARAM, 2);
0091 }
0092 }
0093
0094
0095 align::LocalVector BowedSurfaceAlignmentParameters::translation() const {
0096
0097 const AlgebraicVector ¶ms = theData->parameters();
0098 return align::LocalVector(params[dx], params[dy], params[dz]);
0099 }
0100
0101
0102 align::EulerAngles BowedSurfaceAlignmentParameters::rotation() const {
0103 const AlgebraicVector ¶ms = theData->parameters();
0104 const Alignable *alignable = this->alignable();
0105 const AlignableSurface &surface = alignable->surface();
0106
0107 align::EulerAngles eulerAngles(3);
0108
0109
0110 eulerAngles[0] = params[dslopeY] * 2. / surface.length();
0111 eulerAngles[1] = -params[dslopeX] * 2. / surface.width();
0112 const double aScale = BowedDerivs::gammaScale(surface.width(), surface.length());
0113 eulerAngles[2] = params[drotZ] / aScale;
0114
0115 return eulerAngles;
0116 }
0117
0118
0119 void BowedSurfaceAlignmentParameters::apply() {
0120 Alignable *alignable = this->alignable();
0121 if (!alignable) {
0122 throw cms::Exception("BadParameters") << "BowedSurfaceAlignmentParameters::apply: parameters without "
0123 "alignable";
0124 }
0125
0126
0127 alignable->move(alignable->surface().toGlobal(this->translation()));
0128
0129
0130 const align::EulerAngles angles(this->rotation());
0131
0132
0133
0134 align::RotationType rot(alignable->surface().toGlobal(align::toMatrix(angles)));
0135 align::rectify(rot);
0136 alignable->rotateInGlobalFrame(rot);
0137
0138
0139 if (selector()[dsagittaX] || selector()[dsagittaXY] || selector()[dsagittaY]) {
0140 const auto ¶ms = theData->parameters();
0141 const BowedSurfaceDeformation deform{params[dsagittaX], params[dsagittaXY], params[dsagittaY]};
0142
0143
0144
0145
0146 alignable->addSurfaceDeformation(&deform, false);
0147 }
0148 }
0149
0150
0151 int BowedSurfaceAlignmentParameters::type() const { return AlignmentParametersFactory::kBowedSurface; }
0152
0153
0154 void BowedSurfaceAlignmentParameters::print() const {
0155 std::cout << "Contents of BowedSurfaceAlignmentParameters:"
0156 << "\nParameters: " << theData->parameters() << "\nCovariance: " << theData->covariance() << std::endl;
0157 }