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()).station()-1)<<2) + (DTLayerId(id.rawId()).superLayer()-1);
00051 else if (subdet == (uint32_t) MuonSubdetId::CSC)
00052 layer = ((CSCDetId(id.rawId()).station()-1)<<2) + (CSCDetId(id.rawId()).ring()-1);
00053 else if (subdet == (uint32_t) MuonSubdetId::RPC) {
00054 RPCDetId rpcid(id.rawId());
00055 layer = ((rpcid.station()-1)<<2) + abs(rpcid.region());
00056 if (rpcid.station() <= 2) layer += 2*(rpcid.layer()-1);
00057 }
00058 }
00059 pattern += (layer&LayerMask)<<LayerOffset;
00060
00061
00062 uint32_t side = 0;
00063 if (detid == DetId::Tracker) {
00064 side = isStereo(id);
00065 } else if (detid == DetId::Muon) {
00066 side = 0;
00067 }
00068 pattern += (side&SideMask)<<SideOffset;
00069
00070
00071 pattern += (hitType&HitTypeMask)<<HitTypeOffset;
00072
00073
00074 setHitPattern(i, pattern);
00075 }
00076
00077 void HitPattern::setHitPattern(int position, uint32_t pattern) {
00078 int offset = position * HitSize;
00079 for (int i=0; i<HitSize; i++) {
00080 int pos = offset + i;
00081 uint32_t bit = (pattern >> i) & 0x1;
00082 hitPattern_[pos / 32] += bit << ((offset + i) % 32);
00083 }
00084 }
00085
00086 uint32_t HitPattern::getHitPattern(int position) const {
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 uint16_t bitEndOffset = (position+1) * HitSize;
00106 uint8_t secondWord = (bitEndOffset >> 5);
00107 uint8_t secondWordBits = bitEndOffset & (32-1);
00108 if (secondWordBits >= HitSize) {
00109 uint8_t lowBitsToTrash = secondWordBits - HitSize;
00110 uint32_t myResult = (hitPattern_[secondWord] >> lowBitsToTrash) & ((1 << HitSize)-1);
00111 return myResult;
00112 } else {
00113 uint8_t firstWordBits = HitSize - secondWordBits;
00114 uint32_t firstWordBlock = hitPattern_[secondWord-1] >> (32-firstWordBits);
00115 uint32_t secondWordBlock = hitPattern_[secondWord] & ((1<<secondWordBits)-1);
00116 uint32_t myResult = firstWordBlock + (secondWordBlock << firstWordBits);
00117 return myResult;
00118 }
00119 }
00120
00121 bool HitPattern::trackerHitFilter(uint32_t pattern) const {
00122 if (pattern == 0) return false;
00123 if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 1) return true;
00124 return false;
00125 }
00126
00127 bool HitPattern::muonHitFilter(uint32_t pattern) const {
00128 if (pattern == 0) return false;
00129 if (((pattern>>SubDetectorOffset) & SubDetectorMask) == 0) return true;
00130 return false;
00131 }
00132
00133 uint32_t HitPattern::getSubStructure(uint32_t pattern) const {
00134 if (pattern == 0) return 999999;
00135 return ((pattern >> SubstrOffset) & SubstrMask);
00136 }
00137
00138 bool HitPattern::pixelHitFilter(uint32_t pattern) const {
00139 if (!trackerHitFilter(pattern)) return false;
00140 uint32_t substructure = getSubStructure(pattern);
00141 if (substructure == PixelSubdetector::PixelBarrel ||
00142 substructure == PixelSubdetector::PixelEndcap) return true;
00143 return false;
00144 }
00145
00146 bool HitPattern::pixelBarrelHitFilter(uint32_t pattern) const {
00147 if (!trackerHitFilter(pattern)) return false;
00148 uint32_t substructure = getSubStructure(pattern);
00149 if (substructure == PixelSubdetector::PixelBarrel) return true;
00150 return false;
00151 }
00152
00153 bool HitPattern::pixelEndcapHitFilter(uint32_t pattern) const {
00154 if (!trackerHitFilter(pattern)) return false;
00155 uint32_t substructure = getSubStructure(pattern);
00156 if (substructure == PixelSubdetector::PixelEndcap) return true;
00157 return false;
00158 }
00159
00160 bool HitPattern::stripHitFilter(uint32_t pattern) const {
00161 if (!trackerHitFilter(pattern)) return false;
00162 uint32_t substructure = getSubStructure(pattern);
00163 if (substructure == StripSubdetector::TIB ||
00164 substructure == StripSubdetector::TID ||
00165 substructure == StripSubdetector::TOB ||
00166 substructure == StripSubdetector::TEC) return true;
00167 return false;
00168 }
00169
00170 bool HitPattern::stripTIBHitFilter(uint32_t pattern) const {
00171 if (!trackerHitFilter(pattern)) return false;
00172 uint32_t substructure = getSubStructure(pattern);
00173 if (substructure == StripSubdetector::TIB) return true;
00174 return false;
00175 }
00176
00177 bool HitPattern::stripTIDHitFilter(uint32_t pattern) const {
00178 if (!trackerHitFilter(pattern)) return false;
00179 uint32_t substructure = getSubStructure(pattern);
00180 if (substructure == StripSubdetector::TID) return true;
00181 return false;
00182 }
00183
00184 bool HitPattern::stripTOBHitFilter(uint32_t pattern) const {
00185 if (!trackerHitFilter(pattern)) return false;
00186 uint32_t substructure = getSubStructure(pattern);
00187 if (substructure == StripSubdetector::TOB) return true;
00188 return false;
00189 }
00190
00191 bool HitPattern::stripTECHitFilter(uint32_t pattern) const {
00192 if (!trackerHitFilter(pattern)) return false;
00193 uint32_t substructure = getSubStructure(pattern);
00194 if (substructure == StripSubdetector::TEC) return true;
00195 return false;
00196 }
00197
00198 bool HitPattern::muonDTHitFilter(uint32_t pattern) const {
00199 if (!muonHitFilter(pattern)) return false;
00200 uint32_t substructure = getSubStructure(pattern);
00201 if (substructure == (uint32_t) MuonSubdetId::DT) return true;
00202 return false;
00203 }
00204
00205 bool HitPattern::muonCSCHitFilter(uint32_t pattern) const {
00206 if (!muonHitFilter(pattern)) return false;
00207 uint32_t substructure = getSubStructure(pattern);
00208 if (substructure == (uint32_t) MuonSubdetId::CSC) return true;
00209 return false;
00210 }
00211
00212 bool HitPattern::muonRPCHitFilter(uint32_t pattern) const {
00213 if (!muonHitFilter(pattern)) return false;
00214 uint32_t substructure = getSubStructure(pattern);
00215 if (substructure == (uint32_t) MuonSubdetId::RPC) return true;
00216 return false;
00217 }
00218
00219 uint32_t HitPattern::getLayer(uint32_t pattern) const {
00220 if (pattern == 0) return 999999;
00221 return ((pattern>>LayerOffset) & LayerMask);
00222 }
00223
00224 uint32_t HitPattern::getSubSubStructure(uint32_t pattern) const {
00225 if (pattern == 0) return 999999;
00226 return ((pattern>>LayerOffset) & LayerMask);
00227 }
00228
00229
00230 uint32_t HitPattern::getSide (uint32_t pattern)
00231 {
00232 if (pattern == 0) return 999999;
00233 return (pattern >> SideOffset) & SideMask;
00234 }
00235
00236 uint32_t HitPattern::getHitType( uint32_t pattern ) const {
00237 if (pattern == 0) return 999999;
00238 return ((pattern>>HitTypeOffset) & HitTypeMask);
00239 }
00240
00241 uint32_t HitPattern::getMuonStation(uint32_t pattern) const {
00242 return (getSubSubStructure(pattern)>>2) + 1;
00243 }
00244
00245 uint32_t HitPattern::getDTSuperLayer(uint32_t pattern) const {
00246 return (getSubSubStructure(pattern) & 3) + 1;
00247 }
00248
00249 uint32_t HitPattern::getCSCRing(uint32_t pattern) const {
00250 return (getSubSubStructure(pattern) & 3) + 1;
00251 }
00252
00253 uint32_t HitPattern::getRPCLayer(uint32_t pattern) const {
00254 uint32_t sss = getSubSubStructure(pattern), stat = sss >> 2;
00255 if (stat <= 1) return ((sss >> 1) & 1) + 1;
00256 else return 0;
00257 }
00258
00259 uint32_t HitPattern::getRPCregion(uint32_t pattern) const {
00260 return getSubSubStructure(pattern) & 1;
00261 }
00262
00263
00264 bool HitPattern::validHitFilter(uint32_t pattern) const {
00265 if (getHitType(pattern) == 0) return true;
00266 return false;
00267 }
00268
00269 bool HitPattern::type_1_HitFilter(uint32_t pattern) const {
00270 if (getHitType(pattern) == 1) return true;
00271 return false;
00272 }
00273
00274 bool HitPattern::type_2_HitFilter(uint32_t pattern) const {
00275 if (getHitType(pattern) == 2) return true;
00276 return false;
00277 }
00278
00279 bool HitPattern::type_3_HitFilter(uint32_t pattern) const {
00280 if (getHitType(pattern) == 3) return true;
00281 return false;
00282 }
00283
00284 bool HitPattern::hasValidHitInFirstPixelBarrel() const {
00285 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00286 uint32_t pattern = getHitPattern(i);
00287 if (pixelBarrelHitFilter(pattern)) {
00288 if (getLayer(pattern) == 1) {
00289 if (validHitFilter(pattern)) {
00290 return true;
00291 }
00292 }
00293 }
00294 }
00295 return false;
00296 }
00297
00298 bool HitPattern::hasValidHitInFirstPixelEndcap() const {
00299 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00300 uint32_t pattern = getHitPattern(i);
00301 if (pixelEndcapHitFilter(pattern)) {
00302 if (getLayer(pattern) == 1) {
00303 if (validHitFilter(pattern)) {
00304 return true;
00305 }
00306 }
00307 }
00308 }
00309 return false;
00310 }
00311
00312 int HitPattern::numberOfHits() const {
00313 int count = 0;
00314 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00315 uint32_t pattern = getHitPattern(i);
00316 if (pattern != 0) count++;
00317 }
00318 return count;
00319 }
00320
00321 int HitPattern::numberOfValidHits() const {
00322 int count = 0;
00323 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00324 uint32_t pattern = getHitPattern(i);
00325 if (pattern == 0) break;
00326
00327 if (validHitFilter(pattern)) count++;
00328
00329 }
00330 return count;
00331 }
00332
00333 int HitPattern::numberOfValidTrackerHits() const {
00334 int count = 0;
00335 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00336 uint32_t pattern = getHitPattern(i);
00337 if (pattern != 0) {
00338 if (validHitFilter(pattern)) {
00339 if (trackerHitFilter(pattern)) count++;
00340 }
00341 }
00342 }
00343 return count;
00344 }
00345
00346 int HitPattern::numberOfValidMuonHits() const {
00347 int count = 0;
00348 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00349 uint32_t pattern = getHitPattern(i);
00350 if (pattern != 0) {
00351 if (validHitFilter(pattern)) {
00352 if (muonHitFilter(pattern)) count++;
00353 }
00354 }
00355 }
00356 return count;
00357 }
00358
00359 int HitPattern::numberOfValidPixelHits() const {
00360 int count = 0;
00361 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00362 uint32_t pattern = getHitPattern(i);
00363 if (pattern != 0) {
00364 if (validHitFilter(pattern)) {
00365 if (pixelHitFilter(pattern)) count++;
00366 }
00367 }
00368 }
00369 return count;
00370 }
00371
00372 int HitPattern::numberOfValidPixelBarrelHits() const {
00373 int count = 0;
00374 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00375 uint32_t pattern = getHitPattern(i);
00376 if (pattern != 0) {
00377 if (validHitFilter(pattern)) {
00378 if (pixelBarrelHitFilter(pattern)) count++;
00379 }
00380 }
00381 }
00382 return count;
00383 }
00384
00385 int HitPattern::numberOfValidPixelEndcapHits() const {
00386 int count = 0;
00387 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00388 uint32_t pattern = getHitPattern(i);
00389 if (pattern != 0) {
00390 if (validHitFilter(pattern)) {
00391 if (pixelEndcapHitFilter(pattern)) count++;
00392 }
00393 }
00394 }
00395 return count;
00396 }
00397
00398 int HitPattern::numberOfValidStripHits() const {
00399 int count = 0;
00400 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00401 uint32_t pattern = getHitPattern(i);
00402 if (pattern != 0) {
00403 if (validHitFilter(pattern)) {
00404 if (stripHitFilter(pattern)) count++;
00405 }
00406 }
00407 }
00408 return count;
00409 }
00410
00411 int HitPattern::numberOfValidStripTIBHits() const {
00412 int count = 0;
00413 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00414 uint32_t pattern = getHitPattern(i);
00415 if (pattern != 0) {
00416 if (validHitFilter(pattern)) {
00417 if (stripTIBHitFilter(pattern)) count++;
00418 }
00419 }
00420 }
00421 return count;
00422 }
00423
00424 int HitPattern::numberOfValidStripTIDHits() const {
00425 int count = 0;
00426 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00427 uint32_t pattern = getHitPattern(i);
00428 if (pattern != 0) {
00429 if (validHitFilter(pattern)) {
00430 if (stripTIDHitFilter(pattern)) count++;
00431 }
00432 }
00433 }
00434 return count;
00435 }
00436
00437 int HitPattern::numberOfValidStripTOBHits() const {
00438 int count = 0;
00439 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00440 uint32_t pattern = getHitPattern(i);
00441 if (pattern != 0) {
00442 if (validHitFilter(pattern)) {
00443 if (stripTOBHitFilter(pattern)) count++;
00444 }
00445 }
00446 }
00447 return count;
00448 }
00449
00450 int HitPattern::numberOfValidStripTECHits() const {
00451 int count = 0;
00452 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00453 uint32_t pattern = getHitPattern(i);
00454 if (pattern != 0) {
00455 if (validHitFilter(pattern)) {
00456 if (stripTECHitFilter(pattern)) count++;
00457 }
00458 }
00459 }
00460 return count;
00461 }
00462
00463 int HitPattern::numberOfValidMuonDTHits() const {
00464 int count = 0;
00465 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00466 uint32_t pattern = getHitPattern(i);
00467 if (pattern != 0) {
00468 if (validHitFilter(pattern)) {
00469 if (muonDTHitFilter(pattern)) count++;
00470 }
00471 }
00472 }
00473 return count;
00474 }
00475
00476 int HitPattern::numberOfValidMuonCSCHits() const {
00477 int count = 0;
00478 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00479 uint32_t pattern = getHitPattern(i);
00480 if (pattern != 0) {
00481 if (validHitFilter(pattern)) {
00482 if (muonCSCHitFilter(pattern)) count++;
00483 }
00484 }
00485 }
00486 return count;
00487 }
00488
00489 int HitPattern::numberOfValidMuonRPCHits() const {
00490 int count = 0;
00491 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00492 uint32_t pattern = getHitPattern(i);
00493 if (pattern != 0) {
00494 if (validHitFilter(pattern)) {
00495 if (muonRPCHitFilter(pattern)) count++;
00496 }
00497 }
00498 }
00499 return count;
00500 }
00501
00502 int HitPattern::numberOfLostHits() const {
00503 int count = 0;
00504 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00505 uint32_t pattern = getHitPattern(i);
00506 if (pattern != 0) {
00507 if (type_1_HitFilter(pattern)) count++;
00508 }
00509 }
00510 return count;
00511 }
00512
00513 int HitPattern::numberOfLostTrackerHits() const {
00514 int count = 0;
00515 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00516 uint32_t pattern = getHitPattern(i);
00517 if (pattern != 0) {
00518 if (type_1_HitFilter(pattern)) {
00519 if (trackerHitFilter(pattern)) count++;
00520 }
00521 }
00522 }
00523 return count;
00524 }
00525
00526 int HitPattern::numberOfLostMuonHits() const {
00527 int count = 0;
00528 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00529 uint32_t pattern = getHitPattern(i);
00530 if (pattern != 0) {
00531 if (type_1_HitFilter(pattern)) {
00532 if (muonHitFilter(pattern)) count++;
00533 }
00534 }
00535 }
00536 return count;
00537 }
00538
00539 int HitPattern::numberOfLostPixelHits() const {
00540 int count = 0;
00541 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00542 uint32_t pattern = getHitPattern(i);
00543 if (pattern != 0) {
00544 if (type_1_HitFilter(pattern)) {
00545 if (pixelHitFilter(pattern)) count++;
00546 }
00547 }
00548 }
00549 return count;
00550 }
00551
00552 int HitPattern::numberOfLostPixelBarrelHits() const {
00553 int count = 0;
00554 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00555 uint32_t pattern = getHitPattern(i);
00556 if (pattern != 0) {
00557 if (type_1_HitFilter(pattern)) {
00558 if (pixelBarrelHitFilter(pattern)) count++;
00559 }
00560 }
00561 }
00562 return count;
00563 }
00564
00565 int HitPattern::numberOfLostPixelEndcapHits() const {
00566 int count = 0;
00567 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00568 uint32_t pattern = getHitPattern(i);
00569 if (pattern != 0) {
00570 if (type_1_HitFilter(pattern)) {
00571 if (pixelEndcapHitFilter(pattern)) count++;
00572 }
00573 }
00574 }
00575 return count;
00576 }
00577
00578 int HitPattern::numberOfLostStripHits() const {
00579 int count = 0;
00580 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00581 uint32_t pattern = getHitPattern(i);
00582 if (pattern != 0) {
00583 if (type_1_HitFilter(pattern)) {
00584 if (stripHitFilter(pattern)) count++;
00585 }
00586 }
00587 }
00588 return count;
00589 }
00590
00591 int HitPattern::numberOfLostStripTIBHits() const {
00592 int count = 0;
00593 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00594 uint32_t pattern = getHitPattern(i);
00595 if (pattern != 0) {
00596 if (type_1_HitFilter(pattern)) {
00597 if (stripTIBHitFilter(pattern)) count++;
00598 }
00599 }
00600 }
00601 return count;
00602 }
00603
00604 int HitPattern::numberOfLostStripTIDHits() const {
00605 int count = 0;
00606 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00607 uint32_t pattern = getHitPattern(i);
00608 if (pattern != 0) {
00609 if (type_1_HitFilter(pattern)) {
00610 if (stripTIDHitFilter(pattern)) count++;
00611 }
00612 }
00613 }
00614 return count;
00615 }
00616
00617 int HitPattern::numberOfLostStripTOBHits() const {
00618 int count = 0;
00619 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00620 uint32_t pattern = getHitPattern(i);
00621 if (pattern != 0) {
00622 if (type_1_HitFilter(pattern)) {
00623 if (stripTOBHitFilter(pattern)) count++;
00624 }
00625 }
00626 }
00627 return count;
00628 }
00629
00630 int HitPattern::numberOfLostStripTECHits() const {
00631 int count = 0;
00632 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00633 uint32_t pattern = getHitPattern(i);
00634 if (pattern != 0) {
00635 if (type_1_HitFilter(pattern)) {
00636 if (stripTECHitFilter(pattern)) count++;
00637 }
00638 }
00639 }
00640 return count;
00641 }
00642
00643 int HitPattern::numberOfLostMuonDTHits() const {
00644 int count = 0;
00645 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00646 uint32_t pattern = getHitPattern(i);
00647 if (pattern != 0) {
00648 if (type_1_HitFilter(pattern)) {
00649 if (muonDTHitFilter(pattern)) count++;
00650 }
00651 }
00652 }
00653 return count;
00654 }
00655
00656 int HitPattern::numberOfLostMuonCSCHits() const {
00657 int count = 0;
00658 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00659 uint32_t pattern = getHitPattern(i);
00660 if (pattern != 0) {
00661 if (type_1_HitFilter(pattern)) {
00662 if (muonCSCHitFilter(pattern)) count++;
00663 }
00664 }
00665 }
00666 return count;
00667 }
00668
00669 int HitPattern::numberOfLostMuonRPCHits() const {
00670 int count = 0;
00671 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00672 uint32_t pattern = getHitPattern(i);
00673 if (pattern != 0) {
00674 if (type_1_HitFilter(pattern)) {
00675 if (muonRPCHitFilter(pattern)) count++;
00676 }
00677 }
00678 }
00679 return count;
00680 }
00681
00682 int HitPattern::numberOfBadHits() const {
00683 int count = 0;
00684 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00685 uint32_t pattern = getHitPattern(i);
00686 if (pattern != 0) {
00687 if (type_3_HitFilter(pattern)) count++;
00688 }
00689 }
00690 return count;
00691 }
00692
00693 int HitPattern::numberOfBadMuonHits() const {
00694 int count = 0;
00695 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00696 uint32_t pattern = getHitPattern(i);
00697 if (pattern != 0) {
00698 if (type_3_HitFilter(pattern)) {
00699 if (muonHitFilter(pattern)) count++;
00700 }
00701 }
00702 }
00703 return count;
00704 }
00705
00706 int HitPattern::numberOfBadMuonDTHits() const {
00707 int count = 0;
00708 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00709 uint32_t pattern = getHitPattern(i);
00710 if (pattern != 0) {
00711 if (type_3_HitFilter(pattern)) {
00712 if (muonDTHitFilter(pattern)) count++;
00713 }
00714 }
00715 }
00716 return count;
00717 }
00718
00719 int HitPattern::numberOfBadMuonCSCHits() const {
00720 int count = 0;
00721 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00722 uint32_t pattern = getHitPattern(i);
00723 if (pattern != 0) {
00724 if (type_3_HitFilter(pattern)) {
00725 if (muonCSCHitFilter(pattern)) count++;
00726 }
00727 }
00728 }
00729 return count;
00730 }
00731
00732 int HitPattern::numberOfBadMuonRPCHits() const {
00733 int count = 0;
00734 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00735 uint32_t pattern = getHitPattern(i);
00736 if (pattern != 0) {
00737 if (type_3_HitFilter(pattern)) {
00738 if (muonRPCHitFilter(pattern)) count++;
00739 }
00740 }
00741 }
00742 return count;
00743 }
00744
00745 int HitPattern::numberOfInactiveHits() const {
00746 int count = 0;
00747 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00748 uint32_t pattern = getHitPattern(i);
00749 if (pattern != 0) {
00750 if (type_2_HitFilter(pattern)) count++;
00751 }
00752 }
00753 return count;
00754 }
00755
00756 int HitPattern::numberOfInactiveTrackerHits() const {
00757 int count = 0;
00758 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
00759 uint32_t pattern = getHitPattern(i);
00760 if (pattern != 0) {
00761 if (type_2_HitFilter(pattern) && trackerHitFilter(pattern)) count++;
00762 }
00763 }
00764 return count;
00765 }
00766
00767
00768 int HitPattern::numberOfValidStripLayersWithMonoAndStereo () const
00769 {
00770 static const int nHits = (PatternSize * 32) / HitSize;
00771 bool hasMono[SubstrMask + 1][LayerMask + 1];
00772
00773 memset(hasMono, 0, sizeof(hasMono));
00774 bool hasStereo[SubstrMask + 1][LayerMask + 1];
00775 memset(hasStereo, 0, sizeof(hasStereo));
00776
00777 for (int i = 0; i < nHits; i++) {
00778 uint32_t pattern = getHitPattern(i);
00779 if (pattern != 0) {
00780 if (validHitFilter(pattern) && stripHitFilter(pattern)) {
00781 switch (getSide(pattern)) {
00782 case 0:
00783 hasMono[getSubStructure(pattern)][getLayer(pattern)]
00784 = true;
00785 break;
00786 case 1:
00787 hasStereo[getSubStructure(pattern)][getLayer(pattern)]
00788 = true;
00789 break;
00790 default:
00791 break;
00792 }
00793 }
00794 }
00795 }
00796
00797 int count = 0;
00798 for (int i = 0; i < SubstrMask + 1; ++i)
00799 for (int j = 0; j < LayerMask + 1; ++j)
00800 if (hasMono[i][j] && hasStereo[i][j])
00801 count++;
00802 return count;
00803 }
00804
00805 uint32_t HitPattern::getTrackerLayerCase(uint32_t substr, uint32_t layer) const
00806 {
00807 uint32_t tk_substr_layer =
00808 (1 << SubDetectorOffset) +
00809 ((substr & SubstrMask) << SubstrOffset) +
00810 ((layer & LayerMask) << LayerOffset);
00811
00812 uint32_t mask =
00813 (SubDetectorMask << SubDetectorOffset) +
00814 (SubstrMask << SubstrOffset) +
00815 (LayerMask << LayerOffset);
00816
00817
00818
00819
00820
00821
00822
00823
00824 uint32_t layerCase = 999999;
00825 for (int i=0; i<(PatternSize * 32) / HitSize; i++)
00826 {
00827 uint32_t pattern = getHitPattern(i);
00828 if (pattern == 0) break;
00829 if ((pattern & mask) == tk_substr_layer)
00830 {
00831 uint32_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
00832 if (hitType < layerCase)
00833 {
00834 layerCase = hitType;
00835 if (hitType == 3) layerCase = 2;
00836 }
00837 }
00838 }
00839 return layerCase;
00840 }
00841
00842 uint32_t HitPattern::getTrackerMonoStereo (uint32_t substr, uint32_t layer) const
00843 {
00844 uint32_t tk_substr_layer =
00845 (1 << SubDetectorOffset) +
00846 ((substr & SubstrMask) << SubstrOffset) +
00847 ((layer & LayerMask) << LayerOffset);
00848
00849 uint32_t mask =
00850 (SubDetectorMask << SubDetectorOffset) +
00851 (SubstrMask << SubstrOffset) +
00852 (LayerMask << LayerOffset);
00853
00854
00855
00856
00857
00858 uint32_t monoStereo = 0;
00859 for (int i=0; i<(PatternSize * 32) / HitSize; i++)
00860 {
00861 uint32_t pattern = getHitPattern(i);
00862 if (pattern == 0) break;
00863 if ((pattern & mask) == tk_substr_layer)
00864 {
00865 uint32_t hitType = (pattern >> HitTypeOffset) & HitTypeMask;
00866 if (hitType == 0) {
00867 switch (getSide(pattern)) {
00868 case 0:
00869 monoStereo |= MONO;
00870 break;
00871 case 1:
00872 monoStereo |= STEREO;
00873 break;
00874 default:
00875 break;
00876 }
00877 }
00878 }
00879 }
00880 return monoStereo;
00881 }
00882
00883 int HitPattern::trackerLayersWithMeasurement() const {
00884 return pixelLayersWithMeasurement() +
00885 stripLayersWithMeasurement();
00886 }
00887
00888 int HitPattern::pixelLayersWithMeasurement() const {
00889 return pixelBarrelLayersWithMeasurement() +
00890 pixelEndcapLayersWithMeasurement();
00891 }
00892
00893 int HitPattern::stripLayersWithMeasurement() const {
00894 return stripTIBLayersWithMeasurement() +
00895 stripTIDLayersWithMeasurement() +
00896 stripTOBLayersWithMeasurement() +
00897 stripTECLayersWithMeasurement();
00898 }
00899
00900 int HitPattern::pixelBarrelLayersWithMeasurement() const {
00901 int count = 0;
00902 uint32_t substr = PixelSubdetector::PixelBarrel;
00903 for (uint32_t layer=1; layer<=3; layer++) {
00904 if (getTrackerLayerCase(substr, layer) == 0) count++;
00905 }
00906 return count;
00907 }
00908
00909 int HitPattern::pixelEndcapLayersWithMeasurement() const {
00910 int count = 0;
00911 uint32_t substr = PixelSubdetector::PixelEndcap;
00912 for (uint32_t layer=1; layer<=2; layer++) {
00913 if (getTrackerLayerCase(substr, layer) == 0) count++;
00914 }
00915 return count;
00916 }
00917
00918 int HitPattern::stripTIBLayersWithMeasurement() const {
00919 int count = 0;
00920 uint32_t substr = StripSubdetector::TIB;
00921 for (uint32_t layer=1; layer<=4; layer++) {
00922 if (getTrackerLayerCase(substr, layer) == 0) count++;
00923 }
00924 return count;
00925 }
00926
00927 int HitPattern::stripTIDLayersWithMeasurement() const {
00928 int count = 0;
00929 uint32_t substr = StripSubdetector::TID;
00930 for (uint32_t layer=1; layer<=3; layer++) {
00931 if (getTrackerLayerCase(substr, layer) == 0) count++;
00932 }
00933 return count;
00934 }
00935
00936 int HitPattern::stripTOBLayersWithMeasurement() const {
00937 int count = 0;
00938 uint32_t substr = StripSubdetector::TOB;
00939 for (uint32_t layer=1; layer<=6; layer++) {
00940 if (getTrackerLayerCase(substr, layer) == 0) count++;
00941 }
00942 return count;
00943 }
00944
00945 int HitPattern::stripTECLayersWithMeasurement() const {
00946 int count = 0;
00947 uint32_t substr = StripSubdetector::TEC;
00948 for (uint32_t layer=1; layer<=9; layer++) {
00949 if (getTrackerLayerCase(substr, layer) == 0) count++;
00950 }
00951 return count;
00952 }
00953
00954 int HitPattern::trackerLayersWithoutMeasurement() const {
00955 return pixelLayersWithoutMeasurement() +
00956 stripLayersWithoutMeasurement();
00957 }
00958
00959 int HitPattern::pixelLayersWithoutMeasurement() const {
00960 return pixelBarrelLayersWithoutMeasurement() +
00961 pixelEndcapLayersWithoutMeasurement();
00962 }
00963
00964 int HitPattern::stripLayersWithoutMeasurement() const {
00965 return stripTIBLayersWithoutMeasurement() +
00966 stripTIDLayersWithoutMeasurement() +
00967 stripTOBLayersWithoutMeasurement() +
00968 stripTECLayersWithoutMeasurement();
00969 }
00970
00971 int HitPattern::pixelBarrelLayersWithoutMeasurement() const {
00972 int count = 0;
00973 uint32_t substr = PixelSubdetector::PixelBarrel;
00974 for (uint32_t layer=1; layer<=3; layer++) {
00975 if (getTrackerLayerCase(substr, layer) == 1) count++;
00976 }
00977 return count;
00978 }
00979
00980 int HitPattern::pixelEndcapLayersWithoutMeasurement() const {
00981 int count = 0;
00982 uint32_t substr = PixelSubdetector::PixelEndcap;
00983 for (uint32_t layer=1; layer<=2; layer++) {
00984 if (getTrackerLayerCase(substr, layer) == 1) count++;
00985 }
00986 return count;
00987 }
00988
00989 int HitPattern::stripTIBLayersWithoutMeasurement() const {
00990 int count = 0;
00991 uint32_t substr = StripSubdetector::TIB;
00992 for (uint32_t layer=1; layer<=4; layer++) {
00993 if (getTrackerLayerCase(substr, layer) == 1) count++;
00994 }
00995 return count;
00996 }
00997
00998 int HitPattern::stripTIDLayersWithoutMeasurement() const {
00999 int count = 0;
01000 uint32_t substr = StripSubdetector::TID;
01001 for (uint32_t layer=1; layer<=3; layer++) {
01002 if (getTrackerLayerCase(substr, layer) == 1) count++;
01003 }
01004 return count;
01005 }
01006
01007 int HitPattern::stripTOBLayersWithoutMeasurement() const {
01008 int count = 0;
01009 uint32_t substr = StripSubdetector::TOB;
01010 for (uint32_t layer=1; layer<=6; layer++) {
01011 if (getTrackerLayerCase(substr, layer) == 1) count++;
01012 }
01013 return count;
01014 }
01015
01016 int HitPattern::stripTECLayersWithoutMeasurement() const {
01017 int count = 0;
01018 uint32_t substr = StripSubdetector::TEC;
01019 for (uint32_t layer=1; layer<=9; layer++) {
01020 if (getTrackerLayerCase(substr, layer) == 1) count++;
01021 }
01022 return count;
01023 }
01024
01025 int HitPattern::trackerLayersTotallyOffOrBad() const {
01026 return pixelLayersTotallyOffOrBad() +
01027 stripLayersTotallyOffOrBad();
01028 }
01029
01030 int HitPattern::pixelLayersTotallyOffOrBad() const {
01031 return pixelBarrelLayersTotallyOffOrBad() +
01032 pixelEndcapLayersTotallyOffOrBad();
01033 }
01034
01035 int HitPattern::stripLayersTotallyOffOrBad() const {
01036 return stripTIBLayersTotallyOffOrBad() +
01037 stripTIDLayersTotallyOffOrBad() +
01038 stripTOBLayersTotallyOffOrBad() +
01039 stripTECLayersTotallyOffOrBad();
01040 }
01041
01042 int HitPattern::pixelBarrelLayersTotallyOffOrBad() const {
01043 int count = 0;
01044 uint32_t substr = PixelSubdetector::PixelBarrel;
01045 for (uint32_t layer=1; layer<=3; layer++) {
01046 if (getTrackerLayerCase(substr, layer) == 2) count++;
01047 }
01048 return count;
01049 }
01050
01051 int HitPattern::pixelEndcapLayersTotallyOffOrBad() const {
01052 int count = 0;
01053 uint32_t substr = PixelSubdetector::PixelEndcap;
01054 for (uint32_t layer=1; layer<=2; layer++) {
01055 if (getTrackerLayerCase(substr, layer) == 2) count++;
01056 }
01057 return count;
01058 }
01059
01060 int HitPattern::stripTIBLayersTotallyOffOrBad() const {
01061 int count = 0;
01062 uint32_t substr = StripSubdetector::TIB;
01063 for (uint32_t layer=1; layer<=4; layer++) {
01064 if (getTrackerLayerCase(substr, layer) == 2) count++;
01065 }
01066 return count;
01067 }
01068
01069 int HitPattern::stripTIDLayersTotallyOffOrBad() const {
01070 int count = 0;
01071 uint32_t substr = StripSubdetector::TID;
01072 for (uint32_t layer=1; layer<=3; layer++) {
01073 if (getTrackerLayerCase(substr, layer) == 2) count++;
01074 }
01075 return count;
01076 }
01077
01078 int HitPattern::stripTOBLayersTotallyOffOrBad() const {
01079 int count = 0;
01080 uint32_t substr = StripSubdetector::TOB;
01081 for (uint32_t layer=1; layer<=6; layer++) {
01082 if (getTrackerLayerCase(substr, layer) == 2) count++;
01083 }
01084 return count;
01085 }
01086
01087 int HitPattern::stripTECLayersTotallyOffOrBad() const {
01088 int count = 0;
01089 uint32_t substr = StripSubdetector::TEC;
01090 for (uint32_t layer=1; layer<=9; layer++) {
01091 if (getTrackerLayerCase(substr, layer) == 2) count++;
01092 }
01093 return count;
01094 }
01095
01096 int HitPattern::trackerLayersNull() const {
01097 return pixelLayersNull() +
01098 stripLayersNull();
01099 }
01100
01101 int HitPattern::pixelLayersNull() const {
01102 return pixelBarrelLayersNull() +
01103 pixelEndcapLayersNull();
01104 }
01105
01106 int HitPattern::stripLayersNull() const {
01107 return stripTIBLayersNull() +
01108 stripTIDLayersNull() +
01109 stripTOBLayersNull() +
01110 stripTECLayersNull();
01111 }
01112
01113 int HitPattern::pixelBarrelLayersNull() const {
01114 int count = 0;
01115 uint32_t substr = PixelSubdetector::PixelBarrel;
01116 for (uint32_t layer=1; layer<=3; layer++) {
01117 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01118 }
01119 return count;
01120 }
01121
01122 int HitPattern::pixelEndcapLayersNull() const {
01123 int count = 0;
01124 uint32_t substr = PixelSubdetector::PixelEndcap;
01125 for (uint32_t layer=1; layer<=2; layer++) {
01126 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01127 }
01128 return count;
01129 }
01130
01131 int HitPattern::stripTIBLayersNull() const {
01132 int count = 0;
01133 uint32_t substr = StripSubdetector::TIB;
01134 for (uint32_t layer=1; layer<=4; layer++) {
01135 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01136 }
01137 return count;
01138 }
01139
01140 int HitPattern::stripTIDLayersNull() const {
01141 int count = 0;
01142 uint32_t substr = StripSubdetector::TID;
01143 for (uint32_t layer=1; layer<=3; layer++) {
01144 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01145 }
01146 return count;
01147 }
01148
01149 int HitPattern::stripTOBLayersNull() const {
01150 int count = 0;
01151 uint32_t substr = StripSubdetector::TOB;
01152 for (uint32_t layer=1; layer<=6; layer++) {
01153 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01154 }
01155 return count;
01156 }
01157
01158 int HitPattern::stripTECLayersNull() const {
01159 int count = 0;
01160 uint32_t substr = StripSubdetector::TEC;
01161 for (uint32_t layer=1; layer<=9; layer++) {
01162 if (getTrackerLayerCase(substr, layer) == 999999) count++;
01163 }
01164 return count;
01165 }
01166
01167 void HitPattern::printHitPattern (int position, std::ostream &stream) const
01168 {
01169 uint32_t pattern = getHitPattern(position);
01170 stream << "\t";
01171 if (muonHitFilter(pattern))
01172 stream << "muon";
01173 if (trackerHitFilter(pattern))
01174 stream << "tracker";
01175 stream << "\tsubstructure " << getSubStructure(pattern);
01176 if (muonHitFilter(pattern)) {
01177 stream << "\tstation " << getMuonStation(pattern);
01178 if (muonDTHitFilter(pattern)) {
01179 stream << "\tdt superlayer " << getDTSuperLayer(pattern);
01180 } else if (muonCSCHitFilter(pattern)) {
01181 stream << "\tcsc ring " << getCSCRing(pattern);
01182 } else if (muonRPCHitFilter(pattern)) {
01183 stream << "\trpc " << (getRPCregion(pattern) ? "endcaps" : "barrel") << ", layer " << getRPCLayer(pattern);
01184 } else {
01185 stream << "(UNKNOWN Muon SubStructure!) \tsubsubstructure " << getSubStructure(pattern);
01186 }
01187 } else {
01188 stream << "\tlayer " << getLayer(pattern);
01189 }
01190 stream << "\thit type " << getHitType(pattern);
01191 stream << std::endl;
01192 }
01193
01194 void HitPattern::print (std::ostream &stream) const
01195 {
01196 stream << "HitPattern" << std::endl;
01197 for (int i = 0; i < numberOfHits(); i++)
01198 printHitPattern(i, stream);
01199 std::ios_base::fmtflags flags = stream.flags();
01200 stream.setf ( std::ios_base::hex, std::ios_base::basefield );
01201 stream.setf ( std::ios_base::showbase );
01202 for (int i = 0; i < numberOfHits(); i++) {
01203 uint32_t pattern = getHitPattern(i);
01204 stream << pattern << std::endl;
01205 }
01206 stream.flags(flags);
01207 }
01208
01209 uint32_t HitPattern::isStereo (DetId i)
01210 {
01211 switch (i.det()) {
01212 case DetId::Tracker:
01213 switch (i.subdetId()) {
01214 case PixelSubdetector::PixelBarrel:
01215 case PixelSubdetector::PixelEndcap:
01216 return 0;
01217 case StripSubdetector::TIB:
01218 {
01219 TIBDetId id = i;
01220 return id.isStereo();
01221 }
01222 case StripSubdetector::TID:
01223 {
01224 TIDDetId id = i;
01225 return id.isStereo();
01226 }
01227 case StripSubdetector::TOB:
01228 {
01229 TOBDetId id = i;
01230 return id.isStereo();
01231 }
01232 case StripSubdetector::TEC:
01233 {
01234 TECDetId id = i;
01235 return id.isStereo();
01236 }
01237 default:
01238 return 0;
01239 }
01240 break;
01241 default:
01242 return 0;
01243 }
01244 }
01245
01246 int HitPattern::muonStations(int subdet, int hitType) const {
01247 int stations[4] = { 0,0,0,0 };
01248 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
01249 uint32_t pattern = getHitPattern(i);
01250 if (pattern == 0) break;
01251 if (muonHitFilter(pattern) &&
01252 (subdet == 0 || int(getSubStructure(pattern)) == subdet) &&
01253 (hitType == -1 || int(getHitType(pattern)) == hitType)) {
01254 stations[getMuonStation(pattern)-1] = 1;
01255 }
01256 }
01257 return stations[0]+stations[1]+stations[2]+stations[3];
01258 }
01259
01260 int HitPattern::muonStationsWithValidHits() const { return muonStations(0, 0); }
01261 int HitPattern::muonStationsWithBadHits() const { return muonStations(0, 3); }
01262 int HitPattern::muonStationsWithAnyHits() const { return muonStations(0,-1); }
01263 int HitPattern::dtStationsWithValidHits() const { return muonStations(1, 0); }
01264 int HitPattern::dtStationsWithBadHits() const { return muonStations(1, 3); }
01265 int HitPattern::dtStationsWithAnyHits() const { return muonStations(1,-1); }
01266 int HitPattern::cscStationsWithValidHits() const { return muonStations(2, 0); }
01267 int HitPattern::cscStationsWithBadHits() const { return muonStations(2, 3); }
01268 int HitPattern::cscStationsWithAnyHits() const { return muonStations(2,-1); }
01269 int HitPattern::rpcStationsWithValidHits() const { return muonStations(3, 0); }
01270 int HitPattern::rpcStationsWithBadHits() const { return muonStations(3, 3); }
01271 int HitPattern::rpcStationsWithAnyHits() const { return muonStations(3,-1); }
01272
01273 int HitPattern::innermostMuonStationWithHits(int hitType) const {
01274 int ret = 0;
01275 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
01276 uint32_t pattern = getHitPattern(i);
01277 if (pattern == 0) break;
01278 if (muonHitFilter(pattern) &&
01279 (hitType == -1 || int(getHitType(pattern)) == hitType)) {
01280 int stat = getMuonStation(pattern);
01281 if (ret == 0 || stat < ret) ret = stat;
01282 }
01283 }
01284 return ret;
01285 }
01286
01287 int HitPattern::outermostMuonStationWithHits(int hitType) const {
01288 int ret = 0;
01289 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
01290 uint32_t pattern = getHitPattern(i);
01291 if (pattern == 0) break;
01292 if (muonHitFilter(pattern) &&
01293 (hitType == -1 || int(getHitType(pattern)) == hitType)) {
01294 int stat = getMuonStation(pattern);
01295 if (ret == 0 || stat > ret) ret = stat;
01296 }
01297 }
01298 return ret;
01299 }
01300
01301 int HitPattern::innermostMuonStationWithValidHits() const { return innermostMuonStationWithHits(0); }
01302 int HitPattern::innermostMuonStationWithBadHits() const { return innermostMuonStationWithHits(3); }
01303 int HitPattern::innermostMuonStationWithAnyHits() const { return innermostMuonStationWithHits(-1); }
01304 int HitPattern::outermostMuonStationWithValidHits() const { return outermostMuonStationWithHits(0); }
01305 int HitPattern::outermostMuonStationWithBadHits() const { return outermostMuonStationWithHits(3); }
01306 int HitPattern::outermostMuonStationWithAnyHits() const { return outermostMuonStationWithHits(-1); }
01307
01308 int HitPattern::numberOfDTStationsWithRPhiView() const {
01309 int stations[4] = { 0,0,0,0 };
01310 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
01311 uint32_t pattern = getHitPattern(i);
01312 if (pattern == 0) break;
01313 if (muonDTHitFilter(pattern) && validHitFilter(pattern) && getDTSuperLayer(pattern) != 2) {
01314 stations[getMuonStation(pattern)-1] = 1;
01315 }
01316 }
01317 return stations[0]+stations[1]+stations[2]+stations[3];
01318 }
01319
01320 int HitPattern::numberOfDTStationsWithRZView() const {
01321 int stations[4] = { 0,0,0,0 };
01322 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
01323 uint32_t pattern = getHitPattern(i);
01324 if (pattern == 0) break;
01325 if (muonDTHitFilter(pattern) && validHitFilter(pattern) && getDTSuperLayer(pattern) == 2) {
01326 stations[getMuonStation(pattern)-1] = 1;
01327 }
01328 }
01329 return stations[0]+stations[1]+stations[2]+stations[3];
01330 }
01331
01332 int HitPattern::numberOfDTStationsWithBothViews() const {
01333 int stations[4][2] = { {0,0}, {0,0}, {0,0}, {0,0} };
01334 for (int i=0; i<(PatternSize * 32) / HitSize; i++) {
01335 uint32_t pattern = getHitPattern(i);
01336 if (pattern == 0) break;
01337 if (muonDTHitFilter(pattern) && validHitFilter(pattern)) {
01338 stations[getMuonStation(pattern)-1][getDTSuperLayer(pattern) == 2] = 1;
01339 }
01340 }
01341 return stations[0][0]*stations[0][1] + stations[1][0]*stations[1][1] + stations[2][0]*stations[2][1] + stations[3][0]*stations[3][1];
01342 }
01343
01344
01345