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