CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_2_9_HLT1_bphpatch4/src/DataFormats/TrackReco/src/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()).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   // adding mono/stereo bit
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   // adding hit type bits
00071   pattern += (hitType&HitTypeMask)<<HitTypeOffset;
00072 
00073   // set pattern for i-th hit
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 /* Note: you are not taking a consecutive sequence of HitSize bits starting from position*HitSize
00088          as the bit order in the words are reversed. 
00089          e.g. if position = 0 you take the lowest 10 bits of the first word.
00090     
00091          I hope this can clarify what is the memory layout of such thing
00092 
00093  straight 01234567890123456789012345678901 | 23456789012345678901234567890123 | 4567
00094  (global) 0         1         2         3  | 3       4         5         6    | 6  
00095  words    [--------------0---------------] | [--------------1---------------] | [---   
00096  word     01234567890123456789012345678901 | 01234567890123456789012345678901 | 0123
00097   (str)   0         1         2         3  | 0         1         2         3  | 0
00098           [--------------0---------------] | [--------------1---------------] | [---   
00099  word     10987654321098765432109876543210 | 10987654321098765432109876543210 | 1098
00100   (rev)   32         21        10        0 | 32         21        10        0 | 32  
00101  reverse  10987654321098765432109876543210 | 32109876543210987654321098765432 | 5432
00102           32         21        10        0 | 6  65        54        43      3   9
00103 
00104          ugly enough, but it's not my fault, I was not even in CMS at that time   [gpetrucc] */
00105   uint16_t bitEndOffset = (position+1) * HitSize;
00106   uint8_t secondWord   = (bitEndOffset >> 5);
00107   uint8_t secondWordBits = bitEndOffset & (32-1); // that is, bitEndOffset % 32
00108   if (secondWordBits >= HitSize) { // full block is in this word
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     //if (pattern != 0) {
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      //     printf("sizeof(hasMono) = %d\n", sizeof(hasMono));
00773      memset(hasMono, 0, sizeof(hasMono));
00774      bool hasStereo[SubstrMask + 1][LayerMask + 1];
00775      memset(hasStereo, 0, sizeof(hasStereo));
00776      // mark which layers have mono/stereo hits
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: // mono
00783                          hasMono[getSubStructure(pattern)][getLayer(pattern)] 
00784                               = true;
00785                          break;
00786                     case 1: // stereo
00787                          hasStereo[getSubStructure(pattern)][getLayer(pattern)]
00788                               = true;
00789                          break;
00790                     default:
00791                          break;
00792                     }
00793                }
00794           }
00795      }
00796      // count how many layers have mono and stereo hits
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   // crossed
00818   //   layer case 0: valid + (missing, off, bad) ==> with measurement
00819   //   layer case 1: missing + (off, bad) ==> without measurement
00820   //   layer case 2: off, bad ==> totally off or bad, cannot say much
00821   // not crossed
00822   //   layer case 999999: track outside acceptance or in gap ==> null
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; // 0,1,2,3
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   //    0:              neither a valid mono nor a valid stereo hit
00855   //    MONO:           valid mono hit
00856   //    STEREO:         valid stereo hit
00857   //    MONO | STEREO:  both
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; // 0,1,2,3
00866       if (hitType == 0) { // valid hit
00867            switch (getSide(pattern)) {
00868            case 0: // mono
00869                 monoStereo |= MONO;
00870                 break;
00871            case 1: // stereo
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