CMS 3D CMS Logo

SiStripRegionCabling.h

Go to the documentation of this file.
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

Generated on Tue Jun 9 17:25:26 2009 for CMSSW by  doxygen 1.5.4