File indexing completed on 2023-03-17 10:53:56
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #ifndef CSCDQM_Detector_H
0020 #define CSCDQM_Detector_H
0021
0022 #include <cmath>
0023 #include <cfloat>
0024 #include <map>
0025 #include <vector>
0026 #include <iostream>
0027 #include <sstream>
0028 #include <iomanip>
0029
0030 #ifdef CSC_RENDER_PLUGIN
0031 #include "CSCDQM_Utility.h"
0032 #else
0033 #include "CSCDQM_Utility.h"
0034 #endif
0035
0036 namespace cscdqm {
0037
0038
0039
0040
0041
0042 #define N_SIDES 2
0043 #define N_STATIONS 4
0044 #define N_RINGS 3
0045 #define N_CHAMBERS 36
0046 #define N_LAYERS 6
0047 #define N_CFEBS 5
0048 #define N_HVS 5
0049
0050
0051 #define ADDR_SIZE 7
0052
0053
0054 #define N_ELEMENTS 9540
0055
0056
0057
0058
0059
0060
0061 #define PARTITION_INDEX(x, y) (x * partitions_y + y)
0062 #define PARTITION_STEP_X (5.0 / partitions_x)
0063 #define PARTITION_STEP_Y ((2.0 * 3.14159) / partitions_y)
0064
0065
0066
0067
0068 struct AddressMask {
0069 bool side;
0070 bool station;
0071 bool ring;
0072 bool chamber;
0073 bool layer;
0074 bool cfeb;
0075 bool hv;
0076 };
0077
0078
0079
0080
0081
0082 struct Address {
0083 unsigned int side;
0084 unsigned int station;
0085 unsigned int ring;
0086 unsigned int chamber;
0087 unsigned int layer;
0088 unsigned int cfeb;
0089 unsigned int hv;
0090
0091 AddressMask mask;
0092
0093 const bool operator==(const Address& a) const {
0094 if (mask.side == a.mask.side && mask.side == true && side != a.side)
0095 return false;
0096 if (mask.station == a.mask.station && mask.station == true && station != a.station)
0097 return false;
0098 if (mask.ring == a.mask.ring && mask.ring == true && ring != a.ring)
0099 return false;
0100 if (mask.chamber == a.mask.chamber && mask.chamber == true && chamber != a.chamber)
0101 return false;
0102 if (mask.layer == a.mask.layer && mask.layer == true && layer != a.layer)
0103 return false;
0104 if (mask.cfeb == a.mask.cfeb && mask.cfeb == true && cfeb != a.cfeb)
0105 return false;
0106 if (mask.hv == a.mask.hv && mask.hv == true && hv != a.hv)
0107 return false;
0108 return true;
0109 };
0110
0111 friend std::ostream& operator<<(std::ostream& out, const Address& adr) {
0112 out << adr.name();
0113 return out;
0114 }
0115
0116
0117
0118
0119
0120 const std::string name() const {
0121 std::ostringstream oss;
0122 oss << "CSC";
0123 if (mask.side) {
0124 oss << "_Side" << (side == 1 ? "Plus" : "Minus");
0125 if (mask.station) {
0126 oss << "_Station" << std::setfill('0') << std::setw(2) << station;
0127 if (mask.ring) {
0128 oss << "_Ring" << std::setfill('0') << std::setw(2) << ring;
0129 if (mask.chamber) {
0130 oss << "_Chamber" << std::setfill('0') << std::setw(2) << chamber;
0131 if (mask.layer) {
0132 oss << "_Layer" << std::setfill('0') << std::setw(2) << layer;
0133 if (mask.cfeb) {
0134 oss << "_CFEB" << std::setfill('0') << std::setw(2) << cfeb;
0135 if (mask.hv) {
0136 oss << "_HV" << std::setfill('0') << std::setw(2) << hv;
0137 }
0138 }
0139 }
0140 }
0141 }
0142 }
0143 }
0144 return oss.str();
0145 }
0146 };
0147
0148
0149
0150
0151 struct AddressBox {
0152 Address adr;
0153 float xmin;
0154 float xmax;
0155 float ymin;
0156 float ymax;
0157 };
0158
0159
0160 typedef std::map<const unsigned int, std::vector<unsigned int> > PartitionMap;
0161
0162
0163 typedef PartitionMap::iterator PartitionMapIterator;
0164
0165
0166
0167
0168
0169 class Detector {
0170 public:
0171 Detector(const unsigned int p_partitions_x = 0, const unsigned int p_partitions_y = 0);
0172
0173 const bool NextAddress(unsigned int& i, const Address*& adr, const Address& mask) const;
0174 const bool NextAddressBox(unsigned int& i, const AddressBox*& box, const Address& mask) const;
0175
0176 const bool NextAddressBoxByPartition(unsigned int& i,
0177 const unsigned int px,
0178 const unsigned int py,
0179 AddressBox*& box);
0180
0181 const float Area(const unsigned int station) const;
0182 const float Area(const Address& adr) const;
0183
0184 void PrintAddress(const Address& adr) const;
0185 const bool AddressFromString(const std::string& str_address, Address& adr) const;
0186
0187 const unsigned int NumberOfRings(const unsigned int station) const;
0188 const unsigned int NumberOfChambers(const unsigned int station, const unsigned int ring) const;
0189 const unsigned int NumberOfChamberCFEBs(const unsigned int station, const unsigned int ring) const;
0190 const unsigned int NumberOfChamberHVs(const unsigned int station, const unsigned int ring) const;
0191 unsigned int GlobalChamberIndex(unsigned int side,
0192 unsigned int station,
0193 unsigned int ring,
0194 unsigned int chamber) const;
0195
0196 private:
0197 const float Eta(const float r, const float z) const;
0198 const float EtaToX(const float eta) const;
0199 const float PhiToY(const float phi) const;
0200 const float Z(const int station, const int ring) const;
0201 const float RMinHV(const int station, const int ring, const int n_hv) const;
0202 const float RMaxHV(const int station, const int ring, const int n_hv) const;
0203 const float PhiMinCFEB(const int station, const int ring, const int chamber, const int cfeb) const;
0204 const float PhiMaxCFEB(const int station, const int ring, const int chamber, const int cfeb) const;
0205
0206
0207 AddressBox boxes[N_ELEMENTS];
0208
0209
0210 float station_area[N_STATIONS];
0211
0212
0213 unsigned int partitions_x;
0214
0215
0216 unsigned int partitions_y;
0217
0218
0219 PartitionMap partitions;
0220 };
0221
0222 }
0223
0224 #endif