Go to the documentation of this file.00001 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00002 #include "FWCore/Utilities/interface/Exception.h"
00003 #include <ostream>
00004
00005 const HcalDetId HcalDetId::Undefined(HcalEmpty,0,0,0);
00006
00007 HcalDetId::HcalDetId() : DetId() {
00008 }
00009
00010 HcalDetId::HcalDetId(uint32_t rawid) : DetId(rawid) {
00011 }
00012
00013 HcalDetId::HcalDetId(HcalSubdetector subdet, int tower_ieta, int tower_iphi, int depth) : DetId(Hcal,subdet) {
00014
00015 id_ |= ((depth&0x1F)<<14) |
00016 ((tower_ieta>0)?(0x2000|(tower_ieta<<7)):((-tower_ieta)<<7)) |
00017 (tower_iphi&0x7F);
00018 }
00019
00020 HcalDetId::HcalDetId(const DetId& gen) {
00021 if (!gen.null()) {
00022 HcalSubdetector subdet=(HcalSubdetector(gen.subdetId()));
00023 if (gen.det()!=Hcal ||
00024 (subdet!=HcalBarrel && subdet!=HcalEndcap &&
00025 subdet!=HcalOuter && subdet!=HcalForward ))
00026 {
00027 throw cms::Exception("Invalid DetId") << "Cannot initialize HcalDetId from " << std::hex << gen.rawId() << std::dec;
00028 }
00029 }
00030 id_=gen.rawId();
00031 }
00032
00033 HcalDetId& HcalDetId::operator=(const DetId& gen) {
00034 if (!gen.null()) {
00035 HcalSubdetector subdet=(HcalSubdetector(gen.subdetId()));
00036 if (gen.det()!=Hcal ||
00037 (subdet!=HcalBarrel && subdet!=HcalEndcap &&
00038 subdet!=HcalOuter && subdet!=HcalForward ))
00039 {
00040 throw cms::Exception("Invalid DetId") << "Cannot assign HcalDetId from " << std::hex << gen.rawId() << std::dec;
00041 }
00042 }
00043 id_=gen.rawId();
00044 return (*this);
00045 }
00046
00047 int HcalDetId::crystal_iphi_low() const {
00048 int simple_iphi=((iphi()-1)*5)+1;
00049 simple_iphi+=10;
00050 return ((simple_iphi>360)?(simple_iphi-360):(simple_iphi));
00051 }
00052
00053 int HcalDetId::crystal_iphi_high() const {
00054 int simple_iphi=((iphi()-1)*5)+5;
00055 simple_iphi+=10;
00056 return ((simple_iphi>360)?(simple_iphi-360):(simple_iphi));
00057 }
00058
00059 std::ostream& operator<<(std::ostream& s,const HcalDetId& id) {
00060 switch (id.subdet()) {
00061 case(HcalBarrel) : return s << "(HB " << id.ieta() << ',' << id.iphi() << ',' << id.depth() << ')';
00062 case(HcalEndcap) : return s << "(HE " << id.ieta() << ',' << id.iphi() << ',' << id.depth() << ')';
00063 case(HcalForward) : return s << "(HF " << id.ieta() << ',' << id.iphi() << ',' << id.depth() << ')';
00064 case(HcalOuter) : return s << "(HO " << id.ieta() << ',' << id.iphi() << ')';
00065 default : return s << id.rawId();
00066 }
00067 }
00068
00069 bool
00070 HcalDetId::validDetId( HcalSubdetector sd,
00071 int ies,
00072 int ip,
00073 int dp )
00074 {
00075 const int ie ( abs( ies ) ) ;
00076
00077 return ( ( ip >= 1 ) &&
00078 ( ip <= 72 ) &&
00079 ( dp >= 1 ) &&
00080 ( ie >= 1 ) &&
00081 ( ( ( sd == HcalBarrel ) &&
00082 ( ( ( ie <= 14 ) &&
00083 ( dp == 1 ) ) ||
00084 ( ( ( ie == 15 ) || ( ie == 16 ) ) &&
00085 ( dp <= 2 ) ) ) ) ||
00086 ( ( sd == HcalEndcap ) &&
00087 ( ( ( ie == 16 ) &&
00088 ( dp == 3 ) ) ||
00089 ( ( ie == 17 ) &&
00090 ( dp == 1 ) ) ||
00091 ( ( ie >= 18 ) &&
00092 ( ie <= 20 ) &&
00093 ( dp <= 2 ) ) ||
00094 ( ( ie >= 21 ) &&
00095 ( ie <= 26 ) &&
00096 ( dp <= 2 ) &&
00097 ( ip%2 == 1 ) ) ||
00098 ( ( ie >= 27 ) &&
00099 ( ie <= 28 ) &&
00100 ( dp <= 3 ) &&
00101 ( ip%2 == 1 ) ) ||
00102 ( ( ie == 29 ) &&
00103 ( dp <= 2 ) &&
00104 ( ip%2 == 1 ) ) ) ) ||
00105 ( ( sd == HcalOuter ) &&
00106 ( ie <= 15 ) &&
00107 ( dp == 4 ) ) ||
00108 ( ( sd == HcalForward ) &&
00109 ( dp <= 2 ) &&
00110 ( ( ( ie >= 29 ) &&
00111 ( ie <= 39 ) &&
00112 ( ip%2 == 1 ) ) ||
00113 ( ( ie >= 40 ) &&
00114 ( ie <= 41 ) &&
00115 ( ip%4 == 3 ) ) ) ) ) ) ;
00116 }
00117
00118 int
00119 HcalDetId::hashed_index() const
00120 {
00121 const HcalSubdetector sd ( subdet() ) ;
00122 const int ip ( iphi() ) ;
00123 const int ie ( ietaAbs() ) ;
00124 const int dp ( depth() ) ;
00125 const int zn ( zside() < 0 ? 1 : 0 ) ;
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 return ( ( sd == HcalBarrel ) ?
00138 ( ip - 1 )*18 + dp - 1 + ie - ( ie<16 ? 1 : 0 ) + zn*kHBhalf :
00139 ( ( sd == HcalEndcap ) ?
00140 2*kHBhalf + ( ip - 1 )*8 + ( ip/2 )*20 +
00141 ( ( ie==16 || ie==17 ) ? ie - 16 :
00142 ( ( ie>=18 && ie<=20 ) ? 2 + 2*( ie - 18 ) + dp - 1 :
00143 ( ( ie>=21 && ie<=26 ) ? 8 + 2*( ie - 21 ) + dp - 1 :
00144 ( ( ie>=27 && ie<=28 ) ? 20 + 3*( ie - 27 ) + dp - 1 :
00145 26 + 2*( ie - 29 ) + dp - 1 ) ) ) ) + zn*kHEhalf :
00146 ( ( sd == HcalOuter ) ?
00147 2*kHBhalf + 2*kHEhalf + ( ip - 1 )*15 + ( ie - 1 ) + zn*kHOhalf :
00148 ( ( sd == HcalForward ) ?
00149 2*kHBhalf + 2*kHEhalf + 2*kHOhalf +
00150 ( ( ip - 1 )/4 )*4 + ( ( ip - 1 )/2 )*22 +
00151 2*( ie - 29 ) + ( dp - 1 ) + zn*kHFhalf : -1 ) ) ) ) ;
00152 }
00153
00154 HcalDetId
00155 HcalDetId::detIdFromDenseIndex( uint32_t di )
00156 {
00157 if( validDenseIndex( di ) )
00158 {
00159 HcalSubdetector sd ( HcalBarrel ) ;
00160 int ie ( 0 ) ;
00161 int ip ( 0 ) ;
00162 int dp ( 0 ) ;
00163 int in ( di ) ;
00164 int iz ( 1 ) ;
00165 if( in > 2*( kHBhalf + kHEhalf + kHOhalf ) - 1 )
00166 {
00167 sd = HcalForward ;
00168 in -= 2*( kHBhalf + kHEhalf + kHOhalf ) ;
00169 iz = ( in<kHFhalf ? 1 : -1 ) ;
00170 in %= kHFhalf ;
00171 ip = 4*( in/48 ) ;
00172 in %= 48 ;
00173 ip += 1 + ( in>21 ? 2 : 0 ) ;
00174 if( 3 == ip%4 ) in -= 22 ;
00175 ie = 29 + in/2 ;
00176 dp = 1 + in%2 ;
00177 }
00178 else
00179 {
00180 if( in > 2*( kHBhalf + kHEhalf ) - 1 )
00181 {
00182 sd = HcalOuter ;
00183 in -= 2*( kHBhalf + kHEhalf ) ;
00184 iz = ( in<kHOhalf ? 1 : -1 ) ;
00185 in %= kHOhalf ;
00186 dp = 4 ;
00187 ip = 1 + in/15 ;
00188 ie = 1 + ( in - 15*( ip - 1 ) ) ;
00189 }
00190 else
00191 {
00192 if( in > 2*kHBhalf - 1 )
00193 {
00194 sd = HcalEndcap ;
00195 in -= 2*kHBhalf ;
00196 iz = ( in<kHEhalf ? 1 : -1 ) ;
00197 in %= kHEhalf ;
00198 ip = 2*( in/36 ) ;
00199 in %= 36 ;
00200 ip += 1 + in/28 ;
00201 if( 0 == ip%2 ) in %= 28 ;
00202 ie = 15 + ( in<2 ? 1 + in : 2 +
00203 ( in<20 ? 1 + ( in - 2 )/2 : 9 +
00204 ( in<26 ? 1 + ( in - 20 )/3 : 3 ) ) ) ;
00205 dp = ( in<1 ? 3 :
00206 ( in<2 ? 1 :
00207 ( in<20 ? 1 + ( in - 2 )%2 :
00208 ( in<26 ? 1 + ( in - 20 )%3 :
00209 ( 1 + ( in - 26 )%2 ) ) ) ) ) ;
00210 }
00211 else
00212 {
00213 iz = ( di<kHBhalf ? 1 : -1 ) ;
00214 in %= kHBhalf ;
00215 ip = in/18 + 1 ;
00216 in %= 18 ;
00217 if( in < 14 )
00218 {
00219 dp = 1 ;
00220 ie = in + 1 ;
00221 }
00222 else
00223 {
00224 in %= 14 ;
00225 dp = 1 + in%2 ;
00226 ie = 15 + in/2 ;
00227 }
00228 }
00229 }
00230 }
00231 return HcalDetId( sd, iz*int(ie), ip, dp ) ;
00232 }
00233 else
00234 {
00235 return HcalDetId() ;
00236 }
00237 }