CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_13_patch3/src/DataFormats/CaloTowers/src/CaloTowerDetId.cc

Go to the documentation of this file.
00001 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00002 #include "FWCore/Utilities/interface/Exception.h"
00003 #include <iostream>
00004 
00005 CaloTowerDetId::CaloTowerDetId() : DetId() {
00006 }
00007   
00008 CaloTowerDetId::CaloTowerDetId(uint32_t rawid) : DetId(rawid&0xFFF0FFFFu) {
00009   
00010 }
00011   
00012 CaloTowerDetId::CaloTowerDetId(int ieta, int iphi) : DetId(Calo,SubdetId) {
00013   id_|= 
00014     ((ieta>0)?(0x2000|((ieta&0x3F)<<7)):(((-ieta)&0x3f)<<7)) |
00015     (iphi&0x7F);
00016 }
00017   
00018 CaloTowerDetId::CaloTowerDetId(const DetId& gen) {
00019   if (!gen.null() && (gen.det()!=Calo || gen.subdetId()!=SubdetId)) {
00020     throw cms::Exception("Invalid DetId") << "Cannot initialize CaloTowerDetId from " << std::hex << gen.rawId() << std::dec;
00021   }
00022   id_=gen.rawId(); 
00023 }
00024   
00025 CaloTowerDetId& CaloTowerDetId::operator=(const DetId& gen) {
00026   if (!gen.null() && (gen.det()!=Calo || gen.subdetId()!=SubdetId)) {
00027     throw cms::Exception("Invalid DetId") << "Cannot assign CaloTowerDetId from " << std::hex << gen.rawId() << std::dec;
00028   }
00029   id_=gen.rawId();
00030   return *this;
00031 }
00032 
00033 int CaloTowerDetId::iphi() const {
00034   int retval=id_&0x7F;
00035   return retval;
00036 }  
00037 
00038 bool 
00039 CaloTowerDetId::validDetId( int ie , int ip ) 
00040 {
00041    const int ia ( abs( ie ) ) ;
00042    return ( ( ia >= 1 )        &&
00043             ( ip >= 1 )        &&
00044             ( ia <= kMaxIEta ) &&
00045             ( ip <= kMaxIPhi ) &&
00046             ( ( ( ia <= kBarIEta ) &&
00047                 ( ip <= kBarNPhi )    ) ||
00048              ( ( ia >  kBarIEta ) &&
00049                 ( ia <= kEndIEta ) &&
00050                 ( (ip-1)%2 == 0  )    ) ||
00051               ( ( ia >  kEndIEta ) &&
00052                 ( ia <= kForIEta ) &&
00053                 ( (ip-3)%4 == 0 )    )    )  ) ;
00054 }
00055 
00056 uint32_t 
00057 CaloTowerDetId::denseIndex() const 
00058 {
00059    const uint32_t ie ( ietaAbs()     ) ;
00060    const uint32_t ip ( iphi()    - 1 ) ;
00061    
00062    return ( ( 0 > zside() ? 0 : kAllNTot ) +
00063             ( ( kBarIEta >= ie ? ( ie - 1 )*kBarNPhi + ip :
00064                 ( kEndIEta >= ie ?  kBarNTot + ( ie - 1 - kBarIEta )*kEndNPhi + ip/2 :
00065                   kBarNTot + kEndNTot + ( ie - 1 - kEndIEta )*kForNPhi + ip/4 ) ) ) ) ;
00066 }
00067 
00068 CaloTowerDetId 
00069 CaloTowerDetId::detIdFromDenseIndex( uint32_t din ) 
00070 {
00071    const int iz ( din < kAllNTot ? -1 : 1 ) ;
00072    din %= kAllNTot ;
00073    const uint32_t ie ( ( kBarNTot + kEndNTot ) - 1 < din ?
00074                        kEndIEta + ( din - kBarNTot - kEndNTot )/kForNPhi + 1 :
00075                        ( kBarNTot - 1 < din ?
00076                          kBarIEta + ( din - kBarNTot )/kEndNPhi + 1 :
00077                          din/kBarNPhi + 1 ) ) ;
00078 
00079    const uint32_t ip ( ( kBarNTot + kEndNTot ) - 1 < din ?
00080                        ( ( din - kBarNTot - kEndNTot )%kForNPhi )*4 + 3 :
00081                        ( kBarNTot - 1 < din ?
00082                          ( ( din - kBarNTot )%kEndNPhi )*2 + 1 :
00083                          din%kBarNPhi + 1 ) ) ;
00084 
00085    return ( validDenseIndex( din ) ? CaloTowerDetId( iz*ie, ip ) : CaloTowerDetId() ) ;
00086 }
00087 
00088 std::ostream& operator<<(std::ostream& s, const CaloTowerDetId& id) {
00089   return s << "Tower (" << id.ieta() << "," << id.iphi() << ")";
00090 }