CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HitPattern.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 #ifndef TrackReco_HitPattern_h
3 #define TrackReco_HitPattern_h
4 
5 //
6 // File: DataFormats/TrackReco/interface/HitPattern.h
7 //
8 // Marcel Vos, INFN Pisa
9 // v1.10 2007/05/08 bellan
10 // Zongru Wan, Kansas State University
11 // Jean-Roch Vlimant
12 // Kevin Burkett
13 // Boris Mangano
14 //
15 // Hit pattern is the summary information of the hits associated to track in
16 // AOD. When RecHits are no longer available, the compact hit pattern should
17 // allow basic track selection based on the hits in various subdetectors. The
18 // hits of a track are saved in unit32_t hitPattern_[28], initialized as
19 // 0x00000000, ..., 0x00000000. Set one hit with 10 bits
20 //
21 // +-----+-----+-----+-----+-----+-----+-----+-----+----------------+-----+-----+
22 // |tk/mu| sub-structure | sub-sub-structure | stereo | hit type |
23 // +-----+-----+-----+-----+-----+-----+-----+-----+----------------+-----+-----+
24 // ... | 10 | 9 8 7 | 6 5 4 3 | 2 | 1 0 | bit
25 //
26 // |tk = 1 PXB = 1 layer = 1-3 hit type = 0-3
27 // |tk = 1 PXF = 2 disk = 1-2 hit type = 0-3
28 // |tk = 1 TIB = 3 layer = 1-4 0=rphi,1=stereo hit type = 0-3
29 // |tk = 1 TID = 4 wheel = 1-3 0=rphi,1=stereo hit type = 0-3
30 // |tk = 1 TOB = 5 layer = 1-6 0=rphi,1=stereo hit type = 0-3
31 // |tk = 1 TEC = 6 wheel = 1-9 0=rphi,1=stereo hit type = 0-3
32 // |mu = 0 DT = 1 4*(stat-1)+superlayer hit type = 0-3
33 // |mu = 0 CSC = 2 4*(stat-1)+(ring-1) hit type = 0-3
34 // |mu = 0 RPC = 3 4*(stat-1)+2*layer+region hit type = 0-3
35 //
36 // hit type, see DataFormats/TrackingRecHit/interface/TrackingRecHit.h
37 // valid = valid hit = 0
38 // missing = detector is good, but no rec hit found = 1
39 // inactive = detector is off, so there was no hope = 2
40 // bad = there were many bad strips within the ellipse = 3
41 //
42 // The maximum number of hits = 32*28/11 = 81. It had been shown by Zongru
43 // using a 100 GeV muon sample with 5000 events uniform in eta and phi, the
44 // average (maximum) number of tracker hits is 13 (17) and the average
45 // (maximum) number of muon detector hits is about 26 (50). If the number of
46 // hits of a track is larger than 80 then the extra hits are ignored by hit
47 // pattern. The static hit pattern array might be improved to a dynamic one
48 // in the future.
49 //
50 // Because of tracking with/without overlaps and with/without hit-splitting,
51 // the final number of hits per track is pretty "variable". Compared with the
52 // number of valid hits, the number of crossed layers with measurement should
53 // be more robust to discriminate between good and fake track.
54 //
55 // Since 4-bit for sub-sub-structure is not enough to specify a muon layer,
56 // the layer case counting methods are implemented for tracker only. This is
57 // different from the hit counting methods which are implemented for both
58 // tracker and muon detector.
59 //
60 // Given a tracker layer, specified by sub-structure and layer, the method
61 // getTrackerLayerCase(substr, layer) groups all of the hits in the hit pattern
62 // array for the layer together and returns one of the four cases
63 //
64 // crossed
65 // layer case 0: valid + (missing, off, bad) ==> with measurement
66 // layer case 1: missing + (off, bad) ==> without measurement
67 // layer case 2: off, bad ==> totally off or bad, cannot say much
68 // not crossed
69 // layer case 999999: track outside acceptance or in gap ==> null
70 //
71 // Given a tracker layer, specified by sub-structure and layer, the method
72 // getTrackerMonoStereo(substr, layer) groups all of the valid hits in the hit
73 // pattern array for the layer together and returns
74 //
75 // 0: neither a valid mono nor a valid stereo hit
76 // MONO: valid mono hit
77 // STEREO: valid stereo hit
78 // MONO | STEREO: both
79 //
80 // Given a track, here is an example usage of hit pattern
81 //
82 // // hit pattern of the track
83 // const reco::HitPattern& p = track->hitPattern();
84 //
85 // // loop over the hits of the track
86 // for (int i=0; i<p.numberOfHits(); i++) {
87 // uint32_t hit = p.getHitPattern(i);
88 //
89 // // if the hit is valid and in pixel barrel, print out the layer
90 // if (p.validHitFilter(hit) && p.pixelBarrelHitFilter(hit))
91 // std::cout << "valid hit found in pixel barrel layer "
92 // << p.getLayer(hit) << std::endl;
93 //
94 // // expert level: printout the hit in 10-bit binary format
95 // std::cout << "hit in 10-bit binary format = ";
96 // for (int j=9; j>=0; j--) {
97 // int bit = (hit >> j) & 0x1;
98 // std::cout << bit;
99 // }
100 // std::cout << std::endl;
101 // }
102 //
103 // // count the number of valid pixel barrel *** hits ***
104 // std::cout << "number of of valid pixel barrel hits is "
105 // << p.numberOfValidPixelBarrelHits() << std::endl;
106 //
107 // // count the number of pixel barrel *** layers *** with measurement
108 // std::cout << "number of of pixel barrel layers with measurement is "
109 // << p.pixelBarrelLayersWithMeasurement() << std::endl;
110 //
111 #include <ostream>
118 namespace reco {
119  class HitPattern {
120  public:
121  enum { MONO = 1, STEREO = 2 };
122 
123  // default constructor
124  // init hit pattern array as 0x00000000, ..., 0x00000000
125  HitPattern() { for (int i=0; i<PatternSize; i++) hitPattern_[i] = 0; }
126 
127  // constructor from iterator (begin, end) pair
128  template<typename I>
129  HitPattern(const I & begin, const I & end) { set(begin, end); }
130 
131  // constructor from hit collection
132  template<typename C>
133  HitPattern(const C & c) { set(c); }
134 
135  // set pattern from iterator (begin, end) pair
136  // init hit pattern array as 0x00000000, ..., 0x00000000
137  // loop over the hits and set hit pattern
138  template<typename I>
139  void set(const I & begin, const I & end) {
140  for (int i=0; i<PatternSize; i++) hitPattern_[i] = 0;
141  unsigned int counter = 0;
142  for (I hit=begin; hit!=end && counter<32*PatternSize/HitSize;
143  hit++, counter++)
144  set(*hit, counter);
145  }
146 
147 
148  // generic count methods
149  typedef bool filterType(unsigned int);
151  int count = 0;
152  for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
153  uint32_t pattern = getHitPattern(i);
154  if (pattern == 0) break;
155  if (filter(pattern)) ++count;
156  }
157  return count;
158  }
159 
160  int countTypedHits(filterType typeFilter, filterType filter) const {
161  int count = 0;
162  for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
163  uint32_t pattern = getHitPattern(i);
164  if (pattern == 0) break;
165  if (typeFilter(pattern)&&filter(pattern)) ++count;
166  }
167  return count;
168  }
169 
170  // print the pattern of the position-th hit
171  void printHitPattern (int position, std::ostream &stream) const;
172  void print (std::ostream &stream = std::cout) const;
173 
174  // set the pattern of the i-th hit
175  void set(const TrackingRecHit &hit, unsigned int i){setHitPattern(i, encode(hit,i));}
176 
177  // append a hit to the hit pattern
178  void appendHit(const TrackingRecHit & hit);
179 
180  // get the pattern of the position-th hit
181  uint32_t getHitPattern(int position) const;
182 
183  static bool trackerHitFilter(uint32_t pattern); // tracker hit
184  static bool muonHitFilter(uint32_t pattern); // muon hit
185 
186  static uint32_t getSubStructure(uint32_t pattern); // sub-structure
187  static bool pixelHitFilter(uint32_t pattern); // pixel
188  static bool pixelBarrelHitFilter(uint32_t pattern); // pixel barrel
189  static bool pixelEndcapHitFilter(uint32_t pattern); // pixel endcap
190  static bool stripHitFilter(uint32_t pattern); // strip
191  static bool stripTIBHitFilter(uint32_t pattern); // strip TIB
192  static bool stripTIDHitFilter(uint32_t pattern); // strip TID
193  static bool stripTOBHitFilter(uint32_t pattern); // strip TOB
194  static bool stripTECHitFilter(uint32_t pattern); // strip TEC
195  static bool muonDTHitFilter(uint32_t pattern); // muon DT
196  static bool muonCSCHitFilter(uint32_t pattern); // muon CSC
197  static bool muonRPCHitFilter(uint32_t pattern); // muon RPC
198 
199  static uint32_t getLayer(uint32_t pattern); // sub-sub-structure
200  static uint32_t getSubSubStructure(uint32_t pattern); // sub-sub-structure
201 
203  static uint32_t getMuonStation(uint32_t pattern); // only for patterns from muon, of course
205  static uint32_t getDTSuperLayer(uint32_t pattern); // only for DT patterns
207  static uint32_t getCSCRing(uint32_t pattern) ;
209  static uint32_t getRPCLayer(uint32_t pattern) ;
211  static uint32_t getRPCregion(uint32_t pattern);
212 
213  static uint32_t getHitType(uint32_t pattern); // hit type
214  static bool validHitFilter(uint32_t pattern); // hit type 0 = valid
215  static bool type_1_HitFilter(uint32_t pattern); // hit type 1
216  static bool type_2_HitFilter(uint32_t pattern); // hit type 2
217  static bool type_3_HitFilter(uint32_t pattern); // hit type 3
218 
219  static uint32_t getSide (uint32_t pattern); // mono (0) or stereo (1)
220 
221  bool hasValidHitInFirstPixelBarrel() const; // has valid hit in PXB layer 1
222  bool hasValidHitInFirstPixelEndcap() const; // has valid hit in PXF layer 1
223 
224  int numberOfHits() const; // not-null
225  int numberOfValidHits() const; // not-null, valid
226  int numberOfValidTrackerHits() const; // not-null, valid, tracker
227  int numberOfValidMuonHits() const; // not-null, valid, muon
228  int numberOfValidPixelHits() const; // not-null, valid, pixel
229  int numberOfValidPixelBarrelHits() const; // not-null, valid, pixel PXB
230  int numberOfValidPixelEndcapHits() const; // not-null, valid, pixel PXF
231  int numberOfValidStripHits() const; // not-null, valid, strip
232  int numberOfValidStripTIBHits() const; // not-null, valid, strip TIB
233  int numberOfValidStripTIDHits() const; // not-null, valid, strip TID
234  int numberOfValidStripTOBHits() const; // not-null, valid, strip TOB
235  int numberOfValidStripTECHits() const; // not-null, valid, strip TEC
236  int numberOfValidMuonDTHits() const; // not-null, valid, muon DT
237  int numberOfValidMuonCSCHits() const; // not-null, valid, muon CSC
238  int numberOfValidMuonRPCHits() const; // not-null, valid, muon RPC
239  int numberOfLostHits() const; // not-null, not valid
240  int numberOfLostTrackerHits() const; // not-null, not valid, tracker
241  int numberOfLostMuonHits() const; // not-null, not valid, muon
242  int numberOfLostPixelHits() const; // not-null, not valid, pixel
243  int numberOfLostPixelBarrelHits() const; // not-null, not valid, pixel PXB
244  int numberOfLostPixelEndcapHits() const; // not-null, not valid, pixel PXF
245  int numberOfLostStripHits() const; // not-null, not valid, strip
246  int numberOfLostStripTIBHits() const; // not-null, not valid, strip TIB
247  int numberOfLostStripTIDHits() const; // not-null, not valid, strip TID
248  int numberOfLostStripTOBHits() const; // not-null, not valid, strip TOB
249  int numberOfLostStripTECHits() const; // not-null, not valid, strip TEC
250  int numberOfLostMuonDTHits() const; // not-null, not valid, muon DT
251  int numberOfLostMuonCSCHits() const; // not-null, not valid, muon CSC
252  int numberOfLostMuonRPCHits() const; // not-null, not valid, muon RPC
253  int numberOfBadHits() const; // not-null, bad (only used in Muon Ch.)
254  int numberOfBadMuonHits() const; // not-null, bad, muon
255  int numberOfBadMuonDTHits() const; // not-null, bad, muon DT
256  int numberOfBadMuonCSCHits() const; // not-null, bad, muon CSC
257  int numberOfBadMuonRPCHits() const; // not-null, bad, muon RPC
258  int numberOfInactiveHits() const; // not-null, inactive
259  int numberOfInactiveTrackerHits() const; // not-null, inactive, tracker
260 
261 
263  const; // count strip layers that have non-null, valid mono and stereo hits
264 
265  uint32_t getTrackerLayerCase(uint32_t substr, uint32_t layer) const;
266  uint32_t getTrackerMonoStereo (uint32_t substr, uint32_t layer) const;
267 
268  int trackerLayersWithMeasurement() const; // case 0: tracker
269  int pixelLayersWithMeasurement() const; // case 0: pixel
270  int stripLayersWithMeasurement() const; // case 0: strip
271  int pixelBarrelLayersWithMeasurement() const; // case 0: pixel PXB
272  int pixelEndcapLayersWithMeasurement() const; // case 0: pixel PXF
273  int stripTIBLayersWithMeasurement() const; // case 0: strip TIB
274  int stripTIDLayersWithMeasurement() const; // case 0: strip TID
275  int stripTOBLayersWithMeasurement() const; // case 0: strip TOB
276  int stripTECLayersWithMeasurement() const; // case 0: strip TEC
277  int trackerLayersWithoutMeasurement() const; // case 1: tracker
278  int pixelLayersWithoutMeasurement() const; // case 1: pixel
279  int stripLayersWithoutMeasurement() const; // case 1: strip
280  int pixelBarrelLayersWithoutMeasurement() const; // case 1: pixel PXB
281  int pixelEndcapLayersWithoutMeasurement() const; // case 1: pixel PXF
282  int stripTIBLayersWithoutMeasurement() const; // case 1: strip TIB
283  int stripTIDLayersWithoutMeasurement() const; // case 1: strip TID
284  int stripTOBLayersWithoutMeasurement() const; // case 1: strip TOB
285  int stripTECLayersWithoutMeasurement() const; // case 1: strip TEC
286  int trackerLayersTotallyOffOrBad() const; // case 2: tracker
287  int pixelLayersTotallyOffOrBad() const; // case 2: pixel
288  int stripLayersTotallyOffOrBad() const; // case 2: strip
289  int pixelBarrelLayersTotallyOffOrBad() const; // case 2: pixel PXB
290  int pixelEndcapLayersTotallyOffOrBad() const; // case 2: pixel PXF
291  int stripTIBLayersTotallyOffOrBad() const; // case 2: strip TIB
292  int stripTIDLayersTotallyOffOrBad() const; // case 2: strip TID
293  int stripTOBLayersTotallyOffOrBad() const; // case 2: strip TOB
294  int stripTECLayersTotallyOffOrBad() const; // case 2: strip TEC
295  int trackerLayersNull() const; // case 999999: tracker
296  int pixelLayersNull() const; // case 999999: pixel
297  int stripLayersNull() const; // case 999999: strip
298  int pixelBarrelLayersNull() const; // case 999999: pixel PXB
299  int pixelEndcapLayersNull() const; // case 999999: pixel PXF
300  int stripTIBLayersNull() const; // case 999999: strip TIB
301  int stripTIDLayersNull() const; // case 999999: strip TID
302  int stripTOBLayersNull() const; // case 999999: strip TOB
303  int stripTECLayersNull() const; // case 999999: strip TEC
304 
305 
306 
308  int muonStations(int subdet, int hitType) const ;
309 
310  int muonStationsWithValidHits() const ;
311  int muonStationsWithBadHits() const ;
312  int muonStationsWithAnyHits() const ;
313  int dtStationsWithValidHits() const ;
314  int dtStationsWithBadHits() const ;
315  int dtStationsWithAnyHits() const ;
316  int cscStationsWithValidHits() const ;
317  int cscStationsWithBadHits() const ;
318  int cscStationsWithAnyHits() const ;
319  int rpcStationsWithValidHits() const ;
320  int rpcStationsWithBadHits() const ;
321  int rpcStationsWithAnyHits() const ;
322 
324  int innermostMuonStationWithHits(int hitType) const ;
326  int innermostMuonStationWithBadHits() const ;
327  int innermostMuonStationWithAnyHits() const ;
328 
330  int outermostMuonStationWithHits(int hitType) const ;
332  int outermostMuonStationWithBadHits() const ;
333  int outermostMuonStationWithAnyHits() const ;
334 
335  int numberOfDTStationsWithRPhiView() const ;
336  int numberOfDTStationsWithRZView() const ;
337  int numberOfDTStationsWithBothViews() const ;
338  private:
339 
340  // number of 32 bit integers to store the full pattern
341  const static unsigned short PatternSize = 25;
342 
343  // number of bits used for each hit
344  const static unsigned short HitSize = 11;
345 
346  // 1 bit to distinguish tracker and muon subsystems
347  const static unsigned short SubDetectorOffset = 10;
348  const static unsigned short SubDetectorMask = 0x1;
349 
350  // 3 bits to identify the tracker/muon detector substructure
351  const static unsigned short SubstrOffset = 7;
352  const static unsigned short SubstrMask = 0x7;
353 
354  // 4 bits to identify the layer/disk/wheel within the substructure
355  const static unsigned short LayerOffset = 3;
356  const static unsigned short LayerMask = 0xF;
357 
358  // 1 bit to identify the side in double-sided detectors
359  const static unsigned short SideOffset = 2;
360  const static unsigned short SideMask = 0x1;
361 
362  // 2 bits for hit type
363  const static unsigned short HitTypeOffset = 0;
364  const static unsigned short HitTypeMask = 0x3;
365 
366  // full hit pattern information is packed in PatternSize 32 bit words
367  uint32_t hitPattern_[ PatternSize ];
368 
369  // set pattern for position-th hit
370  void setHitPattern(int position, uint32_t pattern);
371 
372  // set pattern for i-th hit passing a reference
373  void set(const TrackingRecHitRef & ref, unsigned int i) { set(* ref, i); }
374 
375  // detector side for tracker modules (mono/stereo)
376  static uint32_t isStereo (DetId);
377 
378  // encoder for pattern
379  uint32_t encode(const TrackingRecHit &,unsigned int);
380  };
381 
382  // inline function
383 
384  inline bool HitPattern::pixelHitFilter(uint32_t pattern) {
385  if unlikely(!trackerHitFilter(pattern)) return false;
386  uint32_t substructure = getSubStructure(pattern);
387  if (substructure == PixelSubdetector::PixelBarrel ||
388  substructure == PixelSubdetector::PixelEndcap) return true;
389  return false;
390  }
391 
392  inline bool HitPattern::pixelBarrelHitFilter(uint32_t pattern) {
393  if unlikely(!trackerHitFilter(pattern)) return false;
394  uint32_t substructure = getSubStructure(pattern);
395  if (substructure == PixelSubdetector::PixelBarrel) return true;
396  return false;
397  }
398 
399  inline bool HitPattern::pixelEndcapHitFilter(uint32_t pattern) {
400  if unlikely(!trackerHitFilter(pattern)) return false;
401  uint32_t substructure = getSubStructure(pattern);
402  if (substructure == PixelSubdetector::PixelEndcap) return true;
403  return false;
404  }
405 
406  inline bool HitPattern::stripHitFilter(uint32_t pattern) {
407  if unlikely(!trackerHitFilter(pattern)) return false;
408  uint32_t substructure = getSubStructure(pattern);
409  if (substructure == StripSubdetector::TIB ||
410  substructure == StripSubdetector::TID ||
411  substructure == StripSubdetector::TOB ||
412  substructure == StripSubdetector::TEC) return true;
413  return false;
414  }
415 
416  inline bool HitPattern::stripTIBHitFilter(uint32_t pattern) {
417  if unlikely(!trackerHitFilter(pattern)) return false;
418  uint32_t substructure = getSubStructure(pattern);
419  if (substructure == StripSubdetector::TIB) return true;
420  return false;
421  }
422 
423  inline bool HitPattern::stripTIDHitFilter(uint32_t pattern) {
424  if unlikely(!trackerHitFilter(pattern)) return false;
425  uint32_t substructure = getSubStructure(pattern);
426  if (substructure == StripSubdetector::TID) return true;
427  return false;
428  }
429 
430  inline bool HitPattern::stripTOBHitFilter(uint32_t pattern) {
431  if unlikely(!trackerHitFilter(pattern)) return false;
432  uint32_t substructure = getSubStructure(pattern);
433  if (substructure == StripSubdetector::TOB) return true;
434  return false;
435  }
436 
437  inline bool HitPattern::stripTECHitFilter(uint32_t pattern) {
438  if unlikely(!trackerHitFilter(pattern)) return false;
439  uint32_t substructure = getSubStructure(pattern);
440  if (substructure == StripSubdetector::TEC) return true;
441  return false;
442  }
443 
444  inline bool HitPattern::muonDTHitFilter(uint32_t pattern) {
445  if unlikely(!muonHitFilter(pattern)) return false;
446  uint32_t substructure = getSubStructure(pattern);
447  if (substructure == (uint32_t) MuonSubdetId::DT) return true;
448  return false;
449  }
450 
451  inline bool HitPattern::muonCSCHitFilter(uint32_t pattern) {
452  if unlikely(!muonHitFilter(pattern)) return false;
453  uint32_t substructure = getSubStructure(pattern);
454  if (substructure == (uint32_t) MuonSubdetId::CSC) return true;
455  return false;
456  }
457 
458  inline bool HitPattern::muonRPCHitFilter(uint32_t pattern) {
459  if unlikely(!muonHitFilter(pattern)) return false;
460  uint32_t substructure = getSubStructure(pattern);
461  if (substructure == (uint32_t) MuonSubdetId::RPC) return true;
462  return false;
463  }
464 
465 
466  inline bool HitPattern::trackerHitFilter(uint32_t pattern) {
467  if unlikely(pattern == 0) return false;
468  if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 1) return true;
469  return false;
470  }
471 
472  inline bool HitPattern::muonHitFilter(uint32_t pattern) {
473  if unlikely(pattern == 0) return false;
474  if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 0) return true;
475  return false;
476  }
477 
478 
479  inline uint32_t HitPattern::getSubStructure(uint32_t pattern) {
480  if unlikely(pattern == 0) return 999999;
481  return ((pattern >> SubstrOffset) & SubstrMask);
482  }
483 
484 
485  inline uint32_t HitPattern::getLayer(uint32_t pattern) {
486  if unlikely(pattern == 0) return 999999;
487  return ((pattern>>LayerOffset) & LayerMask);
488  }
489 
490  inline uint32_t HitPattern::getSubSubStructure(uint32_t pattern) {
491  if unlikely(pattern == 0) return 999999;
492  return ((pattern>>LayerOffset) & LayerMask);
493  }
494 
495 
496  inline uint32_t HitPattern::getSide (uint32_t pattern) {
497  if unlikely(pattern == 0) return 999999;
498  return (pattern >> SideOffset) & SideMask;
499  }
500 
501  inline uint32_t HitPattern::getHitType( uint32_t pattern ) {
502  if unlikely(pattern == 0) return 999999;
503  return ((pattern>>HitTypeOffset) & HitTypeMask);
504  }
505 
506  inline uint32_t HitPattern::getMuonStation(uint32_t pattern) {
507  return (getSubSubStructure(pattern)>>2) + 1;
508  }
509 
510  inline uint32_t HitPattern::getDTSuperLayer(uint32_t pattern) {
511  return (getSubSubStructure(pattern) & 3);
512  }
513 
514  inline uint32_t HitPattern::getCSCRing(uint32_t pattern) {
515  return (getSubSubStructure(pattern) & 3) + 1;
516  }
517 
518  inline uint32_t HitPattern::getRPCLayer(uint32_t pattern) {
519  uint32_t sss = getSubSubStructure(pattern), stat = sss >> 2;
520  if likely(stat <= 1) return ((sss >> 1) & 1) + 1;
521  return 0;
522  }
523 
524  inline uint32_t HitPattern::getRPCregion(uint32_t pattern) {
525  return getSubSubStructure(pattern) & 1;
526  }
527 
528 
529  inline bool HitPattern::validHitFilter(uint32_t pattern) {
530  if (getHitType(pattern) == 0) return true;
531  return false;
532  }
533 
534  inline bool HitPattern::type_1_HitFilter(uint32_t pattern) {
535  if (getHitType(pattern) == 1) return true;
536  return false;
537  }
538 
539  inline bool HitPattern::type_2_HitFilter(uint32_t pattern) {
540  if (getHitType(pattern) == 2) return true;
541  return false;
542  }
543 
544  inline bool HitPattern::type_3_HitFilter(uint32_t pattern) {
545  if (getHitType(pattern) == 3) return true;
546  return false;
547  }
548 
549 
550  // count methods
551 
552 // valid
553 
554 inline int HitPattern::numberOfValidHits() const {
555  return countHits(validHitFilter);
556 }
557 
560 }
561 
564 }
565 
568 }
569 
572 }
573 
576 }
577 
580 }
581 
584 }
585 
588 }
589 
592 }
593 
596 }
597 
600 }
601 
604 }
605 
608 }
609 
610 // lost
611 inline int HitPattern::numberOfLostHits() const {
612  return countHits(type_1_HitFilter);
613 }
614 
617 }
618 
621 }
622 
625 }
626 
629 }
630 
633 }
634 
637 }
638 
641 }
642 
645 }
646 
649 }
650 
653 }
654 
657 }
658 
661 }
662 
665 }
666 
667 
668 // bad
669 inline int HitPattern::numberOfBadHits() const {
670  return countHits(type_3_HitFilter);
671 }
672 
675 }
676 
679 }
680 
683 }
684 
687 }
688 
689 
690 // inactive
692  return countHits(type_2_HitFilter);
693 }
694 
697 }
698 
699 
700 
701 
702 
703 
704 
706  return pixelLayersWithMeasurement() +
708  }
709 
713  }
714 
720  }
721 
722 
726  }
727 
731  }
732 
738  }
739 
740 
742  return pixelLayersTotallyOffOrBad() +
744  }
745 
749  }
750 
756  }
757 
758  inline int HitPattern::trackerLayersNull() const {
759  return pixelLayersNull() +
760  stripLayersNull();
761  }
762 
763  inline int HitPattern::pixelLayersNull() const {
764  return pixelBarrelLayersNull() +
766  }
767 
768  inline int HitPattern::stripLayersNull() const {
769  return stripTIBLayersNull() +
771  stripTOBLayersNull() +
773  }
774 
775 
776  inline int HitPattern::muonStationsWithValidHits() const { return muonStations(0, 0); }
777  inline int HitPattern::muonStationsWithBadHits() const { return muonStations(0, 3); }
778  inline int HitPattern::muonStationsWithAnyHits() const { return muonStations(0,-1); }
779  inline int HitPattern::dtStationsWithValidHits() const { return muonStations(1, 0); }
780  inline int HitPattern::dtStationsWithBadHits() const { return muonStations(1, 3); }
781  inline int HitPattern::dtStationsWithAnyHits() const { return muonStations(1,-1); }
782  inline int HitPattern::cscStationsWithValidHits() const { return muonStations(2, 0); }
783  inline int HitPattern::cscStationsWithBadHits() const { return muonStations(2, 3); }
784  inline int HitPattern::cscStationsWithAnyHits() const { return muonStations(2,-1); }
785  inline int HitPattern::rpcStationsWithValidHits() const { return muonStations(3, 0); }
786  inline int HitPattern::rpcStationsWithBadHits() const { return muonStations(3, 3); }
787  inline int HitPattern::rpcStationsWithAnyHits() const { return muonStations(3,-1); }
788 
795 
796 }
797 
798 #endif
int stripTOBLayersWithMeasurement() const
Definition: HitPattern.cc:373
int countTypedHits(filterType typeFilter, filterType filter) const
Definition: HitPattern.h:160
int i
Definition: DBlmapReader.cc:9
int cscStationsWithAnyHits() const
Definition: HitPattern.h:784
static uint32_t getRPCLayer(uint32_t pattern)
RPC layer: for station 1 and 2, layer = 1(inner) or 2(outer); for station 3, 4 layer is always 0...
Definition: HitPattern.h:518
int outermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:664
int outermostMuonStationWithValidHits() const
Definition: HitPattern.h:792
static uint32_t getDTSuperLayer(uint32_t pattern)
DT superlayer (1-3). Where the &quot;hit&quot; was a DT segment, superlayer is 0. Only valid for muon DT patter...
Definition: HitPattern.h:510
int pixelBarrelLayersNull() const
Definition: HitPattern.cc:502
int stripTIBLayersNull() const
Definition: HitPattern.cc:520
int numberOfInactiveHits() const
Definition: HitPattern.h:691
static uint32_t getLayer(uint32_t pattern)
Definition: HitPattern.h:485
void appendHit(const TrackingRecHit &hit)
Definition: HitPattern.cc:88
static uint32_t isStereo(DetId)
Definition: HitPattern.cc:598
static uint32_t getCSCRing(uint32_t pattern)
CSC ring (1-4). Only valid for muon CSC patterns, of course.
Definition: HitPattern.h:514
uint32_t hitPattern_[PatternSize]
Definition: HitPattern.h:367
int stripTIBLayersWithMeasurement() const
Definition: HitPattern.cc:355
int stripTECLayersNull() const
Definition: HitPattern.cc:547
static const unsigned short SideOffset
Definition: HitPattern.h:359
uint32_t encode(const TrackingRecHit &, unsigned int)
Definition: HitPattern.cc:15
void set(const TrackingRecHit &hit, unsigned int i)
Definition: HitPattern.h:175
int muonStations(int subdet, int hitType) const
subdet = 0(all), 1(DT), 2(CSC), 3(RPC); hitType=-1(all), 0=valid, 3=bad
Definition: HitPattern.cc:635
static uint32_t getSubSubStructure(uint32_t pattern)
Definition: HitPattern.h:490
int pixelLayersWithoutMeasurement() const
Definition: HitPattern.h:728
int numberOfLostTrackerHits() const
Definition: HitPattern.h:615
static bool muonDTHitFilter(uint32_t pattern)
Definition: HitPattern.h:444
static const unsigned short SubstrOffset
Definition: HitPattern.h:351
int numberOfValidHits() const
Definition: HitPattern.h:554
static bool trackerHitFilter(uint32_t pattern)
Definition: HitPattern.h:466
uint32_t getTrackerMonoStereo(uint32_t substr, uint32_t layer) const
Definition: HitPattern.cc:294
int numberOfLostHits() const
Definition: HitPattern.h:611
int numberOfDTStationsWithRPhiView() const
Definition: HitPattern.cc:679
int numberOfBadHits() const
Definition: HitPattern.h:669
int cscStationsWithValidHits() const
Definition: HitPattern.h:782
int pixelLayersNull() const
Definition: HitPattern.h:763
int numberOfLostPixelHits() const
Definition: HitPattern.h:623
int pixelLayersWithMeasurement() const
Definition: HitPattern.h:710
int trackerLayersWithoutMeasurement() const
Definition: HitPattern.h:723
int numberOfValidStripHits() const
Definition: HitPattern.h:578
static uint32_t getHitType(uint32_t pattern)
Definition: HitPattern.h:501
int stripTIDLayersWithoutMeasurement() const
Definition: HitPattern.cc:419
int rpcStationsWithValidHits() const
Definition: HitPattern.h:785
HitPattern(const C &c)
Definition: HitPattern.h:133
static bool type_2_HitFilter(uint32_t pattern)
Definition: HitPattern.h:539
static uint32_t getMuonStation(uint32_t pattern)
Muon station (1-4). Only valid for muon patterns, of course.
Definition: HitPattern.h:506
void set(const I &begin, const I &end)
Definition: HitPattern.h:139
void print(std::ostream &stream=std::cout) const
Definition: HitPattern.cc:583
static const unsigned short PatternSize
Definition: HitPattern.h:341
int numberOfValidStripLayersWithMonoAndStereo() const
Definition: HitPattern.cc:224
int pixelBarrelLayersWithoutMeasurement() const
Definition: HitPattern.cc:392
static bool stripTECHitFilter(uint32_t pattern)
Definition: HitPattern.h:437
int numberOfLostMuonHits() const
Definition: HitPattern.h:619
static const unsigned short HitTypeMask
Definition: HitPattern.h:364
int pixelEndcapLayersWithMeasurement() const
Definition: HitPattern.cc:346
int numberOfValidStripTOBHits() const
Definition: HitPattern.h:590
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
int numberOfValidMuonCSCHits() const
Definition: HitPattern.h:602
int numberOfValidMuonRPCHits() const
Definition: HitPattern.h:606
bool hasValidHitInFirstPixelEndcap() const
Definition: HitPattern.cc:198
static bool stripTIDHitFilter(uint32_t pattern)
Definition: HitPattern.h:423
int muonStationsWithBadHits() const
Definition: HitPattern.h:777
int numberOfLostStripTECHits() const
Definition: HitPattern.h:651
static bool muonHitFilter(uint32_t pattern)
Definition: HitPattern.h:472
#define unlikely(x)
Definition: Likely.h:21
int stripLayersNull() const
Definition: HitPattern.h:768
int muonStationsWithValidHits() const
Definition: HitPattern.h:776
static const int CSC
Definition: MuonSubdetId.h:15
int stripTOBLayersTotallyOffOrBad() const
Definition: HitPattern.cc:483
int rpcStationsWithBadHits() const
Definition: HitPattern.h:786
int stripLayersWithoutMeasurement() const
Definition: HitPattern.h:733
int innermostMuonStationWithAnyHits() const
Definition: HitPattern.h:791
int trackerLayersTotallyOffOrBad() const
Definition: HitPattern.h:741
int numberOfValidPixelBarrelHits() const
Definition: HitPattern.h:570
int stripTIDLayersTotallyOffOrBad() const
Definition: HitPattern.cc:474
static bool type_1_HitFilter(uint32_t pattern)
Definition: HitPattern.h:534
int numberOfLostPixelEndcapHits() const
Definition: HitPattern.h:631
int stripTIDLayersWithMeasurement() const
Definition: HitPattern.cc:364
int trackerLayersWithMeasurement() const
Definition: HitPattern.h:705
static const unsigned short SubDetectorMask
Definition: HitPattern.h:348
int numberOfLostStripTIDHits() const
Definition: HitPattern.h:643
int muonStationsWithAnyHits() const
Definition: HitPattern.h:778
static bool pixelHitFilter(uint32_t pattern)
Definition: HitPattern.h:384
int pixelLayersTotallyOffOrBad() const
Definition: HitPattern.h:746
int stripTECLayersTotallyOffOrBad() const
Definition: HitPattern.cc:492
int numberOfHits() const
Definition: HitPattern.cc:213
static uint32_t getSubStructure(uint32_t pattern)
Definition: HitPattern.h:479
int numberOfBadMuonHits() const
Definition: HitPattern.h:673
int stripTIBLayersWithoutMeasurement() const
Definition: HitPattern.cc:410
int numberOfValidStripTIDHits() const
Definition: HitPattern.h:586
const std::complex< double > I
Definition: I.h:8
int numberOfDTStationsWithRZView() const
Definition: HitPattern.cc:691
static bool muonRPCHitFilter(uint32_t pattern)
Definition: HitPattern.h:458
static bool validHitFilter(uint32_t pattern)
Definition: HitPattern.h:529
int numberOfValidStripTECHits() const
Definition: HitPattern.h:594
#define end
Definition: vmac.h:38
int stripTIDLayersNull() const
Definition: HitPattern.cc:529
int numberOfLostMuonRPCHits() const
Definition: HitPattern.h:663
static const unsigned short HitTypeOffset
Definition: HitPattern.h:363
int numberOfBadMuonRPCHits() const
Definition: HitPattern.h:685
int dtStationsWithValidHits() const
Definition: HitPattern.h:779
int stripLayersTotallyOffOrBad() const
Definition: HitPattern.h:751
int cscStationsWithBadHits() const
Definition: HitPattern.h:783
int numberOfDTStationsWithBothViews() const
Definition: HitPattern.cc:703
static const unsigned short HitSize
Definition: HitPattern.h:344
static uint32_t getSide(uint32_t pattern)
Definition: HitPattern.h:496
int dtStationsWithAnyHits() const
Definition: HitPattern.h:781
int numberOfLostStripHits() const
Definition: HitPattern.h:635
Definition: DetId.h:20
int innermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:650
int numberOfInactiveTrackerHits() const
Definition: HitPattern.h:695
static const unsigned short SideMask
Definition: HitPattern.h:360
int pixelEndcapLayersWithoutMeasurement() const
Definition: HitPattern.cc:401
int innermostMuonStationWithBadHits() const
Definition: HitPattern.h:790
static const unsigned short SubDetectorOffset
Definition: HitPattern.h:347
int trackerLayersNull() const
Definition: HitPattern.h:758
int stripLayersWithMeasurement() const
Definition: HitPattern.h:715
int pixelBarrelLayersWithMeasurement() const
Definition: HitPattern.cc:337
int numberOfBadMuonDTHits() const
Definition: HitPattern.h:677
static uint32_t getRPCregion(uint32_t pattern)
RPC region: 0 = barrel, 1 = endcap. Only valid for muon RPC patterns, of course.
Definition: HitPattern.h:524
int outermostMuonStationWithBadHits() const
Definition: HitPattern.h:793
int dtStationsWithBadHits() const
Definition: HitPattern.h:780
int numberOfValidStripTIBHits() const
Definition: HitPattern.h:582
int numberOfValidTrackerHits() const
Definition: HitPattern.h:558
int numberOfValidPixelEndcapHits() const
Definition: HitPattern.h:574
int stripTOBLayersNull() const
Definition: HitPattern.cc:538
uint32_t getTrackerLayerCase(uint32_t substr, uint32_t layer) const
Definition: HitPattern.cc:260
static bool type_3_HitFilter(uint32_t pattern)
Definition: HitPattern.h:544
int pixelBarrelLayersTotallyOffOrBad() const
Definition: HitPattern.cc:447
#define likely(x)
Definition: Likely.h:20
int numberOfLostMuonDTHits() const
Definition: HitPattern.h:655
#define begin
Definition: vmac.h:31
static const unsigned short SubstrMask
Definition: HitPattern.h:352
int numberOfBadMuonCSCHits() const
Definition: HitPattern.h:681
int numberOfLostStripTOBHits() const
Definition: HitPattern.h:647
static const int RPC
Definition: MuonSubdetId.h:16
static const unsigned short LayerOffset
Definition: HitPattern.h:355
int stripTECLayersWithoutMeasurement() const
Definition: HitPattern.cc:437
int numberOfValidMuonDTHits() const
Definition: HitPattern.h:598
static bool stripHitFilter(uint32_t pattern)
Definition: HitPattern.h:406
int stripTECLayersWithMeasurement() const
Definition: HitPattern.cc:382
int stripTOBLayersWithoutMeasurement() const
Definition: HitPattern.cc:428
int pixelEndcapLayersTotallyOffOrBad() const
Definition: HitPattern.cc:456
int numberOfValidPixelHits() const
Definition: HitPattern.h:566
static bool pixelEndcapHitFilter(uint32_t pattern)
Definition: HitPattern.h:399
static bool muonCSCHitFilter(uint32_t pattern)
Definition: HitPattern.h:451
tuple cout
Definition: gather_cfg.py:121
static const int DT
Definition: MuonSubdetId.h:14
bool filterType(unsigned int)
Definition: HitPattern.h:149
void printHitPattern(int position, std::ostream &stream) const
Definition: HitPattern.cc:556
bool hasValidHitInFirstPixelBarrel() const
Definition: HitPattern.cc:183
int numberOfValidMuonHits() const
Definition: HitPattern.h:562
static bool stripTOBHitFilter(uint32_t pattern)
Definition: HitPattern.h:430
int stripTIBLayersTotallyOffOrBad() const
Definition: HitPattern.cc:465
static const unsigned short LayerMask
Definition: HitPattern.h:356
int numberOfLostStripTIBHits() const
Definition: HitPattern.h:639
uint32_t getHitPattern(int position) const
Definition: HitPattern.cc:144
int rpcStationsWithAnyHits() const
Definition: HitPattern.h:787
int numberOfLostPixelBarrelHits() const
Definition: HitPattern.h:627
void set(const TrackingRecHitRef &ref, unsigned int i)
Definition: HitPattern.h:373
int countHits(filterType filter) const
Definition: HitPattern.h:150
static bool pixelBarrelHitFilter(uint32_t pattern)
Definition: HitPattern.h:392
int innermostMuonStationWithValidHits() const
Definition: HitPattern.h:789
int numberOfLostMuonCSCHits() const
Definition: HitPattern.h:659
int outermostMuonStationWithAnyHits() const
Definition: HitPattern.h:794
int pixelEndcapLayersNull() const
Definition: HitPattern.cc:511
void setHitPattern(int position, uint32_t pattern)
Definition: HitPattern.cc:79
static bool stripTIBHitFilter(uint32_t pattern)
Definition: HitPattern.h:416
HitPattern(const I &begin, const I &end)
Definition: HitPattern.h:129