CMS 3D CMS Logo

HitPattern.cc
Go to the documentation of this file.
10 
12 
14 
15 #include <bitset>
16 
17 using namespace reco;
18 
20  : hitCount(0), beginTrackHits(0), endTrackHits(0), beginInner(0), endInner(0), beginOuter(0), endOuter(0) {
22 }
23 
25  : hitCount(other.hitCount),
26  beginTrackHits(other.beginTrackHits),
27  endTrackHits(other.endTrackHits),
28  beginInner(other.beginInner),
29  endInner(other.endInner),
30  beginOuter(other.beginOuter),
31  endOuter(other.endOuter) {
32  memcpy(this->hitPattern, other.hitPattern, sizeof(uint16_t) * HitPattern::ARRAY_LENGTH);
33 }
34 
36  : hitCount(other.hitCount),
37  beginTrackHits(other.beginTrackHits),
38  endTrackHits(other.endTrackHits),
39  beginInner(other.beginInner),
40  endInner(other.endInner),
41  beginOuter(other.beginOuter),
42  endOuter(other.endOuter) {
43  const unsigned short max_vector_length =
44  (other.hitPattern.size() > HitPattern::ARRAY_LENGTH) ? HitPattern::ARRAY_LENGTH : other.hitPattern.size();
45  std::copy(other.hitPattern.begin(), other.hitPattern.begin() + max_vector_length, this->hitPattern);
46 }
47 
49 
51  if (this == &other) {
52  return *this;
53  }
54 
55  this->hitCount = other.hitCount;
56 
57  this->beginTrackHits = other.beginTrackHits;
58  this->endTrackHits = other.endTrackHits;
59 
60  this->beginInner = other.beginInner;
61  this->endInner = other.endInner;
62 
63  this->beginOuter = other.beginOuter;
64  this->endOuter = other.endOuter;
65 
66  memcpy(this->hitPattern, other.hitPattern, sizeof(uint16_t) * HitPattern::ARRAY_LENGTH);
67 
68  return *this;
69 }
70 
71 void HitPattern::clear(void) {
72  this->hitCount = 0;
73  this->beginTrackHits = 0;
74  this->endTrackHits = 0;
75  this->beginInner = 0;
76  this->endInner = 0;
77  this->beginOuter = 0;
78  this->endOuter = 0;
79 
80  memset(this->hitPattern, EMPTY_PATTERN, sizeof(uint16_t) * HitPattern::ARRAY_LENGTH);
81 }
82 
84  return appendHit(*ref, ttopo);
85 }
86 
87 uint16_t HitPattern::encode(const TrackingRecHit& hit, const TrackerTopology& ttopo) {
88  return encode(hit.geographicalId(), hit.getType(), ttopo);
89 }
90 
91 namespace {
92  uint16_t encodeMuonLayer(const DetId& id) {
93  uint16_t detid = id.det();
94  uint16_t subdet = id.subdetId();
95 
96  uint16_t layer = 0x0;
97  if (detid == DetId::Muon) {
98  switch (subdet) {
99  case MuonSubdetId::DT:
100  layer = ((DTLayerId(id.rawId()).station() - 1) << 2);
101  layer |= DTLayerId(id.rawId()).superLayer();
102  break;
103  case MuonSubdetId::CSC:
104  layer = ((CSCDetId(id.rawId()).station() - 1) << 2);
105  layer |= (CSCDetId(id.rawId()).ring() - 1);
106  break;
107  case MuonSubdetId::RPC: {
108  RPCDetId rpcid(id.rawId());
109  layer = ((rpcid.station() - 1) << 2);
110  layer |= (rpcid.station() <= 2) ? ((rpcid.layer() - 1) << 1) : 0x0;
111  layer |= abs(rpcid.region());
112  } break;
113  case MuonSubdetId::GEM: {
114  GEMDetId gemid(id.rawId());
115  {
116  uint16_t st = gemid.station();
117  uint16_t la = gemid.layer();
118  if (st == 0) {
119  layer |= 0b1000;
120  layer |= (la - 1);
121  } else {
122  layer |= (st - 1) << 2;
123  layer |= (la - 1);
124  }
125  }
126  } break;
127  case MuonSubdetId::ME0: {
128  ME0DetId me0id(id.rawId());
129  //layer = ((me0id.roll()-1)<<1) + abs(me0id.layer()-1);
130  //layer = ((me0id.roll()-1)<<1) + abs(me0id.layer());
131  //Only layer information that is meaningful is in the roll/etapartition
132  layer = (me0id.roll());
133  } break;
134  }
135  }
136  return layer;
137  }
138  uint16_t encodeTimingLayer(const DetId& id) {
139  uint16_t detid = id.det();
140  uint16_t subdet = id.subdetId();
141  uint16_t layer = 0x0;
142  if (detid == DetId::Forward && subdet == FastTime) {
143  MTDDetId mtdid(id);
144  switch (mtdid.mtdSubDetector()) {
145  case MTDDetId::BTL:
146  layer = BTLDetId(id).globalRunit();
147  break;
148  case MTDDetId::ETL:
149  layer = ETLDetId(id).mtdRR();
150  break;
151  default:
152  throw cms::Exception("HitPattern") << "Invalid MTD Subdetector " << mtdid.mtdSubDetector() << "!";
153  }
154  } else {
155  throw cms::Exception("HitPattern") << "Invalid DetId for FastTime det= " << detid << " subdet= " << subdet << "!";
156  }
157  return layer;
158  }
159 } // namespace
160 
161 uint16_t HitPattern::encode(const DetId& id, TrackingRecHit::Type hitType, const TrackerTopology& ttopo) {
162  uint16_t detid = id.det();
163  uint16_t subdet = id.subdetId();
164 
165  // adding layer/disk/wheel bits
166  uint16_t layer = 0x0;
167  if (detid == DetId::Tracker) {
168  layer = ttopo.layer(id);
169  } else if (detid == DetId::Muon) {
170  layer = encodeMuonLayer(id);
171  } else if (detid == DetId::Forward && subdet == FastTime) {
172  layer = encodeTimingLayer(id);
173  }
174 
175  // adding mono/stereo bit
176  uint16_t side = 0x0;
177  if (detid == DetId::Tracker) {
178  side = isStereo(id, ttopo);
179  } else if (detid == DetId::Muon || (detid == DetId::Forward && subdet == FastTime)) {
180  side = 0x0;
181  }
182 
183  // juggle the detid around to deal with the fact the bitwidth is larger
184  // DetId::Muon is 2 and DetId::Forward is 6, must map to 0 and 2 respectively
185  if (detid == DetId::Tracker) {
186  detid = TRACKER_HIT;
187  } else if (detid == DetId::Muon) {
188  detid = MUON_HIT; // DetId::Muon is 2 and needs to be reordered to match old encoding where it got masked
189  } else if (detid == DetId::Forward && subdet == FastTime) {
190  detid = MTD_HIT; // since DetId::Forward is some other number, reorder it here
191  subdet = static_cast<uint16_t>(MTDDetId(id).mtdSubDetector());
192  }
193 
194  return encode(detid, subdet, layer, side, hitType);
195 }
196 
197 uint16_t HitPattern::encode(uint16_t det, uint16_t subdet, uint16_t layer, uint16_t side, TrackingRecHit::Type hitType) {
199 
200  // adding tracker/muon/mtd detector bits
202 
203  // adding substructure (PXB, PXF, TIB, TID, TOB, TEC, or DT, CSC, RPC,GEM, or BTL, ETL) bits
204  pattern |= (subdet & SubstrMask) << SubstrOffset;
205 
206  // adding layer/disk/wheel/ring/modType bits
207  pattern |= (layer & LayerMask) << LayerOffset;
208 
209  // adding mono/stereo bit
210  pattern |= (side & SideMask) << SideOffset;
211 
212  TrackingRecHit::Type patternHitType =
217  : hitType);
218 
219  pattern |= (patternHitType & HitTypeMask) << HitTypeOffset;
220 
221  return pattern;
222 }
223 
225  return appendHit(hit.geographicalId(), hit.getType(), ttopo);
226 }
227 
228 bool HitPattern::appendHit(const DetId& id, TrackingRecHit::Type hitType, const TrackerTopology& ttopo) {
229  //if HitPattern is full, journey ends no matter what.
231  return false;
232  }
233 
234  uint16_t pattern = HitPattern::encode(id, hitType, ttopo);
235 
236  return appendHit(pattern, hitType);
237 }
238 
239 bool HitPattern::appendHit(const uint16_t pattern, TrackingRecHit::Type hitType) {
240  //if HitPattern is full, journey ends no matter what.
242  return false;
243  }
244 
245  switch (hitType) {
249  case TrackingRecHit::bad:
250  // hitCount != endT => we are not inserting T type of hits but of T'
251  // 0 != beginT || 0 != endT => we already have hits of T type
252  // so we already have hits of T in the vector and we don't want to
253  // mess them with T' hits.
254  if UNLIKELY (((hitCount != endTrackHits) && (0 != beginTrackHits || 0 != endTrackHits))) {
255  cms::Exception("HitPattern") << "TRACK_HITS"
256  << " were stored on this object before hits of some other category were inserted "
257  << "but hits of the same category should be inserted in a row. "
258  << "Please rework the code so it inserts all "
259  << "TRACK_HITS"
260  << " in a row.";
261  return false;
262  }
263  return insertTrackHit(pattern);
264  break;
267  if UNLIKELY (((hitCount != endInner) && (0 != beginInner || 0 != endInner))) {
268  cms::Exception("HitPattern") << "MISSING_INNER_HITS"
269  << " were stored on this object before hits of some other category were inserted "
270  << "but hits of the same category should be inserted in a row. "
271  << "Please rework the code so it inserts all "
272  << "MISSING_INNER_HITS"
273  << " in a row.";
274  return false;
275  }
277  break;
280  if UNLIKELY (((hitCount != endOuter) && (0 != beginOuter || 0 != endOuter))) {
281  cms::Exception("HitPattern") << "MISSING_OUTER_HITS"
282  << " were stored on this object before hits of some other category were inserted "
283  << "but hits of the same category should be inserted in a row. "
284  << "Please rework the code so it inserts all "
285  << "MISSING_OUTER_HITS"
286  << " in a row.";
287  return false;
288  }
290  break;
291  }
292 
293  return false;
294 }
295 
296 bool HitPattern::appendTrackerHit(uint16_t subdet, uint16_t layer, uint16_t stereo, TrackingRecHit::Type hitType) {
297  return appendHit(encode(TRACKER_HIT, subdet, layer, stereo, hitType), hitType);
298 }
299 
301  //if HitPattern is full, journey ends no matter what.
303  return false;
304  }
305 
306  if UNLIKELY (id.det() != DetId::Muon) {
307  throw cms::Exception("HitPattern")
308  << "Got DetId from det " << id.det()
309  << " that is not Muon in appendMuonHit(), which should only be used for muon hits in the HitPattern IO rule";
310  }
311 
312  uint16_t subdet = id.subdetId();
313  return appendHit(encode(MUON_HIT, subdet, encodeMuonLayer(id), 0, hitType), hitType);
314 }
315 
317  if UNLIKELY ((position < 0 || position >= hitCount)) {
319  }
320  /*
321  Note: you are not taking a consecutive sequence of HIT_LENGTH bits starting from position * HIT_LENGTH
322  as the bit order in the words are reversed.
323  e.g. if position = 0 you take the lowest 12 bits of the first word.
324 
325  I hope this can clarify what is the memory layout of such thing
326 
327  straight 01234567890123456789012345678901 | 23456789012345678901234567890123 | 4567
328  (global) 0 1 2 3 | 3 4 5 6 | 6
329  words [--------------0---------------] | [--------------1---------------] | [---
330  word 01234567890123456789012345678901 | 01234567890123456789012345678901 | 0123
331  (str) 0 1 2 3 | 0 1 2 3 | 0
332  [--------------0---------------] | [--------------1---------------] | [---
333  word 10987654321098765432109876543210 | 10987654321098765432109876543210 | 1098
334  (rev) 32 21 10 0 | 32 21 10 0 | 32
335  reverse 10987654321098765432109876543210 | 32109876543210987654321098765432 | 5432
336  32 21 10 0 | 6 65 54 43 3 9
337 
338  ugly enough, but it's not my fault, I was not even in CMS at that time [gpetrucc]
339  */
340 
341  uint16_t bitEndOffset = (position + 1) * HIT_LENGTH;
342  uint8_t secondWord = (bitEndOffset >> 4);
343  uint8_t secondWordBits = bitEndOffset & (16 - 1); // that is, bitEndOffset % 16
344  if (secondWordBits >= HIT_LENGTH) { // full block is in this word
345  uint8_t lowBitsToTrash = secondWordBits - HIT_LENGTH;
346  uint16_t myResult = (hitPattern[secondWord] >> lowBitsToTrash) & ((1 << HIT_LENGTH) - 1);
347  return myResult;
348  } else {
349  uint8_t firstWordBits = HIT_LENGTH - secondWordBits;
350  uint16_t firstWordBlock = hitPattern[secondWord - 1] >> (16 - firstWordBits);
351  if (secondWordBits == 0)
352  return firstWordBlock;
353  uint16_t secondWordBlock = hitPattern[secondWord] & ((1 << secondWordBits) - 1);
354  uint16_t myResult = firstWordBlock + (secondWordBlock << firstWordBits);
355  return myResult;
356  }
357 }
358 
360  for (int i = beginTrackHits; i < endTrackHits; ++i) {
362  bool pixelHitFilter = ((det == 1 && pixelBarrelHitFilter(pattern)) || (det == 2 && pixelEndcapHitFilter(pattern)));
363  if (pixelHitFilter && (getLayer(pattern) == layer) && validHitFilter(pattern)) {
364  return true;
365  }
366  }
367  return false;
368 }
369 
370 int HitPattern::numberOfValidStripLayersWithMonoAndStereo(uint16_t stripdet, uint16_t layer) const {
371  bool hasMono[SubstrMask + 1][LayerMask + 1];
372  bool hasStereo[SubstrMask + 1][LayerMask + 1];
373  memset(hasMono, 0, sizeof(hasMono));
374  memset(hasStereo, 0, sizeof(hasStereo));
375 
376  // mark which layers have mono/stereo hits
377  for (int i = beginTrackHits; i < endTrackHits; ++i) {
379  uint16_t subStructure = getSubStructure(pattern);
380 
382  if (stripdet != 0 && subStructure != stripdet) {
383  continue;
384  }
385 
386  if (layer != 0 && getSubSubStructure(pattern) != layer) {
387  continue;
388  }
389 
390  switch (getSide(pattern)) {
391  case 0: // mono
392  hasMono[subStructure][getLayer(pattern)] = true;
393  break;
394  case 1: // stereo
395  hasStereo[subStructure][getLayer(pattern)] = true;
396  break;
397  default:;
398  break;
399  }
400  }
401  }
402 
403  // count how many layers have mono and stereo hits
404  int count = 0;
405  for (int i = 0; i < SubstrMask + 1; ++i) {
406  for (int j = 0; j < LayerMask + 1; ++j) {
407  if (hasMono[i][j] && hasStereo[i][j]) {
408  count++;
409  }
410  }
411  }
412  return count;
413 }
414 
416  auto category = TRACK_HITS;
417  std::bitset<128> side[2];
418  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
419  for (int i = range.first; i < range.second; ++i) {
421  if (pattern > maxTrackerWord)
422  continue;
423  if (pattern < minStripWord)
424  continue;
425  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
426  if (hitType != HIT_TYPE::VALID)
427  continue;
428  auto apattern = (pattern - minTrackerWord) >> LayerOffset;
429  // assert(apattern<128);
430  side[getSide(pattern)].set(apattern);
431  }
432  // assert(numberOfValidStripLayersWithMonoAndStereo(0, 0)==int((side[0]&side[1]).count()));
433  return (side[0] & side[1]).count();
434 }
435 
438 }
439 
442 }
443 
446 }
447 
450 }
451 
452 uint32_t HitPattern::getTrackerLayerCase(HitCategory category, uint16_t substr, uint16_t layer) const {
453  uint16_t tk_substr_layer =
454  (0x1 << SubDetectorOffset) + ((substr & SubstrMask) << SubstrOffset) + ((layer & LayerMask) << LayerOffset);
455 
457 
458  // layer case 0: valid + (missing, off, bad) ==> with measurement
459  // layer case 1: missing + (off, bad) ==> without measurement
460  // layer case 2: off, bad ==> totally off or bad, cannot say much
461  // layer case NULL_RETURN: track outside acceptance or in gap ==> null
462  uint32_t layerCase = NULL_RETURN;
463  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
464  for (int i = range.first; i < range.second; ++i) {
466  if ((pattern & mask) == tk_substr_layer) {
467  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
468  if (hitType < layerCase) {
469  // BAD and INACTIVE as the same type (as INACTIVE)
470  layerCase = (hitType == HIT_TYPE::BAD ? (uint32_t)HIT_TYPE::INACTIVE : hitType);
471  if (layerCase == HIT_TYPE::VALID) {
472  break;
473  }
474  }
475  }
476  }
477  return layerCase;
478 }
479 
480 uint16_t HitPattern::getTrackerMonoStereo(HitCategory category, uint16_t substr, uint16_t layer) const {
481  uint16_t tk_substr_layer =
482  (0x1 << SubDetectorOffset) + ((substr & SubstrMask) << SubstrOffset) + ((layer & LayerMask) << LayerOffset);
484 
485  // 0: neither a valid mono nor a valid stereo hit
486  // MONO: valid mono hit
487  // STEREO: valid stereo hit
488  // MONO | STEREO: both
489  uint16_t monoStereo = 0x0;
490  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
491  for (int i = range.first; i < range.second; ++i) {
493  if ((pattern & mask) == tk_substr_layer) {
494  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
495  if (hitType == HIT_TYPE::VALID) {
496  switch (getSide(pattern)) {
497  case 0: // mono
498  monoStereo |= MONO;
499  break;
500  case 1: // stereo
501  monoStereo |= STEREO;
502  break;
503  }
504  }
505 
506  if (monoStereo == (MONO | STEREO)) {
507  break;
508  }
509  }
510  }
511  return monoStereo;
512 }
513 
515  auto category = TRACK_HITS;
516  std::bitset<128> layerOk;
517  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
518  for (int i = range.first; i < range.second; ++i) {
521  continue;
522  if (pattern > minStripWord)
523  continue;
524  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
525  if (hitType != HIT_TYPE::VALID)
526  continue;
528  // assert(pattern<128);
529  layerOk.set(pattern);
530  }
531  // assert(pixelLayersWithMeasurementOld()==int(layerOk.count()));
532  return layerOk.count();
533 }
534 
536  auto category = TRACK_HITS;
537  std::bitset<128> layerOk;
538  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
539  for (int i = range.first; i < range.second; ++i) {
542  continue;
543  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
544  if (hitType != HIT_TYPE::VALID)
545  continue;
547  // assert(pattern<128);
548  layerOk.set(pattern);
549  }
550  // assert(trackerLayersWithMeasurementOld()==int(layerOk.count()));
551  return layerOk.count();
552 }
553 
555  std::bitset<128> layerOk;
556  std::bitset<128> layerMissed;
557  std::pair<uint8_t, uint8_t> range = getCategoryIndexRange(category);
558  for (int i = range.first; i < range.second; ++i) {
561  continue;
562  uint16_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
564  // assert(pattern<128);
565  if (hitType == HIT_TYPE::VALID)
566  layerOk.set(pattern);
567  if (hitType == HIT_TYPE::MISSING)
568  layerMissed.set(pattern);
569  }
570  layerMissed &= ~layerOk;
571 
572  // assert(trackerLayersWithoutMeasurementOld(category)==int(layerMissed.count()));
573 
574  return layerMissed.count();
575 }
576 
578  int count = 0;
579  uint16_t NPixBarrel = 4;
580  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
581  if (getTrackerLayerCase(TRACK_HITS, PixelSubdetector::PixelBarrel, layer) == HIT_TYPE::VALID) {
582  count++;
583  }
584  }
585  return count;
586 }
587 
589  int count = 0;
590  uint16_t NPixForward = 3;
591  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
592  if (getTrackerLayerCase(TRACK_HITS, PixelSubdetector::PixelEndcap, layer) == HIT_TYPE::VALID) {
593  count++;
594  }
595  }
596  return count;
597 }
598 
600  int count = 0;
601  for (uint16_t layer = 1; layer <= 4; layer++) {
602  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TIB, layer) == HIT_TYPE::VALID) {
603  count++;
604  }
605  }
606  return count;
607 }
608 
610  int count = 0;
611  for (uint16_t layer = 1; layer <= 3; layer++) {
612  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TID, layer) == HIT_TYPE::VALID) {
613  count++;
614  }
615  }
616  return count;
617 }
618 
620  int count = 0;
621  for (uint16_t layer = 1; layer <= 6; layer++) {
622  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TOB, layer) == HIT_TYPE::VALID) {
623  count++;
624  }
625  }
626  return count;
627 }
628 
630  int count = 0;
631  for (uint16_t layer = 1; layer <= 9; layer++) {
632  if (getTrackerLayerCase(TRACK_HITS, StripSubdetector::TEC, layer) == HIT_TYPE::VALID) {
633  count++;
634  }
635  }
636  return count;
637 }
638 
640  int count = 0;
641  uint16_t NPixBarrel = 4;
642  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
643  if (getTrackerLayerCase(category, PixelSubdetector::PixelBarrel, layer) == HIT_TYPE::MISSING) {
644  count++;
645  }
646  }
647  return count;
648 }
649 
651  int count = 0;
652  uint16_t NPixForward = 3;
653  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
654  if (getTrackerLayerCase(category, PixelSubdetector::PixelEndcap, layer) == HIT_TYPE::MISSING) {
655  count++;
656  }
657  }
658  return count;
659 }
660 
662  int count = 0;
663  for (uint16_t layer = 1; layer <= 4; layer++) {
664  if (getTrackerLayerCase(category, StripSubdetector::TIB, layer) == HIT_TYPE::MISSING) {
665  count++;
666  }
667  }
668  return count;
669 }
670 
672  int count = 0;
673  for (uint16_t layer = 1; layer <= 3; layer++) {
674  if (getTrackerLayerCase(category, StripSubdetector::TID, layer) == HIT_TYPE::MISSING) {
675  count++;
676  }
677  }
678  return count;
679 }
680 
682  int count = 0;
683  for (uint16_t layer = 1; layer <= 6; layer++) {
684  if (getTrackerLayerCase(category, StripSubdetector::TOB, layer) == HIT_TYPE::MISSING) {
685  count++;
686  }
687  }
688  return count;
689 }
690 
692  int count = 0;
693  for (uint16_t layer = 1; layer <= 9; layer++) {
694  if (getTrackerLayerCase(category, StripSubdetector::TEC, layer) == HIT_TYPE::MISSING) {
695  count++;
696  }
697  }
698  return count;
699 }
700 
702  int count = 0;
703  uint16_t NPixBarrel = 4;
704  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
705  if (getTrackerLayerCase(category, PixelSubdetector::PixelBarrel, layer) == HIT_TYPE::INACTIVE) {
706  count++;
707  }
708  }
709  return count;
710 }
711 
713  int count = 0;
714  uint16_t NPixForward = 3;
715  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
716  if (getTrackerLayerCase(category, PixelSubdetector::PixelEndcap, layer) == HIT_TYPE::INACTIVE) {
717  count++;
718  }
719  }
720  return count;
721 }
722 
724  int count = 0;
725  for (uint16_t layer = 1; layer <= 4; layer++) {
726  if (getTrackerLayerCase(category, StripSubdetector::TIB, layer) == HIT_TYPE::INACTIVE) {
727  count++;
728  }
729  }
730  return count;
731 }
732 
734  int count = 0;
735  for (uint16_t layer = 1; layer <= 3; layer++) {
736  if (getTrackerLayerCase(category, StripSubdetector::TID, layer) == HIT_TYPE::INACTIVE) {
737  count++;
738  }
739  }
740  return count;
741 }
742 
744  int count = 0;
745  for (uint16_t layer = 1; layer <= 6; layer++) {
746  if (getTrackerLayerCase(category, StripSubdetector::TOB, layer) == HIT_TYPE::INACTIVE) {
747  count++;
748  }
749  }
750  return count;
751 }
752 
754  int count = 0;
755  for (uint16_t layer = 1; layer <= 9; layer++) {
756  if (getTrackerLayerCase(category, StripSubdetector::TEC, layer) == HIT_TYPE::INACTIVE) {
757  count++;
758  }
759  }
760  return count;
761 }
762 
764  int count = 0;
765  uint16_t NPixBarrel = 4;
766  for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
768  count++;
769  }
770  }
771  return count;
772 }
773 
775  int count = 0;
776  uint16_t NPixForward = 3;
777  for (uint16_t layer = 1; layer <= NPixForward; layer++) {
779  count++;
780  }
781  }
782  return count;
783 }
784 
786  int count = 0;
787  for (uint16_t layer = 1; layer <= 4; layer++) {
789  count++;
790  }
791  }
792  return count;
793 }
794 
796  int count = 0;
797  for (uint16_t layer = 1; layer <= 3; layer++) {
799  count++;
800  }
801  }
802  return count;
803 }
804 
806  int count = 0;
807  for (uint16_t layer = 1; layer <= 6; layer++) {
809  count++;
810  }
811  }
812  return count;
813 }
814 
816  int count = 0;
817  for (uint16_t layer = 1; layer <= 9; layer++) {
819  count++;
820  }
821  }
822  return count;
823 }
824 
826  uint16_t pattern = getHitPattern(category, position);
827  stream << "\t";
828  if (muonHitFilter(pattern)) {
829  stream << "muon";
830  } else if (trackerHitFilter(pattern)) {
831  stream << "tracker";
832  } else if (timingHitFilter(pattern)) {
833  stream << "timing";
834  }
835 
836  stream << "\tsubstructure " << getSubStructure(pattern);
837  if (muonHitFilter(pattern)) {
838  stream << "\tstation " << getMuonStation(pattern);
839  if (muonDTHitFilter(pattern)) {
840  stream << "\tdt superlayer " << getDTSuperLayer(pattern);
841  } else if (muonCSCHitFilter(pattern)) {
842  stream << "\tcsc ring " << getCSCRing(pattern);
843  } else if (muonRPCHitFilter(pattern)) {
844  stream << "\trpc " << (getRPCregion(pattern) ? "endcaps" : "barrel") << ", layer " << getRPCLayer(pattern);
845  } else if (muonGEMHitFilter(pattern)) {
846  stream << "\tgem "
847  << " station " << getGEMStation(pattern) << ", layer" << getGEMLayer(pattern);
848  } else if (muonME0HitFilter(pattern)) {
849  stream << "\tme0 ";
850  } else {
851  stream << "(UNKNOWN Muon SubStructure!) \tsubsubstructure " << getSubStructure(pattern);
852  }
853  } else if (timingHitFilter(pattern)) {
854  uint32_t rr = getLayer(pattern);
855  switch (getSubStructure(pattern)) {
856  case 1:
857  stream << "\tRU " << getLayer(pattern);
858  break;
859  case 2: {
860  uint32_t disc(99), discside(99), sector(99);
861  ETLDetId::decodeSector(rr, disc, discside, sector);
862  stream << "\tdisc/disc side/sector " << disc << " " << discside << " " << sector;
863  break;
864  }
865  default:
866  stream << "\tlayer " << rr;
867  break;
868  }
869  } else {
870  stream << "\tlayer " << getLayer(pattern);
871  }
872  stream << "\thit type " << getHitType(pattern);
873  stream << std::endl;
874 }
875 
876 void HitPattern::print(HitCategory category, std::ostream& stream) const {
877  stream << "HitPattern" << std::endl;
878  for (int i = 0; i < numberOfAllHits(category); ++i) {
880  }
881  std::ios_base::fmtflags flags = stream.flags();
882  stream.setf(std::ios_base::hex, std::ios_base::basefield);
883  stream.setf(std::ios_base::showbase);
884 
885  for (int i = 0; i < this->numberOfAllHits(category); ++i) {
886  stream << getHitPattern(category, i) << std::endl;
887  }
888 
889  stream.flags(flags);
890 }
891 
892 uint16_t HitPattern::isStereo(DetId i, const TrackerTopology& ttopo) {
893  if (i.det() != DetId::Tracker) {
894  return 0;
895  }
896 
897  switch (i.subdetId()) {
900  return 0;
902  return ttopo.tibIsStereo(i);
904  return ttopo.tidIsStereo(i);
906  return ttopo.tobIsStereo(i);
908  return ttopo.tecIsStereo(i);
909  default:
910  return 0;
911  }
912 }
913 
914 int HitPattern::muonStations(int subdet, int hitType) const {
915  int stations[5] = {0, 0, 0, 0, 0};
916  for (int i = beginTrackHits; i < endTrackHits; ++i) {
918  if (muonHitFilter(pattern) && (subdet == 0 || int(getSubStructure(pattern)) == subdet) &&
919  (hitType == -1 || int(getHitType(pattern)) == hitType)) {
921  }
922  }
923 
924  return stations[0] + stations[1] + stations[2] + stations[3] + stations[4];
925 }
926 
928  int ret = 0;
929  for (int i = beginTrackHits; i < endTrackHits; ++i) {
931  if (muonHitFilter(pattern) && (hitType == -1 || int(getHitType(pattern)) == hitType)) {
932  int stat = getMuonStation(pattern);
933  if (ret == 0 || stat < ret) {
934  ret = stat;
935  }
936  }
937  }
938 
939  return ret;
940 }
941 
943  int ret = 0;
944  for (int i = beginTrackHits; i < endTrackHits; ++i) {
946  if (muonHitFilter(pattern) && (hitType == -1 || int(getHitType(pattern)) == hitType)) {
947  int stat = getMuonStation(pattern);
948  if (ret == 0 || stat > ret) {
949  ret = stat;
950  }
951  }
952  }
953  return ret;
954 }
955 
957  int stations[4] = {0, 0, 0, 0};
958  for (int i = beginTrackHits; i < endTrackHits; ++i) {
960 
962  stations[getMuonStation(pattern) - 1] = 1;
963  }
964  }
965  return stations[0] + stations[1] + stations[2] + stations[3];
966 }
967 
969  int stations[4] = {0, 0, 0, 0};
970  for (int i = beginTrackHits; i < endTrackHits; ++i) {
973  stations[getMuonStation(pattern) - 1] = 1;
974  }
975  }
976  return stations[0] + stations[1] + stations[2] + stations[3];
977 }
978 
980  int stations[4][2] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}};
981  for (int i = beginTrackHits; i < endTrackHits; ++i) {
985  }
986  }
987 
988  return stations[0][0] * stations[0][1] + stations[1][0] * stations[1][1] + stations[2][0] * stations[2][1] +
989  stations[3][0] * stations[3][1];
990 }
991 
992 void HitPattern::insertHit(const uint16_t pattern) {
993  int offset = hitCount * HIT_LENGTH;
994  for (int i = 0; i < HIT_LENGTH; i++) {
995  int pos = offset + i;
996  uint16_t bit = (pattern >> i) & 0x1;
997  //equivalent to hitPattern[pos / 16] += bit << ((offset + i) % 16);
998  hitPattern[pos >> 4] += bit << ((offset + i) & (16 - 1));
999  }
1000  hitCount++;
1001 }
1002 
1003 bool HitPattern::insertTrackHit(const uint16_t pattern) {
1004  // if begin is 0, this is the first hit of this type being inserted, so
1005  // we need to update begin so it points to the correct index, the first
1006  // empty index.
1007  // unlikely, because it will happen only when inserting
1008  // the first hit of this type
1009  if UNLIKELY ((0 == beginTrackHits && 0 == endTrackHits)) {
1011  // before the first hit of this type is inserted, there are no hits
1013  }
1014 
1015  insertHit(pattern);
1016  endTrackHits++;
1017 
1018  return true;
1019 }
1020 
1022  if UNLIKELY ((0 == beginInner && 0 == endInner)) {
1023  beginInner = hitCount;
1024  endInner = beginInner;
1025  }
1026 
1027  insertHit(pattern);
1028  endInner++;
1029 
1030  return true;
1031 }
1032 
1034  if UNLIKELY ((0 == beginOuter && 0 == endOuter)) {
1035  beginOuter = hitCount;
1036  endOuter = beginOuter;
1037  }
1038 
1039  insertHit(pattern);
1040  endOuter++;
1041 
1042  return true;
1043 }
1044 
1047  .hitCount = hitCount,
1048  .beginTrackHits = beginTrackHits,
1049  .endTrackHits = endTrackHits,
1050  .beginInner = beginInner,
1051  .endInner = endInner,
1052  .beginOuter = beginOuter,
1053  .endOuter = endOuter,
1054  .hitPattern = std::vector<uint16_t>(hitPattern, hitPattern + HitPattern::ARRAY_LENGTH)};
1055  return result;
1056 }
std::pair< uint8_t, uint8_t > getCategoryIndexRange(HitCategory category) const
Definition: HitPattern.h:512
int station() const
Return the station number.
Definition: DTChamberId.h:45
static uint16_t getCSCRing(uint16_t pattern)
CSC ring (1-4). Only valid for muon CSC patterns, of course.
Definition: HitPattern.h:761
static constexpr auto TEC
static uint32_t getLayer(uint16_t pattern)
Definition: HitPattern.h:721
void insertHit(const uint16_t pattern)
Definition: HitPattern.cc:992
int numberOfValidStripLayersWithMonoAndStereo() const
Definition: HitPattern.cc:415
int pixelEndcapLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:650
static const unsigned short HIT_LENGTH
Definition: HitPattern.h:158
static const unsigned short ARRAY_LENGTH
Definition: HitPattern.h:157
int stripTECLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.cc:753
static const uint32_t NULL_RETURN
Definition: HitPattern.h:161
static constexpr int GEM
Definition: MuonSubdetId.h:14
static bool timingHitFilter(uint16_t pattern)
Definition: HitPattern.h:705
static bool pixelHitFilter(uint16_t pattern)
Definition: HitPattern.h:581
int numberOfValidTECLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:448
int superLayer() const
Return the superlayer number.
static uint16_t isStereo(DetId i, const TrackerTopology &ttopo)
Definition: HitPattern.cc:892
static const unsigned short SideOffset
Definition: HitPattern.h:450
static const uint16_t EMPTY_PATTERN
Definition: HitPattern.h:162
static uint16_t getDTSuperLayer(uint16_t pattern)
DT superlayer (1-3). Where the "hit" was a DT segment, superlayer is 0. Only valid for muon DT patter...
Definition: HitPattern.h:759
uint16_t getHitPatternByAbsoluteIndex(int position) const
Definition: HitPattern.cc:316
static bool muonME0HitFilter(uint16_t pattern)
Definition: HitPattern.h:672
ret
prodAgent to be discontinued
static const unsigned short SubstrOffset
Definition: HitPattern.h:458
int trackerLayersWithMeasurement() const
Definition: HitPattern.cc:535
int numberOfAllHits(HitCategory category) const
Definition: HitPattern.h:804
HitPattern & operator=(const HitPattern &other)
Definition: HitPattern.cc:50
static const unsigned short MaxHits
Definition: HitPattern.h:159
int stripTOBLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.cc:743
int stripTIDLayersWithMeasurement() const
Definition: HitPattern.cc:609
int pixelEndcapLayersWithMeasurement() const
Definition: HitPattern.cc:588
int mtdSubDetector() const
Definition: MTDDetId.h:56
static const unsigned short maxTrackerWord
Definition: HitPattern.h:466
int innermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:927
int stripTIBLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:661
int pixelEndcapLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.cc:712
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t stream
static const unsigned short HitTypeMask
Definition: HitPattern.h:447
static bool pixelBarrelHitFilter(uint16_t pattern)
Definition: HitPattern.h:590
int numberOfDTStationsWithBothViews() const
Definition: HitPattern.cc:979
int globalRunit() const
Definition: BTLDetId.h:93
bool tibIsStereo(const DetId &id) const
int stripTECLayersWithMeasurement() const
Definition: HitPattern.cc:629
unsigned int layer(const DetId &id) const
Detector identifier base class for the MIP Timing Layer.
Definition: MTDDetId.h:21
bool insertExpectedOuterHit(const uint16_t pattern)
Definition: HitPattern.cc:1033
static bool pixelEndcapHitFilter(uint16_t pattern)
Definition: HitPattern.h:599
int stripTIBLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.cc:723
int stripTIBLayersNull() const
Definition: HitPattern.cc:785
Run3ScoutingHitPatternPOD run3ScoutingHitPatternPOD() const
Definition: HitPattern.cc:1045
static bool validHitFilter(uint16_t pattern)
Definition: HitPattern.h:796
bool tobIsStereo(const DetId &id) const
uint8_t endInner
Definition: HitPattern.h:502
int outermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
Definition: HitPattern.cc:942
int numberOfDTStationsWithRPhiView() const
Definition: HitPattern.cc:956
static uint16_t getGEMLayer(uint16_t pattern)
GEM layer: 1-6 for station 0, 1-2 for stations 1 and 2. Only valid for muon GEM patterns, of course.
Definition: HitPattern.h:789
static const unsigned short minTrackerWord
Definition: HitPattern.h:465
uint16_t hitPattern[ARRAY_LENGTH]
Definition: HitPattern.h:496
static bool muonCSCHitFilter(uint16_t pattern)
Definition: HitPattern.h:645
static uint32_t getHitType(uint16_t pattern)
Definition: HitPattern.h:747
static const unsigned short SubDetectorMask
Definition: HitPattern.h:463
static bool stripHitFilter(uint16_t pattern)
Definition: HitPattern.h:608
uint16_t getTrackerMonoStereo(HitCategory category, uint16_t substr, uint16_t layer) const
Definition: HitPattern.cc:480
int numberOfDTStationsWithRZView() const
Definition: HitPattern.cc:968
int stripTOBLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:681
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int pixelEndcapLayersNull() const
Definition: HitPattern.cc:774
int numberOfValidTIBLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:440
int stripTOBLayersWithMeasurement() const
Definition: HitPattern.cc:619
bool appendHit(const TrackingRecHit &hit, const TrackerTopology &ttopo)
Definition: HitPattern.cc:224
int mtdRR() const
Definition: MTDDetId.h:64
static constexpr int ME0
Definition: MuonSubdetId.h:15
int stripTECLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:691
uint8_t beginInner
Definition: HitPattern.h:501
int stripTOBLayersNull() const
Definition: HitPattern.cc:805
static constexpr auto TOB
static const unsigned short HitTypeOffset
Definition: HitPattern.h:446
uint16_t getHitPattern(HitCategory category, int position) const
Definition: HitPattern.h:537
bool appendTrackerHit(uint16_t subdet, uint16_t layer, uint16_t stereo, TrackingRecHit::Type hitType)
Definition: HitPattern.cc:296
uint8_t beginTrackHits
Definition: HitPattern.h:499
static uint32_t getSubStructure(uint16_t pattern)
Definition: HitPattern.h:713
int muonStations(int subdet, int hitType) const
subdet = 0(all), 1(DT), 2(CSC), 3(RPC) 4(GEM); hitType=-1(all), 0=valid, 3=bad
Definition: HitPattern.cc:914
int stripTIDLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.cc:733
static uint16_t getRPCregion(uint16_t pattern)
RPC region: 0 = barrel, 1 = endcap. Only valid for muon RPC patterns, of course.
Definition: HitPattern.h:774
static bool muonGEMHitFilter(uint16_t pattern)
Definition: HitPattern.h:663
static uint16_t getGEMStation(uint16_t pattern)
GEM station: 1,2. Only valid for muon GEM patterns, of course.
Definition: HitPattern.h:777
Definition: DetId.h:17
static bool muonHitFilter(uint16_t pattern)
Definition: HitPattern.h:683
static bool trackerHitFilter(uint16_t pattern)
Definition: HitPattern.h:679
uint8_t endTrackHits
Definition: HitPattern.h:500
double const BAD
Definition: Constants.h:15
int trackerLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:554
static constexpr auto TIB
static const unsigned short SideMask
Definition: HitPattern.h:451
int station() const
Definition: CSCDetId.h:79
static const unsigned short minStripWord
Definition: HitPattern.h:468
uint8_t hitCount
Definition: HitPattern.h:497
int numberOfValidTIDLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:444
uint8_t beginOuter
Definition: HitPattern.h:503
static const unsigned short SubDetectorOffset
Definition: HitPattern.h:462
static constexpr int RPC
Definition: MuonSubdetId.h:13
void printHitPattern(HitCategory category, int position, std::ostream &stream) const
Definition: HitPattern.cc:825
bool tecIsStereo(const DetId &id) const
int stripTECLayersNull() const
Definition: HitPattern.cc:815
bool tidIsStereo(const DetId &id) const
static uint32_t getSide(uint16_t pattern)
Definition: HitPattern.h:739
static bool muonDTHitFilter(uint16_t pattern)
Definition: HitPattern.h:636
bool insertExpectedInnerHit(const uint16_t pattern)
Definition: HitPattern.cc:1021
int pixelBarrelLayersNull() const
Definition: HitPattern.cc:763
Detector identifier class for the Endcap Timing Layer.
Definition: ETLDetId.h:16
fixed size matrix
static const unsigned short SubstrMask
Definition: HitPattern.h:459
static const unsigned short LayerOffset
Definition: HitPattern.h:454
static int position[264][3]
Definition: ReadPGInfo.cc:289
Detector identifier class for the Barrel Timing Layer. The crystal count must start from 0...
Definition: BTLDetId.h:19
bool insertTrackHit(const uint16_t pattern)
Definition: HitPattern.cc:1003
int stripTIDLayersNull() const
Definition: HitPattern.cc:795
int pixelBarrelLayersWithMeasurement() const
Definition: HitPattern.cc:577
int stripTIDLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:671
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:763
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:755
int pixelLayersWithMeasurement() const
Definition: HitPattern.cc:514
#define UNLIKELY(x)
Definition: Likely.h:21
static void decodeSector(const uint32_t rr, uint32_t &nDisc, uint32_t &discSide, uint32_t &sector)
Definition: ETLDetId.h:109
static uint32_t getSubSubStructure(uint16_t pattern)
Definition: HitPattern.h:723
static constexpr int DT
Definition: MuonSubdetId.h:11
int ring() const
Definition: CSCDetId.h:68
static const unsigned short LayerMask
Definition: HitPattern.h:455
int pixelBarrelLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
Definition: HitPattern.cc:701
static bool muonRPCHitFilter(uint16_t pattern)
Definition: HitPattern.h:654
static constexpr int CSC
Definition: MuonSubdetId.h:12
static constexpr auto TID
uint8_t endOuter
Definition: HitPattern.h:504
static uint16_t encode(const TrackingRecHit &hit, const TrackerTopology &ttopo)
Definition: HitPattern.cc:87
uint32_t getTrackerLayerCase(HitCategory category, uint16_t substr, uint16_t layer) const
Definition: HitPattern.cc:452
bool hasValidHitInPixelLayer(enum PixelSubdetector::SubDetector, uint16_t layer) const
Definition: HitPattern.cc:359
int numberOfValidTOBLayersWithMonoAndStereo(uint32_t layer=0) const
Definition: HitPattern.cc:436
int pixelBarrelLayersWithoutMeasurement(HitCategory category) const
Definition: HitPattern.cc:639
bool appendMuonHit(const DetId &id, TrackingRecHit::Type hitType)
Definition: HitPattern.cc:300
int stripTIBLayersWithMeasurement() const
Definition: HitPattern.cc:599
void print(HitCategory category, std::ostream &stream=std::cout) const
Definition: HitPattern.cc:876