CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ThirdHitPredictionFromInvParabola.h
Go to the documentation of this file.
1 #ifndef ThirdHitPredictionFromInvParabola_H
2 #define ThirdHitPredictionFromInvParabola_H
3 
15 
19 
20 
21 class TrackingRegion;
22 class OrderedHitPair;
23 
24 
26 
27 public:
28  using Scalar=double;
33 
34 
37  Scalar tolerance): theTolerance(tolerance)
38  {
39  init(x1,y1,x2,y2,ip,std::abs(curv));
40  }
41 
43  Scalar ip, Scalar curv, Scalar tolerance);
44 
45 // inline Range operator()(Scalar radius, int charge) const { return rangeRPhiSlow(radius,charge,1); }
46  inline Range operator()(Scalar radius, int charge) const { return rangeRPhi(radius,charge); }
47 
48  Range rangeRPhi(Scalar radius, int charge) const __attribute__ ((optimize(3, "fast-math")));
49  // Range rangeRPhiSlow(Scalar radius, int charge, int nIter=5) const;
50 
51  void init( const GlobalPoint & P1, const GlobalPoint & P2, Scalar ip, Scalar curv) {
52  init( P1.x(), P1.y(), P2.x(),P2.y(),ip,curv);
53  }
54  void init(Scalar x1,Scalar y1, Scalar x2,Scalar y2, Scalar ip, Scalar curv);
55 
56 private:
57 
58  inline Scalar coeffA(Scalar impactParameter) const;
59  inline Scalar coeffB(Scalar impactParameter) const;
60  inline Scalar predV(Scalar u, Scalar ip) const;
61  inline Scalar ipFromCurvature(Scalar curvature, bool pos) const;
62 
63  Point2D transform(Point2D const & p) const {
64  return theRotation.rotate(p)/p.mag2();
65  }
66 
67  Point2D transformBack(Point2D const & p) const {
68  return theRotation.rotateBack(p)/p.mag2();
69  }
70 
71 private:
72 
75 
76  // formula is symmetric for (ip,pos) -> (-ip,neg)
77  inline void findPointAtCurve(Scalar radius, Scalar ip, Scalar &u, Scalar &v) const;
78 
81 
82 };
83 
84 
85 
87  coeffA(Scalar impactParameter) const
88 {
89  auto c = -pv*overDu;
90  return c - u1u2*impactParameter;
91 }
92 
94  coeffB(Scalar impactParameter) const
95 {
96  auto c = dv*overDu;
97  return c - su*impactParameter;
98 }
99 
102 {
103  Scalar overU1u2 = 1./u1u2;
104  Scalar inInf = -pv*overDu*overU1u2;
105  return (pos? inInf : -inInf) -curvature*overU1u2*0.5;
106 }
107 
108 
110 predV( Scalar u, Scalar ip) const
111 {
112  auto c = -( coeffA(ip) - coeffB(ip*u) - ip*u*u);
113  return c;
114 }
115 
116 
118  Scalar & u, Scalar & v) const
119 {
120  //
121  // assume u=(1-alpha^2/2)/r v=alpha/r
122  // solve qudratic equation neglecting aplha^4 term
123  //
124  Scalar A = coeffA(ip);
125  Scalar B = coeffB(ip);
126 
127  // Scalar overR = 1./r;
128  Scalar ipOverR = ip/r; // *overR;
129 
130  Scalar a = 0.5*B+ipOverR;
131  Scalar c = -B+A*r-ipOverR;
132 
133  Scalar delta = 1-4*a*c;
134  // Scalar sqrtdelta = (delta > 0) ? std::sqrt(delta) : 0.;
135  Scalar sqrtdelta = std::sqrt(delta);
136  // Scalar alpha = (-1+sqrtdelta)/(2*a);
137  Scalar alpha = (-2*c)/(1+sqrtdelta);
138 
139  v = alpha; // *overR
140  Scalar d2 = 1. - v*v; // overR*overR - v*v
141  // u = (d2 > 0) ? std::sqrt(d2) : 0.;
142  u = std::sqrt(d2);
143 
144  // u,v not rotated! not multiplied by 1/r
145 }
146 
147 
148 #endif
Scalar coeffA(Scalar impactParameter) const
dbl * delta
Definition: mlp_gen.cc:36
float alpha
Definition: AMPTWrapper.h:95
T y() const
Definition: PV3DBase.h:63
#define abs(x)
Definition: mlp_lapack.h:159
double charge(const std::vector< uint8_t > &Ampls)
void init(const GlobalPoint &P1, const GlobalPoint &P2, Scalar ip, Scalar curv)
T curvature(T InversePt, const edm::EventSetup &iSetup)
Range rangeRPhi(Scalar radius, int charge) const __attribute__((optimize(3
T sqrt(T t)
Definition: SSEVec.h:48
ThirdHitPredictionFromInvParabola(Scalar x1, Scalar y1, Scalar x2, Scalar y2, Scalar ip, Scalar curv, Scalar tolerance)
float __attribute__((vector_size(8))) float32x2_t
Definition: ExtVec.h:6
Scalar coeffB(Scalar impactParameter) const
Scalar ipFromCurvature(Scalar curvature, bool pos) const
void findPointAtCurve(Scalar radius, Scalar ip, Scalar &u, Scalar &v) const
Range operator()(Scalar radius, int charge) const
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
double a
Definition: hdecay.h:121
BasicVector rotateBack(const BasicVector &v) const
T x() const
Definition: PV3DBase.h:62
Point2D transformBack(Point2D const &p) const
BasicVector rotate(const BasicVector &v) const