CMS 3D CMS Logo

CastorTopology.cc
Go to the documentation of this file.
3 #include <cmath>
4 #include <iostream>
5 #include <algorithm>
6 
7 static const int MODULE_EM_MAX = 2;
8 static const int MODULE_HAD_MAX = 12;
9 
11  : excludeEM_(false),
12  excludeHAD_(false),
13  excludeZP_(false),
14  excludeZN_(false),
15  firstEMModule_(1),
16  lastEMModule_(2),
17  firstHADModule_(3),
18  lastHADModule_(14) {}
19 
20 bool CastorTopology::valid(const HcalCastorDetId& id) const { return (validRaw(id) && !isExcluded(id)); }
21 
23  bool exed = false;
24 
25  // check for section exclutions
26  switch (id.section()) {
27  case (HcalCastorDetId::EM):
28  exed = excludeEM_;
29  break;
30  case (HcalCastorDetId::HAD):
31  exed = excludeHAD_;
32  break;
33  default:
34  exed = false;
35  }
36 
37  // check the entire list
38  if (!exed && !exclusionList_.empty()) {
39  std::vector<HcalCastorDetId>::const_iterator i = std::lower_bound(exclusionList_.begin(), exclusionList_.end(), id);
40  if (i != exclusionList_.end() && *i == id)
41  exed = true;
42  }
43  return exed;
44 }
45 
47  std::vector<HcalCastorDetId>::iterator i = std::lower_bound(exclusionList_.begin(), exclusionList_.end(), id);
48  if (i == exclusionList_.end() || *i != id) {
49  exclusionList_.insert(i, id);
50  }
51 }
52 
54  switch (zside) {
55  case (1):
56  excludeZP_ = true;
57  break;
58  case (-1):
59  excludeZN_ = true;
60  break;
61  default:
62  break;
63  }
64 }
65 
67  switch (zside) {
68  case (1):
69  excludeZP_ = true;
70  break;
71  case (-1):
72  excludeZN_ = true;
73  break;
74  default:
75  break;
76  }
77  switch (section) {
78  case (HcalCastorDetId::EM):
79  excludeEM_ = true;
80  break;
81  case (HcalCastorDetId::HAD):
82  excludeHAD_ = true;
83  break;
84  default:
85  break;
86  }
87 }
88 
90  HcalCastorDetId::Section section1,
91  int isec1,
92  int imod1,
93  HcalCastorDetId::Section section2,
94  int isec2,
95  int imod2) {
96  bool exed = false;
97  switch (zside) {
98  case (1):
99  exed = excludeZP_;
100  break;
101  case (-1):
102  exed = excludeZN_;
103  break;
104  default:
105  exed = false;
106  }
107  if (exed)
108  return 0;
109 
110  /* NOTE not so sure about the exclusion */
111  if (section1 == HcalCastorDetId::EM && section2 == HcalCastorDetId::EM) {
112  exed = excludeEM_;
113  } else if (section1 == HcalCastorDetId::HAD && section2 == HcalCastorDetId::HAD) {
114  exed = excludeHAD_;
115  } else {
116  exed = false;
117  };
118 
119  if (exed)
120  return 0;
121 
122  bool isPositive = false;
123  if (zside == 1)
124  isPositive = true;
125 
126  int n = 0;
127  for (int isec = isec1; isec < isec2; isec++) {
128  for (int imod = imod1; imod < imod2; imod++) {
129  HcalCastorDetId id(section1, isPositive, isec, imod);
130  if (validRaw(id))
131  exclude(id);
132  n++;
133  }
134  }
135  return n;
136 }
137 
139  return HcalCastorDetId::validDetId(id.section(), id.zside() > 0, id.sector(), id.module());
140 }
141 
142 std::vector<DetId> CastorTopology::incSector(const DetId& id) const {
143  std::vector<DetId> vNeighborsDetId;
144  HcalCastorDetId castorId = HcalCastorDetId(id);
145  HcalCastorDetId castorDetId;
146  if (validRaw(castorId)) {
147  bool isPositive = false;
148  if (castorId.zside() == 1)
149  isPositive = true;
150  if (castorId.sector() == 1) {
151  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector() + 1, castorId.module());
152  vNeighborsDetId.emplace_back(castorDetId.rawId());
153  return vNeighborsDetId;
154  }
155  if (castorId.sector() == 16) {
156  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector() - 1, castorId.module());
157  vNeighborsDetId.emplace_back(castorDetId.rawId());
158  return vNeighborsDetId;
159  }
160  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector() - 1, castorId.module());
161  vNeighborsDetId.emplace_back(castorDetId.rawId());
162  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector() + 1, castorId.module());
163  vNeighborsDetId.emplace_back(castorDetId.rawId());
164  }
165  return vNeighborsDetId;
166 }
167 
168 std::vector<DetId> CastorTopology::incModule(const DetId& id) const {
169  std::vector<DetId> vNeighborsDetId;
170  HcalCastorDetId castorId = HcalCastorDetId(id);
171  HcalCastorDetId castorDetId;
172  if (validRaw(castorId) && castorId.section() == HcalCastorDetId::EM) {
173  bool isPositive = false;
174  if (castorId.zside() == 1)
175  isPositive = true;
176  if (castorId.module() == 1) {
177  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector(), castorId.module() + 1);
178  vNeighborsDetId.emplace_back(castorDetId.rawId());
179  return vNeighborsDetId;
180  }
181  if (castorId.module() == MODULE_EM_MAX) {
182  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector(), castorId.module() - 1);
183  vNeighborsDetId.emplace_back(castorDetId.rawId());
184  return vNeighborsDetId;
185  }
186  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector(), castorId.module() - 1);
187  vNeighborsDetId.emplace_back(castorDetId.rawId());
188  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector(), castorId.module() + 1);
189  vNeighborsDetId.emplace_back(castorDetId.rawId());
190  }
191  if (validRaw(castorId) && castorId.section() == HcalCastorDetId::HAD) {
192  bool isPositive = false;
193  if (castorId.zside() == 1)
194  isPositive = true;
195  if (castorId.module() == 1) {
196  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector(), castorId.module() + 1);
197  vNeighborsDetId.emplace_back(castorDetId.rawId());
198  return vNeighborsDetId;
199  }
200  if (castorId.module() == MODULE_HAD_MAX) {
201  castorDetId = HcalCastorDetId(castorId.section(), isPositive, castorId.sector(), castorId.module() - 1);
202  vNeighborsDetId.emplace_back(castorDetId.rawId());
203  return vNeighborsDetId;
204  }
205  }
206  return vNeighborsDetId;
207 }
208 
209 std::vector<DetId> CastorTopology::east(const DetId& /*id*/) const {
210  edm::LogVerbatim("ForwardGeom") << "CastorTopology::east() not yet implemented";
211  std::vector<DetId> vNeighborsDetId;
212  return vNeighborsDetId;
213 }
214 
215 std::vector<DetId> CastorTopology::west(const DetId& /*id*/) const {
216  edm::LogVerbatim("ForwardGeom") << "CastorTopology::west() not yet implemented";
217  std::vector<DetId> vNeighborsDetId;
218  return vNeighborsDetId;
219 }
220 
221 std::vector<DetId> CastorTopology::north(const DetId& /*id*/) const {
222  edm::LogVerbatim("ForwardGeom") << "CastorTopology::north() not yet implemented";
223  std::vector<DetId> vNeighborsDetId;
224  return vNeighborsDetId;
225 }
226 std::vector<DetId> CastorTopology::south(const DetId& /*id*/) const {
227  edm::LogVerbatim("ForwardGeom") << "CastorTopology::south() not yet implemented";
228  std::vector<DetId> vNeighborsDetId;
229  return vNeighborsDetId;
230 }
231 std::vector<DetId> CastorTopology::up(const DetId& /*id*/) const {
232  edm::LogVerbatim("ForwardGeom") << "CastorTopology::up() not yet implemented";
233  std::vector<DetId> vNeighborsDetId;
234  return vNeighborsDetId;
235 }
236 std::vector<DetId> CastorTopology::down(const DetId& /*id*/) const {
237  edm::LogVerbatim("ForwardGeom") << "CastorTopology::down() not yet implemented";
238  std::vector<DetId> vNeighborsDetId;
239  return vNeighborsDetId;
240 }
241 
243  int ncells = 0;
244  switch (section) {
245  case (HcalCastorDetId::EM):
246  ncells = MODULE_EM_MAX * 16;
247  break;
248  case (HcalCastorDetId::HAD):
249  ncells = MODULE_HAD_MAX * 16;
250  break;
252  ncells = 0;
253  break;
254  }
255  return ncells;
256 }
257 
259  int firstCell = 0;
260  switch (section) {
261  case (HcalCastorDetId::EM):
263  break;
264  case (HcalCastorDetId::HAD):
266  break;
268  firstCell = 0;
269  break;
270  }
271  return firstCell;
272 }
273 
275  int lastCell = 0;
276  switch (section) {
277  case (HcalCastorDetId::EM):
279  break;
280  case (HcalCastorDetId::HAD):
282  break;
284  lastCell = 0;
285  break;
286  }
287  return lastCell;
288 }
static bool validDetId(Section iSection, bool posEta, int iSector, int iMod)
Log< level::Info, true > LogVerbatim
bool isExcluded(const HcalCastorDetId &id) const
static const int MODULE_EM_MAX
std::vector< DetId > down(const DetId &id) const override
int zside(DetId const &)
virtual std::vector< DetId > incModule(const DetId &id) const
static const int MODULE_HAD_MAX
virtual bool valid(const HcalCastorDetId &id) const
int module() const
get the module (1-2 for EM, 1-12 for HAD)
int zside() const
get the z-side of the cell (1/-1)
virtual bool validRaw(const HcalCastorDetId &id) const
int sector() const
get the sector (1-16)
std::vector< DetId > west(const DetId &id) const override
std::vector< DetId > north(const DetId &id) const override
Definition: DetId.h:17
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)
Section section() const
get the section
virtual std::vector< DetId > incSector(const DetId &id) const
std::vector< DetId > up(const DetId &id) const override
std::vector< DetId > south(const DetId &id) const override
void exclude(const HcalCastorDetId &id)
std::vector< HcalCastorDetId > exclusionList_
int firstCell(HcalCastorDetId::Section section) const
int lastCell(HcalCastorDetId::Section section) const
std::vector< DetId > east(const DetId &id) const override