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 
13 
14 namespace {
15 
16  struct Stat {
17  struct Nop {
18  Nop(int = 0) {}
19  Nop& operator=(int) { return *this; }
20  void operator++(int) {}
21  };
22 #ifdef STAT_TSB
23  using VAR = long long;
24 #else
25  using VAR = Nop;
26 #endif
27  VAR ntot = 0;
28  VAR nf1 = 0;
29  VAR nf2 = 0;
30 
31  VAR ns1 = 0;
32  VAR ns2 = 0;
33  VAR ns11 = 0;
34  VAR ns21 = 0;
35 
36  VAR nth = 0;
37  VAR nle = 0;
38 
39  //Geom checker 1337311 84696 634946 20369 259701 241266 18435 614128
40  // 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
41  // 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
42  // 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
43  // 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
44  // Geom checker 214,884,027 6,756,424 54,479,049 7,059,696 78,135,883 18443999 1124058 158,174,933 17153503
45  // Geom checker 453,155,905 14,054,554 79,733,432 14,837,002 163,414,609 0 0 324,629,999 0
46 #ifdef STAT_TSB
47  ~Stat() {
48  std::cout << "Geom checker " << ntot << ' ' << nf1 << ' ' << nf2 << ' ' << ns1 << ' ' << ns2 << ' ' << ns11 << ' '
49  << ns21 << ' ' << nth << ' ' << nle << std::endl;
50  }
51 #endif
52  };
53 
54  CMS_THREAD_SAFE Stat stat; // for production purpose it is thread safe
55 
56 } // namespace
57 
58 std::pair<bool, TrajectoryStateOnSurface> GeomDetCompatibilityChecker::isCompatible(const GeomDet* theDet,
59  const TrajectoryStateOnSurface& tsos,
60  const Propagator& prop,
61  const MeasurementEstimator& est) {
62  stat.ntot++;
63 
64  auto const sagCut = est.maxSagitta();
65  auto const minTol2 = est.minTolerance2();
66 
67  // std::cout << "param " << sagCut << ' ' << std::sqrt(minTol2) << std::endl;
68 
69  /*
70  auto err2 = tsos.curvilinearError().matrix()(3,3);
71  auto largeErr = err2> 0.1*tolerance2;
72  if (largeErr) stat.nle++;
73  */
74 
75  bool isIn = false;
76  float sagitta = 99999999.0f;
77  bool close = false;
78  if LIKELY (sagCut > 0) {
79  // linear approximation
80  auto const& plane = theDet->specificSurface();
83  auto path = crossing.pathLength(plane);
84  isIn = path.first;
85  if UNLIKELY (!path.first)
86  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 UNLIKELY (!propSt.isValid()) {
113  stat.nf1++;
114  return std::make_pair(false, std::move(propSt));
115  }
116 
117  auto es = est.estimate(propSt, theDet->specificSurface());
118  if (!es)
119  stat.nf2++;
120  if (close && (!isIn) && (!es))
121  stat.ns11++;
122  if (close && es && (!isIn)) {
123  stat.ns21++;
124  } // std::cout << sagitta << std::endl;}
125  return std::make_pair(es, std::move(propSt));
126 }
Basic3DVector & operator=(const Basic3DVector &)=default
Assignment operator.
const GlobalTrajectoryParameters & globalParameters() const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
constexpr Process operator++(Process p)
Definition: DataFormats.h:68
#define LIKELY(x)
Definition: Likely.h:20
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
T perp2() const
Squared magnitude of transverse component.
GlobalPoint globalPosition() const
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
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:53
GlobalVector globalMomentum() const
#define UNLIKELY(x)
Definition: Likely.h:21
const Plane & specificSurface() const
Same as surface(), kept for backward compatibility.
Definition: GeomDet.h:40
def move(src, dest)
Definition: eostools.py:511
#define LogDebug(id)