CMS 3D CMS Logo

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