00001 #ifndef ECALDETID_EEDETID_H
00002 #define ECALDETID_EEDETID_H
00003
00004 #include <ostream>
00005 #include "DataFormats/DetId/interface/DetId.h"
00006 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00007
00008
00017 class EEDetId : public DetId {
00018 public:
00019 enum { Subdet=EcalEndcap};
00021 EEDetId() {}
00023 EEDetId(uint32_t rawid) : DetId(rawid) {}
00026 EEDetId(int i, int j, int iz, int mode = XYMODE);
00028 EEDetId(const DetId& id);
00030 EEDetId& operator=(const DetId& id);
00031
00033
00034 static EcalSubdetector subdet() { return EcalEndcap;}
00035
00037 int zside() const { return (id_&0x4000)?(1):(-1); }
00039 int ix() const { return (id_>>7)&0x7F; }
00041 int iy() const { return id_&0x7F; }
00043 int isc() const;
00045 int ic() const;
00047 int iquadrant() const ;
00048
00049 bool positiveZ() const { return id_&0x4000;}
00050
00051 int iPhiOuterRing() const ;
00052
00053 static EEDetId idOuterRing( int iPhi , int zEnd ) ;
00054
00056 int hashedIndex() const
00057 {
00058 return ( iy() - nBegin[ ix() - 1 ] +
00059 nIntegral[ ix() - 1 ] +
00060 ( positiveZ() ? ICR_FEE : 0 ) ) ;
00061 }
00062
00063 static bool isNextToBoundary( EEDetId id ) ;
00064
00065 static bool isNextToDBoundary( EEDetId id ) ;
00066
00067 static bool isNextToRingBoundary( EEDetId id ) ;
00068
00070 static EEDetId unhashIndex( int hi ) ;
00071
00073 static bool validHashIndex( int i ) ;
00074
00076 static bool validDetId( int i, int j, int iz ) ;
00077
00078 static const int IX_MIN =1;
00079 static const int IY_MIN =1;
00080 static const int IX_MAX =100;
00081 static const int IY_MAX =100;
00082 static const int ISC_MIN=1;
00083 static const int ICR_MIN=1;
00084 static const int ISC_MAX=316;
00085 static const int ICR_MAX=25;
00086
00087
00088 static const int ICR_FD =3870;
00089 static const int ICR_FEE =7740;
00090 static const int SIZE_HASH=2*ICR_FEE;
00091 static const int MIN_HASH = 0;
00092 static const int MAX_HASH = 2*ICR_FEE-1;
00093
00094
00095
00096 static const int XYMODE = 0;
00097 static const int SCCRYSTALMODE = 1;
00098
00099 private:
00100
00101 bool isOuterRing() const ;
00102
00103 static bool isOuterRingXY( int ax, int ay ) ;
00104
00105
00106
00107 static const int nCols = 10;
00108 static const int nCrys = 5;
00109 static const int QuadColLimits[nCols+1];
00110 static const int iYoffset[nCols+1];
00111
00112 static const int nBegin[IX_MAX];
00113 static const int nIntegral[IX_MAX];
00114
00115 int ix( int iSC, int iCrys ) const;
00116 int iy( int iSC, int iCrys ) const;
00117 int ixQuadrantOne() const;
00118 int iyQuadrantOne() const;
00119 };
00120
00121 std::ostream& operator<<(std::ostream& s,const EEDetId& id);
00122
00123 #endif