CMS 3D CMS Logo

InnerDeltaPhi.cc
Go to the documentation of this file.
10 
11 #if !defined(__INTEL_COMPILER)
12 #define USE_VECTORS_HERE
13 #endif
14 
15 using namespace std;
16 
17 #ifdef VI_DEBUG
18 namespace {
19  struct Stat {
20  float xmin = 1.1;
21  float xmax = -1.1;
22  int nt = 0;
23  int nn = 0;
24  int nl = 0;
25 
26  ~Stat() { std::cout << "ASIN " << xmin << ',' << xmax << ',' << nt << ',' << nn << ',' << nl << std::endl; }
27  };
28 
29  Stat stat;
30 
31 } // namespace
32 
33 namespace {
34  template <class T>
35  inline T cropped_asin(T x) {
36  stat.nt++;
37  if (x < 0.f)
38  stat.nn++;
39  if (x > 0.5f)
40  stat.nl++;
41  stat.xmin = std::min(x, stat.xmin);
42  stat.xmax = std::max(x, stat.xmax);
43 
44  return std::abs(x) <= 1 ? std::asin(x) : (x > 0 ? T(M_PI / 2) : -T(M_PI / 2));
45  }
46 } // namespace
47 #else // for icc
48 namespace {
49  template <class T>
50  inline T cropped_asin(T x) {
51  return std::abs(x) <= 1 ? std::asin(x) : (x > 0 ? T(M_PI / 2) : -T(M_PI / 2));
52  }
53 } // namespace
54 #endif
55 
56 namespace {
57 
58  template <class T>
59  inline T sqr(T t) {
60  return t * t;
61  }
62 
63  // reasonable (5.e-4) only for |x|<0.7 then degrades..
64  template <typename T>
65  inline T f_asin07f(T x) {
66  auto ret = 1.f + (x * x) * (0.157549798488616943359375f + (x * x) * 0.125192224979400634765625f);
67 
68  return x * ret;
69  }
70 
71 } // namespace
72 
74 
75 namespace {
76  inline float f_atan2f(float y, float x) { return unsafe_atan2f<7>(y, x); }
77  template <typename V>
78  inline float f_phi(V v) {
79  return f_atan2f(v.y(), v.x());
80  }
81 } // namespace
82 
84  const DetLayer& layer,
85  const TrackingRegion& region,
86  const edm::EventSetup& iSetup,
87  bool precise,
88  float extraTolerance)
89  : innerIsBarrel(layer.isBarrel()),
90  outerIsBarrel(outlayer.isBarrel()),
91  thePrecise(precise),
92  ol(outlayer.seqNum()),
93  theROrigin(region.originRBound()),
94  theRLayer(0),
95  theThickness(0),
96  theExtraTolerance(extraTolerance),
97  theA(0),
98  theB(0),
99  theVtxZ(region.origin().z()),
100  thePtMin(region.ptMin()),
101  theVtx(region.origin().x(), region.origin().y()),
102  sigma(&layer, iSetup)
103 
104 {
105  float zMinOrigin = theVtxZ - region.originZBound();
106  float zMaxOrigin = theVtxZ + region.originZBound();
108 
109  if (innerIsBarrel)
110  initBarrelLayer(layer);
111  else
112  initForwardLayer(layer, zMinOrigin, zMaxOrigin);
113 
114  if (outerIsBarrel)
115  initBarrelMS(outlayer);
116  else
117  initForwardMS(outlayer);
118 }
119 
120 void InnerDeltaPhi::initBarrelMS(const DetLayer& outLayer) {
121  const BarrelDetLayer& bl = static_cast<const BarrelDetLayer&>(outLayer);
122  float rLayer = bl.specificSurface().radius();
123  auto zmax = 0.5f * outLayer.surface().bounds().length();
124  PixelRecoPointRZ zero(0., 0.);
125  PixelRecoPointRZ point1(rLayer, 0.);
126  PixelRecoPointRZ point2(rLayer, zmax);
127  auto scatt1 = 3.f * sigma(thePtMin, zero, point1, ol);
128  auto scatt2 = 3.f * sigma(thePtMin, zero, point2, ol);
129  theDeltaScatt = (scatt2 - scatt1) / zmax;
130  theScatt0 = scatt1;
131 }
132 
133 void InnerDeltaPhi::initForwardMS(const DetLayer& outLayer) {
134  const ForwardDetLayer& fl = static_cast<const ForwardDetLayer&>(outLayer);
135  auto minR = fl.specificSurface().innerRadius();
136  auto maxR = fl.specificSurface().outerRadius();
137  auto layerZ = outLayer.position().z();
138  // compute min and max multiple scattering correction
139  PixelRecoPointRZ zero(0., theVtxZ);
140  PixelRecoPointRZ point1(minR, layerZ);
141  PixelRecoPointRZ point2(maxR, layerZ);
142  auto scatt1 = 3.f * sigma(thePtMin, zero, point1, ol);
143  auto scatt2 = 3.f * sigma(thePtMin, zero, point2, ol);
144  theDeltaScatt = (scatt2 - scatt1) / (maxR - minR);
145  theScatt0 = scatt1 - theDeltaScatt * minR;
146 }
147 
149  const BarrelDetLayer& bl = static_cast<const BarrelDetLayer&>(layer);
150  float rLayer = bl.specificSurface().radius();
151 
152  // the maximal delta phi will be for the innermost hits
153  theThickness = layer.surface().bounds().thickness();
154  theRLayer = rLayer - 0.5f * theThickness;
155 }
156 
157 void InnerDeltaPhi::initForwardLayer(const DetLayer& layer, float zMinOrigin, float zMaxOrigin) {
158  const ForwardDetLayer& fl = static_cast<const ForwardDetLayer&>(layer);
159  theRLayer = fl.specificSurface().innerRadius();
160  float layerZ = layer.position().z();
161  theThickness = layer.surface().bounds().thickness();
162  float layerZmin = layerZ > 0 ? layerZ - 0.5f * theThickness : layerZ + 0.5f * theThickness;
163  theB = layerZ > 0 ? zMaxOrigin : zMinOrigin;
164  theA = layerZmin - theB;
165 }
166 
167 PixelRecoRange<float> InnerDeltaPhi::phiRange(const Point2D& hitXY, float hitZ, float errRPhi) const {
168  float rLayer = theRLayer;
169  Point2D crossing;
170 
171  Point2D dHit = hitXY - theVtx;
172  auto dHitmag = dHit.mag();
173  float dLayer = 0.;
174  float dL = 0.;
175 
176  // track is crossing layer with angle such as:
177  // this factor should be taken in computation of eror projection
178  float cosCross = 0;
179 
180  //
181  // compute crossing of stright track with inner layer
182  //
183  if (!innerIsBarrel) {
184  auto t = theA / (hitZ - theB);
185  auto dt = std::abs(theThickness / (hitZ - theB));
186  crossing = theVtx + t * dHit;
187  rLayer = crossing.mag();
188  dLayer = t * dHitmag;
189  dL = dt * dHitmag;
190  cosCross = std::abs(dHit.unit().dot(crossing.unit()));
191  } else {
192  //
193  // compute crossing of track with layer
194  // dHit - from VTX to outer hit
195  // rLayer - layer radius
196  // dLayer - distance from VTX to inner layer in direction of dHit
197  // vect(rLayer) = vect(rVTX) + vect(dHit).unit * dLayer
198  // rLayer^2 = (vect(rVTX) + vect(dHit).unit * dLayer)^2 and we have square eqation for dLayer
199  //
200  // barrel case
201  //
202  auto vtxmag2 = theVtx.mag2();
203  if (vtxmag2 < 1.e-10f) {
204  dLayer = rLayer;
205  } else {
206  // there are cancellation here....
207  double var_c = vtxmag2 - sqr(rLayer);
208  double var_b = theVtx.dot(dHit.unit());
209  double var_delta = sqr(var_b) - var_c;
210  if (var_delta <= 0.)
211  var_delta = 0;
212  dLayer = -var_b + std::sqrt(var_delta); //only the value along vector is OK.
213  }
214  crossing = theVtx + dHit.unit() * dLayer;
215  cosCross = std::abs(dHit.unit().dot(crossing.unit()));
216  dL = theThickness / cosCross;
217  }
218 
219 #ifdef USE_VECTORS_HERE
220  cms_float32x4_t num{dHitmag, dLayer, theROrigin * (dHitmag - dLayer), 1.f};
221  cms_float32x4_t den{2 * theRCurvature, 2 * theRCurvature, dHitmag * dLayer, 1.f};
222  auto phis = f_asin07f(num / den);
223  phis = phis * dLayer / (rLayer * cosCross);
224  auto deltaPhi = std::abs(phis[0] - phis[1]);
225  auto deltaPhiOrig = phis[2];
226 #else
227 #warning no vector!
228  auto alphaHit = cropped_asin(dHitmag / (2 * theRCurvature));
229  auto OdeltaPhi = std::abs(alphaHit - cropped_asin(dLayer / (2 * theRCurvature)));
230  OdeltaPhi *= dLayer / (rLayer * cosCross);
231  // compute additional delta phi due to origin radius
232  auto OdeltaPhiOrig = cropped_asin(theROrigin * (dHitmag - dLayer) / (dHitmag * dLayer));
233  OdeltaPhiOrig *= dLayer / (rLayer * cosCross);
234  // std::cout << "dphi " << OdeltaPhi<<'/'<<OdeltaPhiOrig << ' ' << deltaPhi<<'/'<<deltaPhiOrig << std::endl;
235 
236  auto deltaPhi = OdeltaPhi;
237  auto deltaPhiOrig = OdeltaPhiOrig;
238 #endif
239 
240  // additinal angle due to not perpendicular stright line crossing (for displaced beam)
241  // double dPhiCrossing = (cosCross > 0.9999) ? 0 : dL * sqrt(1-sqr(cosCross))/ rLayer;
242  Point2D crossing2 = theVtx + dHit.unit() * (dLayer + dL);
243  auto phicross2 = f_phi(crossing2);
244  auto phicross1 = f_phi(crossing);
245  auto dphicross = phicross2 - phicross1;
246  if (dphicross < -float(M_PI))
247  dphicross += float(2 * M_PI);
248  if (dphicross > float(M_PI))
249  dphicross -= float(2 * M_PI);
250  if (dphicross > float(M_PI / 2))
251  dphicross = 0.; // something wrong?
252  phicross2 = phicross1 + dphicross;
253 
254  // inner hit error taken as constant
255  auto deltaPhiHit = theExtraTolerance / rLayer;
256 
257  // outer hit error
258  // double deltaPhiHitOuter = errRPhi/rLayer;
259  auto deltaPhiHitOuter = errRPhi / hitXY.mag();
260 
261  auto margin = deltaPhi + deltaPhiOrig + deltaPhiHit + deltaPhiHitOuter;
262 
263  if (thePrecise) {
264  // add multiple scattering correction
265 
266  /*
267  PixelRecoPointRZ zero(0., theVtxZ);
268  PixelRecoPointRZ point(hitXY.mag(), hitZ);
269  auto scatt = 3.f*sigma(thePtMin,zero, point, ol);
270  */
271 
272  auto w = outerIsBarrel ? std::abs(hitZ) : hitXY.mag();
273  auto nscatt = theScatt0 + theDeltaScatt * w;
274 
275  // std::cout << "scatt " << (outerIsBarrel ? "B" : "F") << (innerIsBarrel ? "B " : "F ")
276  // << scatt << ' ' << nscatt << ' ' << nscatt/scatt << std::endl;
277 
278  margin += nscatt / rLayer;
279  }
280 
281  return PixelRecoRange<float>(std::min(phicross1, phicross2) - margin, std::max(phicross1, phicross2) + margin);
282 }
float dt
Definition: AMPTWrapper.h:136
virtual float length() const =0
const double w
Definition: UKUtility.cc:23
void initBarrelMS(const DetLayer &outLayer)
ret
prodAgent to be discontinued
T dot(const Basic2DVector &lh) const
Scalar product, or "dot" product, with a vector of same type.
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
const Bounds & bounds() const
Definition: Surface.h:89
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
PixelRecoRange< float > phiRange(const Point2D &hitXY, float zHit, float errRPhi) const
Point2D theVtx
Definition: InnerDeltaPhi.h:56
Basic2DVector unit() const
float theDeltaScatt
Definition: InnerDeltaPhi.h:46
T sqrt(T t)
Definition: SSEVec.h:19
T z() const
Definition: PV3DBase.h:61
Double_t margin
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
double f[11][100]
T min(T a, T b)
Definition: MathUtil.h:58
float originZBound() const
bounds the particle vertex in the longitudinal plane
int nt
Definition: AMPTWrapper.h:42
#define M_PI
virtual const BoundDisk & specificSurface() const final
void initForwardMS(const DetLayer &outLayer)
float theThickness
Definition: InnerDeltaPhi.h:44
virtual float thickness() const =0
virtual const Surface::PositionType & position() const
Returns position of the surface.
void initBarrelLayer(const DetLayer &layer)
float theRCurvature
Definition: InnerDeltaPhi.h:48
void initForwardLayer(const DetLayer &layer, float zMinOrigin, float zMaxOrigin)
T bendingRadius(T pt, const edm::EventSetup &iSetup)
Square< F >::type sqr(const F &f)
Definition: Square.h:14
InnerDeltaPhi(const DetLayer &outlayer, const DetLayer &layer, const TrackingRegion &region, const edm::EventSetup &iSetup, bool precise=true, float extraTolerance=0.f)
float theExtraTolerance
Definition: InnerDeltaPhi.h:49
long double T
MultipleScatteringParametrisation sigma
Definition: InnerDeltaPhi.h:58