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 //
117 #include <algorithm>
118 #include <iostream>
119 #include <ostream>
120 
121 
122 namespace reco {
123  class HitPattern {
124  public:
125  enum { MONO = 1, STEREO = 2 };
126 
127  // number of 32 bit integers to store the full pattern
128  const static unsigned short PatternSize = 25;
129 
130  // number of bits used for each hit
131  const static unsigned short HitSize = 11;
132 
133  static const int MaxHits = (PatternSize * 32) / HitSize;
134 
135  // default constructor
136  // init hit pattern array as 0x00000000, ..., 0x00000000
137  HitPattern() { for (int i=0; i<PatternSize; i++) hitPattern_[i] = 0; }
138 
139  // constructor from iterator (begin, end) pair
140  template<typename I>
141  HitPattern(const I & begin, const I & end) { set(begin, end); }
142 
143  // constructor from hit collection
144  template<typename C>
145  HitPattern(const C & c) { set(c); }
146 
147  // set pattern from iterator (begin, end) pair
148  // init hit pattern array as 0x00000000, ..., 0x00000000
149  // loop over the hits and set hit pattern
150  template<typename I>
151  void set(const I & begin, const I & end) {
152  for (int i=0; i<PatternSize; i++) hitPattern_[i] = 0;
153  unsigned int counter = 0;
154  for (I hit=begin; hit!=end && counter<32*PatternSize/HitSize;
155  hit++, counter++)
156  set(*hit, counter);
157  }
158 
159 
160  // generic count methods
161  typedef bool filterType(unsigned int);
163  int count = 0;
164  for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
165  uint32_t pattern = getHitPattern(i);
166  if (pattern == 0) break;
167  if (filter(pattern)) ++count;
168  }
169  return count;
170  }
171 
172  int countTypedHits(filterType typeFilter, filterType filter) const {
173  int count = 0;
174  for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
175  uint32_t pattern = getHitPattern(i);
176  if (pattern == 0) break;
177  if (typeFilter(pattern)&&filter(pattern)) ++count;
178  }
179  return count;
180  }
181 
182  template<typename F>
183  void call(filterType typeFilter, F f) const {
184  for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
185  uint32_t pattern = getHitPattern(i);
186  if (pattern == 0) break;
187  // f() return false to ask to stop looping
188  if (typeFilter(pattern) && !f(pattern) ) break;
189  }
190  }
191 
192  // print the pattern of the position-th hit
193  void printHitPattern (int position, std::ostream &stream) const;
194  void print (std::ostream &stream = std::cout) const;
195 
196  // set the pattern of the i-th hit
197  void set(const TrackingRecHit &hit, unsigned int i){setHitPattern(i, encode(hit,i));}
198 
199  // append a hit to the hit pattern
200  void appendHit(const TrackingRecHit & hit);
201 
202  // get the pattern of the position-th hit
203  uint32_t getHitPattern(int position) const;
204 
205  static bool trackerHitFilter(uint32_t pattern); // tracker hit
206  static bool muonHitFilter(uint32_t pattern); // muon hit
207 
208  static uint32_t getSubStructure(uint32_t pattern); // sub-structure
209  static bool pixelHitFilter(uint32_t pattern); // pixel
210  static bool pixelBarrelHitFilter(uint32_t pattern); // pixel barrel
211  static bool pixelEndcapHitFilter(uint32_t pattern); // pixel endcap
212  static bool stripHitFilter(uint32_t pattern); // strip
213  static bool stripTIBHitFilter(uint32_t pattern); // strip TIB
214  static bool stripTIDHitFilter(uint32_t pattern); // strip TID
215  static bool stripTOBHitFilter(uint32_t pattern); // strip TOB
216  static bool stripTECHitFilter(uint32_t pattern); // strip TEC
217  static bool muonDTHitFilter(uint32_t pattern); // muon DT
218  static bool muonCSCHitFilter(uint32_t pattern); // muon CSC
219  static bool muonRPCHitFilter(uint32_t pattern); // muon RPC
220 
221  static uint32_t getLayer(uint32_t pattern); // sub-sub-structure
222  static uint32_t getSubSubStructure(uint32_t pattern); // sub-sub-structure
223 
225  static uint32_t getMuonStation(uint32_t pattern); // only for patterns from muon, of course
227  static uint32_t getDTSuperLayer(uint32_t pattern); // only for DT patterns
229  static uint32_t getCSCRing(uint32_t pattern) ;
231  static uint32_t getRPCLayer(uint32_t pattern) ;
233  static uint32_t getRPCregion(uint32_t pattern);
234 
235  static uint32_t getHitType(uint32_t pattern); // hit type
236  static bool validHitFilter(uint32_t pattern); // hit type 0 = valid
237  static bool type_1_HitFilter(uint32_t pattern); // hit type 1
238  static bool type_2_HitFilter(uint32_t pattern); // hit type 2
239  static bool type_3_HitFilter(uint32_t pattern); // hit type 3
240 
241  static uint32_t getSide (uint32_t pattern); // mono (0) or stereo (1)
242 
243  bool hasValidHitInFirstPixelBarrel() const; // has valid hit in PXB layer 1
244  bool hasValidHitInFirstPixelEndcap() const; // has valid hit in PXF layer 1
245 
246  int numberOfHits() const; // not-null
247  int numberOfValidHits() const; // not-null, valid
248  int numberOfValidTrackerHits() const; // not-null, valid, tracker
249  int numberOfValidMuonHits() const; // not-null, valid, muon
250  int numberOfValidPixelHits() const; // not-null, valid, pixel
251  int numberOfValidPixelBarrelHits() const; // not-null, valid, pixel PXB
252  int numberOfValidPixelEndcapHits() const; // not-null, valid, pixel PXF
253  int numberOfValidStripHits() const; // not-null, valid, strip
254  int numberOfValidStripTIBHits() const; // not-null, valid, strip TIB
255  int numberOfValidStripTIDHits() const; // not-null, valid, strip TID
256  int numberOfValidStripTOBHits() const; // not-null, valid, strip TOB
257  int numberOfValidStripTECHits() const; // not-null, valid, strip TEC
258  int numberOfValidMuonDTHits() const; // not-null, valid, muon DT
259  int numberOfValidMuonCSCHits() const; // not-null, valid, muon CSC
260  int numberOfValidMuonRPCHits() const; // not-null, valid, muon RPC
261  int numberOfLostHits() const; // not-null, not valid
262  int numberOfLostTrackerHits() const; // not-null, not valid, tracker
263  int numberOfLostMuonHits() const; // not-null, not valid, muon
264  int numberOfLostPixelHits() const; // not-null, not valid, pixel
265  int numberOfLostPixelBarrelHits() const; // not-null, not valid, pixel PXB
266  int numberOfLostPixelEndcapHits() const; // not-null, not valid, pixel PXF
267  int numberOfLostStripHits() const; // not-null, not valid, strip
268  int numberOfLostStripTIBHits() const; // not-null, not valid, strip TIB
269  int numberOfLostStripTIDHits() const; // not-null, not valid, strip TID
270  int numberOfLostStripTOBHits() const; // not-null, not valid, strip TOB
271  int numberOfLostStripTECHits() const; // not-null, not valid, strip TEC
272  int numberOfLostMuonDTHits() const; // not-null, not valid, muon DT
273  int numberOfLostMuonCSCHits() const; // not-null, not valid, muon CSC
274  int numberOfLostMuonRPCHits() const; // not-null, not valid, muon RPC
275  int numberOfBadHits() const; // not-null, bad (only used in Muon Ch.)
276  int numberOfBadMuonHits() const; // not-null, bad, muon
277  int numberOfBadMuonDTHits() const; // not-null, bad, muon DT
278  int numberOfBadMuonCSCHits() const; // not-null, bad, muon CSC
279  int numberOfBadMuonRPCHits() const; // not-null, bad, muon RPC
280  int numberOfInactiveHits() const; // not-null, inactive
281  int numberOfInactiveTrackerHits() const; // not-null, inactive, tracker
282 
283  int numberOfValidStripLayersWithMonoAndStereo (uint32_t stripdet, uint32_t layer)
284  const; // count strip layers that have non-null, valid mono and stereo hits
285 
287  const {return numberOfValidStripLayersWithMonoAndStereo(0,0);}
288 
289  int numberOfValidTOBLayersWithMonoAndStereo (uint32_t layer = 0)
291  int numberOfValidTIBLayersWithMonoAndStereo (uint32_t layer = 0)
293  int numberOfValidTIDLayersWithMonoAndStereo (uint32_t layer = 0)
295  int numberOfValidTECLayersWithMonoAndStereo (uint32_t layer = 0)
297 
298  uint32_t getTrackerLayerCase(uint32_t substr, uint32_t layer) const;
299  uint32_t getTrackerMonoStereo (uint32_t substr, uint32_t layer) const;
300 
301  int trackerLayersWithMeasurement() const; // case 0: tracker
302  int pixelLayersWithMeasurement() const; // case 0: pixel
303  int stripLayersWithMeasurement() const; // case 0: strip
304  int pixelBarrelLayersWithMeasurement() const; // case 0: pixel PXB
305  int pixelEndcapLayersWithMeasurement() const; // case 0: pixel PXF
306  int stripTIBLayersWithMeasurement() const; // case 0: strip TIB
307  int stripTIDLayersWithMeasurement() const; // case 0: strip TID
308  int stripTOBLayersWithMeasurement() const; // case 0: strip TOB
309  int stripTECLayersWithMeasurement() const; // case 0: strip TEC
310  int trackerLayersWithoutMeasurement() const; // case 1: tracker
311  int pixelLayersWithoutMeasurement() const; // case 1: pixel
312  int stripLayersWithoutMeasurement() const; // case 1: strip
313  int pixelBarrelLayersWithoutMeasurement() const; // case 1: pixel PXB
314  int pixelEndcapLayersWithoutMeasurement() const; // case 1: pixel PXF
315  int stripTIBLayersWithoutMeasurement() const; // case 1: strip TIB
316  int stripTIDLayersWithoutMeasurement() const; // case 1: strip TID
317  int stripTOBLayersWithoutMeasurement() const; // case 1: strip TOB
318  int stripTECLayersWithoutMeasurement() const; // case 1: strip TEC
319  int trackerLayersTotallyOffOrBad() const; // case 2: tracker
320  int pixelLayersTotallyOffOrBad() const; // case 2: pixel
321  int stripLayersTotallyOffOrBad() const; // case 2: strip
322  int pixelBarrelLayersTotallyOffOrBad() const; // case 2: pixel PXB
323  int pixelEndcapLayersTotallyOffOrBad() const; // case 2: pixel PXF
324  int stripTIBLayersTotallyOffOrBad() const; // case 2: strip TIB
325  int stripTIDLayersTotallyOffOrBad() const; // case 2: strip TID
326  int stripTOBLayersTotallyOffOrBad() const; // case 2: strip TOB
327  int stripTECLayersTotallyOffOrBad() const; // case 2: strip TEC
328  int trackerLayersNull() const; // case 999999: tracker
329  int pixelLayersNull() const; // case 999999: pixel
330  int stripLayersNull() const; // case 999999: strip
331  int pixelBarrelLayersNull() const; // case 999999: pixel PXB
332  int pixelEndcapLayersNull() const; // case 999999: pixel PXF
333  int stripTIBLayersNull() const; // case 999999: strip TIB
334  int stripTIDLayersNull() const; // case 999999: strip TID
335  int stripTOBLayersNull() const; // case 999999: strip TOB
336  int stripTECLayersNull() const; // case 999999: strip TEC
337 
338 
339 
341  int muonStations(int subdet, int hitType) const ;
342 
343  int muonStationsWithValidHits() const ;
344  int muonStationsWithBadHits() const ;
345  int muonStationsWithAnyHits() const ;
346  int dtStationsWithValidHits() const ;
347  int dtStationsWithBadHits() const ;
348  int dtStationsWithAnyHits() const ;
349  int cscStationsWithValidHits() const ;
350  int cscStationsWithBadHits() const ;
351  int cscStationsWithAnyHits() const ;
352  int rpcStationsWithValidHits() const ;
353  int rpcStationsWithBadHits() const ;
354  int rpcStationsWithAnyHits() const ;
355 
357  int innermostMuonStationWithHits(int hitType) const ;
359  int innermostMuonStationWithBadHits() const ;
360  int innermostMuonStationWithAnyHits() const ;
361 
363  int outermostMuonStationWithHits(int hitType) const ;
365  int outermostMuonStationWithBadHits() const ;
366  int outermostMuonStationWithAnyHits() const ;
367 
368  int numberOfDTStationsWithRPhiView() const ;
369  int numberOfDTStationsWithRZView() const ;
370  int numberOfDTStationsWithBothViews() const ;
371  private:
372 
373 
374  // 1 bit to distinguish tracker and muon subsystems
375  const static unsigned short SubDetectorOffset = 10;
376  const static unsigned short SubDetectorMask = 0x1;
377 
378  // 3 bits to identify the tracker/muon detector substructure
379  const static unsigned short SubstrOffset = 7;
380  const static unsigned short SubstrMask = 0x7;
381 
382  // 4 bits to identify the layer/disk/wheel within the substructure
383  const static unsigned short LayerOffset = 3;
384  const static unsigned short LayerMask = 0xF;
385 
386  // 1 bit to identify the side in double-sided detectors
387  const static unsigned short SideOffset = 2;
388  const static unsigned short SideMask = 0x1;
389 
390  // 2 bits for hit type
391  const static unsigned short HitTypeOffset = 0;
392  const static unsigned short HitTypeMask = 0x3;
393 
394  // full hit pattern information is packed in PatternSize 32 bit words
395  uint32_t hitPattern_[ PatternSize ];
396 
397  // set pattern for position-th hit
398  void setHitPattern(int position, uint32_t pattern);
399 
400  // set pattern for i-th hit passing a reference
401  void set(const TrackingRecHitRef & ref, unsigned int i) { set(* ref, i); }
402 
403  // detector side for tracker modules (mono/stereo)
404  static uint32_t isStereo (DetId);
405 
406  // encoder for pattern
407  uint32_t encode(const TrackingRecHit &,unsigned int);
408  };
409 
410  // inline function
411 
412  inline bool HitPattern::pixelHitFilter(uint32_t pattern) {
413  if unlikely(!trackerHitFilter(pattern)) return false;
414  uint32_t substructure = getSubStructure(pattern);
415  if (substructure == PixelSubdetector::PixelBarrel ||
416  substructure == PixelSubdetector::PixelEndcap) return true;
417  return false;
418  }
419 
420  inline bool HitPattern::pixelBarrelHitFilter(uint32_t pattern) {
421  if unlikely(!trackerHitFilter(pattern)) return false;
422  uint32_t substructure = getSubStructure(pattern);
423  if (substructure == PixelSubdetector::PixelBarrel) return true;
424  return false;
425  }
426 
427  inline bool HitPattern::pixelEndcapHitFilter(uint32_t pattern) {
428  if unlikely(!trackerHitFilter(pattern)) return false;
429  uint32_t substructure = getSubStructure(pattern);
430  if (substructure == PixelSubdetector::PixelEndcap) return true;
431  return false;
432  }
433 
434  inline bool HitPattern::stripHitFilter(uint32_t pattern) {
435  if unlikely(!trackerHitFilter(pattern)) return false;
436  uint32_t substructure = getSubStructure(pattern);
437  if (substructure == StripSubdetector::TIB ||
438  substructure == StripSubdetector::TID ||
439  substructure == StripSubdetector::TOB ||
440  substructure == StripSubdetector::TEC) return true;
441  return false;
442  }
443 
444  inline bool HitPattern::stripTIBHitFilter(uint32_t pattern) {
445  if unlikely(!trackerHitFilter(pattern)) return false;
446  uint32_t substructure = getSubStructure(pattern);
447  if (substructure == StripSubdetector::TIB) return true;
448  return false;
449  }
450 
451  inline bool HitPattern::stripTIDHitFilter(uint32_t pattern) {
452  if unlikely(!trackerHitFilter(pattern)) return false;
453  uint32_t substructure = getSubStructure(pattern);
454  if (substructure == StripSubdetector::TID) return true;
455  return false;
456  }
457 
458  inline bool HitPattern::stripTOBHitFilter(uint32_t pattern) {
459  if unlikely(!trackerHitFilter(pattern)) return false;
460  uint32_t substructure = getSubStructure(pattern);
461  if (substructure == StripSubdetector::TOB) return true;
462  return false;
463  }
464 
465  inline bool HitPattern::stripTECHitFilter(uint32_t pattern) {
466  if unlikely(!trackerHitFilter(pattern)) return false;
467  uint32_t substructure = getSubStructure(pattern);
468  if (substructure == StripSubdetector::TEC) return true;
469  return false;
470  }
471 
472  inline bool HitPattern::muonDTHitFilter(uint32_t pattern) {
473  if unlikely(!muonHitFilter(pattern)) return false;
474  uint32_t substructure = getSubStructure(pattern);
475  if (substructure == (uint32_t) MuonSubdetId::DT) return true;
476  return false;
477  }
478 
479  inline bool HitPattern::muonCSCHitFilter(uint32_t pattern) {
480  if unlikely(!muonHitFilter(pattern)) return false;
481  uint32_t substructure = getSubStructure(pattern);
482  if (substructure == (uint32_t) MuonSubdetId::CSC) return true;
483  return false;
484  }
485 
486  inline bool HitPattern::muonRPCHitFilter(uint32_t pattern) {
487  if unlikely(!muonHitFilter(pattern)) return false;
488  uint32_t substructure = getSubStructure(pattern);
489  if (substructure == (uint32_t) MuonSubdetId::RPC) return true;
490  return false;
491  }
492 
493 
494  inline bool HitPattern::trackerHitFilter(uint32_t pattern) {
495  if unlikely(pattern == 0) return false;
496  if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 1) return true;
497  return false;
498  }
499 
500  inline bool HitPattern::muonHitFilter(uint32_t pattern) {
501  if unlikely(pattern == 0) return false;
502  if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 0) return true;
503  return false;
504  }
505 
506 
507  inline uint32_t HitPattern::getSubStructure(uint32_t pattern) {
508  if unlikely(pattern == 0) return 999999;
509  return ((pattern >> SubstrOffset) & SubstrMask);
510  }
511 
512 
513  inline uint32_t HitPattern::getLayer(uint32_t pattern) {
514  if unlikely(pattern == 0) return 999999;
515  return ((pattern>>LayerOffset) & LayerMask);
516  }
517 
518  inline uint32_t HitPattern::getSubSubStructure(uint32_t pattern) {
519  if unlikely(pattern == 0) return 999999;
520  return ((pattern>>LayerOffset) & LayerMask);
521  }
522 
523 
524  inline uint32_t HitPattern::getSide (uint32_t pattern) {
525  if unlikely(pattern == 0) return 999999;
526  return (pattern >> SideOffset) & SideMask;
527  }
528 
529  inline uint32_t HitPattern::getHitType( uint32_t pattern ) {
530  if unlikely(pattern == 0) return 999999;
531  return ((pattern>>HitTypeOffset) & HitTypeMask);
532  }
533 
534  inline uint32_t HitPattern::getMuonStation(uint32_t pattern) {
535  return (getSubSubStructure(pattern)>>2) + 1;
536  }
537 
538  inline uint32_t HitPattern::getDTSuperLayer(uint32_t pattern) {
539  return (getSubSubStructure(pattern) & 3);
540  }
541 
542  inline uint32_t HitPattern::getCSCRing(uint32_t pattern) {
543  return (getSubSubStructure(pattern) & 3) + 1;
544  }
545 
546  inline uint32_t HitPattern::getRPCLayer(uint32_t pattern) {
547  uint32_t sss = getSubSubStructure(pattern), stat = sss >> 2;
548  if likely(stat <= 1) return ((sss >> 1) & 1) + 1;
549  return 0;
550  }
551 
552  inline uint32_t HitPattern::getRPCregion(uint32_t pattern) {
553  return getSubSubStructure(pattern) & 1;
554  }
555 
556 
557  inline bool HitPattern::validHitFilter(uint32_t pattern) {
558  if (getHitType(pattern) == 0) return true;
559  return false;
560  }
561 
562  inline bool HitPattern::type_1_HitFilter(uint32_t pattern) {
563  if (getHitType(pattern) == 1) return true;
564  return false;
565  }
566 
567  inline bool HitPattern::type_2_HitFilter(uint32_t pattern) {
568  if (getHitType(pattern) == 2) return true;
569  return false;
570  }
571 
572  inline bool HitPattern::type_3_HitFilter(uint32_t pattern) {
573  if (getHitType(pattern) == 3) return true;
574  return false;
575  }
576 
577 
578  // count methods
579 
580 // valid
581 
582 inline int HitPattern::numberOfValidHits() const {
583  return countHits(validHitFilter);
584 }
585 
588 }
589 
592 }
593 
596 }
597 
600 }
601 
604 }
605 
608 }
609 
612 }
613 
616 }
617 
620 }
621 
624 }
625 
628 }
629 
632 }
633 
636 }
637 
638 // lost
639 inline int HitPattern::numberOfLostHits() const {
640  return countHits(type_1_HitFilter);
641 }
642 
645 }
646 
649 }
650 
653 }
654 
657 }
658 
661 }
662 
665 }
666 
669 }
670 
673 }
674 
677 }
678 
681 }
682 
685 }
686 
689 }
690 
693 }
694 
695 
696 // bad
697 inline int HitPattern::numberOfBadHits() const {
698  return countHits(type_3_HitFilter);
699 }
700 
703 }
704 
707 }
708 
711 }
712 
715 }
716 
717 
718 // inactive
720  return countHits(type_2_HitFilter);
721 }
722 
725 }
726 
727 
728 
729 
730 
731 
732 
734  return pixelLayersWithMeasurement() +
736  }
737 
741  }
742 
748  }
749 
750 
754  }
755 
759  }
760 
766  }
767 
768 
770  return pixelLayersTotallyOffOrBad() +
772  }
773 
777  }
778 
784  }
785 
786  inline int HitPattern::trackerLayersNull() const {
787  return pixelLayersNull() +
788  stripLayersNull();
789  }
790 
791  inline int HitPattern::pixelLayersNull() const {
792  return pixelBarrelLayersNull() +
794  }
795 
796  inline int HitPattern::stripLayersNull() const {
797  return stripTIBLayersNull() +
799  stripTOBLayersNull() +
801  }
802 
803 
804  inline int HitPattern::muonStationsWithValidHits() const { return muonStations(0, 0); }
805  inline int HitPattern::muonStationsWithBadHits() const { return muonStations(0, 3); }
806  inline int HitPattern::muonStationsWithAnyHits() const { return muonStations(0,-1); }
807  inline int HitPattern::dtStationsWithValidHits() const { return muonStations(1, 0); }
808  inline int HitPattern::dtStationsWithBadHits() const { return muonStations(1, 3); }
809  inline int HitPattern::dtStationsWithAnyHits() const { return muonStations(1,-1); }
810  inline int HitPattern::cscStationsWithValidHits() const { return muonStations(2, 0); }
811  inline int HitPattern::cscStationsWithBadHits() const { return muonStations(2, 3); }
812  inline int HitPattern::cscStationsWithAnyHits() const { return muonStations(2,-1); }
813  inline int HitPattern::rpcStationsWithValidHits() const { return muonStations(3, 0); }
814  inline int HitPattern::rpcStationsWithBadHits() const { return muonStations(3, 3); }
815  inline int HitPattern::rpcStationsWithAnyHits() const { return muonStations(3,-1); }
816 
823 
824 #ifndef CMS_NOCXX11 // cint....
825 
826  template<int N=reco::HitPattern::MaxHits>
827  struct PatternSet {
828  static constexpr int MaxHits=N;
829  unsigned char hit[N];
830  unsigned char nhit;
831 
832  unsigned char const * begin() const { return hit;}
833  unsigned char const * end() const { return hit+nhit;}
834  unsigned char * begin() { return hit;}
835  unsigned char * end() { return hit+nhit;}
836  int size() const { return nhit;}
837  unsigned char operator[](int i) const{ return hit[i];}
838 
839  PatternSet(): nhit(0){}
841  fill(hp);
842  }
843 
844  void fill(reco::HitPattern const & hp) {
845  int lhit=0;
846  auto unpack =[&lhit,this](uint32_t pattern) -> bool {
847  unsigned char p = 255&(pattern>>3);
848  hit[lhit++]= p;
849 
850  // bouble sort
851  if (lhit>1)
852  for (auto h=hit+lhit-1; h!=hit; --h) {
853  if ( (*(h-1)) <= p) break; // { (*h)=p;break;}
854  (*h)=*(h-1); *(h-1)=p;
855  }
856  return lhit<MaxHits;
857  };
859  nhit=lhit;
860  }
861  };
862 
863  template<int N>
865  PatternSet<N> comm;
866  comm.nhit = std::set_intersection(p1.begin(),p1.end(),p2.begin(),p2.end(),comm.begin())-comm.begin();
867  return comm;
868 }
869 #endif // gcc11
870 
871 } // namespace reco
872 
873 #endif
PatternSet(reco::HitPattern const &hp)
Definition: HitPattern.h:840
unsigned char const * begin() const
Definition: HitPattern.h:832
int stripTOBLayersWithMeasurement() const
Definition: HitPattern.cc:376
int countTypedHits(filterType typeFilter, filterType filter) const
Definition: HitPattern.h:172
unsigned char const * end() const
Definition: HitPattern.h:833
int i
Definition: DBlmapReader.cc:9
int cscStationsWithAnyHits() const
Definition: HitPattern.h:812
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:546
int outermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:673
int outermostMuonStationWithValidHits() const
Definition: HitPattern.h:820
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:538
int pixelBarrelLayersNull() const
Definition: HitPattern.cc:509
int stripTIBLayersNull() const
Definition: HitPattern.cc:529
PatternSet< N > commonHits(PatternSet< N > const &p1, PatternSet< N > const &p2)
Definition: HitPattern.h:864
int numberOfInactiveHits() const
Definition: HitPattern.h:719
int numberOfValidTECLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.h:295
static uint32_t getLayer(uint32_t pattern)
Definition: HitPattern.h:513
void appendHit(const TrackingRecHit &hit)
Definition: HitPattern.cc:88
static uint32_t isStereo(DetId)
Definition: HitPattern.cc:607
static uint32_t getCSCRing(uint32_t pattern)
CSC ring (1-4). Only valid for muon CSC patterns, of course.
Definition: HitPattern.h:542
uint32_t hitPattern_[PatternSize]
Definition: HitPattern.h:395
int stripTIBLayersWithMeasurement() const
Definition: HitPattern.cc:358
int stripTECLayersNull() const
Definition: HitPattern.cc:556
static const unsigned short SideOffset
Definition: HitPattern.h:387
uint32_t encode(const TrackingRecHit &, unsigned int)
Definition: HitPattern.cc:15
void set(const TrackingRecHit &hit, unsigned int i)
Definition: HitPattern.h:197
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:644
static uint32_t getSubSubStructure(uint32_t pattern)
Definition: HitPattern.h:518
int pixelLayersWithoutMeasurement() const
Definition: HitPattern.h:756
int numberOfLostTrackerHits() const
Definition: HitPattern.h:643
static bool muonDTHitFilter(uint32_t pattern)
Definition: HitPattern.h:472
static const unsigned short SubstrOffset
Definition: HitPattern.h:379
int numberOfValidHits() const
Definition: HitPattern.h:582
static bool trackerHitFilter(uint32_t pattern)
Definition: HitPattern.h:494
uint32_t getTrackerMonoStereo(uint32_t substr, uint32_t layer) const
Definition: HitPattern.cc:295
int numberOfLostHits() const
Definition: HitPattern.h:639
int numberOfDTStationsWithRPhiView() const
Definition: HitPattern.cc:688
int numberOfBadHits() const
Definition: HitPattern.h:697
int cscStationsWithValidHits() const
Definition: HitPattern.h:810
int pixelLayersNull() const
Definition: HitPattern.h:791
int numberOfLostPixelHits() const
Definition: HitPattern.h:651
unsigned char nhit
Definition: HitPattern.h:830
int pixelLayersWithMeasurement() const
Definition: HitPattern.h:738
int trackerLayersWithoutMeasurement() const
Definition: HitPattern.h:751
int numberOfValidStripHits() const
Definition: HitPattern.h:606
static uint32_t getHitType(uint32_t pattern)
Definition: HitPattern.h:529
int numberOfValidTOBLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.h:289
int stripTIDLayersWithoutMeasurement() const
Definition: HitPattern.cc:424
int rpcStationsWithValidHits() const
Definition: HitPattern.h:813
HitPattern(const C &c)
Definition: HitPattern.h:145
static bool type_2_HitFilter(uint32_t pattern)
Definition: HitPattern.h:567
static uint32_t getMuonStation(uint32_t pattern)
Muon station (1-4). Only valid for muon patterns, of course.
Definition: HitPattern.h:534
void set(const I &begin, const I &end)
Definition: HitPattern.h:151
void print(std::ostream &stream=std::cout) const
Definition: HitPattern.cc:592
int numberOfValidTIDLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.h:293
static const unsigned short PatternSize
Definition: HitPattern.h:128
int pixelBarrelLayersWithoutMeasurement() const
Definition: HitPattern.cc:395
static bool stripTECHitFilter(uint32_t pattern)
Definition: HitPattern.h:465
int numberOfLostMuonHits() const
Definition: HitPattern.h:647
Float p2
Definition: deltaR.h:21
static const unsigned short HitTypeMask
Definition: HitPattern.h:392
int pixelEndcapLayersWithMeasurement() const
Definition: HitPattern.cc:348
int numberOfValidTIBLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.h:291
int numberOfValidStripTOBHits() const
Definition: HitPattern.h:618
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
int numberOfValidMuonCSCHits() const
Definition: HitPattern.h:630
void call(filterType typeFilter, F f) const
Definition: HitPattern.h:183
int numberOfValidMuonRPCHits() const
Definition: HitPattern.h:634
bool hasValidHitInFirstPixelEndcap() const
Definition: HitPattern.cc:198
static bool stripTIDHitFilter(uint32_t pattern)
Definition: HitPattern.h:451
int muonStationsWithBadHits() const
Definition: HitPattern.h:805
int numberOfLostStripTECHits() const
Definition: HitPattern.h:679
static bool muonHitFilter(uint32_t pattern)
Definition: HitPattern.h:500
#define unlikely(x)
Definition: Likely.h:21
int stripLayersNull() const
Definition: HitPattern.h:796
unsigned char * begin()
Definition: HitPattern.h:834
int muonStationsWithValidHits() const
Definition: HitPattern.h:804
static const int CSC
Definition: MuonSubdetId.h:13
static constexpr int MaxHits
Definition: HitPattern.h:828
int stripTOBLayersTotallyOffOrBad() const
Definition: HitPattern.cc:490
int rpcStationsWithBadHits() const
Definition: HitPattern.h:814
int stripLayersWithoutMeasurement() const
Definition: HitPattern.h:761
int innermostMuonStationWithAnyHits() const
Definition: HitPattern.h:819
int trackerLayersTotallyOffOrBad() const
Definition: HitPattern.h:769
int numberOfValidPixelBarrelHits() const
Definition: HitPattern.h:598
int stripTIDLayersTotallyOffOrBad() const
Definition: HitPattern.cc:481
static bool type_1_HitFilter(uint32_t pattern)
Definition: HitPattern.h:562
int numberOfLostPixelEndcapHits() const
Definition: HitPattern.h:659
int stripTIDLayersWithMeasurement() const
Definition: HitPattern.cc:367
int trackerLayersWithMeasurement() const
Definition: HitPattern.h:733
susybsm::HSCParticleRefProd hp
Definition: classes.h:27
Float p1
Definition: deltaR.h:20
static const unsigned short SubDetectorMask
Definition: HitPattern.h:376
int numberOfLostStripTIDHits() const
Definition: HitPattern.h:671
int muonStationsWithAnyHits() const
Definition: HitPattern.h:806
static const int MaxHits
Definition: HitPattern.h:133
void fill(reco::HitPattern const &hp)
Definition: HitPattern.h:844
static bool pixelHitFilter(uint32_t pattern)
Definition: HitPattern.h:412
int pixelLayersTotallyOffOrBad() const
Definition: HitPattern.h:774
int stripTECLayersTotallyOffOrBad() const
Definition: HitPattern.cc:499
int numberOfHits() const
Definition: HitPattern.cc:213
static uint32_t getSubStructure(uint32_t pattern)
Definition: HitPattern.h:507
int numberOfBadMuonHits() const
Definition: HitPattern.h:701
int stripTIBLayersWithoutMeasurement() const
Definition: HitPattern.cc:415
int numberOfValidStripTIDHits() const
Definition: HitPattern.h:614
int size() const
Definition: HitPattern.h:836
const std::complex< double > I
Definition: I.h:8
int numberOfDTStationsWithRZView() const
Definition: HitPattern.cc:700
double f[11][100]
static bool muonRPCHitFilter(uint32_t pattern)
Definition: HitPattern.h:486
static bool validHitFilter(uint32_t pattern)
Definition: HitPattern.h:557
int numberOfValidStripTECHits() const
Definition: HitPattern.h:622
#define end
Definition: vmac.h:37
int stripTIDLayersNull() const
Definition: HitPattern.cc:538
int numberOfLostMuonRPCHits() const
Definition: HitPattern.h:691
static const unsigned short HitTypeOffset
Definition: HitPattern.h:391
int numberOfBadMuonRPCHits() const
Definition: HitPattern.h:713
int dtStationsWithValidHits() const
Definition: HitPattern.h:807
int stripLayersTotallyOffOrBad() const
Definition: HitPattern.h:779
int cscStationsWithBadHits() const
Definition: HitPattern.h:811
unsigned char * end()
Definition: HitPattern.h:835
int numberOfDTStationsWithBothViews() const
Definition: HitPattern.cc:712
static const unsigned short HitSize
Definition: HitPattern.h:131
static uint32_t getSide(uint32_t pattern)
Definition: HitPattern.h:524
int dtStationsWithAnyHits() const
Definition: HitPattern.h:809
int numberOfLostStripHits() const
Definition: HitPattern.h:663
Definition: DetId.h:18
int innermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:659
int numberOfInactiveTrackerHits() const
Definition: HitPattern.h:723
static const unsigned short SideMask
Definition: HitPattern.h:388
#define N
Definition: blowfish.cc:9
int pixelEndcapLayersWithoutMeasurement() const
Definition: HitPattern.cc:405
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
int innermostMuonStationWithBadHits() const
Definition: HitPattern.h:818
static const unsigned short SubDetectorOffset
Definition: HitPattern.h:375
int trackerLayersNull() const
Definition: HitPattern.h:786
int stripLayersWithMeasurement() const
Definition: HitPattern.h:743
int pixelBarrelLayersWithMeasurement() const
Definition: HitPattern.cc:338
int numberOfBadMuonDTHits() const
Definition: HitPattern.h:705
static uint32_t getRPCregion(uint32_t pattern)
RPC region: 0 = barrel, 1 = endcap. Only valid for muon RPC patterns, of course.
Definition: HitPattern.h:552
int outermostMuonStationWithBadHits() const
Definition: HitPattern.h:821
int dtStationsWithBadHits() const
Definition: HitPattern.h:808
int numberOfValidStripTIBHits() const
Definition: HitPattern.h:610
int numberOfValidTrackerHits() const
Definition: HitPattern.h:586
int numberOfValidPixelEndcapHits() const
Definition: HitPattern.h:602
int stripTOBLayersNull() const
Definition: HitPattern.cc:547
uint32_t getTrackerLayerCase(uint32_t substr, uint32_t layer) const
Definition: HitPattern.cc:261
static bool type_3_HitFilter(uint32_t pattern)
Definition: HitPattern.h:572
int pixelBarrelLayersTotallyOffOrBad() const
Definition: HitPattern.cc:452
#define likely(x)
Definition: Likely.h:20
int numberOfLostMuonDTHits() const
Definition: HitPattern.h:683
#define begin
Definition: vmac.h:30
static const unsigned short SubstrMask
Definition: HitPattern.h:380
int numberOfBadMuonCSCHits() const
Definition: HitPattern.h:709
int numberOfLostStripTOBHits() const
Definition: HitPattern.h:675
unsigned char hit[N]
Definition: HitPattern.h:829
static const int RPC
Definition: MuonSubdetId.h:14
static const unsigned short LayerOffset
Definition: HitPattern.h:383
int stripTECLayersWithoutMeasurement() const
Definition: HitPattern.cc:442
static std::atomic< unsigned int > counter
int numberOfValidMuonDTHits() const
Definition: HitPattern.h:626
static bool stripHitFilter(uint32_t pattern)
Definition: HitPattern.h:434
int stripTECLayersWithMeasurement() const
Definition: HitPattern.cc:385
int stripTOBLayersWithoutMeasurement() const
Definition: HitPattern.cc:433
int pixelEndcapLayersTotallyOffOrBad() const
Definition: HitPattern.cc:462
int numberOfValidPixelHits() const
Definition: HitPattern.h:594
static bool pixelEndcapHitFilter(uint32_t pattern)
Definition: HitPattern.h:427
static bool muonCSCHitFilter(uint32_t pattern)
Definition: HitPattern.h:479
tuple cout
Definition: gather_cfg.py:121
static const int DT
Definition: MuonSubdetId.h:12
bool filterType(unsigned int)
Definition: HitPattern.h:161
void printHitPattern(int position, std::ostream &stream) const
Definition: HitPattern.cc:565
bool hasValidHitInFirstPixelBarrel() const
Definition: HitPattern.cc:183
int numberOfValidMuonHits() const
Definition: HitPattern.h:590
static bool stripTOBHitFilter(uint32_t pattern)
Definition: HitPattern.h:458
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:281
int stripTIBLayersTotallyOffOrBad() const
Definition: HitPattern.cc:472
static const unsigned short LayerMask
Definition: HitPattern.h:384
int numberOfLostStripTIBHits() const
Definition: HitPattern.h:667
uint32_t getHitPattern(int position) const
Definition: HitPattern.cc:144
int rpcStationsWithAnyHits() const
Definition: HitPattern.h:815
int numberOfLostPixelBarrelHits() const
Definition: HitPattern.h:655
void set(const TrackingRecHitRef &ref, unsigned int i)
Definition: HitPattern.h:401
int numberOfValidStripLayersWithMonoAndStereo() const
Definition: HitPattern.h:286
int countHits(filterType filter) const
Definition: HitPattern.h:162
static bool pixelBarrelHitFilter(uint32_t pattern)
Definition: HitPattern.h:420
unsigned char operator[](int i) const
Definition: HitPattern.h:837
#define constexpr
int innermostMuonStationWithValidHits() const
Definition: HitPattern.h:817
int numberOfLostMuonCSCHits() const
Definition: HitPattern.h:687
int outermostMuonStationWithAnyHits() const
Definition: HitPattern.h:822
int pixelEndcapLayersNull() const
Definition: HitPattern.cc:519
void setHitPattern(int position, uint32_t pattern)
Definition: HitPattern.cc:79
static bool stripTIBHitFilter(uint32_t pattern)
Definition: HitPattern.h:444
HitPattern(const I &begin, const I &end)
Definition: HitPattern.h:141