00001 #include "DataFormats/TrackReco/interface/HitPattern.h"
00002 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00003 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00004 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00005 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00006 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00007 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00008 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00009 #include "DataFormats/MuonDetId/interface/DTLayerId.h"
00010 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
00011 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00012 using namespace reco;
00013
00014 void HitPattern::set(const TrackingRecHit & hit, unsigned int i) {
00015
00016 if (i >= 32 * PatternSize / HitSize) return;
00017
00018
00019 DetId id = hit.geographicalId();
00020 uint32_t detid = id.det();
00021 uint32_t hitType = (uint32_t) hit.getType();
00022
00023
00024 uint32_t pattern = 0;
00025
00026
00027 pattern += ((detid)&SubDetectorMask)<<SubDetectorOffset;
00028
00029
00030 uint32_t subdet = id.subdetId();
00031 pattern += ((subdet)&SubstrMask)<<SubstrOffset;
00032
00033
00034 uint32_t layer = 0;
00035 if (detid == DetId::Tracker) {
00036 if (subdet == PixelSubdetector::PixelBarrel)
00037 layer = PXBDetId(id).layer();
00038 else if (subdet == PixelSubdetector::PixelEndcap)
00039 layer = PXFDetId(id).disk();
00040 else if (subdet == StripSubdetector::TIB)
00041 layer = TIBDetId(id).layer();
00042 else if (subdet == StripSubdetector::TID)
00043 layer = TIDDetId(id).wheel();
00044 else if (subdet == StripSubdetector::TOB)
00045 layer = TOBDetId(id).layer();
00046 else if (subdet == StripSubdetector::TEC)
00047 layer = TECDetId(id).wheel();
00048 } else if (detid == DetId::Muon) {
00049 if (subdet == (uint32_t) MuonSubdetId::DT)
00050 layer = DTLayerId(id.rawId()).layer();
00051 else if (subdet == (uint32_t) MuonSubdetId::CSC)
00052 layer = CSCDetId(id.rawId()).layer();
00053 else if (subdet == (uint32_t) MuonSubdetId::RPC)
00054 layer = RPCDetId(id.rawId()).layer();
00055 }
00056 pattern += (layer&LayerMask)<<LayerOffset;
00057
00058
00059 uint32_t side = 0;
00060 if (detid == DetId::Tracker) {
00061 side = isStereo(id);
00062 } else if (detid == DetId::Muon) {
00063 side = 0;
00064 }
00065 pattern += (side&SideMask)<<SideOffset;
00066
00067
00068 pattern += (hitType&HitTypeMask)<<HitTypeOffset;
00069
00070
00071 setHitPattern(i, pattern);
00072 }
00073
00074 void HitPattern::setHitPattern(int position, uint32_t pattern) {
00075 int offset = position * HitSize;
00076 for (int i=0; i<HitSize; i++) {
00077 int pos = offset + i;
00078 uint32_t bit = (pattern >> i) & 0x1;
00079 hitPattern_[pos / 32] += bit << ((offset + i) % 32);
00080 }
00081 }
00082
00083 uint32_t HitPattern::getHitPattern(int position) const {
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 #if defined(OLD_HITPATTERN_LOGIC)
00104 int offset = position * HitSize;
00105 uint32_t pattern = 0;
00106 for (int i=0; i<HitSize; i++) {
00107 int pos = offset + i;
00108 uint32_t word = hitPattern_[pos / 32];
00109 uint32_t bit = (word >> (pos%32)) & 0x1;
00110 pattern += bit << i;
00111 }
00112 #endif
00113 #define GIO_HITPATTERN_LOGIC
00114 #if defined(GIO_HITPATTERN_LOGIC)
00115 uint16_t bitEndOffset = (position+1) * HitSize;
00116 uint8_t secondWord = (bitEndOffset >> 5);
00117 uint8_t secondWordBits = bitEndOffset & (32-1);
00118 if (secondWordBits >= HitSize) {
00119 uint8_t lowBitsToTrash = secondWordBits - HitSize;
00120 uint32_t myResult = (hitPattern_[secondWord] >> lowBitsToTrash) & ((1 << HitSize)-1);
00121 #if defined(OLD_HITPATTERN_LOGIC)
00122 if (pattern != myResult) { abort(); }
00123 #endif //both
00124 return myResult;
00125 } else {
00126 uint8_t firstWordBits = HitSize - secondWordBits;
00127 uint32_t firstWordBlock = hitPattern_[secondWord-1] >> (32-firstWordBits);
00128 uint32_t secondWordBlock = hitPattern_[secondWord] & ((1<<secondWordBits)-1);
00129 uint32_t myResult = firstWordBlock + (secondWordBlock << firstWordBits);
00130 #if defined(OLD_HITPATTERN_LOGIC)
00131 if (pattern != myResult) { abort(); }
00132 #endif //both
00133 return myResult;
00134 }
00135 #endif
00136 #ifndef GIO_HITPATTERN_LOGIC
00137 return pattern;
00138 #endif
00139 }
00140
00141 bool HitPattern::trackerHitFilter(uint32_t pattern) const {
00142 if (pattern == 0) return false;
00143 if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 1) return true;
00144 return false;
00145 }
00146
00147 bool HitPattern::muonHitFilter(uint32_t pattern) const {
00148 if (pattern == 0) return false;
00149 if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 0) return true;
00150 return false;
00151 }
00152
00153 uint32_t HitPattern::getSubStructure(uint32_t pattern) const {
00154 if (pattern == 0) return 999999;
00155 return ((pattern >> SubstrOffset) & SubstrMask);
00156 }
00157
00158 bool HitPattern::pixelHitFilter(uint32_t pattern) const {
00159 if (!trackerHitFilter(pattern)) return false;
00160 uint32_t substructure = getSubStructure(pattern);
00161 if (substructure == PixelSubdetector::PixelBarrel ||
00162 substructure == PixelSubdetector::PixelEndcap) return true;
00163 return false;
00164 }
00165
00166 bool HitPattern::pixelBarrelHitFilter(uint32_t pattern) const {
00167 if (!trackerHitFilter(pattern)) return false;
00168 uint32_t substructure = getSubStructure(pattern);
00169 if (substructure == PixelSubdetector::PixelBarrel) return true;
00170 return false;
00171 }
00172
00173 bool HitPattern::pixelEndcapHitFilter(uint32_t pattern) const {
00174 if (!trackerHitFilter(pattern)) return false;
00175 uint32_t substructure = getSubStructure(pattern);
00176 if (substructure == PixelSubdetector::PixelEndcap) return true;
00177 return false;
00178 }
00179
00180 bool HitPattern::stripHitFilter(uint32_t pattern) const {
00181 if (!trackerHitFilter(pattern)) return false;
00182 uint32_t substructure = getSubStructure(pattern);
00183 if (substructure == StripSubdetector::TIB ||
00184 substructure == StripSubdetector::TID ||
00185 substructure == StripSubdetector::TOB ||
00186 substructure == StripSubdetector::TEC) return true;
00187 return false;
00188 }
00189
00190 bool HitPattern::stripTIBHitFilter(uint32_t pattern) const {
00191 if (!trackerHitFilter(pattern)) return false;
00192 uint32_t substructure = getSubStructure(pattern);
00193 if (substructure == StripSubdetector::TIB) return true;
00194 return false;
00195 }
00196
00197 bool HitPattern::stripTIDHitFilter(uint32_t pattern) const {
00198 if (!trackerHitFilter(pattern)) return false;
00199 uint32_t substructure = getSubStructure(pattern);
00200 if (substructure == StripSubdetector::TID) return true;
00201 return false;
00202 }
00203
00204 bool HitPattern::stripTOBHitFilter(uint32_t pattern) const {
00205 if (!trackerHitFilter(pattern)) return false;
00206 uint32_t substructure = getSubStructure(pattern);
00207 if (substructure == StripSubdetector::TOB) return true;
00208 return false;
00209 }
00210
00211 bool HitPattern::stripTECHitFilter(uint32_t pattern) const {
00212 if (!trackerHitFilter(pattern)) return false;
00213 uint32_t substructure = getSubStructure(pattern);
00214 if (substructure == StripSubdetector::TEC) return true;
00215 return false;
00216 }
00217
00218 bool HitPattern::muonDTHitFilter(uint32_t pattern) const {
00219 if (!muonHitFilter(pattern)) return false;
00220 uint32_t substructure = getSubStructure(pattern);
00221 if (substructure == (uint32_t) MuonSubdetId::DT) return true;
00222 return false;
00223 }
00224
00225 bool HitPattern::muonCSCHitFilter(uint32_t pattern) const {
00226 if (!muonHitFilter(pattern)) return false;
00227 uint32_t substructure = getSubStructure(pattern);
00228 if (substructure == (uint32_t) MuonSubdetId::CSC) return true;
00229 return false;
00230 }
00231
00232 bool HitPattern::muonRPCHitFilter(uint32_t pattern) const {
00233 if (!muonHitFilter(pattern)) return false;
00234 uint32_t substructure = getSubStructure(pattern);
00235 if (substructure == (uint32_t) MuonSubdetId::RPC) return true;
00236 return false;
00237 }
00238
00239 uint32_t HitPattern::getLayer(uint32_t pattern) const {
00240 if (pattern == 0) return 999999;
00241 return ((pattern>>LayerOffset) & LayerMask);
00242 }
00243
00244 uint32_t HitPattern::getSide (uint32_t pattern)
00245 {
00246 if (pattern == 0) return 999999;
00247 return (pattern >> SideOffset) & SideMask;
00248 }
00249
00250 uint32_t HitPattern::getHitType( uint32_t pattern ) const {
00251 if (pattern == 0) return 999999;
00252 return ((pattern>>HitTypeOffset) & HitTypeMask);
00253 }
00254
00255 bool HitPattern::validHitFilter(uint32_t pattern) const {
00256 if (getHitType(pattern) == 0) return true;
00257 return false;
00258 }
00259
00260 bool HitPattern::type_1_HitFilter(uint32_t pattern) const {
00261 if (getHitType(pattern) == 1) return true;
00262 return false;
00263 }
00264
00265 bool HitPattern::type_2_HitFilter(uint32_t pattern) const {
00266 if (getHitType(pattern) == 2) return true;
00267 return false;
00268 }
00269
00270 bool HitPattern::type_3_HitFilter(uint32_t pattern) const {
00271 if (getHitType(pattern) == 3) return true;
00272 return false;
00273 }
00274
00275 bool HitPattern::hasValidHitInFirstPixelBarrel() const {
00276 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00277 uint32_t pattern = getHitPattern(i);
00278 if (pixelBarrelHitFilter(pattern)) {
00279 if (getLayer(pattern) == 1) {
00280 if (validHitFilter(pattern)) {
00281 return true;
00282 }
00283 }
00284 }
00285 }
00286 return false;
00287 }
00288
00289 int HitPattern::numberOfHits() const {
00290 int count = 0;
00291 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00292 uint32_t pattern = getHitPattern(i);
00293 if (pattern != 0) count++;
00294 }
00295 return count;
00296 }
00297
00298 int HitPattern::numberOfValidHits() const {
00299 int count = 0;
00300 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00301 uint32_t pattern = getHitPattern(i);
00302 if (pattern == 0) break;
00303
00304 if (validHitFilter(pattern)) count++;
00305
00306 }
00307 return count;
00308 }
00309
00310 int HitPattern::numberOfValidTrackerHits() const {
00311 int count = 0;
00312 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00313 uint32_t pattern = getHitPattern(i);
00314 if (pattern != 0) {
00315 if (validHitFilter(pattern)) {
00316 if (trackerHitFilter(pattern)) count++;
00317 }
00318 }
00319 }
00320 return count;
00321 }
00322
00323 int HitPattern::numberOfValidMuonHits() const {
00324 int count = 0;
00325 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00326 uint32_t pattern = getHitPattern(i);
00327 if (pattern != 0) {
00328 if (validHitFilter(pattern)) {
00329 if (muonHitFilter(pattern)) count++;
00330 }
00331 }
00332 }
00333 return count;
00334 }
00335
00336 int HitPattern::numberOfValidPixelHits() const {
00337 int count = 0;
00338 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00339 uint32_t pattern = getHitPattern(i);
00340 if (pattern != 0) {
00341 if (validHitFilter(pattern)) {
00342 if (pixelHitFilter(pattern)) count++;
00343 }
00344 }
00345 }
00346 return count;
00347 }
00348
00349 int HitPattern::numberOfValidPixelBarrelHits() const {
00350 int count = 0;
00351 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00352 uint32_t pattern = getHitPattern(i);
00353 if (pattern != 0) {
00354 if (validHitFilter(pattern)) {
00355 if (pixelBarrelHitFilter(pattern)) count++;
00356 }
00357 }
00358 }
00359 return count;
00360 }
00361
00362 int HitPattern::numberOfValidPixelEndcapHits() const {
00363 int count = 0;
00364 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00365 uint32_t pattern = getHitPattern(i);
00366 if (pattern != 0) {
00367 if (validHitFilter(pattern)) {
00368 if (pixelEndcapHitFilter(pattern)) count++;
00369 }
00370 }
00371 }
00372 return count;
00373 }
00374
00375 int HitPattern::numberOfValidStripHits() const {
00376 int count = 0;
00377 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00378 uint32_t pattern = getHitPattern(i);
00379 if (pattern != 0) {
00380 if (validHitFilter(pattern)) {
00381 if (stripHitFilter(pattern)) count++;
00382 }
00383 }
00384 }
00385 return count;
00386 }
00387
00388 int HitPattern::numberOfValidStripTIBHits() const {
00389 int count = 0;
00390 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00391 uint32_t pattern = getHitPattern(i);
00392 if (pattern != 0) {
00393 if (validHitFilter(pattern)) {
00394 if (stripTIBHitFilter(pattern)) count++;
00395 }
00396 }
00397 }
00398 return count;
00399 }
00400
00401 int HitPattern::numberOfValidStripTIDHits() const {
00402 int count = 0;
00403 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00404 uint32_t pattern = getHitPattern(i);
00405 if (pattern != 0) {
00406 if (validHitFilter(pattern)) {
00407 if (stripTIDHitFilter(pattern)) count++;
00408 }
00409 }
00410 }
00411 return count;
00412 }
00413
00414 int HitPattern::numberOfValidStripTOBHits() const {
00415 int count = 0;
00416 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00417 uint32_t pattern = getHitPattern(i);
00418 if (pattern != 0) {
00419 if (validHitFilter(pattern)) {
00420 if (stripTOBHitFilter(pattern)) count++;
00421 }
00422 }
00423 }
00424 return count;
00425 }
00426
00427 int HitPattern::numberOfValidStripTECHits() const {
00428 int count = 0;
00429 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00430 uint32_t pattern = getHitPattern(i);
00431 if (pattern != 0) {
00432 if (validHitFilter(pattern)) {
00433 if (stripTECHitFilter(pattern)) count++;
00434 }
00435 }
00436 }
00437 return count;
00438 }
00439
00440 int HitPattern::numberOfValidMuonDTHits() const {
00441 int count = 0;
00442 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00443 uint32_t pattern = getHitPattern(i);
00444 if (pattern != 0) {
00445 if (validHitFilter(pattern)) {
00446 if (muonDTHitFilter(pattern)) count++;
00447 }
00448 }
00449 }
00450 return count;
00451 }
00452
00453 int HitPattern::numberOfValidMuonCSCHits() const {
00454 int count = 0;
00455 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00456 uint32_t pattern = getHitPattern(i);
00457 if (pattern != 0) {
00458 if (validHitFilter(pattern)) {
00459 if (muonCSCHitFilter(pattern)) count++;
00460 }
00461 }
00462 }
00463 return count;
00464 }
00465
00466 int HitPattern::numberOfValidMuonRPCHits() const {
00467 int count = 0;
00468 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00469 uint32_t pattern = getHitPattern(i);
00470 if (pattern != 0) {
00471 if (validHitFilter(pattern)) {
00472 if (muonRPCHitFilter(pattern)) count++;
00473 }
00474 }
00475 }
00476 return count;
00477 }
00478
00479 int HitPattern::numberOfLostHits() const {
00480 int count = 0;
00481 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00482 uint32_t pattern = getHitPattern(i);
00483 if (pattern != 0) {
00484 if (type_1_HitFilter(pattern)) count++;
00485 }
00486 }
00487 return count;
00488 }
00489
00490 int HitPattern::numberOfLostTrackerHits() const {
00491 int count = 0;
00492 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00493 uint32_t pattern = getHitPattern(i);
00494 if (pattern != 0) {
00495 if (type_1_HitFilter(pattern)) {
00496 if (trackerHitFilter(pattern)) count++;
00497 }
00498 }
00499 }
00500 return count;
00501 }
00502
00503 int HitPattern::numberOfLostMuonHits() const {
00504 int count = 0;
00505 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00506 uint32_t pattern = getHitPattern(i);
00507 if (pattern != 0) {
00508 if (type_1_HitFilter(pattern)) {
00509 if (muonHitFilter(pattern)) count++;
00510 }
00511 }
00512 }
00513 return count;
00514 }
00515
00516 int HitPattern::numberOfLostPixelHits() const {
00517 int count = 0;
00518 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00519 uint32_t pattern = getHitPattern(i);
00520 if (pattern != 0) {
00521 if (type_1_HitFilter(pattern)) {
00522 if (pixelHitFilter(pattern)) count++;
00523 }
00524 }
00525 }
00526 return count;
00527 }
00528
00529 int HitPattern::numberOfLostPixelBarrelHits() const {
00530 int count = 0;
00531 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00532 uint32_t pattern = getHitPattern(i);
00533 if (pattern != 0) {
00534 if (type_1_HitFilter(pattern)) {
00535 if (pixelBarrelHitFilter(pattern)) count++;
00536 }
00537 }
00538 }
00539 return count;
00540 }
00541
00542 int HitPattern::numberOfLostPixelEndcapHits() const {
00543 int count = 0;
00544 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00545 uint32_t pattern = getHitPattern(i);
00546 if (pattern != 0) {
00547 if (type_1_HitFilter(pattern)) {
00548 if (pixelEndcapHitFilter(pattern)) count++;
00549 }
00550 }
00551 }
00552 return count;
00553 }
00554
00555 int HitPattern::numberOfLostStripHits() const {
00556 int count = 0;
00557 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00558 uint32_t pattern = getHitPattern(i);
00559 if (pattern != 0) {
00560 if (type_1_HitFilter(pattern)) {
00561 if (stripHitFilter(pattern)) count++;
00562 }
00563 }
00564 }
00565 return count;
00566 }
00567
00568 int HitPattern::numberOfLostStripTIBHits() const {
00569 int count = 0;
00570 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00571 uint32_t pattern = getHitPattern(i);
00572 if (pattern != 0) {
00573 if (type_1_HitFilter(pattern)) {
00574 if (stripTIBHitFilter(pattern)) count++;
00575 }
00576 }
00577 }
00578 return count;
00579 }
00580
00581 int HitPattern::numberOfLostStripTIDHits() const {
00582 int count = 0;
00583 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00584 uint32_t pattern = getHitPattern(i);
00585 if (pattern != 0) {
00586 if (type_1_HitFilter(pattern)) {
00587 if (stripTIDHitFilter(pattern)) count++;
00588 }
00589 }
00590 }
00591 return count;
00592 }
00593
00594 int HitPattern::numberOfLostStripTOBHits() const {
00595 int count = 0;
00596 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00597 uint32_t pattern = getHitPattern(i);
00598 if (pattern != 0) {
00599 if (type_1_HitFilter(pattern)) {
00600 if (stripTOBHitFilter(pattern)) count++;
00601 }
00602 }
00603 }
00604 return count;
00605 }
00606
00607 int HitPattern::numberOfLostStripTECHits() const {
00608 int count = 0;
00609 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00610 uint32_t pattern = getHitPattern(i);
00611 if (pattern != 0) {
00612 if (type_1_HitFilter(pattern)) {
00613 if (stripTECHitFilter(pattern)) count++;
00614 }
00615 }
00616 }
00617 return count;
00618 }
00619
00620 int HitPattern::numberOfLostMuonDTHits() const {
00621 int count = 0;
00622 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00623 uint32_t pattern = getHitPattern(i);
00624 if (pattern != 0) {
00625 if (type_1_HitFilter(pattern)) {
00626 if (muonDTHitFilter(pattern)) count++;
00627 }
00628 }
00629 }
00630 return count;
00631 }
00632
00633 int HitPattern::numberOfLostMuonCSCHits() const {
00634 int count = 0;
00635 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00636 uint32_t pattern = getHitPattern(i);
00637 if (pattern != 0) {
00638 if (type_1_HitFilter(pattern)) {
00639 if (muonCSCHitFilter(pattern)) count++;
00640 }
00641 }
00642 }
00643 return count;
00644 }
00645
00646 int HitPattern::numberOfLostMuonRPCHits() const {
00647 int count = 0;
00648 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00649 uint32_t pattern = getHitPattern(i);
00650 if (pattern != 0) {
00651 if (type_1_HitFilter(pattern)) {
00652 if (muonRPCHitFilter(pattern)) count++;
00653 }
00654 }
00655 }
00656 return count;
00657 }
00658
00659 int HitPattern::numberOfValidStripLayersWithMonoAndStereo () const
00660 {
00661 static const int nHits = (PatternSize * 32) / HitSize;
00662 bool hasMono[SubstrMask + 1][LayerMask + 1];
00663
00664 memset(hasMono, 0, sizeof(hasMono));
00665 bool hasStereo[SubstrMask + 1][LayerMask + 1];
00666 memset(hasStereo, 0, sizeof(hasStereo));
00667
00668 for (int i = 0; i < nHits; i++) {
00669 uint32_t pattern = getHitPattern(i);
00670 if (pattern != 0) {
00671 if (validHitFilter(pattern) && stripHitFilter(pattern)) {
00672 switch (getSide(pattern)) {
00673 case 0:
00674 hasMono[getSubStructure(pattern)][getLayer(pattern)]
00675 = true;
00676 break;
00677 case 1:
00678 hasStereo[getSubStructure(pattern)][getLayer(pattern)]
00679 = true;
00680 break;
00681 default:
00682 break;
00683 }
00684 }
00685 }
00686 }
00687
00688 int count = 0;
00689 for (int i = 0; i < SubstrMask + 1; ++i)
00690 for (int j = 0; j < LayerMask + 1; ++j)
00691 if (hasMono[i][j] && hasStereo[i][j])
00692 count++;
00693 return count;
00694 }
00695
00696 uint32_t HitPattern::getTrackerLayerCase(uint32_t substr, uint32_t layer) const
00697 {
00698 uint32_t tk_substr_layer =
00699 (1 << SubDetectorOffset) +
00700 ((substr & SubstrMask) << SubstrOffset) +
00701 ((layer & LayerMask) << LayerOffset);
00702
00703 uint32_t mask =
00704 (SubDetectorMask << SubDetectorOffset) +
00705 (SubstrMask << SubstrOffset) +
00706 (LayerMask << LayerOffset);
00707
00708
00709
00710
00711
00712
00713
00714
00715 uint32_t layerCase = 999999;
00716 for (int i=0; i<(PatternSize * 32) / HitSize; i++)
00717 {
00718 uint32_t pattern = getHitPattern(i);
00719 if (pattern == 0) break;
00720 if ((pattern & mask) == tk_substr_layer)
00721 {
00722 uint32_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
00723 if (hitType < layerCase)
00724 {
00725 layerCase = hitType;
00726 if (hitType == 3) layerCase = 2;
00727 }
00728 }
00729 }
00730 return layerCase;
00731 }
00732
00733 uint32_t HitPattern::getTrackerMonoStereo (uint32_t substr, uint32_t layer) const
00734 {
00735 uint32_t tk_substr_layer =
00736 (1 << SubDetectorOffset) +
00737 ((substr & SubstrMask) << SubstrOffset) +
00738 ((layer & LayerMask) << LayerOffset);
00739
00740 uint32_t mask =
00741 (SubDetectorMask << SubDetectorOffset) +
00742 (SubstrMask << SubstrOffset) +
00743 (LayerMask << LayerOffset);
00744
00745
00746
00747
00748
00749 uint32_t monoStereo = 0;
00750 for (int i=0; i<(PatternSize * 32) / HitSize; i++)
00751 {
00752 uint32_t pattern = getHitPattern(i);
00753 if (pattern == 0) break;
00754 if ((pattern & mask) == tk_substr_layer)
00755 {
00756 uint32_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
00757 if (hitType == 0) {
00758 switch (getSide(pattern)) {
00759 case 0:
00760 monoStereo |= MONO;
00761 break;
00762 case 1:
00763 monoStereo |= STEREO;
00764 break;
00765 default:
00766 break;
00767 }
00768 }
00769 }
00770 }
00771 return monoStereo;
00772 }
00773
00774 int HitPattern::trackerLayersWithMeasurement() const {
00775 return pixelLayersWithMeasurement() +
00776 stripLayersWithMeasurement();
00777 }
00778
00779 int HitPattern::pixelLayersWithMeasurement() const {
00780 return pixelBarrelLayersWithMeasurement() +
00781 pixelEndcapLayersWithMeasurement();
00782 }
00783
00784 int HitPattern::stripLayersWithMeasurement() const {
00785 return stripTIBLayersWithMeasurement() +
00786 stripTIDLayersWithMeasurement() +
00787 stripTOBLayersWithMeasurement() +
00788 stripTECLayersWithMeasurement();
00789 }
00790
00791 int HitPattern::pixelBarrelLayersWithMeasurement() const {
00792 int count = 0;
00793 uint32_t substr = PixelSubdetector::PixelBarrel;
00794 for (uint32_t layer=1; layer<=3; layer++) {
00795 if (getTrackerLayerCase(substr, layer) == 0) count++;
00796 }
00797 return count;
00798 }
00799
00800 int HitPattern::pixelEndcapLayersWithMeasurement() const {
00801 int count = 0;
00802 uint32_t substr = PixelSubdetector::PixelEndcap;
00803 for (uint32_t layer=1; layer<=2; layer++) {
00804 if (getTrackerLayerCase(substr, layer) == 0) count++;
00805 }
00806 return count;
00807 }
00808
00809 int HitPattern::stripTIBLayersWithMeasurement() const {
00810 int count = 0;
00811 uint32_t substr = StripSubdetector::TIB;
00812 for (uint32_t layer=1; layer<=4; layer++) {
00813 if (getTrackerLayerCase(substr, layer) == 0) count++;
00814 }
00815 return count;
00816 }
00817
00818 int HitPattern::stripTIDLayersWithMeasurement() const {
00819 int count = 0;
00820 uint32_t substr = StripSubdetector::TID;
00821 for (uint32_t layer=1; layer<=3; layer++) {
00822 if (getTrackerLayerCase(substr, layer) == 0) count++;
00823 }
00824 return count;
00825 }
00826
00827 int HitPattern::stripTOBLayersWithMeasurement() const {
00828 int count = 0;
00829 uint32_t substr = StripSubdetector::TOB;
00830 for (uint32_t layer=1; layer<=6; layer++) {
00831 if (getTrackerLayerCase(substr, layer) == 0) count++;
00832 }
00833 return count;
00834 }
00835
00836 int HitPattern::stripTECLayersWithMeasurement() const {
00837 int count = 0;
00838 uint32_t substr = StripSubdetector::TEC;
00839 for (uint32_t layer=1; layer<=9; layer++) {
00840 if (getTrackerLayerCase(substr, layer) == 0) count++;
00841 }
00842 return count;
00843 }
00844
00845 int HitPattern::trackerLayersWithoutMeasurement() const {
00846 return pixelLayersWithoutMeasurement() +
00847 stripLayersWithoutMeasurement();
00848 }
00849
00850 int HitPattern::pixelLayersWithoutMeasurement() const {
00851 return pixelBarrelLayersWithoutMeasurement() +
00852 pixelEndcapLayersWithoutMeasurement();
00853 }
00854
00855 int HitPattern::stripLayersWithoutMeasurement() const {
00856 return stripTIBLayersWithoutMeasurement() +
00857 stripTIDLayersWithoutMeasurement() +
00858 stripTOBLayersWithoutMeasurement() +
00859 stripTECLayersWithoutMeasurement();
00860 }
00861
00862 int HitPattern::pixelBarrelLayersWithoutMeasurement() const {
00863 int count = 0;
00864 uint32_t substr = PixelSubdetector::PixelBarrel;
00865 for (uint32_t layer=1; layer<=3; layer++) {
00866 if (getTrackerLayerCase(substr, layer) == 1) count++;
00867 }
00868 return count;
00869 }
00870
00871 int HitPattern::pixelEndcapLayersWithoutMeasurement() const {
00872 int count = 0;
00873 uint32_t substr = PixelSubdetector::PixelEndcap;
00874 for (uint32_t layer=1; layer<=2; layer++) {
00875 if (getTrackerLayerCase(substr, layer) == 1) count++;
00876 }
00877 return count;
00878 }
00879
00880 int HitPattern::stripTIBLayersWithoutMeasurement() const {
00881 int count = 0;
00882 uint32_t substr = StripSubdetector::TIB;
00883 for (uint32_t layer=1; layer<=4; layer++) {
00884 if (getTrackerLayerCase(substr, layer) == 1) count++;
00885 }
00886 return count;
00887 }
00888
00889 int HitPattern::stripTIDLayersWithoutMeasurement() const {
00890 int count = 0;
00891 uint32_t substr = StripSubdetector::TID;
00892 for (uint32_t layer=1; layer<=3; layer++) {
00893 if (getTrackerLayerCase(substr, layer) == 1) count++;
00894 }
00895 return count;
00896 }
00897
00898 int HitPattern::stripTOBLayersWithoutMeasurement() const {
00899 int count = 0;
00900 uint32_t substr = StripSubdetector::TOB;
00901 for (uint32_t layer=1; layer<=6; layer++) {
00902 if (getTrackerLayerCase(substr, layer) == 1) count++;
00903 }
00904 return count;
00905 }
00906
00907 int HitPattern::stripTECLayersWithoutMeasurement() const {
00908 int count = 0;
00909 uint32_t substr = StripSubdetector::TEC;
00910 for (uint32_t layer=1; layer<=9; layer++) {
00911 if (getTrackerLayerCase(substr, layer) == 1) count++;
00912 }
00913 return count;
00914 }
00915
00916 int HitPattern::trackerLayersTotallyOffOrBad() const {
00917 return pixelLayersTotallyOffOrBad() +
00918 stripLayersTotallyOffOrBad();
00919 }
00920
00921 int HitPattern::pixelLayersTotallyOffOrBad() const {
00922 return pixelBarrelLayersTotallyOffOrBad() +
00923 pixelEndcapLayersTotallyOffOrBad();
00924 }
00925
00926 int HitPattern::stripLayersTotallyOffOrBad() const {
00927 return stripTIBLayersTotallyOffOrBad() +
00928 stripTIDLayersTotallyOffOrBad() +
00929 stripTOBLayersTotallyOffOrBad() +
00930 stripTECLayersTotallyOffOrBad();
00931 }
00932
00933 int HitPattern::pixelBarrelLayersTotallyOffOrBad() const {
00934 int count = 0;
00935 uint32_t substr = PixelSubdetector::PixelBarrel;
00936 for (uint32_t layer=1; layer<=3; layer++) {
00937 if (getTrackerLayerCase(substr, layer) == 2) count++;
00938 }
00939 return count;
00940 }
00941
00942 int HitPattern::pixelEndcapLayersTotallyOffOrBad() const {
00943 int count = 0;
00944 uint32_t substr = PixelSubdetector::PixelEndcap;
00945 for (uint32_t layer=1; layer<=2; layer++) {
00946 if (getTrackerLayerCase(substr, layer) == 2) count++;
00947 }
00948 return count;
00949 }
00950
00951 int HitPattern::stripTIBLayersTotallyOffOrBad() const {
00952 int count = 0;
00953 uint32_t substr = StripSubdetector::TIB;
00954 for (uint32_t layer=1; layer<=4; layer++) {
00955 if (getTrackerLayerCase(substr, layer) == 2) count++;
00956 }
00957 return count;
00958 }
00959
00960 int HitPattern::stripTIDLayersTotallyOffOrBad() const {
00961 int count = 0;
00962 uint32_t substr = StripSubdetector::TID;
00963 for (uint32_t layer=1; layer<=3; layer++) {
00964 if (getTrackerLayerCase(substr, layer) == 2) count++;
00965 }
00966 return count;
00967 }
00968
00969 int HitPattern::stripTOBLayersTotallyOffOrBad() const {
00970 int count = 0;
00971 uint32_t substr = StripSubdetector::TOB;
00972 for (uint32_t layer=1; layer<=6; layer++) {
00973 if (getTrackerLayerCase(substr, layer) == 2) count++;
00974 }
00975 return count;
00976 }
00977
00978 int HitPattern::stripTECLayersTotallyOffOrBad() const {
00979 int count = 0;
00980 uint32_t substr = StripSubdetector::TEC;
00981 for (uint32_t layer=1; layer<=9; layer++) {
00982 if (getTrackerLayerCase(substr, layer) == 2) count++;
00983 }
00984 return count;
00985 }
00986
00987 int HitPattern::trackerLayersNull() const {
00988 return pixelLayersNull() +
00989 stripLayersNull();
00990 }
00991
00992 int HitPattern::pixelLayersNull() const {
00993 return pixelBarrelLayersNull() +
00994 pixelEndcapLayersNull();
00995 }
00996
00997 int HitPattern::stripLayersNull() const {
00998 return stripTIBLayersNull() +
00999 stripTIDLayersNull() +
01000 stripTOBLayersNull() +
01001 stripTECLayersNull();
01002 }
01003
01004 int HitPattern::pixelBarrelLayersNull() const {
01005 int count = 0;
01006 uint32_t substr = PixelSubdetector::PixelBarrel;
01007 for (uint32_t layer=1; layer<=3; layer++) {
01008 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01009 }
01010 return count;
01011 }
01012
01013 int HitPattern::pixelEndcapLayersNull() const {
01014 int count = 0;
01015 uint32_t substr = PixelSubdetector::PixelEndcap;
01016 for (uint32_t layer=1; layer<=2; layer++) {
01017 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01018 }
01019 return count;
01020 }
01021
01022 int HitPattern::stripTIBLayersNull() const {
01023 int count = 0;
01024 uint32_t substr = StripSubdetector::TIB;
01025 for (uint32_t layer=1; layer<=4; layer++) {
01026 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01027 }
01028 return count;
01029 }
01030
01031 int HitPattern::stripTIDLayersNull() const {
01032 int count = 0;
01033 uint32_t substr = StripSubdetector::TID;
01034 for (uint32_t layer=1; layer<=3; layer++) {
01035 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01036 }
01037 return count;
01038 }
01039
01040 int HitPattern::stripTOBLayersNull() const {
01041 int count = 0;
01042 uint32_t substr = StripSubdetector::TOB;
01043 for (uint32_t layer=1; layer<=6; layer++) {
01044 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01045 }
01046 return count;
01047 }
01048
01049 int HitPattern::stripTECLayersNull() const {
01050 int count = 0;
01051 uint32_t substr = StripSubdetector::TEC;
01052 for (uint32_t layer=1; layer<=9; layer++) {
01053 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01054 }
01055 return count;
01056 }
01057
01058 void HitPattern::printHitPattern (int position, std::ostream &stream) const
01059 {
01060 uint32_t pattern = getHitPattern(position);
01061 stream << "\t";
01062 if (muonHitFilter(pattern))
01063 stream << "muon";
01064 if (trackerHitFilter(pattern))
01065 stream << "tracker";
01066 stream << "\tsubstructure " << getSubStructure(pattern);
01067 stream << "\tlayer " << getLayer(pattern);
01068 stream << "\thit type " << getHitType(pattern);
01069 stream << std::endl;
01070 }
01071
01072 void HitPattern::print (std::ostream &stream) const
01073 {
01074 stream << "HitPattern" << std::endl;
01075 for (int i = 0; i < numberOfHits(); i++)
01076 printHitPattern(i, stream);
01077 std::ios_base::fmtflags flags = stream.flags();
01078 stream.setf ( std::ios_base::hex, std::ios_base::basefield );
01079 stream.setf ( std::ios_base::showbase );
01080 for (int i = 0; i < numberOfHits(); i++) {
01081 uint32_t pattern = getHitPattern(i);
01082 stream << pattern << std::endl;
01083 }
01084 stream.flags(flags);
01085 }
01086
01087 uint32_t HitPattern::isStereo (DetId i)
01088 {
01089 switch (i.det()) {
01090 case DetId::Tracker:
01091 switch (i.subdetId()) {
01092 case PixelSubdetector::PixelBarrel:
01093 case PixelSubdetector::PixelEndcap:
01094 return 0;
01095 case StripSubdetector::TIB:
01096 {
01097 TIBDetId id = i;
01098 return id.isStereo();
01099 }
01100 case StripSubdetector::TID:
01101 {
01102 TIDDetId id = i;
01103 return id.isStereo();
01104 }
01105 case StripSubdetector::TOB:
01106 {
01107 TOBDetId id = i;
01108 return id.isStereo();
01109 }
01110 case StripSubdetector::TEC:
01111 {
01112 TECDetId id = i;
01113 return id.isStereo();
01114 }
01115 default:
01116 return 0;
01117 }
01118 break;
01119 default:
01120 return 0;
01121 }
01122 }