00001 #ifndef CalibTracker_SiStripConnectivity_SiStripRegionCabling_H 00002 #define CalibTracker_SiStripConnectivity_SiStripRegionCabling_H 00003 #define _USE_MATH_DEFINES 00004 00005 #include <boost/cstdint.hpp> 00006 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h" 00007 #include "DataFormats/SiStripDetId/interface/SiStripDetId.h" 00008 #include "DataFormats/Common/interface/RefGetter.h" 00009 #include "DataFormats/Common/interface/Handle.h" 00010 #include <vector> 00011 #include <map> 00012 #include <cmath> 00013 00024 class SiStripRegionCabling { 00025 00026 public: 00027 00029 enum SubDet {TIB = 0, TOB = 1, TID = 2, TEC = 3, ALLSUBDETS = 4}; 00030 enum Layer {TIBLAYERS = 4, TOBLAYERS = 6, TIDLAYERS = 3, TECLAYERS = 9, ALLLAYERS = 10}; 00031 00033 typedef std::map< uint32_t, std::vector<FedChannelConnection> > ElementCabling; 00034 typedef std::vector< ElementCabling > WedgeCabling; 00035 typedef std::vector< WedgeCabling > RegionCabling; 00036 typedef std::vector< RegionCabling > Cabling; 00037 00040 typedef std::pair<double,double> Position; 00041 typedef std::pair<uint32_t,uint32_t> PositionIndex; 00042 00045 typedef uint32_t ElementIndex; 00046 00047 SiStripRegionCabling(const uint32_t,const uint32_t, const double); 00048 00049 ~SiStripRegionCabling() {} 00050 00053 inline void setRegionCabling(const Cabling&); 00054 00055 inline const Cabling& getRegionCabling() const; 00056 00057 inline const uint32_t etadivisions() const; 00058 00059 inline const uint32_t phidivisions() const; 00060 00064 inline const std::pair<double,double> regionDimensions() const; 00065 00066 inline const Position position(const uint32_t) const; 00067 00068 inline const Position position(const PositionIndex) const; 00069 00070 inline const PositionIndex positionIndex(const uint32_t) const; 00071 00072 const PositionIndex positionIndex(const Position) const; 00073 00074 const uint32_t region(const Position) const; 00075 00076 inline const uint32_t region(const PositionIndex) const; 00077 00080 PositionIndex increment(const PositionIndex, int, int) const; 00081 00085 inline static const ElementIndex elementIndex(const uint32_t region, const SubDet, const uint32_t layer); 00086 00087 inline const ElementIndex elementIndex(const PositionIndex, const SubDet, const uint32_t layer) const; 00088 00089 inline const ElementIndex elementIndex(const Position, const SubDet, const uint32_t layer) const; 00090 00091 inline static const uint32_t layer(const ElementIndex); 00092 00093 inline static const SubDet subdet(const ElementIndex); 00094 00095 inline static const uint32_t region(const ElementIndex); 00096 00099 static const SubDet subdetFromDetId(const uint32_t detid); 00100 00101 static const uint32_t layerFromDetId(const uint32_t detid); 00102 00103 static const uint32_t physicalLayerFromDetId(const uint32_t detid); 00104 00105 static const uint32_t physicalLayer(const SubDet, const uint32_t layer); 00106 00110 template <class T> 00111 void updateSiStripRefGetter(edm::RefGetter<T>& refgetter, 00112 const edm::Handle< edm::LazyGetter<T> >& lazygetter, 00113 const ElementIndex) const; 00114 00115 template <class T> 00116 void updateSiStripRefGetter(edm::RefGetter<T>& refgetter, 00117 const edm::Handle< edm::LazyGetter<T> >& lazygetter, 00118 const Position position, 00119 const double deltaeta, 00120 const double deltaphi, 00121 const SubDet subdet, 00122 const uint32_t layer) const; 00123 00124 private: 00125 00126 SiStripRegionCabling() {;} 00127 00129 int etadivisions_; 00130 int phidivisions_; 00131 00133 double etamax_; 00134 00136 Cabling regioncabling_; 00137 }; 00138 00139 inline void SiStripRegionCabling::setRegionCabling(const Cabling& regioncabling) { 00140 regioncabling_ = regioncabling; 00141 } 00142 00143 inline const SiStripRegionCabling::Cabling& SiStripRegionCabling::getRegionCabling() const { 00144 return regioncabling_; 00145 } 00146 00147 inline const uint32_t SiStripRegionCabling::etadivisions() const { 00148 return static_cast<uint32_t>(etadivisions_); 00149 } 00150 00151 inline const uint32_t SiStripRegionCabling::phidivisions() const { 00152 return static_cast<uint32_t>(phidivisions_); 00153 } 00154 00155 inline const std::pair<double,double> SiStripRegionCabling::regionDimensions() const { 00156 return std::pair<double,double>((2.*etamax_)/etadivisions_,2.*M_PI/phidivisions_); 00157 } 00158 00159 inline const SiStripRegionCabling::Position SiStripRegionCabling::position(const uint32_t region) const { 00160 PositionIndex index = positionIndex(region); 00161 return position(index); 00162 } 00163 00164 inline const SiStripRegionCabling::Position SiStripRegionCabling::position(const PositionIndex index) const { 00165 return Position(regionDimensions().first*(index.first+.5) - etamax_, regionDimensions().second*(index.second+.5)- M_PI); 00166 } 00167 00168 inline const SiStripRegionCabling::PositionIndex SiStripRegionCabling::positionIndex(const uint32_t region) const { 00169 return PositionIndex(region/phidivisions_,region%phidivisions_); 00170 } 00171 00172 inline const uint32_t SiStripRegionCabling::region(const PositionIndex index) const { 00173 return index.first*phidivisions_ + index.second; 00174 } 00175 00176 inline const uint32_t SiStripRegionCabling::elementIndex(const uint32_t region, const SubDet subdet, const uint32_t layer) { 00177 return region*ALLSUBDETS*ALLLAYERS + subdet*ALLLAYERS + layer; 00178 } 00179 00180 inline const uint32_t SiStripRegionCabling::elementIndex(const PositionIndex index, const SubDet subdet, const uint32_t layer) const { 00181 return elementIndex(region(index),subdet,layer); 00182 } 00183 00184 inline const uint32_t SiStripRegionCabling::elementIndex(const Position position, const SubDet subdet, const uint32_t layer) const { 00185 return elementIndex(region(position),subdet,layer); 00186 } 00187 00188 inline const uint32_t SiStripRegionCabling::layer(const uint32_t index) { 00189 return index%ALLLAYERS; 00190 } 00191 00192 inline const SiStripRegionCabling::SubDet SiStripRegionCabling::subdet(const uint32_t index) { 00193 return static_cast<SiStripRegionCabling::SubDet>((index/ALLLAYERS)%ALLSUBDETS); 00194 } 00195 00196 inline const uint32_t SiStripRegionCabling::region(const uint32_t index) { 00197 return index/(ALLSUBDETS*ALLLAYERS); 00198 } 00199 00200 template <class T> 00201 void SiStripRegionCabling::updateSiStripRefGetter(edm::RefGetter<T>& refgetter, const edm::Handle< edm::LazyGetter<T> >& lazygetter, const uint32_t index) const { 00202 if (!refgetter.find(index)) refgetter.push_back(lazygetter,index); 00203 } 00204 00205 template <class T> 00206 void SiStripRegionCabling::updateSiStripRefGetter(edm::RefGetter<T>& refgetter, const edm::Handle< edm::LazyGetter<T> >& lazygetter, const SiStripRegionCabling::Position pos, const double deltaeta, const double deltaphi, const SubDet sub, const uint32_t layer) const { 00207 00208 PositionIndex index = positionIndex(pos); 00209 Position center = position(index); 00210 double offeta = pos.first-center.first; 00211 double offphi = pos.second-center.second; 00212 double toteta = deltaeta/regionDimensions().first; 00213 double totphi = deltaphi/regionDimensions().second; 00214 uint32_t plueta = static_cast<uint32_t>(offeta+.5+toteta); 00215 uint32_t pluphi = static_cast<uint32_t>(offphi+.5+totphi); 00216 uint32_t mineta = static_cast<uint32_t>(-offeta+.5+toteta); 00217 uint32_t minphi = static_cast<uint32_t>(-offphi+.5+totphi); 00218 00219 for (uint32_t i=0;i<mineta+plueta+1;i++) { 00220 for (uint32_t j=0;j<minphi+pluphi+1;j++) { 00221 const uint32_t k=elementIndex(increment(index,i-mineta,j-minphi),sub,layer); 00222 updateSiStripRefGetter<T>(refgetter,lazygetter,k); 00223 } 00224 } 00225 } 00226 00227 #endif