CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HitPattern.cc
Go to the documentation of this file.
12 
13 using namespace reco;
14 
16  hitCount(0),
17  beginTrackHits(0),
18  endTrackHits(0),
19  beginInner(0),
20  endInner(0),
21  beginOuter(0),
22  endOuter(0)
23 {
25 }
26 
28  hitCount(other.hitCount),
29  beginTrackHits(other.beginTrackHits),
30  endTrackHits(other.endTrackHits),
31  beginInner(other.beginInner),
32  endInner(other.endInner),
33  beginOuter(other.beginOuter),
34  endOuter(other.endOuter)
35 {
36  memcpy(this->hitPattern, other.hitPattern, sizeof(uint16_t) * HitPattern::ARRAY_LENGTH);
37 }
38 
40 {
41  ;
42 }
43 
45 {
46  if (this == &other) {
47  return *this;
48  }
49 
50  this->hitCount = other.hitCount;
51 
52  this->beginTrackHits = other.beginTrackHits;
53  this->endTrackHits = other.endTrackHits;
54 
55  this->beginInner = other.beginInner;
56  this->endInner = other.endInner;
57 
58  this->beginOuter = other.beginOuter;
59  this->endOuter = other.endOuter;
60 
61  memcpy(this->hitPattern, other.hitPattern, sizeof(uint16_t) * HitPattern::ARRAY_LENGTH);
62 
63  return *this;
64 }
65 
67 {
68  this->hitCount = 0;
69  this->beginTrackHits = 0;
70  this->endTrackHits = 0;
71  this->beginInner = 0;
72  this->endInner = 0;
73  this->beginOuter = 0;
74  this->endOuter = 0;
75 
76  memset(this->hitPattern, EMPTY_PATTERN, sizeof(uint16_t) * HitPattern::ARRAY_LENGTH);
77 }
78 
80 {
81  return appendHit(*ref);
82 }
83 
85 {
86  return encode(hit.geographicalId(), hit.getType());
87 }
88 
89 uint16_t HitPattern::encode(const DetId &id, TrackingRecHit::Type hitType)
90 {
92 
93  uint16_t detid = id.det();
94 
95  // adding tracker/muon detector bit
96  pattern |= (detid & SubDetectorMask) << SubDetectorOffset;
97 
98  // adding substructure (PXB, PXF, TIB, TID, TOB, TEC, or DT, CSC, RPC) bits
99  uint16_t subdet = id.subdetId();
100  pattern |= (subdet & SubstrMask) << SubstrOffset;
101 
102  // adding layer/disk/wheel bits
103  uint16_t layer = 0x0;
104  if (detid == DetId::Tracker) {
105  switch (subdet) {
107  layer = PXBDetId(id).layer();
108  break;
110  layer = PXFDetId(id).disk();
111  break;
113  layer = TIBDetId(id).layer();
114  break;
116  layer = TIDDetId(id).wheel();
117  break;
119  layer = TOBDetId(id).layer();
120  break;
122  layer = TECDetId(id).wheel();
123  break;
124  }
125  } else if (detid == DetId::Muon) {
126  switch (subdet) {
127  case MuonSubdetId::DT:
128  layer = ((DTLayerId(id.rawId()).station() - 1) << 2);
129  layer |= DTLayerId(id.rawId()).superLayer();
130  break;
131  case MuonSubdetId::CSC:
132  layer = ((CSCDetId(id.rawId()).station() - 1) << 2);
133  layer |= (CSCDetId(id.rawId()).ring() - 1);
134  break;
135  case MuonSubdetId::RPC:
136  {
137  RPCDetId rpcid(id.rawId());
138  layer = ((rpcid.station() - 1) << 2);
139  layer |= (rpcid.station() <= 2) ? ((rpcid.layer() - 1) << 1) : 0x0;
140  layer |= abs(rpcid.region());
141  }
142  break;
143  }
144  }
145 
146  pattern |= (layer & LayerMask) << LayerOffset;
147 
148  // adding mono/stereo bit
149  uint16_t side = 0x0;
150  if (detid == DetId::Tracker) {
151  side = isStereo(id);
152  } else if (detid == DetId::Muon) {
153  side = 0x0;
154  }
155 
156  pattern |= (side & SideMask) << SideOffset;
157 
158  TrackingRecHit::Type patternHitType = (hitType == TrackingRecHit::missing_inner ||
160 
161  pattern |= (patternHitType & HitTypeMask) << HitTypeOffset;
162 
163  return pattern;
164 }
165 
167 {
168  return appendHit(hit.geographicalId(), hit.getType());
169 }
170 
172 {
173  //if HitPattern is full, journey ends no matter what.
175  return false;
176  }
177 
178  uint16_t pattern = HitPattern::encode(id, hitType);
179 
180  switch (hitType) {
184  case TrackingRecHit::bad:
185  // hitCount != endT => we are not inserting T type of hits but of T'
186  // 0 != beginT || 0 != endT => we already have hits of T type
187  // so we already have hits of T in the vector and we don't want to
188  // mess them with T' hits.
189  if unlikely(((hitCount != endTrackHits) && (0 != beginTrackHits || 0 != endTrackHits))) {
190  cms::Exception("HitPattern")
191  << "TRACK_HITS"
192  << " were stored on this object before hits of some other category were inserted "
193  << "but hits of the same category should be inserted in a row. "
194  << "Please rework the code so it inserts all "
195  << "TRACK_HITS"
196  << " in a row.";
197  return false;
198  }
199  return insertTrackHit(pattern);
200  break;
202  if unlikely(((hitCount != endInner) && (0 != beginInner || 0 != endInner))) {
203  cms::Exception("HitPattern")
204  << "MISSING_INNER_HITS"
205  << " were stored on this object before hits of some other category were inserted "
206  << "but hits of the same category should be inserted in a row. "
207  << "Please rework the code so it inserts all "
208  << "MISSING_INNER_HITS"
209  << " in a row.";
210  return false;
211  }
212  return insertExpectedInnerHit(pattern);
213  break;
215  if unlikely(((hitCount != endOuter) && (0 != beginOuter || 0 != endOuter))) {
216  cms::Exception("HitPattern")
217  << "MISSING_OUTER_HITS"
218  << " were stored on this object before hits of some other category were inserted "
219  << "but hits of the same category should be inserted in a row. "
220  << "Please rework the code so it inserts all "
221  << "MISSING_OUTER_HITS"
222  << " in a row.";
223  return false;
224  }
225  return insertExpectedOuterHit(pattern);
226  break;
227  }
228 
229  return false;
230 }
231 
233 {
234  if unlikely((position < 0 || position >= hitCount)) {
236  }
237  /*
238  Note: you are not taking a consecutive sequence of HIT_LENGTH bits starting from position * HIT_LENGTH
239  as the bit order in the words are reversed.
240  e.g. if position = 0 you take the lowest 10 bits of the first word.
241 
242  I hope this can clarify what is the memory layout of such thing
243 
244  straight 01234567890123456789012345678901 | 23456789012345678901234567890123 | 4567
245  (global) 0 1 2 3 | 3 4 5 6 | 6
246  words [--------------0---------------] | [--------------1---------------] | [---
247  word 01234567890123456789012345678901 | 01234567890123456789012345678901 | 0123
248  (str) 0 1 2 3 | 0 1 2 3 | 0
249  [--------------0---------------] | [--------------1---------------] | [---
250  word 10987654321098765432109876543210 | 10987654321098765432109876543210 | 1098
251  (rev) 32 21 10 0 | 32 21 10 0 | 32
252  reverse 10987654321098765432109876543210 | 32109876543210987654321098765432 | 5432
253  32 21 10 0 | 6 65 54 43 3 9
254 
255  ugly enough, but it's not my fault, I was not even in CMS at that time [gpetrucc]
256  */
257 
258  uint16_t bitEndOffset = (position + 1) * HIT_LENGTH;
259  uint8_t secondWord = (bitEndOffset >> 4);
260  uint8_t secondWordBits = bitEndOffset & (16 - 1); // that is, bitEndOffset % 16
261  if (secondWordBits >= HIT_LENGTH) { // full block is in this word
262  uint8_t lowBitsToTrash = secondWordBits - HIT_LENGTH;
263  uint16_t myResult = (hitPattern[secondWord] >> lowBitsToTrash) & ((1 << HIT_LENGTH) - 1);
264  return myResult;
265  } else {
266  uint8_t firstWordBits = HIT_LENGTH - secondWordBits;
267  uint16_t firstWordBlock = hitPattern[secondWord - 1] >> (16 - firstWordBits);
268  uint16_t secondWordBlock = hitPattern[secondWord] & ((1 << secondWordBits) - 1);
269  uint16_t myResult = firstWordBlock + (secondWordBlock << firstWordBits);
270  return myResult;
271  }
272 }
273 
275 {
276  for (int i = beginTrackHits; i < endTrackHits; ++i) {
278  if (pixelBarrelHitFilter(pattern) && (getLayer(pattern) == 1)
279  && validHitFilter(pattern)) {
280  return true;
281  }
282  }
283  return false;
284 }
285 
287 {
288  for (int i = beginTrackHits; i < endTrackHits; ++i) {
290  if (pixelEndcapHitFilter(pattern) && (getLayer(pattern) == 1)
291  && validHitFilter(pattern)) {
292  return true;
293  }
294  }
295  return false;
296 }
297 
298 int HitPattern::numberOfValidStripLayersWithMonoAndStereo(uint16_t stripdet, uint16_t layer) const
299 {
300  bool hasMono[SubstrMask + 1][LayerMask + 1];
301  bool hasStereo[SubstrMask + 1][LayerMask + 1];
302  memset(hasMono, 0, sizeof(hasMono));
303  memset(hasStereo, 0, sizeof(hasStereo));
304 
305  // mark which layers have mono/stereo hits
306  for (int i = beginTrackHits; i < endTrackHits; ++i) {
308  uint16_t subStructure = getSubStructure(pattern);
309 
310  if (validHitFilter(pattern) && stripHitFilter(pattern)) {
311  if (stripdet != 0 && subStructure != stripdet) {
312  continue;
313  }
314 
315  if (layer != 0 && getSubSubStructure(pattern) != layer) {
316  continue;
317  }
318 
319  switch (getSide(pattern)) {
320  case 0: // mono
321  hasMono[subStructure][getLayer(pattern)] = true;
322  break;
323  case 1: // stereo
324  hasStereo[subStructure][getLayer(pattern)] = true;
325  break;
326  default:
327  ;
328  break;
329  }
330  }
331  }
332 
333  // count how many layers have mono and stereo hits
334  int count = 0;
335  for (int i = 0; i < SubstrMask + 1; ++i) {
336  for (int j = 0; j < LayerMask + 1; ++j) {
337  if (hasMono[i][j] && hasStereo[i][j]) {
338  count++;
339  }
340  }
341  }
342  return count;
343 }
344 
346 {
348 }
349 
351 {
353 }
354 
356 {
358 }
359 
361 {
363 }
364 
366 {
368 }
369 
370 uint32_t HitPattern::getTrackerLayerCase(HitCategory category, uint16_t substr, uint16_t layer) const
371 {
372  uint16_t tk_substr_layer = (0x1 << SubDetectorOffset)
373  + ((substr & SubstrMask) << SubstrOffset)
374  + ((layer & LayerMask) << LayerOffset);
375 
376  uint16_t mask = (SubDetectorMask << SubDetectorOffset)
377  + (SubstrMask << SubstrOffset)
378  + (LayerMask << LayerOffset);
379 
380  // layer case 0: valid + (missing, off, bad) ==> with measurement
381  // layer case 1: missing + (off, bad) ==> without measurement
382  // layer case 2: off, bad ==> totally off or bad, cannot say much
383  // layer case NULL_RETURN: track outside acceptance or in gap ==> null
384  uint32_t layerCase = NULL_RETURN;
385  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
386  for (int i = range.first; i < range.second; ++i) {
388  if ((pattern & mask) == tk_substr_layer) {
389  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
390  if (hitType < layerCase) {
391  // BAD and INACTIVE as the same type (as INACTIVE)
392  layerCase = (hitType == HIT_TYPE::BAD ? HIT_TYPE::INACTIVE : hitType);
393  if (layerCase == HIT_TYPE::VALID) {
394  break;
395  }
396  }
397  }
398  }
399  return layerCase;
400 }
401 
402 uint16_t HitPattern::getTrackerMonoStereo(HitCategory category, uint16_t substr, uint16_t layer) const
403 {
404  uint16_t tk_substr_layer = (0x1 << SubDetectorOffset)
405  + ((substr & SubstrMask) << SubstrOffset)
406  + ((layer & LayerMask) << LayerOffset);
407  uint16_t mask = (SubDetectorMask << SubDetectorOffset)
408  + (SubstrMask << SubstrOffset)
409  + (LayerMask << LayerOffset);
410 
411  // 0: neither a valid mono nor a valid stereo hit
412  // MONO: valid mono hit
413  // STEREO: valid stereo hit
414  // MONO | STEREO: both
415  uint16_t monoStereo = 0x0;
416  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
417  for (int i = range.first; i < range.second; ++i) {
419  if ((pattern & mask) == tk_substr_layer) {
420  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
421  if (hitType == HIT_TYPE::VALID) {
422  switch (getSide(pattern)) {
423  case 0: // mono
424  monoStereo |= MONO;
425  break;
426  case 1: // stereo
427  monoStereo |= STEREO;
428  break;
429  }
430  }
431 
432  if (monoStereo == (MONO | STEREO)) {
433  break;
434  }
435  }
436  }
437  return monoStereo;
438 }
439 
441 {
442  int count = 0;
443  uint16_t NPixBarrel = 4;
444  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
445  if (getTrackerLayerCase(TRACK_HITS, PixelSubdetector::PixelBarrel, layer) == HIT_TYPE::VALID) {
446  count++;
447  }
448  }
449  return count;
450 }
451 
453 {
454  int count = 0;
455  uint16_t NPixForward = 3;
456  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
457  if (getTrackerLayerCase(TRACK_HITS, PixelSubdetector::PixelEndcap, layer) == HIT_TYPE::VALID) {
458  count++;
459  }
460  }
461  return count;
462 }
463 
465 {
466  int count = 0;
467  for (uint16_t layer = 1; layer <= 4; layer++) {
468  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TIB, layer) == HIT_TYPE::VALID) {
469  count++;
470  }
471  }
472  return count;
473 }
474 
476 {
477  int count = 0;
478  for (uint16_t layer = 1; layer <= 3; layer++) {
479  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TID, layer) == HIT_TYPE::VALID) {
480  count++;
481  }
482  }
483  return count;
484 }
485 
487 {
488  int count = 0;
489  for (uint16_t layer = 1; layer <= 6; layer++) {
490  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TOB, layer) == HIT_TYPE::VALID) {
491  count++;
492  }
493  }
494  return count;
495 }
496 
498 {
499  int count = 0;
500  for (uint16_t layer = 1; layer <= 9; layer++) {
501  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TEC, layer) == HIT_TYPE::VALID) {
502  count++;
503  }
504  }
505  return count;
506 }
507 
509 {
510  int count = 0;
511  uint16_t NPixBarrel = 4;
512  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
513  if (getTrackerLayerCase(category, PixelSubdetector::PixelBarrel, layer) == HIT_TYPE::MISSING) {
514  count++;
515  }
516  }
517  return count;
518 }
519 
521 {
522  int count = 0;
523  uint16_t NPixForward = 3;
524  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
525  if (getTrackerLayerCase(category, PixelSubdetector::PixelEndcap, layer) == HIT_TYPE::MISSING) {
526  count++;
527  }
528  }
529  return count;
530 }
531 
533 {
534  int count = 0;
535  for (uint16_t layer = 1; layer <= 4; layer++) {
536  if (getTrackerLayerCase(category, StripSubdetector::TIB, layer) == HIT_TYPE::MISSING) {
537  count++;
538  }
539  }
540  return count;
541 }
542 
544 {
545  int count = 0;
546  for (uint16_t layer = 1; layer <= 3; layer++) {
547  if (getTrackerLayerCase(category, StripSubdetector::TID, layer) == HIT_TYPE::MISSING) {
548  count++;
549  }
550  }
551  return count;
552 }
553 
555 {
556  int count = 0;
557  for (uint16_t layer = 1; layer <= 6; layer++) {
558  if (getTrackerLayerCase(category, StripSubdetector::TOB, layer) == HIT_TYPE::MISSING) {
559  count++;
560  }
561  }
562  return count;
563 }
564 
566 {
567  int count = 0;
568  for (uint16_t layer = 1; layer <= 9; layer++) {
569  if (getTrackerLayerCase(category, StripSubdetector::TEC, layer) == HIT_TYPE::MISSING) {
570  count++;
571  }
572  }
573  return count;
574 }
575 
576 
578 {
579  int count = 0;
580  uint16_t NPixBarrel = 4;
581  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
582  if (getTrackerLayerCase(TRACK_HITS, PixelSubdetector::PixelBarrel, layer) == HIT_TYPE::INACTIVE) {
583  count++;
584  }
585  }
586  return count;
587 }
588 
590 {
591  int count = 0;
592  uint16_t NPixForward = 3;
593  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
594  if (getTrackerLayerCase(TRACK_HITS, PixelSubdetector::PixelEndcap, layer) == HIT_TYPE::INACTIVE) {
595  count++;
596  }
597  }
598  return count;
599 }
600 
602 {
603  int count = 0;
604  for (uint16_t layer = 1; layer <= 4; layer++) {
605  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TIB, layer) == HIT_TYPE::INACTIVE) {
606  count++;
607  }
608  }
609  return count;
610 }
611 
613 {
614  int count = 0;
615  for (uint16_t layer = 1; layer <= 3; layer++) {
616  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TID, layer) == HIT_TYPE::INACTIVE) {
617  count++;
618  }
619  }
620  return count;
621 }
622 
624 {
625  int count = 0;
626  for (uint16_t layer = 1; layer <= 6; layer++) {
627 
628  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TOB, layer) == HIT_TYPE::INACTIVE) {
629  count++;
630  }
631  }
632  return count;
633 }
634 
636 {
637  int count = 0;
638  for (uint16_t layer = 1; layer <= 9; layer++) {
639  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TEC, layer) == HIT_TYPE::INACTIVE) {
640  count++;
641  }
642  }
643  return count;
644 }
645 
647 {
648  int count = 0;
649  uint16_t NPixBarrel = 4;
650  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
652  count++;
653  }
654  }
655  return count;
656 }
657 
659 {
660  int count = 0;
661  uint16_t NPixForward = 3;
662  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
664  count++;
665  }
666  }
667  return count;
668 }
669 
671 {
672  int count = 0;
673  for (uint16_t layer = 1; layer <= 4; layer++) {
675  count++;
676  }
677  }
678  return count;
679 }
680 
682 {
683  int count = 0;
684  for (uint16_t layer = 1; layer <= 3; layer++) {
686  count++;
687  }
688  }
689  return count;
690 }
691 
693 {
694  int count = 0;
695  for (uint16_t layer = 1; layer <= 6; layer++) {
697  count++;
698  }
699  }
700  return count;
701 }
702 
704 {
705  int count = 0;
706  for (uint16_t layer = 1; layer <= 9; layer++) {
708  count++;
709  }
710  }
711  return count;
712 }
713 
715 {
716  uint16_t pattern = getHitPattern(category, position);
717  stream << "\t";
718  if (muonHitFilter(pattern)) {
719  stream << "muon";
720  } else if (trackerHitFilter(pattern)) {
721  stream << "tracker";
722  }
723 
724  stream << "\tsubstructure " << getSubStructure(pattern);
725  if (muonHitFilter(pattern)) {
726  stream << "\tstation " << getMuonStation(pattern);
727  if (muonDTHitFilter(pattern)) {
728  stream << "\tdt superlayer " << getDTSuperLayer(pattern);
729  } else if (muonCSCHitFilter(pattern)) {
730  stream << "\tcsc ring " << getCSCRing(pattern);
731  } else if (muonRPCHitFilter(pattern)) {
732  stream << "\trpc " << (getRPCregion(pattern) ? "endcaps" : "barrel")
733  << ", layer " << getRPCLayer(pattern);
734  } else {
735  stream << "(UNKNOWN Muon SubStructure!) \tsubsubstructure "
736  << getSubStructure(pattern);
737  }
738  } else {
739  stream << "\tlayer " << getLayer(pattern);
740  }
741  stream << "\thit type " << getHitType(pattern);
742  stream << std::endl;
743 }
744 
745 void HitPattern::print(HitCategory category, std::ostream &stream) const
746 {
747  stream << "HitPattern" << std::endl;
748  for (int i = 0; i < numberOfHits(category); ++i) {
749  printHitPattern(category, i, stream);
750  }
751  std::ios_base::fmtflags flags = stream.flags();
752  stream.setf(std::ios_base::hex, std::ios_base::basefield);
753  stream.setf(std::ios_base::showbase);
754 
755  for (int i = 0; i < this->numberOfHits(category); ++i) {
756  stream << getHitPattern(category, i) << std::endl;
757  }
758 
759  stream.flags(flags);
760 }
761 
763 {
764  if (i.det() != DetId::Tracker) {
765  return 0;
766  }
767 
768  switch (i.subdetId()) {
771  return 0;
772  case StripSubdetector::TIB: {
773  TIBDetId id = i;
774  return id.isStereo();
775  }
776  case StripSubdetector::TID: {
777  TIDDetId id = i;
778  return id.isStereo();
779  }
780  case StripSubdetector::TOB: {
781  TOBDetId id = i;
782  return id.isStereo();
783  }
784  case StripSubdetector::TEC: {
785  TECDetId id = i;
786  return id.isStereo();
787  }
788  default:
789  return 0;
790  }
791 }
792 
793 int HitPattern::muonStations(int subdet, int hitType) const
794 {
795  int stations[4] = {0, 0, 0, 0};
796  for (int i = beginTrackHits; i < endTrackHits; ++i) {
798  if (muonHitFilter(pattern)
799  && (subdet == 0 || int(getSubStructure(pattern)) == subdet)
800  && (hitType == -1 || int(getHitType(pattern)) == hitType)) {
801  stations[getMuonStation(pattern) - 1] = 1;
802  }
803  }
804 
805  return stations[0] + stations[1] + stations[2] + stations[3];
806 }
807 
809 {
810  int ret = 0;
811  for (int i = beginTrackHits; i < endTrackHits; ++i) {
813  if (muonHitFilter(pattern)
814  && (hitType == -1 || int(getHitType(pattern)) == hitType)) {
815  int stat = getMuonStation(pattern);
816  if (ret == 0 || stat < ret) {
817  ret = stat;
818  }
819  }
820  }
821 
822  return ret;
823 }
824 
826 {
827  int ret = 0;
828  for (int i = beginTrackHits; i < endTrackHits; ++i) {
830  if (muonHitFilter(pattern) &&
831  (hitType == -1 || int(getHitType(pattern)) == hitType)) {
832  int stat = getMuonStation(pattern);
833  if (ret == 0 || stat > ret) {
834  ret = stat;
835  }
836  }
837  }
838  return ret;
839 }
840 
842 {
843  int stations[4] = {0, 0, 0, 0};
844  for (int i = beginTrackHits; i < endTrackHits; ++i) {
846 
847  if (muonDTHitFilter(pattern) && validHitFilter(pattern)
848  && getDTSuperLayer(pattern) != 2) {
849  stations[getMuonStation(pattern) - 1] = 1;
850  }
851  }
852  return stations[0] + stations[1] + stations[2] + stations[3];
853 }
854 
856 {
857  int stations[4] = {0, 0, 0, 0};
858  for (int i = beginTrackHits; i < endTrackHits; ++i) {
860  if (muonDTHitFilter(pattern) && validHitFilter(pattern)
861  && getDTSuperLayer(pattern) == 2) {
862  stations[getMuonStation(pattern) - 1] = 1;
863  }
864  }
865  return stations[0] + stations[1] + stations[2] + stations[3];
866 }
867 
869 {
870  int stations[4][2] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}};
871  for (int i = beginTrackHits; i < endTrackHits; ++i) {
873  if (muonDTHitFilter(pattern) && validHitFilter(pattern)) {
874  stations[getMuonStation(pattern) - 1][getDTSuperLayer(pattern) == 2] = 1;
875  }
876  }
877 
878  return stations[0][0] * stations[0][1]
879  + stations[1][0] * stations[1][1]
880  + stations[2][0] * stations[2][1]
881  + stations[3][0] * stations[3][1];
882 }
883 
884 void HitPattern::insertHit(const uint16_t pattern)
885 {
886  int offset = hitCount * HIT_LENGTH;
887  for (int i = 0; i < HIT_LENGTH; i++) {
888  int pos = offset + i;
889  uint16_t bit = (pattern >> i) & 0x1;
890  //equivalent to hitPattern[pos / 16] += bit << ((offset + i) % 16);
891  hitPattern[pos >> 4] += bit << ((offset + i) & (16 - 1));
892  }
893  hitCount++;
894 }
895 
897 {
898  // if begin is 0, this is the first hit of this type being inserted, so
899  // we need to update begin so it points to the correct index, the first
900  // empty index.
901  // unlikely, because it will happen only when inserting
902  // the first hit of this type
903  if unlikely((0 == beginTrackHits && 0 == endTrackHits)) {
905  // before the first hit of this type is inserted, there are no hits
907  }
908 
909  insertHit(pattern);
910  endTrackHits++;
911 
912  return true;
913 }
914 
916 {
917  if unlikely((0 == beginInner && 0 == endInner)) {
920  }
921 
922  insertHit(pattern);
923  endInner++;
924 
925  return true;
926 }
927 
929 {
930  if unlikely((0 == beginOuter && 0 == endOuter)) {
933  }
934 
935  insertHit(pattern);
936  endOuter++;
937 
938  return true;
939 }
940 
int stripTOBLayersWithMeasurement() const
Definition: HitPattern.cc:486
static uint16_t getCSCRing(uint16_t pattern)
CSC ring (1-4). Only valid for muon CSC patterns, of course.
Definition: HitPattern.h:679
int pixelBarrelLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:508
int i
Definition: DBlmapReader.cc:9
static uint32_t getLayer(uint16_t pattern)
Definition: HitPattern.h:627
void insertHit(const uint16_t pattern)
Definition: HitPattern.cc:884
int outermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:825
static const unsigned short HIT_LENGTH
Definition: HitPattern.h:157
static const unsigned short ARRAY_LENGTH
Definition: HitPattern.h:156
static const uint32_t NULL_RETURN
Definition: HitPattern.h:160
int pixelBarrelLayersNull() const
Definition: HitPattern.cc:646
int stripTIBLayersNull() const
Definition: HitPattern.cc:670
unsigned int layer() const
layer id
Definition: TOBDetId.h:39
int stripTIBLayersWithMeasurement() const
Definition: HitPattern.cc:464
int stripTECLayersNull() const
Definition: HitPattern.cc:703
static const unsigned short SideOffset
Definition: HitPattern.h:370
static const uint16_t EMPTY_PATTERN
Definition: HitPattern.h:161
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:793
static uint16_t getDTSuperLayer(uint16_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:674
static const unsigned short SubstrOffset
Definition: HitPattern.h:378
int stripTOBLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:554
int numberOfDTStationsWithRPhiView() const
Definition: HitPattern.cc:841
HitPattern & operator=(const HitPattern &other)
Definition: HitPattern.cc:44
uint16_t getTrackerMonoStereo(HitCategory category, uint16_t substr, uint16_t layer) const
Definition: HitPattern.cc:402
static const unsigned short MaxHits
Definition: HitPattern.h:158
uint32_t getTrackerLayerCase(HitCategory category, uint16_t substr, uint16_t layer) const
Definition: HitPattern.cc:370
std::vector< Variable::Flags > flags
Definition: MVATrainer.cc:135
int numberOfValidStripLayersWithMonoAndStereo() const
Definition: HitPattern.cc:345
int pixelEndcapLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:520
static const unsigned short HitTypeMask
Definition: HitPattern.h:367
static bool pixelBarrelHitFilter(uint16_t pattern)
Definition: HitPattern.h:508
int pixelEndcapLayersWithMeasurement() const
Definition: HitPattern.cc:452
static uint16_t encode(const TrackingRecHit &hit)
Definition: HitPattern.cc:84
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
unsigned int layer() const
layer id
Definition: PXBDetId.h:35
bool insertExpectedOuterHit(const uint16_t pattern)
Definition: HitPattern.cc:928
static bool pixelEndcapHitFilter(uint16_t pattern)
Definition: HitPattern.h:518
1: Failed selection (without additional info)
Definition: ParticleCode.h:34
bool hasValidHitInFirstPixelEndcap() const
Definition: HitPattern.cc:286
static bool validHitFilter(uint16_t pattern)
Definition: HitPattern.h:701
#define unlikely(x)
Definition: Likely.h:21
uint8_t endInner
Definition: HitPattern.h:416
void printHitPattern(HitCategory category, int position, std::ostream &stream) const
Definition: HitPattern.cc:714
static const int CSC
Definition: MuonSubdetId.h:13
int stripTOBLayersTotallyOffOrBad() const
Definition: HitPattern.cc:623
uint16_t hitPattern[ARRAY_LENGTH]
Definition: HitPattern.h:410
int stripTIDLayersTotallyOffOrBad() const
Definition: HitPattern.cc:612
static bool muonCSCHitFilter(uint16_t pattern)
Definition: HitPattern.h:580
static uint32_t getHitType(uint16_t pattern)
Definition: HitPattern.h:660
int numberOfValidTECLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:365
int stripTIDLayersWithMeasurement() const
Definition: HitPattern.cc:475
static const unsigned short SubDetectorMask
Definition: HitPattern.h:383
static bool stripHitFilter(uint16_t pattern)
Definition: HitPattern.h:528
int stripTECLayersTotallyOffOrBad() const
Definition: HitPattern.cc:635
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
int numberOfDTStationsWithRZView() const
Definition: HitPattern.cc:855
uint8_t beginInner
Definition: HitPattern.h:415
int stripTIDLayersNull() const
Definition: HitPattern.cc:681
unsigned int offset(bool)
static const unsigned short HitTypeOffset
Definition: HitPattern.h:366
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
int numberOfValidTIDLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:360
uint8_t beginTrackHits
Definition: HitPattern.h:413
unsigned int disk() const
disk id
Definition: PXFDetId.h:43
static uint32_t getSubStructure(uint16_t pattern)
Definition: HitPattern.h:618
int numberOfDTStationsWithBothViews() const
Definition: HitPattern.cc:868
int numberOfValidTIBLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:355
static uint16_t getRPCregion(uint16_t pattern)
RPC region: 0 = barrel, 1 = endcap. Only valid for muon RPC patterns, of course.
Definition: HitPattern.h:696
int stripTIDLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:543
int layer() const
Definition: RPCDetId.h:108
Definition: DetId.h:18
int innermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:808
static bool muonHitFilter(uint16_t pattern)
Definition: HitPattern.h:609
Type getType() const
static bool trackerHitFilter(uint16_t pattern)
Definition: HitPattern.h:600
uint8_t endTrackHits
Definition: HitPattern.h:414
static const unsigned short SideMask
Definition: HitPattern.h:371
std::pair< uint8_t, uint8_t > getCategoryIndexRange(HitCategory category) const
Definition: HitPattern.h:421
uint8_t hitCount
Definition: HitPattern.h:411
uint8_t beginOuter
Definition: HitPattern.h:417
static const unsigned short SubDetectorOffset
Definition: HitPattern.h:382
int pixelBarrelLayersWithMeasurement() const
Definition: HitPattern.cc:440
unsigned int wheel() const
wheel id
Definition: TECDetId.h:52
unsigned int layer() const
layer id
Definition: TIBDetId.h:41
uint16_t getHitPatternByAbsoluteIndex(int position) const
Definition: HitPattern.cc:232
static uint32_t getSide(uint16_t pattern)
Definition: HitPattern.h:651
int stripTOBLayersNull() const
Definition: HitPattern.cc:692
static bool muonDTHitFilter(uint16_t pattern)
Definition: HitPattern.h:570
bool insertExpectedInnerHit(const uint16_t pattern)
Definition: HitPattern.cc:915
int pixelBarrelLayersTotallyOffOrBad() const
Definition: HitPattern.cc:577
static const unsigned short SubstrMask
Definition: HitPattern.h:379
static const int RPC
Definition: MuonSubdetId.h:14
static uint16_t isStereo(DetId i)
Definition: HitPattern.cc:762
static const unsigned short LayerOffset
Definition: HitPattern.h:374
bool insertTrackHit(const uint16_t pattern)
Definition: HitPattern.cc:896
int stripTECLayersWithMeasurement() const
Definition: HitPattern.cc:497
int stripTECLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:565
int pixelEndcapLayersTotallyOffOrBad() const
Definition: HitPattern.cc:589
bool appendHit(const TrackingRecHit &hit)
Definition: HitPattern.cc:166
static uint16_t getRPCLayer(uint16_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:684
static uint16_t getMuonStation(uint16_t pattern)
Muon station (1-4). Only valid for muon patterns, of course. only for patterns from muon...
Definition: HitPattern.h:669
static const int DT
Definition: MuonSubdetId.h:12
void print(HitCategory category, std::ostream &stream=std::cout) const
Definition: HitPattern.cc:745
int numberOfValidTOBLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:350
bool hasValidHitInFirstPixelBarrel() const
Definition: HitPattern.cc:274
DetId geographicalId() const
static uint32_t getSubSubStructure(uint16_t pattern)
Definition: HitPattern.h:632
uint16_t getHitPattern(HitCategory category, int position) const
Definition: HitPattern.h:448
int stripTIBLayersTotallyOffOrBad() const
Definition: HitPattern.cc:601
static const unsigned short LayerMask
Definition: HitPattern.h:375
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
static bool muonRPCHitFilter(uint16_t pattern)
Definition: HitPattern.h:590
uint8_t endOuter
Definition: HitPattern.h:418
int numberOfHits(HitCategory category) const
Definition: HitPattern.h:721
unsigned int wheel() const
wheel id
Definition: TIDDetId.h:50
int stripTIBLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:532
int pixelEndcapLayersNull() const
Definition: HitPattern.cc:658
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:63
int station() const
Definition: RPCDetId.h:96