CMS 3D CMS Logo

CSCDQM_Detector.h
Go to the documentation of this file.
1 /*
2  * =====================================================================================
3  *
4  * Filename: CSCDQM_Detector.h
5  *
6  * Description: CSC detector functions.
7  *
8  * Version: 1.0
9  * Created: 05/19/2008 10:52:21 AM
10  * Revision: none
11  * Compiler: gcc
12  *
13  * Author: Valdas Rapsevicius (VR), Valdas.Rapsevicius@cern.ch
14  * Company: CERN, CH
15  *
16  * =====================================================================================
17  */
18 
19 #ifndef CSCDQM_Detector_H
20 #define CSCDQM_Detector_H
21 
22 #include <cmath>
23 #include <cfloat>
24 #include <map>
25 #include <vector>
26 #include <iostream>
27 #include <sstream>
28 #include <iomanip>
29 
30 #ifdef CSC_RENDER_PLUGIN
31 #include "CSCDQM_Utility.h"
32 #else
33 #include "CSCDQM_Utility.h"
34 #endif
35 
36 namespace cscdqm {
37 
42 #define N_SIDES 2
43 #define N_STATIONS 4
44 #define N_RINGS 3
45 #define N_CHAMBERS 36
46 #define N_LAYERS 6
47 #define N_CFEBS 5
48 #define N_HVS 5
49 
51 #define ADDR_SIZE 7
52 
54 #define N_ELEMENTS 9540
55  //(7740 + 1800)
56 
61 #define PARTITION_INDEX(x, y) (x * partitions_y + y)
62 #define PARTITION_STEP_X (5.0 / partitions_x)
63 #define PARTITION_STEP_Y ((2.0 * 3.14159) / partitions_y)
64 
68  struct AddressMask {
69  bool side;
70  bool station;
71  bool ring;
72  bool chamber;
73  bool layer;
74  bool cfeb;
75  bool hv;
76  };
77 
82  struct Address {
83  unsigned int side;
84  unsigned int station;
85  unsigned int ring;
86  unsigned int chamber;
87  unsigned int layer;
88  unsigned int cfeb;
89  unsigned int hv;
90 
92 
93  const bool operator==(const Address& a) const {
94  if (mask.side == a.mask.side && mask.side == true && side != a.side)
95  return false;
96  if (mask.station == a.mask.station && mask.station == true && station != a.station)
97  return false;
98  if (mask.ring == a.mask.ring && mask.ring == true && ring != a.ring)
99  return false;
100  if (mask.chamber == a.mask.chamber && mask.chamber == true && chamber != a.chamber)
101  return false;
102  if (mask.layer == a.mask.layer && mask.layer == true && layer != a.layer)
103  return false;
104  if (mask.cfeb == a.mask.cfeb && mask.cfeb == true && cfeb != a.cfeb)
105  return false;
106  if (mask.hv == a.mask.hv && mask.hv == true && hv != a.hv)
107  return false;
108  return true;
109  };
110 
111  friend std::ostream& operator<<(std::ostream& out, const Address& adr) {
112  out << adr.name();
113  return out;
114  }
115 
120  const std::string name() const {
121  std::ostringstream oss;
122  oss << "CSC";
123  if (mask.side) {
124  oss << "_Side" << (side == 1 ? "Plus" : "Minus");
125  if (mask.station) {
126  oss << "_Station" << std::setfill('0') << std::setw(2) << station;
127  if (mask.ring) {
128  oss << "_Ring" << std::setfill('0') << std::setw(2) << ring;
129  if (mask.chamber) {
130  oss << "_Chamber" << std::setfill('0') << std::setw(2) << chamber;
131  if (mask.layer) {
132  oss << "_Layer" << std::setfill('0') << std::setw(2) << layer;
133  if (mask.cfeb) {
134  oss << "_CFEB" << std::setfill('0') << std::setw(2) << cfeb;
135  if (mask.hv) {
136  oss << "_HV" << std::setfill('0') << std::setw(2) << hv;
137  }
138  }
139  }
140  }
141  }
142  }
143  }
144  return oss.str();
145  }
146  };
147 
151  struct AddressBox {
153  float xmin;
154  float xmax;
155  float ymin;
156  float ymax;
157  };
158 
160  typedef std::map<const unsigned int, std::vector<unsigned int> > PartitionMap;
161 
163  typedef PartitionMap::iterator PartitionMapIterator;
164 
169  class Detector {
170  public:
171  Detector(const unsigned int p_partitions_x = 0, const unsigned int p_partitions_y = 0);
172 
173  const bool NextAddress(unsigned int& i, const Address*& adr, const Address& mask) const;
174  const bool NextAddressBox(unsigned int& i, const AddressBox*& box, const Address& mask) const;
175  //const bool NextAddressBoxByPartition(unsigned int& i, unsigned int& px, unsigned int& py, const AddressBox*& box, const Address& mask, const float xmin, const float xmax, const float ymin, const float ymax);
176  const bool NextAddressBoxByPartition(unsigned int& i,
177  const unsigned int px,
178  const unsigned int py,
179  AddressBox*& box);
180 
181  const float Area(const unsigned int station) const;
182  const float Area(const Address& adr) const;
183 
184  void PrintAddress(const Address& adr) const;
185  const bool AddressFromString(const std::string& str_address, Address& adr) const;
186 
187  const unsigned int NumberOfRings(const unsigned int station) const;
188  const unsigned int NumberOfChambers(const unsigned int station, const unsigned int ring) const;
189  const unsigned int NumberOfChamberCFEBs(const unsigned int station, const unsigned int ring) const;
190  const unsigned int NumberOfChamberHVs(const unsigned int station, const unsigned int ring) const;
191  unsigned int GlobalChamberIndex(unsigned int side,
192  unsigned int station,
193  unsigned int ring,
194  unsigned int chamber) const;
195 
196  private:
197  const float Eta(const float r, const float z) const;
198  const float EtaToX(const float eta) const;
199  const float PhiToY(const float phi) const;
200  const float Z(const int station, const int ring) const;
201  const float RMinHV(const int station, const int ring, const int n_hv) const;
202  const float RMaxHV(const int station, const int ring, const int n_hv) const;
203  const float PhiMinCFEB(const int station, const int ring, const int chamber, const int cfeb) const;
204  const float PhiMaxCFEB(const int station, const int ring, const int chamber, const int cfeb) const;
205 
208 
210  float station_area[N_STATIONS];
211 
213  unsigned int partitions_x;
214 
216  unsigned int partitions_y;
217 
219  PartitionMap partitions;
220  };
221 
222 } // namespace cscdqm
223 
224 #endif
PartitionMap partitions
Detector geometry and addressing related imformation and routines.
unsigned int partitions_y
unsigned int layer
PartitionMap::iterator PartitionMapIterator
friend std::ostream & operator<<(std::ostream &out, const Address &adr)
unsigned int partitions_x
Area covered by Address in eta/phy space.
std::map< const unsigned int, std::vector< unsigned int > > PartitionMap
Mask of the address which is used to switch on and off appropriate Address fields.
unsigned int cfeb
const bool operator==(const Address &a) const
unsigned int chamber
#define N_ELEMENTS
unsigned int hv
unsigned int station
const std::string name() const
Get the full name of the address prefixed with CSC_. It is being used by summaryReportContent variabl...
#define N_STATIONS
double a
Definition: hdecay.h:119
AddressMask mask
unsigned int side
Structure to store detector addresses of any granularity: from whole detector to the single HV elemen...
unsigned int ring