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 }