CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC4_patch1/src/DataFormats/EcalDetId/interface/EEDetId.h

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   // fast  
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   // slow
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 ; // 1-360 else==0 if not on outer ring!
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,   // output is 1-316
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   //Functions from B. Kennedy to retrieve ix and iy from SC and Crystal number
00351   
00352   static const int nCols = 10;
00353   static const int nCrys = 5; /* Number of crystals per row in SC */
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