Go to the documentation of this file.00001 #ifndef ECALDETID_EEDETID_H
00002 #define ECALDETID_EEDETID_H
00003
00004 #include <iosfwd>
00005 #include "DataFormats/DetId/interface/DetId.h"
00006 #include "DataFormats/EcalDetId/interface/EcalScDetId.h"
00007 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00008
00009
00016 class EEDetId : public DetId {
00017 public:
00018 enum {
00021 Subdet=EcalEndcap
00022 };
00023
00026 EEDetId() {}
00027
00031 EEDetId(uint32_t rawid) : DetId(rawid) {}
00032
00045
00046 EEDetId(int crystal_ix, int crystal_iy, int iz) :
00047 DetId( Ecal, EcalEndcap ) {
00048 id_|=(crystal_iy&0x7f)|((crystal_ix&0x7f)<<7)|((iz>0)?(0x4000):(0));
00049 }
00050
00051 EEDetId(int i, int j, int iz, int mode);
00052
00056 EEDetId(const DetId& id) : DetId(id){}
00057
00061 EEDetId& operator=(const DetId& id) {id_ = id.rawId(); return *this;}
00062
00066 static EcalSubdetector subdet() { return EcalEndcap;}
00067
00071 int zside() const { return (id_&0x4000)?(1):(-1); }
00072
00077 int ix() const { return (id_>>7)&0x7F; }
00078
00083 int iy() const { return id_&0x7F; }
00084
00089 EcalScDetId sc() const {
00090 const int scEdge = 5;
00091 return EcalScDetId(1+(ix()-1)/scEdge, 1+(iy()-1)/scEdge, zside());
00092 }
00093
00126 int isc() const ;
00127
00151 int ic() const;
00152
00169 int iquadrant() const ;
00170
00174 bool positiveZ() const { return id_&0x4000;}
00175
00176 int iPhiOuterRing() const ;
00177
00178 static EEDetId idOuterRing( int iPhi , int zEnd ) ;
00179
00183 int hashedIndex() const
00184 {
00185 const uint32_t jx ( ix() ) ;
00186 const uint32_t jd ( 2*( iy() - 1 ) + ( jx - 1 )/50 ) ;
00187 return ( ( positiveZ() ? kEEhalf : 0) + kdi[jd] + jx - kxf[jd] ) ;
00188 }
00189
00193 uint32_t denseIndex() const { return hashedIndex() ; }
00194
00197 EEDetId offsetBy( int nrStepsX, int nrStepsY ) const;
00198
00201 EEDetId switchZSide() const;
00202
00206 static DetId offsetBy( const DetId startId, int nrStepsX, int nrStepsY );
00207 static DetId switchZSide( const DetId startId );
00208
00214 static bool validDenseIndex( uint32_t din ) { return validHashIndex( din ) ; }
00215
00221 static EEDetId detIdFromDenseIndex( uint32_t din ) { return unhashIndex( din ) ; }
00222
00223 static bool isNextToBoundary( EEDetId id ) ;
00224
00225 static bool isNextToDBoundary( EEDetId id ) ;
00226
00227 static bool isNextToRingBoundary( EEDetId id ) ;
00228
00233 static EEDetId unhashIndex( int hi ) ;
00234
00240 static bool validHashIndex( int i ) { return ( i < kSizeForDenseIndexing ) ; }
00241
00249 static bool validDetId(int crystal_ix, int crystal_iy, int iz) {
00250 return
00251 crystal_ix >= IX_MIN && crystal_ix <= IX_MAX &&
00252 crystal_iy >= IY_MIN && crystal_iy <= IY_MAX &&
00253 std::abs(iz)==1 &&
00254 ( fastValidDetId(crystal_ix,crystal_iy) ||
00255 slowValidDetId(crystal_ix,crystal_iy) );
00256 }
00257 static bool slowValidDetId(int crystal_ix, int crystal_iy);
00258
00263 static bool fastValidDetId(int crystal_ix, int crystal_iy) {
00264 float x = crystal_ix; float y = crystal_iy;
00265 float r = (x - 50.5f) * (x - 50.5f) + (y - 50.5f) * (y - 50.5f);
00266 return r > 12.f * 12.f && r < 48.f * 48.f;
00267 }
00268
00274 static int distanceX(const EEDetId& a,const EEDetId& b);
00275
00281 static int distanceY(const EEDetId& a,const EEDetId& b);
00282
00283
00290 static int isc( int iscCol,
00291 int iscRow ) ;
00292
00295 static const int IX_MIN =1;
00296
00299 static const int IY_MIN =1;
00300
00303 static const int IX_MAX =100;
00304
00307 static const int IY_MAX =100;
00308
00311 static const int ISC_MIN=1;
00312
00315 static const int ICR_MIN=1;
00316
00321 static const int ISC_MAX=316;
00322
00325 static const int ICR_MAX=25;
00326
00327 enum {
00330 kEEhalf = 7324 ,
00334 kSizeForDenseIndexing = 2*kEEhalf
00335 };
00336
00340 static const int XYMODE = 0;
00341 static const int SCCRYSTALMODE = 1;
00344 private:
00345
00346 bool isOuterRing() const ;
00347
00348 static bool isOuterRingXY( int ax, int ay ) ;
00349
00350
00351
00352 static const int nCols = 10;
00353 static const int nCrys = 5;
00354 static const int QuadColLimits[nCols+1];
00355 static const int iYoffset[nCols+1];
00356
00357 static const unsigned short kxf[2*IY_MAX] ;
00358 static const unsigned short kdi[2*IY_MAX] ;
00359
00360 int ix( int iSC, int iCrys ) const;
00361 int iy( int iSC, int iCrys ) const;
00362 int ixQuadrantOne() const;
00363 int iyQuadrantOne() const;
00364 };
00365
00366
00367 std::ostream& operator<<(std::ostream& s,const EEDetId& id);
00368
00369 #endif