CMS 3D CMS Logo

GeomDetCompatibilityChecker.cc
Go to the documentation of this file.
1 // #define STAT_TSB
2 
3 #ifdef STAT_TSB
4 #include <iostream>
5 #endif
6 
12 
13 namespace {
14 
15  struct Stat {
16  struct Nop {
17  Nop(int = 0) {}
18  Nop& operator=(int) { return *this; }
19  void operator++(int) {}
20  };
21 #ifdef STAT_TSB
22  using VAR = long long;
23 #else
24  using VAR = Nop;
25 #endif
26  VAR ntot = 0;
27  VAR nf1 = 0;
28  VAR nf2 = 0;
29 
30  VAR ns1 = 0;
31  VAR ns2 = 0;
32  VAR ns11 = 0;
33  VAR ns21 = 0;
34 
35  VAR nth = 0;
36  VAR nle = 0;
37 
38  //Geom checker 1337311 84696 634946 20369 259701 241266 18435 614128
39  // Geom checker 124,567,704 3,862,821 36,055,605 3,799,127 29,825,229 4,573,316 320,063 75,420,840
40  // Geom checker 119,618,014 2,307,939 31,142,922 2,903,245 34,673,978 5,139,741 539,152 86,847,116 18,196,497
41  // Geom checker 125,554,439 3,431,348 31,900,589 3,706,531 37,272,039 5,160,257 1,670,236 90,573,031 19,505,412
42  // Geom checker 119,583,440 2,379,307 28,357,175 2,960,173 38,977,837 6,239,242 620,636 86,726,732 9,574,902
43  // Geom checker 214,884,027 6,756,424 54,479,049 7,059,696 78,135,883 18443999 1124058 158,174,933 17153503
44  // Geom checker 453,155,905 14,054,554 79,733,432 14,837,002 163,414,609 0 0 324,629,999 0
45 #ifdef STAT_TSB
46  ~Stat() {
47  std::cout << "Geom checker " << ntot << ' ' << nf1 << ' ' << nf2 << ' ' << ns1 << ' ' << ns2 << ' ' << ns11 << ' '
48  << ns21 << ' ' << nth << ' ' << nle << std::endl;
49  }
50 #endif
51  };
52 
53  CMS_THREAD_SAFE Stat stat; // for production purpose it is thread safe
54 
55 } // namespace
56 
57 std::pair<bool, TrajectoryStateOnSurface> GeomDetCompatibilityChecker::isCompatible(const GeomDet* theDet,
58  const TrajectoryStateOnSurface& tsos,
59  const Propagator& prop,
60  const MeasurementEstimator& est) {
61  stat.ntot++;
62 
63  auto const sagCut = est.maxSagitta();
64  auto const minTol2 = est.minTolerance2();
65 
66  // std::cout << "param " << sagCut << ' ' << std::sqrt(minTol2) << std::endl;
67 
68  /*
69  auto err2 = tsos.curvilinearError().matrix()(3,3);
70  auto largeErr = err2> 0.1*tolerance2;
71  if (largeErr) stat.nle++;
72  */
73 
74  bool isIn = false;
75  float sagitta = 99999999;
76  bool close = false;
77  if
78  LIKELY(sagCut > 0) {
79  // linear approximation
80  auto const& plane = theDet->specificSurface();
83  auto path = crossing.pathLength(plane);
84  isIn = path.first;
85  if
86  UNLIKELY(!path.first) stat.ns1++;
87  else {
88  auto gpos = GlobalPoint(crossing.position(path.second));
89  auto tpath2 = (gpos - tsos.globalPosition()).perp2();
90  // sagitta = d^2*c/2
91  sagitta = 0.5f * std::abs(tpath2 * tsos.globalParameters().transverseCurvature());
92  close = sagitta < sagCut;
93  LogDebug("TkDetLayer") << "GeomDetCompatibilityChecker: sagitta " << sagitta << std::endl;
94  if (close) {
95  stat.nth++;
96  auto pos = plane.toLocal(GlobalPoint(crossing.position(path.second)));
97  // auto toll = LocalError(tolerance2,0,tolerance2);
98  auto tollL2 = std::max(sagitta * sagitta, minTol2);
99  auto toll = LocalError(tollL2, 0, tollL2);
100  isIn = plane.bounds().inside(pos, toll);
101  if (!isIn) {
102  stat.ns2++;
103  LogDebug("TkDetLayer") << "GeomDetCompatibilityChecker: not in " << pos << std::endl;
104  return std::make_pair(false, TrajectoryStateOnSurface());
105  }
106  }
107  }
108  }
109 
110  // precise propagation
111  TrajectoryStateOnSurface&& propSt = prop.propagate(tsos, theDet->specificSurface());
112  if
113  UNLIKELY(!propSt.isValid()) {
114  stat.nf1++;
115  return std::make_pair(false, std::move(propSt));
116  }
117 
118  auto es = est.estimate(propSt, theDet->specificSurface());
119  if (!es)
120  stat.nf2++;
121  if (close && (!isIn) && (!es))
122  stat.ns11++;
123  if (close && es && (!isIn)) {
124  stat.ns21++;
125  } // std::cout << sagitta << std::endl;}
126  return std::make_pair(es, std::move(propSt));
127 }
#define LogDebug(id)
float minTolerance2() const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
GlobalPoint globalPosition() const
#define LIKELY(x)
Definition: Likely.h:20
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
static std::pair< bool, TrajectoryStateOnSurface > isCompatible(const GeomDet *theDet, const TrajectoryStateOnSurface &ts, const Propagator &prop, const MeasurementEstimator &est)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define CMS_THREAD_SAFE
const GlobalTrajectoryParameters & globalParameters() const
T perp2() const
Squared magnitude of transverse component.
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
GlobalVector globalMomentum() const
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
#define UNLIKELY(x)
Definition: Likely.h:21
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:53
def move(src, dest)
Definition: eostools.py:511
const Plane & specificSurface() const
Same as surface(), kept for backward compatibility.
Definition: GeomDet.h:40