CMS 3D CMS Logo

TwoBowedSurfacesDeformation.cc
Go to the documentation of this file.
1 
6 
8 
9 // already included via header:
10 // #include <vector>
11 
12 //------------------------------------------------------------------------------
14  if (pars.size() != parameterSize()) {
15  edm::LogError("BadSetup") << "@SUB=TwoBowedSurfacesDeformation"
16  << "Input vector of wrong size " << pars.size() << " instead of " << parameterSize()
17  << ", add zeros to fill up!";
18  }
19  for (unsigned int i = 0; i != std::min((unsigned int)(pars.size()), parameterSize()); ++i)
20  theParameters[i] = pars[i];
21  for (unsigned int i = pars.size(); i != parameterSize(); ++i)
22  theParameters[i] = 0;
23 }
24 
25 //------------------------------------------------------------------------------
27  return new TwoBowedSurfacesDeformation(*this);
28 }
29 
30 //------------------------------------------------------------------------------
32 
33 //------------------------------------------------------------------------------
35  const LocalTrackAngles &localAngles,
36  double length,
37  double width) const {
38  const double ySplit = theParameters[k_ySplit()];
39 
40  // treatment of different widthes at high/low y could be done by theRelWidthLowY or so
41  // if (widthLowY > 0. && widthHighY != widthLowY) {
42  // std::cout << "SurfaceDeformation::positionCorrection2Bowed: Cannot yet deal "
43  // << " with different widthes, take " << widthHighY << " not " << widthLowY
44  // << std::endl;
45  // }
46  // const double width = widthHighY;
47 
48  // Some signs depend on whether we are in surface part below or above ySplit:
49  const double sign = (localPos.y() < ySplit ? +1. : -1.);
50  const double yMiddle = ySplit * 0.5 - sign * length * .25;
51  // 'calibrate' y length and transform y to be w.r.t. surface middle
52  const double myY = localPos.y() - yMiddle;
53  const double myLength = length * 0.5 + sign * ySplit;
54 
55  double uRel = 2. * localPos.x() / width; // relative u (-1 .. +1)
56  double vRel = 2. * myY / myLength; // relative v (-1 .. +1)
57  // 'range check':
58  const double cutOff = 1.5;
59  if (uRel < -cutOff) {
60  uRel = -cutOff;
61  } else if (uRel > cutOff) {
62  uRel = cutOff;
63  }
64  if (vRel < -cutOff) {
65  vRel = -cutOff;
66  } else if (vRel > cutOff) {
67  vRel = cutOff;
68  }
69 
70  auto pars = theParameters;
71  // 1st, get dw effect depending
72  // - on the surface sagittas (Legendre polynomials),
73  // see BowedSurfaceAlignmentDerivatives::operator()(..)
74  // - relative dw
75  // - surface specific dalpha (note that this shifts surface specific dw)
76  // - surface specific dbeta
77  const double dw = (uRel * uRel - 1. / 3.) * (pars[0] + sign * pars[9]) // sagittaX
78  + uRel * vRel * (pars[1] + sign * pars[10]) // sagittaXY
79  + (vRel * vRel - 1. / 3.) * (pars[2] + sign * pars[11]) // sagittaY
80  + sign * pars[5] // different dw
81  + myY * sign * pars[6] // different dalpha
82  - localPos.x() * sign * pars[7]; // different dbeta
83  // 2nd, translate the dw effect to shifts in x and y
84  // Positive dxdz/dydz and positive dw mean negative shift in x/y:
85  Local2DVector::ScalarType x = -dw * localAngles.dxdz();
86  Local2DVector::ScalarType y = -dw * localAngles.dydz();
87  // 3rd, treat in-plane differences depending on surface from xy-shifts...
88  x += (sign * pars[3]); // different du
89  y += (sign * pars[4]); // different dv
90  // ...and gamma-rotation
91  x -= myY * (sign * pars[8]); // different dgamma for u
92  y += localPos.x() * (sign * pars[8]); // different dgamma for v
93 
94  return Local2DVector(x, y);
95 }
96 
97 //------------------------------------------------------------------------------
99  if (this->type() == other.type()) {
100  const std::vector<double> otherParameters(other.parameters());
101  if (otherParameters.size() == parameterSize()) {
102  // Second check in case it is really adding, either way DO NOT check equality directly
103  if (fabs(theParameters[k_ySplit()] - otherParameters[k_ySplit()]) < 1e-5 ||
104  fabs(otherParameters[k_ySplit()]) < 1e-5) {
105  for (unsigned int i = 0; i != parameterSize() - 1; ++i) { // -1 for ySplit
106  // mean bows, delta shifts, delta angles and delta bows can simply be added up
107  theParameters[i] += otherParameters[i];
108  }
109  return true;
110  } else { // ySplit values are different!
111  edm::LogError("Alignment") << "@SUB=TwoBowedSurfacesDeformation::add"
112  << "Different ySplit: this " << theParameters[k_ySplit()] << ", to add "
113  << otherParameters[k_ySplit()];
114  }
115  } // same size
116  } // same type
117 
118  edm::LogError("Alignment") << "@SUB=TwoBowedSurfacesDeformation::add"
119  << "Types are different!";
120 
121  return false;
122 }
123 
124 //------------------------------------------------------------------------------
125 std::vector<double> TwoBowedSurfacesDeformation::parameters() const {
126  return std::vector<double>(theParameters, theParameters + parameterSize());
127 }
T y() const
Definition: PV2DBase.h:44
virtual std::vector< double > parameters() const =0
parameters - interpretation left to the concrete implementation
virtual int type() const =0
specific type, i.e. SurfaceDeformationFactory::Type
double dydz() const
Definition: Topology.h:53
TwoBowedSurfacesDeformation * clone() const override
int type() const override
specific type, i.e. SurfaceDeformationFactory::kTwoBowedSurfaces
Local2DVector positionCorrection(const Local2DPoint &localPos, const LocalTrackAngles &localAngles, double length, double width) const override
TwoBowedSurfacesDeformation(const std::vector< double > &parameters)
T min(T a, T b)
Definition: MathUtil.h:58
double dxdz() const
Definition: Topology.h:52
Vector2DBase< double, LocalTag > Local2DVector
bool add(const SurfaceDeformation &other) override
std::vector< double > parameters() const override
parameters - see constructor for meaning
T x() const
Definition: PV2DBase.h:43