File indexing completed on 2023-03-17 10:42:07
0001 #ifndef CalibTracker_SiStripConnectivity_SiStripRegionCabling_H
0002 #define CalibTracker_SiStripConnectivity_SiStripRegionCabling_H
0003 #define _USE_MATH_DEFINES
0004
0005 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
0006 #include "DataFormats/Common/interface/Handle.h"
0007 #include <cmath>
0008 #include <map>
0009 #include <sstream>
0010 #include <vector>
0011 #include <cstdint>
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 class SiStripRegionCabling {
0024 public:
0025
0026 enum SubDet { TIB = 0, TOB = 1, TID = 2, TEC = 3, ALLSUBDETS = 4 };
0027 enum Layer { TIBLAYERS = 4, TOBLAYERS = 6, TIDLAYERS = 3, TECLAYERS = 9, ALLLAYERS = 10 };
0028
0029
0030 typedef std::pair<uint32_t, std::vector<FedChannelConnection>> Element;
0031 typedef std::vector<Element> ElementCabling;
0032 typedef std::vector<ElementCabling> WedgeCabling;
0033 typedef std::vector<WedgeCabling> RegionCabling;
0034 typedef std::vector<RegionCabling> Cabling;
0035
0036
0037
0038 typedef std::pair<double, double> Position;
0039 typedef std::pair<uint32_t, uint32_t> PositionIndex;
0040
0041
0042
0043 typedef uint32_t ElementIndex;
0044
0045 SiStripRegionCabling(const uint32_t, const uint32_t, const double);
0046
0047 ~SiStripRegionCabling() {}
0048
0049
0050
0051 inline void setRegionCabling(const Cabling &);
0052
0053 inline const Cabling &getRegionCabling() const;
0054
0055 inline const uint32_t etadivisions() const;
0056
0057 inline const uint32_t phidivisions() const;
0058
0059
0060
0061
0062 inline const std::pair<double, double> regionDimensions() const;
0063
0064 inline const Position position(const uint32_t) const;
0065
0066 inline const Position position(const PositionIndex) const;
0067
0068 inline const PositionIndex positionIndex(const uint32_t) const;
0069
0070 const PositionIndex positionIndex(const Position) const;
0071
0072 const uint32_t region(const Position) const;
0073
0074 inline const uint32_t region(const PositionIndex) const;
0075
0076
0077
0078 PositionIndex increment(const PositionIndex, int, int) const;
0079
0080
0081
0082
0083 inline static const ElementIndex elementIndex(const uint32_t region, const SubDet, const uint32_t layer);
0084
0085 inline const ElementIndex elementIndex(const PositionIndex, const SubDet, const uint32_t layer) const;
0086
0087 inline const ElementIndex elementIndex(const Position, const SubDet, const uint32_t layer) const;
0088
0089 inline static const uint32_t layer(const ElementIndex);
0090
0091 inline static const SubDet subdet(const ElementIndex);
0092
0093 inline static const uint32_t region(const ElementIndex);
0094
0095
0096
0097 static const SubDet subdetFromDetId(const uint32_t detid);
0098
0099
0100 void print(std::stringstream &) const;
0101
0102 private:
0103 SiStripRegionCabling() { ; }
0104
0105
0106 int etadivisions_;
0107 int phidivisions_;
0108
0109
0110 double etamax_;
0111
0112
0113 Cabling regioncabling_;
0114 };
0115
0116 inline void SiStripRegionCabling::setRegionCabling(const Cabling ®ioncabling) { regioncabling_ = regioncabling; }
0117
0118 inline const SiStripRegionCabling::Cabling &SiStripRegionCabling::getRegionCabling() const { return regioncabling_; }
0119
0120 inline const uint32_t SiStripRegionCabling::etadivisions() const { return static_cast<uint32_t>(etadivisions_); }
0121
0122 inline const uint32_t SiStripRegionCabling::phidivisions() const { return static_cast<uint32_t>(phidivisions_); }
0123
0124 inline const std::pair<double, double> SiStripRegionCabling::regionDimensions() const {
0125 return std::pair<double, double>((2. * etamax_) / etadivisions_, 2. * M_PI / phidivisions_);
0126 }
0127
0128 inline const SiStripRegionCabling::Position SiStripRegionCabling::position(const uint32_t region) const {
0129 PositionIndex index = positionIndex(region);
0130 return position(index);
0131 }
0132
0133 inline const SiStripRegionCabling::Position SiStripRegionCabling::position(const PositionIndex index) const {
0134 return Position(regionDimensions().first * (index.first + .5) - etamax_,
0135 regionDimensions().second * (index.second + .5) - M_PI);
0136 }
0137
0138 inline const SiStripRegionCabling::PositionIndex SiStripRegionCabling::positionIndex(const uint32_t region) const {
0139 return PositionIndex(region / phidivisions_, region % phidivisions_);
0140 }
0141
0142 inline const uint32_t SiStripRegionCabling::region(const PositionIndex index) const {
0143 return index.first * phidivisions_ + index.second;
0144 }
0145
0146 inline const uint32_t SiStripRegionCabling::elementIndex(const uint32_t region,
0147 const SubDet subdet,
0148 const uint32_t layer) {
0149 return region * ALLSUBDETS * ALLLAYERS + subdet * ALLLAYERS + layer;
0150 }
0151
0152 inline const uint32_t SiStripRegionCabling::elementIndex(const PositionIndex index,
0153 const SubDet subdet,
0154 const uint32_t layer) const {
0155 return elementIndex(region(index), subdet, layer);
0156 }
0157
0158 inline const uint32_t SiStripRegionCabling::elementIndex(const Position position,
0159 const SubDet subdet,
0160 const uint32_t layer) const {
0161 return elementIndex(region(position), subdet, layer);
0162 }
0163
0164 inline const uint32_t SiStripRegionCabling::layer(const uint32_t index) { return index % ALLLAYERS; }
0165
0166 inline const SiStripRegionCabling::SubDet SiStripRegionCabling::subdet(const uint32_t index) {
0167 return static_cast<SiStripRegionCabling::SubDet>((index / ALLLAYERS) % ALLSUBDETS);
0168 }
0169
0170 inline const uint32_t SiStripRegionCabling::region(const uint32_t index) { return index / (ALLSUBDETS * ALLLAYERS); }
0171
0172 #endif