CMS 3D CMS Logo

HitPattern.cc

Go to the documentation of this file.
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   // ignore the rec hit if the number of hit is larger than the max
00016   if (i >= 32 * PatternSize / HitSize) return;
00017 
00018   // get rec hit det id and rec hit type
00019   DetId id = hit.geographicalId();
00020   uint32_t detid = id.det();
00021   uint32_t hitType = (uint32_t) hit.getType();
00022 
00023   // init pattern of this hit to 0
00024   uint32_t pattern = 0;
00025 
00026   // adding tracker/muon detector bit
00027   pattern += ((detid)&SubDetectorMask)<<SubDetectorOffset;
00028   
00029   // adding substructure (PXB,PXF,TIB,TID,TOB,TEC, or DT,CSC,RPC) bits 
00030   uint32_t subdet = id.subdetId();
00031   pattern += ((subdet)&SubstrMask)<<SubstrOffset;
00032   
00033   // adding layer/disk/wheel bits
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   // adding mono/stereo bit
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   // adding hit type bits
00068   pattern += (hitType&HitTypeMask)<<HitTypeOffset;
00069 
00070   // set pattern for i-th hit
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 /* Note: you are not taking a consecutive sequence of HitSize bits starting from position*HitSize
00085          as the bit order in the words are reversed. 
00086          e.g. if position = 0 you take the lowest 10 bits of the first word.
00087     
00088          I hope this can clarify what is the memory layout of such thing
00089 
00090  straight 01234567890123456789012345678901 | 23456789012345678901234567890123 | 4567
00091  (global) 0         1         2         3  | 3       4         5         6    | 6  
00092  words    [--------------0---------------] | [--------------1---------------] | [---   
00093  word     01234567890123456789012345678901 | 01234567890123456789012345678901 | 0123
00094   (str)   0         1         2         3  | 0         1         2         3  | 0
00095           [--------------0---------------] | [--------------1---------------] | [---   
00096  word     10987654321098765432109876543210 | 10987654321098765432109876543210 | 1098
00097   (rev)   32         21        10        0 | 32         21        10        0 | 32  
00098  reverse  10987654321098765432109876543210 | 32109876543210987654321098765432 | 5432
00099           32         21        10        0 | 6  65        54        43      3   9
00100 
00101          ugly enough, but it's not my fault, I was not even in CMS at that time   [gpetrucc] */
00102 //#define OLD_HITPATTERN_LOGIC
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); // that is, bitEndOffset % 32
00118   if (secondWordBits >= HitSize) { // full block is in this word
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     //if (pattern != 0) {
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      //     printf("sizeof(hasMono) = %d\n", sizeof(hasMono));
00664      memset(hasMono, 0, sizeof(hasMono));
00665      bool hasStereo[SubstrMask + 1][LayerMask + 1];
00666      memset(hasStereo, 0, sizeof(hasStereo));
00667      // mark which layers have mono/stereo hits
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: // mono
00674                          hasMono[getSubStructure(pattern)][getLayer(pattern)] 
00675                               = true;
00676                          break;
00677                     case 1: // stereo
00678                          hasStereo[getSubStructure(pattern)][getLayer(pattern)]
00679                               = true;
00680                          break;
00681                     default:
00682                          break;
00683                     }
00684                }
00685           }
00686      }
00687      // count how many layers have mono and stereo hits
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   // crossed
00709   //   layer case 0: valid + (missing, off, bad) ==> with measurement
00710   //   layer case 1: missing + (off, bad) ==> without measurement
00711   //   layer case 2: off, bad ==> totally off or bad, cannot say much
00712   // not crossed
00713   //   layer case 999999: track outside acceptance or in gap ==> null
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; // 0,1,2,3
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   //    0:              neither a valid mono nor a valid stereo hit
00746   //    MONO:           valid mono hit
00747   //    STEREO:         valid stereo hit
00748   //    MONO | STEREO:  both
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; // 0,1,2,3
00757       if (hitType == 0) { // valid hit
00758            switch (getSide(pattern)) {
00759            case 0: // mono
00760                 monoStereo |= MONO;
00761                 break;
00762            case 1: // stereo
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 }

Generated on Tue Jun 9 17:31:48 2009 for CMSSW by  doxygen 1.5.4