CMS 3D CMS Logo

GeomDetCompatibilityChecker.cc
Go to the documentation of this file.
3 
6 
7 // #define STAT_TSB
8 
9 #ifdef STAT_TSB
10 #include<iostream>
11 #endif
12 
13 namespace{
14 
15  struct Stat {
16 
17  struct Nop { Nop(int=0){} Nop& operator=(int){return *this;} void operator++(int){}};
18 #ifdef STAT_TSB
19  using VAR=long long;
20 #else
21  using VAR=Nop;
22 #endif
23  VAR ntot=0;
24  VAR nf1=0;
25  VAR nf2=0;
26 
27  VAR ns1=0;
28  VAR ns2=0;
29  VAR ns11=0;
30  VAR ns21=0;
31 
32  VAR nth=0;
33  VAR nle=0;
34 
35 
36  //Geom checker 1337311 84696 634946 20369 259701 241266 18435 614128
37  // 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
38  // 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
39  // 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
40  // 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
41  // Geom checker 214,884,027 6,756,424 54,479,049 7,059,696 78,135,883 18443999 1124058 158,174,933 17153503
42  // Geom checker 453,155,905 14,054,554 79,733,432 14,837,002 163,414,609 0 0 324,629,999 0
43 #ifdef STAT_TSB
44  ~Stat() { std::cout << "Geom checker " << ntot<<' '<< nf1<<' '<< nf2 <<' '<< ns1<< ' '<< ns2 << ' ' << ns11 << ' '<< ns21 << ' ' << nth << ' ' << nle <<std::endl;}
45 #endif
46  };
47 
48  [[cms::thread_safe]] Stat stat; // for production purpose it is thread safe
49 
50 }
51 
52 std::pair<bool, TrajectoryStateOnSurface>
54  const TrajectoryStateOnSurface& tsos,
55  const Propagator& prop,
56  const MeasurementEstimator& est) {
57  stat.ntot++;
58 
59  auto const sagCut = est.maxSagitta();
60  auto const minTol2 = est.minTolerance2();
61 
62  // std::cout << "param " << sagCut << ' ' << std::sqrt(minTol2) << std::endl;
63 
64  /*
65  auto err2 = tsos.curvilinearError().matrix()(3,3);
66  auto largeErr = err2> 0.1*tolerance2;
67  if (largeErr) stat.nle++;
68  */
69 
70  bool isIn = false;
71  float sagitta=99999999;
72  bool close = false;
73  if likely(sagCut>0) {
74  // linear approximation
75  auto const & plane = theDet->specificSurface();
77  auto path = crossing.pathLength(plane);
78  isIn = path.first;
79  if unlikely(!path.first) stat.ns1++;
80  else {
81  auto gpos = GlobalPoint(crossing.position(path.second));
82  auto tpath2 = (gpos-tsos.globalPosition()).perp2();
83  // sagitta = d^2*c/2
84  sagitta = 0.5f*std::abs(tpath2*tsos.globalParameters().transverseCurvature());
85  close = sagitta<sagCut;
86  LogDebug("TkDetLayer") << "GeomDetCompatibilityChecker: sagitta " << sagitta << std::endl;
87  if (close) {
88  stat.nth++;
89  auto pos = plane.toLocal(GlobalPoint(crossing.position(path.second)));
90  // auto toll = LocalError(tolerance2,0,tolerance2);
91  auto tollL2 = std::max(sagitta*sagitta,minTol2);
92  auto toll = LocalError(tollL2,0,tollL2);
93  isIn = plane.bounds().inside(pos,toll);
94  if (!isIn) { stat.ns2++; LogDebug("TkDetLayer") <<"GeomDetCompatibilityChecker: not in " << pos << std::endl;
95  return std::make_pair( false,TrajectoryStateOnSurface());
96  }
97  }
98  }
99  }
100 
101  // precise propagation
102  TrajectoryStateOnSurface && propSt = prop.propagate( tsos, theDet->specificSurface());
103  if unlikely ( !propSt.isValid()) { stat.nf1++; return std::make_pair( false, std::move(propSt));}
104 
105 
106  auto es = est.estimate( propSt, theDet->specificSurface());
107  if (!es) stat.nf2++;
108  if (close && (!isIn) && (!es) ) stat.ns11++;
109  if (close && es &&(!isIn)) { stat.ns21++; } // std::cout << sagitta << std::endl;}
110  return std::make_pair( es, std::move(propSt));
111 
112 }
113 
#define LogDebug(id)
float minTolerance2() const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
GlobalPoint globalPosition() const
#define unlikely(x)
#define likely(x)
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:151
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
const GlobalTrajectoryParameters & globalParameters() const
T perp2() const
Squared magnitude of transverse component.
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
GlobalVector globalMomentum() const
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56
def move(src, dest)
Definition: eostools.py:510
const Plane & specificSurface() const
Same as surface(), kept for backward compatibility.
Definition: GeomDet.h:45