CMS 3D CMS Logo

ZdcTopology.cc
Go to the documentation of this file.
4 #include <cmath>
5 #include <iostream>
6 #include <algorithm>
7 
9  : excludeEM_(false),
10  excludeHAD_(false),
11  excludeLUM_(false),
12  excludeRPD_(false),
13  excludeZP_(false),
14  excludeZN_(false),
15  firstEMModule_(1),
16  lastEMModule_(HcalZDCDetId::kDepEM),
17  firstHADModule_(1),
18  lastHADModule_(HcalZDCDetId::kDepHAD),
19  firstLUMModule_(1),
20  lastLUMModule_(HcalZDCDetId::kDepLUM),
21  firstRPDModule_(1),
22  lastRPDModule_(HcalZDCDetId::kDepRPD) {}
23 
24 bool ZdcTopology::valid(const HcalZDCDetId& id) const {
25  // check the raw rules
26  bool ok = validRaw(id);
27  ok = ok && !isExcluded(id);
28  return ok;
29 }
30 
31 bool ZdcTopology::isExcluded(const HcalZDCDetId& id) const {
32  bool exed = false;
33 
34  // check for section exclutions
35  switch (id.section()) {
36  case (HcalZDCDetId::EM):
37  exed = excludeEM_;
38  break;
39  case (HcalZDCDetId::HAD):
40  exed = excludeHAD_;
41  break;
42  case (HcalZDCDetId::LUM):
43  exed = excludeLUM_;
44  break;
45  case (HcalZDCDetId::RPD):
46  exed = excludeRPD_;
47  break;
48  default:
49  exed = false;
50  }
51 
52  // check the entire list
53  if (!exed && !exclusionList_.empty()) {
54  std::vector<HcalZDCDetId>::const_iterator i = std::lower_bound(exclusionList_.begin(), exclusionList_.end(), id);
55  if (i != exclusionList_.end() && *i == id)
56  exed = true;
57  }
58  return exed;
59 }
60 
62  std::vector<HcalZDCDetId>::iterator i = std::lower_bound(exclusionList_.begin(), exclusionList_.end(), id);
63  if (i == exclusionList_.end() || *i != id) {
64  exclusionList_.insert(i, id);
65  }
66 }
67 
69  switch (zside) {
70  case (1):
71  excludeZP_ = true;
72  break;
73  case (-1):
74  excludeZN_ = true;
75  break;
76  default:
77  break;
78  }
79 }
80 
82  switch (zside) {
83  case (1):
84  excludeZP_ = true;
85  break;
86  case (-1):
87  excludeZN_ = true;
88  break;
89  default:
90  break;
91  }
92  switch (section) {
93  case (HcalZDCDetId::EM):
94  excludeEM_ = true;
95  break;
96  case (HcalZDCDetId::HAD):
97  excludeHAD_ = true;
98  break;
99  case (HcalZDCDetId::LUM):
100  excludeLUM_ = true;
101  break;
102  case (HcalZDCDetId::RPD):
103  excludeRPD_ = true;
104  break;
105  default:
106  break;
107  }
108 }
109 
111  bool exed = false;
112  switch (zside) {
113  case (1):
114  exed = excludeZP_;
115  break;
116  case (-1):
117  exed = excludeZN_;
118  break;
119  default:
120  exed = false;
121  }
122  if (exed)
123  return 0;
124 
125  switch (section) {
126  case (HcalZDCDetId::EM):
127  exed = excludeEM_;
128  break;
129  case (HcalZDCDetId::HAD):
130  exed = excludeHAD_;
131  break;
132  case (HcalZDCDetId::LUM):
133  exed = excludeLUM_;
134  break;
135  case (HcalZDCDetId::RPD):
136  exed = excludeRPD_;
137  break;
138  default:
139  exed = false;
140  }
141  if (exed)
142  return 0;
143 
144  bool isPositive = false;
145  if (zside == 1)
146  isPositive = true;
147 
148  int n = 0;
149  for (int ich = ich1; ich < ich2; ich++) {
150  HcalZDCDetId id(section, isPositive, ich);
151  if (validRaw(id))
152  exclude(id);
153  n++;
154  }
155  return n;
156 }
157 
158 bool ZdcTopology::validRaw(const HcalZDCDetId& id) const {
159  bool ok = true;
160  if (abs(id.zside()) != 1)
161  ok = false;
162  else if (id.channel() <= 0)
163  ok = false;
164  else if (!(id.section() == HcalZDCDetId::EM || id.section() == HcalZDCDetId::HAD ||
165  id.section() == HcalZDCDetId::LUM))
166  //else if (!(id.section() == HcalZDCDetId::EM || id.section() == HcalZDCDetId::HAD || id.section()== HcalZDCDetId::LUM || id.section()== HcalZDCDetId::RPD))
167  ok = false;
168  else if (id.section() == HcalZDCDetId::EM && id.channel() > HcalZDCDetId::kDepEM)
169  ok = false;
170  else if (id.section() == HcalZDCDetId::HAD && id.channel() > HcalZDCDetId::kDepHAD)
171  ok = false;
172  else if (id.section() == HcalZDCDetId::LUM && id.channel() > HcalZDCDetId::kDepLUM)
173  ok = false;
174  else if (id.section() == HcalZDCDetId::RPD && id.channel() > HcalZDCDetId::kDepRPD)
175  ok = false;
176  return ok;
177 }
178 
179 std::vector<DetId> ZdcTopology::transverse(const DetId& id) const {
180  std::vector<DetId> vNeighborsDetId;
181  HcalZDCDetId zdcId = HcalZDCDetId(id);
182  HcalZDCDetId zdcDetId;
183  if (validRaw(zdcId) && zdcId.section() == HcalZDCDetId::EM) {
184  bool isPositive = false;
185  if (zdcId.zside() == 1)
186  isPositive = true;
187  if (zdcId.channel() == 1) {
188  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() + 1);
189  vNeighborsDetId.emplace_back(zdcDetId.rawId());
190  return vNeighborsDetId;
191  }
192  if (zdcId.channel() == HcalZDCDetId::kDepEM) {
193  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() - 1);
194  vNeighborsDetId.emplace_back(zdcDetId.rawId());
195  return vNeighborsDetId;
196  }
197  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() - 1);
198  vNeighborsDetId.emplace_back(zdcDetId.rawId());
199  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() + 1);
200  vNeighborsDetId.emplace_back(zdcDetId.rawId());
201  }
202  return vNeighborsDetId;
203 }
204 
205 std::vector<DetId> ZdcTopology::longitudinal(const DetId& id) const {
206  std::vector<DetId> vNeighborsDetId;
207  HcalZDCDetId zdcId = HcalZDCDetId(id);
208  HcalZDCDetId zdcDetId;
209  if (validRaw(zdcId) && zdcId.section() == HcalZDCDetId::HAD) {
210  bool isPositive = false;
211  if (zdcId.zside() == 1)
212  isPositive = true;
213  if (zdcId.channel() == 1) {
214  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() + 1);
215  vNeighborsDetId.emplace_back(zdcDetId.rawId());
216  return vNeighborsDetId;
217  }
218  if (zdcId.channel() == HcalZDCDetId::kDepHAD) {
219  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() - 1);
220  vNeighborsDetId.emplace_back(zdcDetId.rawId());
221  return vNeighborsDetId;
222  }
223  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() - 1);
224  vNeighborsDetId.emplace_back(zdcDetId.rawId());
225  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() + 1);
226  vNeighborsDetId.emplace_back(zdcDetId.rawId());
227  }
228  if (validRaw(zdcId) && zdcId.section() == HcalZDCDetId::LUM) {
229  bool isPositive = false;
230  if (zdcId.zside() == 1)
231  isPositive = true;
232  if (zdcId.channel() == 1) {
233  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() + 1);
234  vNeighborsDetId.emplace_back(zdcDetId.rawId());
235  return vNeighborsDetId;
236  }
237  if (zdcId.channel() == HcalZDCDetId::kDepLUM) {
238  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() - 1);
239  vNeighborsDetId.emplace_back(zdcDetId.rawId());
240  return vNeighborsDetId;
241  }
242  }
243  if (validRaw(zdcId) && zdcId.section() == HcalZDCDetId::RPD) {
244  bool isPositive = false;
245  if (zdcId.zside() == 1)
246  isPositive = true;
247  if (zdcId.channel() == 1) {
248  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() + 1);
249  vNeighborsDetId.emplace_back(zdcDetId.rawId());
250  return vNeighborsDetId;
251  }
252  if (zdcId.channel() == HcalZDCDetId::kDepRPD) {
253  zdcDetId = HcalZDCDetId(zdcId.section(), isPositive, zdcId.channel() - 1);
254  vNeighborsDetId.emplace_back(zdcDetId.rawId());
255  return vNeighborsDetId;
256  }
257  }
258  return vNeighborsDetId;
259 }
260 
261 std::vector<DetId> ZdcTopology::east(const DetId& /*id*/) const {
262  edm::LogVerbatim("ForwardGeom") << "ZdcTopology::east() not yet implemented";
263  std::vector<DetId> vNeighborsDetId;
264  return vNeighborsDetId;
265 }
266 
267 std::vector<DetId> ZdcTopology::west(const DetId& /*id*/) const {
268  edm::LogVerbatim("ForwardGeom") << "ZdcTopology::west() not yet implemented";
269  std::vector<DetId> vNeighborsDetId;
270  return vNeighborsDetId;
271 }
272 
273 std::vector<DetId> ZdcTopology::north(const DetId& /*id*/) const {
274  edm::LogVerbatim("ForwardGeom") << "ZdcTopology::north() not yet implemented";
275  std::vector<DetId> vNeighborsDetId;
276  return vNeighborsDetId;
277 }
278 std::vector<DetId> ZdcTopology::south(const DetId& /*id*/) const {
279  edm::LogVerbatim("ForwardGeom") << "ZdcTopology::south() not yet implemented";
280  std::vector<DetId> vNeighborsDetId;
281  return vNeighborsDetId;
282 }
283 std::vector<DetId> ZdcTopology::up(const DetId& /*id*/) const {
284  edm::LogVerbatim("ForwardGeom") << "ZdcTopology::up() not yet implemented";
285  std::vector<DetId> vNeighborsDetId;
286  return vNeighborsDetId;
287 }
288 std::vector<DetId> ZdcTopology::down(const DetId& /*id*/) const {
289  edm::LogVerbatim("ForwardGeom") << "ZdcTopology::down() not yet implemented";
290  std::vector<DetId> vNeighborsDetId;
291  return vNeighborsDetId;
292 }
293 
295  int ncells = 0;
296  switch (section) {
297  case (HcalZDCDetId::EM):
299  break;
300  case (HcalZDCDetId::HAD):
302  break;
303  case (HcalZDCDetId::LUM):
305  break;
306  case (HcalZDCDetId::RPD):
308  break;
309  case (HcalZDCDetId::Unknown):
310  ncells = 0;
311  break;
312  }
313  return ncells;
314 }
315 
317  int firstCell = 0;
318  switch (section) {
319  case (HcalZDCDetId::EM):
321  break;
322  case (HcalZDCDetId::HAD):
324  break;
325  case (HcalZDCDetId::LUM):
327  break;
328  case (HcalZDCDetId::RPD):
330  break;
331  case (HcalZDCDetId::Unknown):
332  firstCell = 0;
333  break;
334  }
335  return firstCell;
336 }
337 
339  int lastCell = 0;
340  switch (section) {
341  case (HcalZDCDetId::EM):
343  break;
344  case (HcalZDCDetId::HAD):
346  break;
347  case (HcalZDCDetId::LUM):
349  break;
350  case (HcalZDCDetId::RPD):
352  break;
353  case (HcalZDCDetId::Unknown):
354  lastCell = 0;
355  break;
356  }
357  return lastCell;
358 }
int firstEMModule_
Definition: ZdcTopology.h:59
Log< level::Info, true > LogVerbatim
std::vector< DetId > down(const DetId &id) const override
Definition: ZdcTopology.cc:288
bool excludeEM_
Definition: ZdcTopology.h:57
void exclude(const HcalZDCDetId &id)
Definition: ZdcTopology.cc:61
int lastLUMModule_
Definition: ZdcTopology.h:59
bool excludeRPD_
Definition: ZdcTopology.h:57
bool excludeHAD_
Definition: ZdcTopology.h:57
int zside(DetId const &)
std::vector< DetId > up(const DetId &id) const override
Definition: ZdcTopology.cc:283
std::vector< DetId > north(const DetId &id) const override
Definition: ZdcTopology.cc:273
int firstRPDModule_
Definition: ZdcTopology.h:59
static constexpr int32_t kDepHAD
Definition: HcalZDCDetId.h:38
bool excludeZN_
Definition: ZdcTopology.h:57
static constexpr int32_t kDepEM
Definition: HcalZDCDetId.h:37
std::vector< DetId > south(const DetId &id) const override
Definition: ZdcTopology.cc:278
int firstHADModule_
Definition: ZdcTopology.h:59
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual std::vector< DetId > transverse(const DetId &id) const
Definition: ZdcTopology.cc:179
std::vector< HcalZDCDetId > exclusionList_
Definition: ZdcTopology.h:55
bool excludeLUM_
Definition: ZdcTopology.h:57
int lastRPDModule_
Definition: ZdcTopology.h:59
virtual bool valid(const HcalZDCDetId &id) const
Definition: ZdcTopology.cc:24
int firstCell(HcalZDCDetId::Section section) const
Definition: ZdcTopology.cc:316
std::vector< DetId > east(const DetId &id) const override
Definition: ZdcTopology.cc:261
Definition: DetId.h:17
std::vector< DetId > west(const DetId &id) const override
Definition: ZdcTopology.cc:267
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
virtual unsigned int ncells() const
return a count of valid cells (for dense indexing use)
int lastCell(HcalZDCDetId::Section section) const
Definition: ZdcTopology.cc:338
static constexpr int32_t kDepLUM
Definition: HcalZDCDetId.h:39
constexpr Section section() const
get the section
Definition: HcalZDCDetId.h:92
bool validRaw(const HcalZDCDetId &id) const
Definition: ZdcTopology.cc:158
bool excludeZP_
Definition: ZdcTopology.h:57
static constexpr int32_t kDepRPD
Definition: HcalZDCDetId.h:40
int lastEMModule_
Definition: ZdcTopology.h:59
bool isExcluded(const HcalZDCDetId &id) const
Definition: ZdcTopology.cc:31
constexpr int32_t channel() const
get the channel
Definition: HcalZDCDetId.h:112
int firstLUMModule_
Definition: ZdcTopology.h:59
constexpr int32_t zside() const
get the z-side of the cell (1/-1)
Definition: HcalZDCDetId.h:90
virtual std::vector< DetId > longitudinal(const DetId &id) const
Definition: ZdcTopology.cc:205
int lastHADModule_
Definition: ZdcTopology.h:59