CMS 3D CMS Logo

HcalTopology.cc
Go to the documentation of this file.
2 #include <cmath>
3 #include <iostream>
4 #include <cassert>
5 #include <algorithm>
9 
10 using namespace geant_units;
11 using namespace geant_units::operators;
12 
13 static const int IPHI_MAX = 72;
14 
15 //#define EDM_ML_DEBUG
16 
17 HcalTopology::HcalTopology(const HcalDDDRecConstants* hcons, const bool mergePosition)
18  : hcons_(hcons),
19  mergePosition_(mergePosition),
20  excludeHB_(false),
21  excludeHE_(false),
22  excludeHO_(false),
23  excludeHF_(false),
24  firstHBRing_(1),
25  firstHERing_(999),
26  lastHERing_(0),
27  firstHFRing_(29),
28  lastHFRing_(41),
29  firstHORing_(1),
30  lastHORing_(15),
31  firstHEDoublePhiRing_(999),
32  firstHEQuadPhiRing_(999),
33  firstHFQuadPhiRing_(40),
34  firstHETripleDepthRing_(999),
35  singlePhiBins_(IPHI_MAX),
36  doublePhiBins_(36),
37  maxPhiHE_(IPHI_MAX) {
47  if (hcons_->getNPhi(1) > maxPhiHE_)
48  maxPhiHE_ = hcons_->getNPhi(1);
49  for (auto& i : etaBinsHE_) {
50  if (firstHERing_ > i.ieta)
51  firstHERing_ = i.ieta;
52  if (lastHERing_ < i.ieta)
53  lastHERing_ = i.ieta;
54  int unit = static_cast<int>((i.dphi / 5.0_deg) + 0.01);
55  if (unit == 2 && firstHEDoublePhiRing_ > i.ieta)
56  firstHEDoublePhiRing_ = i.ieta;
57  if (unit == 4 && firstHEQuadPhiRing_ > i.ieta)
58  firstHEQuadPhiRing_ = i.ieta;
59  if (i.layer.size() > 2 && firstHETripleDepthRing_ > i.ieta)
61  }
62  if (firstHERing_ > lastHERing_) {
64  } else {
66  }
68  topoVersion_ = 0; //DL
69  HBSize_ = kHBSizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/barrel * barrel/hcal
70  HESize_ = kHESizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/endcap * endcap/hcal
71  HOSize_ = kHOSizePreLS1; // ieta * iphi * 2
72  HFSize_ = kHFSizePreLS1; // ieta * iphi * depth * 2
74  numberOfShapes_ = 87;
75  } else if (mode_ == HcalTopologyMode::SLHC) { // need to know more eventually
76  topoVersion_ = 10;
79  HOSize_ = (lastHORing_ - firstHORing_ + 1) * IPHI_MAX * 2; // ieta * iphi * 2
80  HFSize_ = (lastHFRing_ - firstHFRing_ + 1) * IPHI_MAX * maxDepthHF_ * 2; // ieta * iphi * depth * 2
82  numberOfShapes_ = (maxPhiHE_ > 72) ? 1200 : 500;
83  }
87  } else {
89  }
90 
91 #ifdef EDM_ML_DEBUG
92  edm::LogVerbatim("HCalGeom") << "Topo sizes " << HBSize_ << ":" << HESize_ << ":" << HOSize_ << ":" << HFSize_ << ":"
93  << HTSize_ << ":" << CALIBSize_ << " for mode " << mode_ << ":" << triggerMode_;
94 #endif
95 
96  //The transition between HE/HF in eta
101  phioff = hcons_->getPhiOffs();
102  std::pair<int, int> ietaHF = hcons_->getEtaRange(2);
105  if (etaBinsHE_.size() > 1) {
106  double eta = etaBinsHE_[etaBinsHE_.size() - 1].etaMax;
107  for (unsigned int i = 1; i < etaTableHF.size(); ++i) {
108  if (eta < etaTableHF[i]) {
109  etaHE2HF_ = ietaHF.first + i - 1;
110  break;
111  }
112  }
113  eta = etaTableHF[0];
114  for (auto& i : etaBinsHE_) {
115  if (eta < i.etaMax) {
116  etaHF2HE_ = i.ieta;
117  break;
118  }
119  }
120  }
121  const double fiveDegInRad = 5.0_deg;
122  for (double k : dPhiTable) {
123  int units = (int)(k / fiveDegInRad + 0.5);
124  unitPhi.emplace_back(units);
125  }
126  for (double k : dPhiTableHF) {
127  int units = (int)(k / fiveDegInRad + 0.5);
128  unitPhiHF.emplace_back(units);
129  }
130  int nEta = hcons_->getNEta();
131  for (int ring = 1; ring <= nEta; ++ring) {
132  std::vector<int> segmentation = hcons_->getDepth(ring - 1, false);
133  setDepthSegmentation(ring, segmentation, false);
134 #ifdef EDM_ML_DEBUG
135  edm::LogVerbatim("HCalGeom") << "Set segmentation for ring " << ring << " with " << segmentation.size()
136  << " elements:";
137  for (unsigned int k = 0; k < segmentation.size(); ++k)
138  edm::LogVerbatim("HCalGeom") << "[" << k << "] " << segmentation[k];
139 #endif
140  segmentation = hcons_->getDepth(ring - 1, true);
141  setDepthSegmentation(ring, segmentation, true);
142 #ifdef EDM_ML_DEBUG
143  edm::LogVerbatim("HCalGeom") << "Set Plan-1 segmentation for ring " << ring << " with " << segmentation.size()
144  << " elements:";
145  for (unsigned int k = 0; k < segmentation.size(); ++k)
146  edm::LogVerbatim("HCalGeom") << "[" << k << "] " << segmentation[k];
147 #endif
148  }
149 
150 #ifdef EDM_ML_DEBUG
151  edm::LogVerbatim("HCalGeom") << "Constants in HcalTopology " << firstHBRing_ << ":" << lastHBRing_ << " "
152  << firstHERing_ << ":" << lastHERing_ << ":" << firstHEDoublePhiRing_ << ":"
153  << firstHEQuadPhiRing_ << ":" << firstHETripleDepthRing_ << " " << firstHFRing_ << ":"
154  << lastHFRing_ << ":" << firstHFQuadPhiRing_ << " " << firstHORing_ << ":" << lastHORing_
155  << " " << maxDepthHB_ << ":" << maxDepthHE_ << " " << nEtaHB_ << ":" << nEtaHE_ << " "
156  << etaHE2HF_ << ":" << etaHF2HE_ << " " << maxPhiHE_;
157 #endif
158 }
159 
161  int maxDepthHB,
162  int maxDepthHE,
164  : hcons_(nullptr),
165  mergePosition_(false),
166  excludeHB_(false),
167  excludeHE_(false),
168  excludeHO_(false),
169  excludeHF_(false),
170  mode_(mode),
171  triggerMode_(tmode),
172  firstHBRing_(1),
173  lastHBRing_(16),
174  firstHERing_(16),
175  lastHERing_(29),
176  firstHFRing_(29),
177  lastHFRing_(41),
178  firstHORing_(1),
179  lastHORing_(15),
180  firstHEDoublePhiRing_((mode == HcalTopologyMode::H2 || mode == HcalTopologyMode::H2HE) ? (22) : (21)),
181  firstHEQuadPhiRing_(999),
182  firstHFQuadPhiRing_(40),
183  firstHETripleDepthRing_((mode == HcalTopologyMode::H2 || mode == HcalTopologyMode::H2HE) ? (24) : (27)),
184  singlePhiBins_(IPHI_MAX),
185  doublePhiBins_(36),
186  maxDepthHB_(maxDepthHB),
187  maxDepthHE_(maxDepthHE),
188  maxDepthHF_(2),
189  etaHE2HF_(30),
190  etaHF2HE_(29),
191  maxPhiHE_(IPHI_MAX),
192  HBSize_(kHBSizePreLS1),
193  HESize_(kHESizePreLS1),
194  HOSize_(kHOSizePreLS1),
195  HFSize_(kHFSizePreLS1),
196  HTSize_(kHTSizePreLS1),
197  CALIBSize_(kCALIBSizePreLS1),
198  numberOfShapes_((mode == HcalTopologyMode::SLHC) ? 500 : 87) {
199  if (mode_ == HcalTopologyMode::LHC) {
200  topoVersion_ = 0; //DL
201  HBSize_ = kHBSizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/barrel * barrel/hcal
202  HESize_ = kHESizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/endcap * endcap/hcal
203  HOSize_ = kHOSizePreLS1; // ieta * iphi * 2
204  HFSize_ = kHFSizePreLS1; // phi * eta * depth * pm
205  } else if (mode_ == HcalTopologyMode::SLHC) { // need to know more eventually
206  HBSize_ = maxDepthHB * 16 * IPHI_MAX * 2;
207  HESize_ = maxDepthHE * (29 - 16 + 1) * maxPhiHE_ * 2;
208  HOSize_ = 15 * IPHI_MAX * 2; // ieta * iphi * 2
209  HFSize_ = IPHI_MAX * 13 * maxDepthHF_ * 2; // phi * eta * depth * pm
211  topoVersion_ = 10;
212  }
213  nEtaHB_ = (lastHBRing_ - firstHBRing_ + 1);
214  nEtaHE_ = (lastHERing_ - firstHERing_ + 1);
217  } else {
219  }
220 
221  edm::LogWarning("HCalGeom") << "This is an incomplete constructor of HcalTopology - be warned that many "
222  << "functionalities will not be there - revert from this - get from EventSetup";
223 }
224 
225 bool HcalTopology::valid(const DetId& id) const {
226  assert(id.det() == DetId::Hcal);
227  return validHcal(id);
228 }
229 
230 bool HcalTopology::validHcal(const HcalDetId& id) const {
231  // check the raw rules
232  return validRaw(id) && !isExcluded(id);
233 }
234 
235 bool HcalTopology::validDetId(HcalSubdetector subdet, int ieta, int iphi, int depth) const {
236  return validHcal(HcalDetId(subdet, ieta, iphi, depth));
237 }
238 
240  if (id.iphi() < 1 || id.iphi() > IPHI_MAX || id.ieta() == 0)
241  return false;
242  if (id.depth() != 0)
243  return false;
244  if (maxDepthHE_ == 0) {
245  if (id.ietaAbs() > lastHBRing_ && id.ietaAbs() < firstHFRing_)
246  return false;
247  }
248  if (id.version() == 0) {
249  if (id.ietaAbs() > 28) {
251  return false;
253  return false;
254  if ((id.iphi() % 4) != 1)
255  return false;
256  if (id.ietaAbs() > 32)
257  return false;
258  }
259  } else if (id.version() == 1) {
261  return false;
262  if (id.ietaAbs() < 30 || id.ietaAbs() > 41)
263  return false;
264  if (id.ietaAbs() > 29 && ((id.iphi() % 2) == 0))
265  return false;
266  if (id.ietaAbs() > 39 && ((id.iphi() % 4) != 3))
267  return false;
268  } else if (id.version() > 1) {
269  // only versions 0 and 1 are supported
270  return false;
271  }
272 
273  return true;
274 }
275 
276 bool HcalTopology::validCalib(const HcalCalibDetId& tid) const {
277  bool ok(false);
279  HcalSubdetector subdet = tid.hcalSubdet();
280  int ieta = tid.ieta();
281  int chan = tid.cboxChannel();
282  unsigned int iphi = static_cast<unsigned int>(tid.iphi());
283  if (subdet == HcalBarrel) {
286  (iphi >= minPhi_) && (iphi <= maxPhi_))
287  ok = true;
288  } else if (subdet == HcalEndcap) {
291  (chan == chanCalibHE2_)) &&
292  (iphi >= minPhi_) && (iphi <= maxPhi_))
293  ok = true;
294  } else if (subdet == HcalForward) {
297  (chan == chanCalibHF2_)) &&
298  (iphi >= minPhi_) && (iphi <= maxPhi_))
299  ok = true;
300  } else if (subdet == HcalOuter) {
303  (chan == chanCalibHOs_)) &&
304  (iphi >= minPhi_) && (iphi <= maxPhi_))
305  ok = true;
306  }
307  } else if (tid.calibFlavor() == HcalCalibDetId::HOCrosstalk) {
308  int ieta = std::abs(tid.ieta());
309  unsigned int iphi = static_cast<unsigned int>(tid.iphi());
311  (iphi >= minPhi_) && (iphi <= maxPhi_))
312  ok = true;
313  } else if (tid.calibFlavor() == HcalCalibDetId::HBX) {
314  int ieta = std::abs(tid.ieta());
315  unsigned int iphi = static_cast<unsigned int>(tid.iphi());
316  if ((ieta == etaCalibHBX_) && (iphi >= minPhi_) && (iphi <= maxPhi_))
317  ok = true;
318  } else if (tid.calibFlavor() == HcalCalibDetId::HEX) {
319  int ieta = std::abs(tid.ieta());
320  unsigned int iphi = static_cast<unsigned int>(tid.iphi());
322  (iphi >= minPhi_) && (iphi <= maxPhi_))
323  ok = true;
324  } else if ((tid.calibFlavor() == HcalCalibDetId::uMNqie) || (tid.calibFlavor() == HcalCalibDetId::LASERMON) ||
326  ok = true;
327  }
328  return ok;
329 }
330 
331 bool HcalTopology::validHcal(const HcalDetId& id, const unsigned int flag) const {
332  /* original logic show here because condensed form below is rather terse
333  // check the raw rules
334  bool ok = validHcal(id);
335  if (flag == 0) { // This is all what is needed
336  } else if (flag == 1) { // See if it is in the to be merged list and merged list
337  if (hcons_->isPlan1MergedId(id)) ok = true;
338  else if (hcons_->isPlan1ToBeMergedId(id)) ok = false;
339  } else if (!ok) {
340  ok = hcons_->isPlan1MergedId(id);
341  }
342  return ok;
343  */
344  return (flag > 0 and hcons_->isPlan1MergedId(id)) or
345  ((flag != 1 or !hcons_->isPlan1ToBeMergedId(id)) and validHcal(id));
346 }
347 
348 bool HcalTopology::isExcluded(const HcalDetId& id) const {
349  bool exed = false;
350  // first, check the full detector exclusions... (fast)
351  switch (id.subdet()) {
352  case (HcalBarrel):
353  exed = excludeHB_;
354  break;
355  case (HcalEndcap):
356  exed = excludeHE_;
357  break;
358  case (HcalOuter):
359  exed = excludeHO_;
360  break;
361  case (HcalForward):
362  exed = excludeHF_;
363  break;
364  default:
365  exed = false;
366  }
367  // next, check the list (slower)
368  if (!exed && !exclusionList_.empty()) {
369  std::vector<HcalDetId>::const_iterator i = std::lower_bound(exclusionList_.begin(), exclusionList_.end(), id);
370  if (i != exclusionList_.end() && *i == id)
371  exed = true;
372  }
373  return exed;
374 }
375 
377  std::vector<HcalDetId>::iterator i = std::lower_bound(exclusionList_.begin(), exclusionList_.end(), id);
378  if (i == exclusionList_.end() || *i != id) {
379  exclusionList_.insert(i, id);
380  }
381 }
382 
384  switch (subdet) {
385  case (HcalBarrel):
386  excludeHB_ = true;
387  break;
388  case (HcalEndcap):
389  excludeHE_ = true;
390  break;
391  case (HcalOuter):
392  excludeHO_ = true;
393  break;
394  case (HcalForward):
395  excludeHF_ = true;
396  break;
397  default:
398  break;
399  }
400 }
401 
402 std::vector<DetId> HcalTopology::east(const DetId& id) const {
403  std::vector<DetId> vNeighborsDetId;
404  HcalDetId neighbors[2];
405  for (int i = 0; i < decIEta(HcalDetId(id), neighbors); i++) {
406  if (neighbors[i].oldFormat())
407  neighbors[i].changeForm();
408  vNeighborsDetId.emplace_back(DetId(neighbors[i].rawId()));
409  }
410  return vNeighborsDetId;
411 }
412 
413 std::vector<DetId> HcalTopology::west(const DetId& id) const {
414  std::vector<DetId> vNeighborsDetId;
415  HcalDetId neighbors[2];
416  for (int i = 0; i < incIEta(HcalDetId(id), neighbors); i++) {
417  if (neighbors[i].oldFormat())
418  neighbors[i].changeForm();
419  vNeighborsDetId.emplace_back(DetId(neighbors[i].rawId()));
420  }
421  return vNeighborsDetId;
422 }
423 
424 std::vector<DetId> HcalTopology::north(const DetId& id) const {
425  std::vector<DetId> vNeighborsDetId;
426  HcalDetId neighbor;
427  if (incIPhi(HcalDetId(id), neighbor)) {
428  if (neighbor.oldFormat())
429  neighbor.changeForm();
430  vNeighborsDetId.emplace_back(DetId(neighbor.rawId()));
431  }
432  return vNeighborsDetId;
433 }
434 
435 std::vector<DetId> HcalTopology::south(const DetId& id) const {
436  std::vector<DetId> vNeighborsDetId;
437  HcalDetId neighbor;
438  if (decIPhi(HcalDetId(id), neighbor)) {
439  if (neighbor.oldFormat())
440  neighbor.changeForm();
441  vNeighborsDetId.emplace_back(DetId(neighbor.rawId()));
442  }
443  return vNeighborsDetId;
444 }
445 
446 std::vector<DetId> HcalTopology::up(const DetId& id) const {
447  HcalDetId neighbor = id;
448  std::vector<DetId> vNeighborsDetId;
449  if (incrementDepth(neighbor)) {
450  if (neighbor.oldFormat())
451  neighbor.changeForm();
452  vNeighborsDetId.emplace_back(neighbor);
453  }
454  return vNeighborsDetId;
455 }
456 
457 std::vector<DetId> HcalTopology::down(const DetId& id) const {
458  HcalDetId neighbor = id;
459  std::vector<DetId> vNeighborsDetId;
460  if (decrementDepth(neighbor)) {
461  if (neighbor.oldFormat())
462  neighbor.changeForm();
463  vNeighborsDetId.emplace_back(neighbor);
464  }
465  return vNeighborsDetId;
466 }
467 
468 int HcalTopology::exclude(HcalSubdetector subdet, int ieta1, int ieta2, int iphi1, int iphi2, int depth1, int depth2) {
469  bool exed = false;
470  // first, check the full detector exclusions... (fast)
471  switch (subdet) {
472  case (HcalBarrel):
473  exed = excludeHB_;
474  break;
475  case (HcalEndcap):
476  exed = excludeHE_;
477  break;
478  case (HcalOuter):
479  exed = excludeHO_;
480  break;
481  case (HcalForward):
482  exed = excludeHF_;
483  break;
484  default:
485  exed = false;
486  }
487  if (exed)
488  return 0; // if the whole detector is excluded...
489 
490  int ieta_l = std::min(ieta1, ieta2);
491  int ieta_h = std::max(ieta1, ieta2);
492  int iphi_l = std::min(iphi1, iphi2);
493  int iphi_h = std::max(iphi1, iphi2);
494  int depth_l = std::min(depth1, depth2);
495  int depth_h = std::max(depth1, depth2);
496 
497  int n = 0;
498  for (int ieta = ieta_l; ieta <= ieta_h; ieta++)
499  for (int iphi = iphi_l; iphi <= iphi_h; iphi++)
500  for (int depth = depth_l; depth <= depth_h; depth++) {
501  HcalDetId id(subdet, ieta, iphi, depth);
502  if (validRaw(id)) { // use 'validRaw' to include check validity in "uncut" detector
503  exclude(id);
504  n++;
505  }
506  }
507  return n;
508 }
509 
537  const HcalSubdetector sd(id.subdet());
538  const int ie(id.ietaAbs());
539  const int ip(id.iphi());
540  const int dp(id.depth());
541 
542  return ((ip >= 1) && (ip <= IPHI_MAX) && (dp >= 1) && (ie >= 1) &&
543  (((sd == HcalBarrel) && (((ie <= 14) && (dp == 1)) || (((ie == 15) || (ie == 16)) && (dp <= 2)))) ||
544  ((sd == HcalEndcap) &&
545  (((ie == firstHERing()) && (dp == 3)) || ((ie == 17) && (dp == 1)) ||
546  ((ie >= 18) && (ie <= 20) && (dp <= 2)) || ((ie >= 21) && (ie <= 26) && (dp <= 2) && (ip % 2 == 1)) ||
547  ((ie >= 27) && (ie <= 28) && (dp <= 3) && (ip % 2 == 1)) || ((ie == 29) && (dp <= 2) && (ip % 2 == 1)))) ||
548  ((sd == HcalOuter) && (ie <= 15) && (dp == 4)) ||
549  ((sd == HcalForward) && (dp <= 2) &&
550  (((ie >= firstHFRing()) && (ie < firstHFQuadPhiRing()) && (ip % 2 == 1)) ||
551  ((ie >= firstHFQuadPhiRing()) && (ie <= lastHFRing()) && (ip % 4 == 3))))));
552 }
553 
555 bool HcalTopology::validRaw(const HcalDetId& id) const {
556  bool ok = true;
557  int ieta = id.ieta();
558  int aieta = id.ietaAbs();
559  int depth = id.depth();
560  int iphi = id.iphi();
561  int zside = id.zside();
562  HcalSubdetector subdet = id.subdet();
563  int maxPhi = (subdet == HcalEndcap) ? maxPhiHE_ : IPHI_MAX;
564  if ((ieta == 0 || iphi <= 0 || iphi > maxPhi) || aieta > maxEta_)
565  ok = false; // outer limits
566 
567  if (ok) {
568  if (subdet == HcalBarrel) {
570  if ((aieta > lastHBRing()) || (depth > hcons_->getMaxDepth(0, aieta, iphi, zside)) ||
571  (depth < hcons_->getMinDepth(0, aieta, iphi, zside)))
572  ok = false;
573  } else {
574  if (aieta > lastHBRing() || depth > 2 || (aieta <= 14 && depth > 1))
575  ok = false;
576  }
577  } else if (subdet == HcalEndcap) {
579  if ((depth > hcons_->getMaxDepth(1, aieta, iphi, zside)) ||
580  (depth < hcons_->getMinDepth(1, aieta, iphi, zside)) || (aieta < firstHERing()) || (aieta > lastHERing())) {
581  ok = false;
582  } else {
583  for (const auto& i : etaBinsHE_) {
584  if (aieta == i.ieta) {
585  if (aieta >= firstHEDoublePhiRing() && (iphi % 2) == 0)
586  ok = false;
587  if (aieta >= firstHEQuadPhiRing() && (iphi % 4) != 3)
588  ok = false;
589  if (aieta + 1 == hcons_->getNoff(1)) {
590  if (depth < 1)
591  ok = false;
592  } else {
593  if (depth < i.depthStart)
594  ok = false;
595  }
596  break;
597  }
598  }
599  }
600  } else {
601  if (depth > hcons_->getMaxDepth(1, aieta, iphi, zside) || aieta < firstHERing() || aieta > lastHERing() ||
602  (aieta == firstHERing() && depth != hcons_->getDepthEta16(2, iphi, zside)) ||
603  (aieta == 17 && depth != 1 && mode_ != HcalTopologyMode::H2) || // special case at H2
604  (((aieta >= 17 && aieta < firstHETripleDepthRing()) || aieta == lastHERing()) && depth > 2) ||
605  (aieta >= firstHEDoublePhiRing() && (iphi % 2) == 0))
606  ok = false;
607  }
608  } else if (subdet == HcalOuter) {
609  if (aieta > lastHORing() || iphi > IPHI_MAX || depth != 4)
610  ok = false;
611  } else if (subdet == HcalForward) {
612  if (aieta < firstHFRing() || aieta > lastHFRing() || ((iphi % 2) == 0) ||
613  (depth > hcons_->maxHFDepth(ieta, iphi)) || (aieta >= firstHFQuadPhiRing() && ((iphi + 1) % 4) != 0))
614  ok = false;
615  } else if (subdet == HcalTriggerTower) {
616  ok = validHT(HcalTrigTowerDetId(id.rawId()));
617  } else if (subdet == HcalOther) {
618  ok = validCalib(HcalCalibDetId(id.rawId()));
619  } else {
620  ok = false;
621  }
622  }
623  return ok;
624 }
625 
626 bool HcalTopology::incIPhi(const HcalDetId& id, HcalDetId& neighbor) const {
627  bool ok = valid(id);
628  if (ok) {
629  switch (id.subdet()) {
630  case (HcalBarrel):
631  case (HcalOuter):
632  if (id.iphi() == IPHI_MAX)
633  neighbor = HcalDetId(id.subdet(), id.ieta(), 1, id.depth());
634  else
635  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() + 1, id.depth());
636  break;
637  case (HcalEndcap):
638  if (id.ietaAbs() >= firstHEQuadPhiRing()) {
639  if (id.iphi() == IPHI_MAX - 1)
640  neighbor = HcalDetId(id.subdet(), id.ieta(), 3, id.depth());
641  else
642  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() + 4, id.depth());
643  } else if (id.ietaAbs() >= firstHEDoublePhiRing()) {
644  if (id.iphi() == IPHI_MAX - 1)
645  neighbor = HcalDetId(id.subdet(), id.ieta(), 1, id.depth());
646  else
647  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() + 2, id.depth());
648  } else {
649  if (id.iphi() == maxPhiHE_)
650  neighbor = HcalDetId(id.subdet(), id.ieta(), 1, id.depth());
651  else
652  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() + 1, id.depth());
653  }
654  break;
655  case (HcalForward):
656  if (id.ietaAbs() >= firstHFQuadPhiRing()) {
657  if (id.iphi() == IPHI_MAX - 1)
658  neighbor = HcalDetId(id.subdet(), id.ieta(), 3, id.depth());
659  else
660  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() + 4, id.depth());
661  } else {
662  if (id.iphi() == IPHI_MAX - 1)
663  neighbor = HcalDetId(id.subdet(), id.ieta(), 1, id.depth());
664  else
665  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() + 2, id.depth());
666  }
667  if (!validRaw(neighbor))
668  ok = false;
669  break;
670  default:
671  ok = false;
672  }
673  }
674  return ok;
675 }
676 
678 bool HcalTopology::decIPhi(const HcalDetId& id, HcalDetId& neighbor) const {
679  bool ok = valid(id);
680  if (ok) {
681  switch (id.subdet()) {
682  case (HcalBarrel):
683  case (HcalOuter):
684  if (id.iphi() == 1)
685  neighbor = HcalDetId(id.subdet(), id.ieta(), IPHI_MAX, id.depth());
686  else
687  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() - 1, id.depth());
688  break;
689  case (HcalEndcap):
690  if (id.ietaAbs() >= firstHEQuadPhiRing()) {
691  if (id.iphi() == 3)
692  neighbor = HcalDetId(id.subdet(), id.ieta(), IPHI_MAX - 1, id.depth());
693  else
694  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() - 4, id.depth());
695  } else if (id.ietaAbs() >= firstHEDoublePhiRing()) {
696  if (id.iphi() == 1)
697  neighbor = HcalDetId(id.subdet(), id.ieta(), IPHI_MAX - 1, id.depth());
698  else
699  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() - 2, id.depth());
700  } else {
701  if (id.iphi() == 1)
702  neighbor = HcalDetId(id.subdet(), id.ieta(), maxPhiHE_, id.depth());
703  else
704  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() - 1, id.depth());
705  }
706  break;
707  case (HcalForward):
708  if (id.ietaAbs() >= firstHFQuadPhiRing()) {
709  if (id.iphi() == 3)
710  neighbor = HcalDetId(id.subdet(), id.ieta(), IPHI_MAX - 1, id.depth());
711  else
712  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() - 4, id.depth());
713  } else {
714  if (id.iphi() == 1)
715  neighbor = HcalDetId(id.subdet(), id.ieta(), IPHI_MAX - 1, id.depth());
716  else
717  neighbor = HcalDetId(id.subdet(), id.ieta(), id.iphi() - 2, id.depth());
718  }
719  if (!validRaw(neighbor))
720  ok = false;
721  break;
722  default:
723  ok = false;
724  }
725  }
726  return ok;
727 }
728 
729 int HcalTopology::incIEta(const HcalDetId& id, HcalDetId neighbors[2]) const {
730  if (id.zside() == 1)
731  return incAIEta(id, neighbors);
732  else
733  return decAIEta(id, neighbors);
734 }
735 
736 int HcalTopology::decIEta(const HcalDetId& id, HcalDetId neighbors[2]) const {
737  if (id.zside() == 1)
738  return decAIEta(id, neighbors);
739  else
740  return incAIEta(id, neighbors);
741 }
742 
744 int HcalTopology::incAIEta(const HcalDetId& id, HcalDetId neighbors[2]) const {
745  int n = 1;
746  int aieta = id.ietaAbs();
747 
748  if (aieta == firstHEDoublePhiRing() - 1 && (id.iphi() % 2) == 0)
749  neighbors[0] = HcalDetId(id.subdet(), (aieta + 1) * id.zside(), id.iphi() - 1, id.depth());
750  else if (aieta == firstHFQuadPhiRing() - 1 && ((id.iphi() + 1) % 4) != 0)
751  neighbors[0] =
752  HcalDetId(id.subdet(), (aieta + 1) * id.zside(), ((id.iphi() == 1) ? (71) : (id.iphi() - 2)), id.depth());
753  else if (aieta == firstHEQuadPhiRing() - 1 && ((id.iphi() + 1) % 4) != 0)
754  neighbors[0] =
755  HcalDetId(id.subdet(), (aieta + 1) * id.zside(), ((id.iphi() == 1) ? (71) : (id.iphi() - 2)), id.depth());
756  else if (aieta == lastHBRing())
757  neighbors[0] = HcalDetId(HcalEndcap, (aieta + 1) * id.zside(), id.iphi(), 1);
758  else if (aieta == lastHERing())
759  neighbors[0] = HcalDetId(HcalForward, etaHE2HF_ * id.zside(), id.iphi(), 1);
760  else
761  neighbors[0] = HcalDetId(id.subdet(), (aieta + 1) * id.zside(), id.iphi(), id.depth());
762 
763  if (!valid(neighbors[0]))
764  n = 0;
765  return n;
766 }
767 
769 int HcalTopology::decAIEta(const HcalDetId& id, HcalDetId neighbors[2]) const {
770  int n = 1;
771  int aieta = id.ietaAbs();
772 
773  if (aieta == firstHEDoublePhiRing()) {
774  n = 2;
775  neighbors[0] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi(), id.depth());
776  neighbors[1] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi() + 1, id.depth());
777  } else if (aieta == firstHFQuadPhiRing()) {
778  n = 2;
779  neighbors[0] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi(), id.depth());
780  if (id.iphi() == IPHI_MAX - 1)
781  neighbors[1] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), 1, id.depth());
782  else
783  neighbors[1] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi() + 2, id.depth());
784  } else if (aieta == firstHEQuadPhiRing()) {
785  n = 2;
786  neighbors[0] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi(), id.depth());
787  if (id.iphi() == IPHI_MAX - 1)
788  neighbors[1] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), 1, id.depth());
789  else
790  neighbors[1] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi() + 2, id.depth());
791  } else if (aieta == 1) {
792  neighbors[0] = HcalDetId(id.subdet(), -aieta * id.zside(), id.iphi(), id.depth());
793  } else if (aieta == firstHERing()) {
794  neighbors[0] = HcalDetId(HcalBarrel, (aieta - 1) * id.zside(), id.iphi(), 1);
795  } else if (aieta == firstHFRing()) {
796  neighbors[0] = HcalDetId(HcalEndcap, etaHF2HE_ * id.zside(), id.iphi(), 1);
797  } else
798  neighbors[0] = HcalDetId(id.subdet(), (aieta - 1) * id.zside(), id.iphi(), id.depth());
799 
800  if (!valid(neighbors[0]) && n == 2) {
801  if (!valid(neighbors[1]))
802  n = 0;
803  else {
804  n = 1;
805  neighbors[0] = neighbors[1];
806  }
807  }
808  if (n == 2 && !valid(neighbors[1]))
809  n = 1;
810  if (n == 1 && !valid(neighbors[0]))
811  n = 0;
812 
813  return n;
814 }
815 
817  HcalSubdetector subdet, int etaRing, int iphi, int zside, int& nDepthBins, int& startingBin) const {
818  if (subdet == HcalBarrel) {
820  startingBin = hcons_->getMinDepth(0, etaRing, iphi, zside);
821  if (etaRing == lastHBRing()) {
822  nDepthBins = hcons_->getDepthEta16(1, iphi, zside) - startingBin + 1;
823  } else {
824  nDepthBins = hcons_->getMaxDepth(0, etaRing, iphi, zside) - startingBin + 1;
825  }
826  } else {
827  if (etaRing <= 14) {
828  nDepthBins = 1;
829  startingBin = 1;
830  } else {
831  nDepthBins = 2;
832  startingBin = 1;
833  }
834  }
835  } else if (subdet == HcalEndcap) {
837  if (etaRing == firstHERing()) {
838  startingBin = hcons_->getDepthEta16(2, iphi, zside);
839  } else {
840  startingBin = hcons_->getMinDepth(1, etaRing, iphi, zside);
841  }
842  nDepthBins = hcons_->getMaxDepth(1, etaRing, iphi, zside) - startingBin + 1;
843  } else {
844  if (etaRing == firstHERing()) {
845  nDepthBins = 1;
846  startingBin = 3;
847  } else if (etaRing == 17) {
848  nDepthBins = 1;
849  startingBin = 1;
850  } else if (etaRing == lastHERing()) {
851  nDepthBins = 2;
852  startingBin = 1;
853  } else {
854  nDepthBins = (etaRing >= firstHETripleDepthRing()) ? 3 : 2;
855  startingBin = 1;
856  }
857  }
858  } else if (subdet == HcalForward) {
859  nDepthBins = maxDepthHF_;
860  startingBin = 1;
861  } else if (subdet == HcalOuter) {
862  nDepthBins = 1;
863  startingBin = 4;
864  } else {
865  edm::LogWarning("HCalGeom") << "Bad HCAL subdetector " << subdet;
866  }
867 }
868 
870  HcalSubdetector subdet = detId.subdet();
871  int ieta = detId.ieta();
872  int etaRing = detId.ietaAbs();
873  int depth = detId.depth();
874  int iphi = detId.iphi();
875  int zside = detId.zside();
876  int nDepthBins(0), startingBin(0);
877  depthBinInformation(subdet, etaRing, iphi, zside, nDepthBins, startingBin);
878 
879  // see if the new depth bin exists
880  ++depth;
881  if (depth >= (startingBin + nDepthBins)) {
882  // handle on a case-by-case basis
883  if (subdet == HcalBarrel && etaRing < lastHORing()) {
884  // HO
885  subdet = HcalOuter;
886  depth = 4;
887  } else if (subdet == HcalBarrel && etaRing == lastHBRing()) {
888  // overlap
889  subdet = HcalEndcap;
892  } else if (subdet == HcalEndcap && etaRing == lastHERing() - 1 && mode_ != HcalTopologyMode::SLHC) {
893  // guard ring HF29 is behind HE 28
894  subdet = HcalForward;
895  (ieta > 0) ? ++ieta : --ieta;
896  depth = 1;
897  } else if (subdet == HcalEndcap && etaRing == lastHERing() && mode_ != HcalTopologyMode::SLHC) {
898  // split cells go to bigger granularity. Ring 29 -> 28
899  (ieta > 0) ? --ieta : ++ieta;
900  } else {
901  // no more chances
902  detId = HcalDetId();
903  return false;
904  }
905  }
906  detId = HcalDetId(subdet, ieta, iphi, depth);
907  return validRaw(detId);
908 }
909 
911  HcalSubdetector subdet = detId.subdet();
912  int ieta = detId.ieta();
913  int etaRing = detId.ietaAbs();
914  int depth = detId.depth();
915  int iphi = detId.iphi();
916  int zside = detId.zside();
917  int nDepthBins, startingBin;
918  depthBinInformation(subdet, etaRing, iphi, zside, nDepthBins, startingBin);
919 
920  // see if the new depth bin exists
921  --depth;
922  if ((subdet == HcalOuter) || (subdet == HcalEndcap && etaRing == firstHERing())) {
923  subdet = HcalBarrel;
924  for (int i = 0; i < nEtaHB_; ++i) {
925  if (etaRing == etaBinsHB_[i].ieta) {
926  depth = etaBinsHB_[i].depthStart + etaBinsHB_[i].layer.size() - 1;
927  break;
928  }
929  }
930  } else if (subdet == HcalEndcap && etaRing == lastHERing() && depth == hcons_->getDepthEta29(iphi, zside, 0) &&
932  (ieta > 0) ? --ieta : ++ieta;
933  } else if (depth <= 0) {
934  if (subdet == HcalForward && etaRing == firstHFRing()) {
935  // overlap
936  subdet = HcalEndcap;
937  etaRing = etaHF2HE_;
938  ieta = (ieta > 0) ? etaRing : -etaRing;
939  for (const auto& i : etaBinsHE_) {
940  if (etaRing == i.ieta) {
941  depth = i.depthStart + i.layer.size() - 1;
942  break;
943  }
944  }
945  } else {
946  // no more chances
947  detId = HcalDetId();
948  return false;
949  }
950  }
951  detId = HcalDetId(subdet, ieta, detId.iphi(), depth);
952  return validRaw(detId);
953 }
954 
955 int HcalTopology::nPhiBins(int etaRing) const {
956  int lastPhiBin = singlePhiBins_;
958  lastPhiBin = doublePhiBins_ / 2;
959  else if (etaRing >= firstHEDoublePhiRing())
960  lastPhiBin = doublePhiBins_;
961  if (hcons_ && etaRing >= hcons_->getEtaRange(1).first && etaRing <= hcons_->getEtaRange(1).second) {
962  return nPhiBins(HcalBarrel, etaRing);
963  }
964  return lastPhiBin;
965 }
966 
967 int HcalTopology::nPhiBins(HcalSubdetector bc, int etaRing) const {
968  double phiTableVal;
969  if (bc == HcalForward) {
970  phiTableVal = dPhiTableHF[etaRing - firstHFRing_];
971  } else {
972  phiTableVal = dPhiTable[etaRing - firstHBRing_];
973  }
974  int lastPhiBin = 0;
975  if (phiTableVal != 0.0)
976  lastPhiBin = static_cast<int>((2._pi / phiTableVal) + 0.001);
977  return lastPhiBin;
978 }
979 
981  int maxd1 = std::max(maxDepthHB_, maxDepthHE_);
982  int maxd2 = std::max(maxDepthHF_, minMaxDepth_);
983  return std::max(maxd1, maxd2);
984 }
985 
987  if (bc == HcalBarrel)
988  return maxDepthHB_;
989  else if (bc == HcalEndcap)
990  return maxDepthHE_;
991  else if (bc == HcalForward)
992  return maxDepthHF_;
993  else
994  return 4;
995 }
996 
997 int HcalTopology::etaRing(HcalSubdetector bc, double abseta) const {
998  int etaring = firstHBRing_;
999  if (bc == HcalForward) {
1000  etaring = firstHFRing_;
1001  for (unsigned int k = 0; k < etaTableHF.size() - 1; ++k) {
1002  if (abseta < etaTableHF[k + 1]) {
1003  etaring += k;
1004  break;
1005  }
1006  }
1007  } else {
1008  for (unsigned int k = 0; k < etaTable.size() - 1; ++k) {
1009  if (abseta < etaTable[k + 1]) {
1010  etaring += k;
1011  break;
1012  }
1013  }
1014  if (abseta >= etaTable[etaTable.size() - 1])
1015  etaring = lastHERing_;
1016  }
1017  return etaring;
1018 }
1019 
1020 int HcalTopology::phiBin(HcalSubdetector bc, int etaring, double phi) const {
1021  //put phi in correct range (0->2pi)
1022  int index(0);
1023  if (bc == HcalBarrel) {
1024  index = (etaring - firstHBRing_);
1025  phi -= phioff[0];
1026  } else if (bc == HcalEndcap) {
1027  index = (etaring - firstHBRing_);
1028  phi -= phioff[1];
1029  } else if (bc == HcalForward) {
1030  index = (etaring - firstHFRing_);
1031  if (index < static_cast<int>(dPhiTableHF.size())) {
1032  if (index >= 0 && unitPhiHF[index] > 2)
1033  phi -= phioff[4];
1034  else
1035  phi -= phioff[2];
1036  }
1037  }
1038  if (index < 0)
1039  index = 0;
1040  if (phi < 0.0)
1041  phi += 2._pi;
1042  else if (phi > 2._pi)
1043  phi -= 2._pi;
1044  int phibin(1), unit(1);
1045  if (bc == HcalForward) {
1046  if (index < (int)(dPhiTableHF.size())) {
1047  unit = unitPhiHF[index];
1048  phibin = static_cast<int>(phi / dPhiTableHF[index]) + 1;
1049  }
1050  } else {
1051  if (index < (int)(dPhiTable.size())) {
1052  phibin = static_cast<int>(phi / dPhiTable[index]) + 1;
1053  unit = unitPhi[index];
1054  }
1055  }
1056  int iphi(phibin);
1057  if (unit == 2)
1058  iphi = (phibin - 1) * 2 + 1;
1059  else if (unit == 4)
1060  iphi = (phibin - 1) * 4 + 3;
1061  return iphi;
1062 }
1063 
1064 void HcalTopology::getDepthSegmentation(const unsigned ring, std::vector<int>& readoutDepths, const bool one) const {
1065  // if it doesn't exist, return the first entry with a lower index. So if we only
1066  // have entries for 1 and 17, any input from 1-16 should return the entry for ring 1
1067  SegmentationMap::const_iterator pos;
1068  if (!one) {
1069  pos = depthSegmentation_.upper_bound(ring);
1070  if (pos == depthSegmentation_.begin()) {
1071  throw cms::Exception("HcalTopology") << "No depth segmentation found for ring" << ring;
1072  }
1073  } else {
1074  pos = depthSegmentationOne_.upper_bound(ring);
1075  if (pos == depthSegmentationOne_.begin()) {
1076  throw cms::Exception("HcalTopology") << "No depth segmentation found for ring" << ring;
1077  }
1078  }
1079  --pos;
1080  // pos now refers to the last element with key <= ring.
1081  readoutDepths = pos->second;
1082 }
1083 
1084 void HcalTopology::setDepthSegmentation(const unsigned ring, const std::vector<int>& readoutDepths, const bool one) {
1085  if (one) {
1086  depthSegmentationOne_[ring] = readoutDepths;
1087  } else {
1088  depthSegmentation_[ring] = readoutDepths;
1089  }
1090 }
1091 
1092 std::pair<int, int> HcalTopology::segmentBoundaries(const unsigned ring, const unsigned depth, const bool one) const {
1093  std::vector<int> readoutDepths;
1094  getDepthSegmentation(ring, readoutDepths, one);
1095  int d1 = std::lower_bound(readoutDepths.begin(), readoutDepths.end(), depth) - readoutDepths.begin();
1096  int d2 = std::upper_bound(readoutDepths.begin(), readoutDepths.end(), depth) - readoutDepths.begin();
1097  return std::pair<int, int>(d1, d2);
1098 }
1099 
1101  double eta(0);
1102  switch (subdet) {
1103  case (HcalBarrel):
1104  if (lastHBRing_ < (int)(etaTable.size()))
1106  break;
1107  case (HcalEndcap):
1108  if (lastHERing_ < (int)(etaTable.size()) && nEtaHE_ > 0)
1110  break;
1111  case (HcalOuter):
1112  if (lastHORing_ < (int)(etaTable.size()))
1114  break;
1115  case (HcalForward):
1116  if (!etaTableHF.empty())
1117  eta = etaTableHF[etaTableHF.size() - 1];
1118  break;
1119  default:
1120  eta = 0;
1121  }
1122  return eta;
1123 }
1124 std::pair<double, double> HcalTopology::etaRange(HcalSubdetector subdet, int keta) const {
1125  int ieta = (keta > 0) ? keta : -keta;
1126  if (subdet == HcalForward) {
1127  if (ieta >= firstHFRing_) {
1128  unsigned int ii = (unsigned int)(ieta - firstHFRing_);
1129  if (ii + 1 < etaTableHF.size())
1130  return std::pair<double, double>(etaTableHF[ii], etaTableHF[ii + 1]);
1131  }
1132  } else {
1133  int ietal = (mode_ == HcalTopologyMode::LHC && ieta == lastHERing_ - 1) ? (ieta + 1) : ieta;
1134  if ((ietal < (int)(etaTable.size())) && (ieta > 0))
1135  return std::pair<double, double>(etaTable[ieta - 1], etaTable[ietal]);
1136  }
1137  return std::pair<double, double>(0, 0);
1138 }
1139 
1140 unsigned int HcalTopology::detId2denseIdPreLS1(const DetId& id) const {
1141  HcalDetId hid(id);
1142  const HcalSubdetector sd(hid.subdet());
1143  const int ip(hid.iphi());
1144  const int ie(hid.ietaAbs());
1145  const int dp(hid.depth());
1146  const int zn(hid.zside() < 0 ? 1 : 0);
1147  unsigned int retval =
1148  ((sd == HcalBarrel)
1149  ? (ip - 1) * 18 + dp - 1 + ie - (ie < 16 ? 1 : 0) + zn * kHBhalf
1150  : ((sd == HcalEndcap)
1151  ? 2 * kHBhalf + (ip - 1) * 8 + (ip / 2) * 20 +
1152  ((ie == 16 || ie == 17)
1153  ? ie - 16
1154  : ((ie >= 18 && ie <= 20)
1155  ? 2 + 2 * (ie - 18) + dp - 1
1156  : ((ie >= 21 && ie <= 26)
1157  ? 8 + 2 * (ie - 21) + dp - 1
1158  : ((ie >= 27 && ie <= 28) ? 20 + 3 * (ie - 27) + dp - 1
1159  : 26 + 2 * (ie - 29) + dp - 1)))) +
1160  zn * kHEhalf
1161  : ((sd == HcalOuter)
1162  ? 2 * kHBhalf + 2 * kHEhalf + (ip - 1) * 15 + (ie - 1) + zn * kHOhalf
1163  : ((sd == HcalForward) ? 2 * kHBhalf + 2 * kHEhalf + 2 * kHOhalf + ((ip - 1) / 4) * 4 +
1164  ((ip - 1) / 2) * 22 + 2 * (ie - 29) + (dp - 1) + zn * kHFhalf
1165  : 0xFFFFFFFFu))));
1166  return retval;
1167 }
1168 
1169 unsigned int HcalTopology::detId2denseIdHB(const DetId& id) const {
1170  HcalDetId hid(id);
1171  const int ip(hid.iphi());
1172  const int ie(hid.ietaAbs());
1173  const int dp(hid.depth());
1174  const int zn(hid.zside() < 0 ? 1 : 0);
1175  unsigned int retval = 0xFFFFFFFFu;
1176  if (topoVersion_ == 0) {
1177  retval = (ip - 1) * 18 + dp - 1 + ie - (ie < 16 ? 1 : 0) + zn * kHBhalf;
1178  } else if (topoVersion_ == 10) {
1179  retval = (dp - 1) + maxDepthHB_ * (ip - 1);
1180  if (hid.ieta() > 0)
1181  retval += maxDepthHB_ * IPHI_MAX * (hid.ieta() - firstHBRing());
1182  else
1183  retval += maxDepthHB_ * IPHI_MAX * (hid.ieta() + lastHBRing() + nEtaHB_);
1184  }
1185  return retval;
1186 }
1187 
1188 unsigned int HcalTopology::detId2denseIdHE(const DetId& id) const {
1189  HcalDetId hid(id);
1190  const int ip(hid.iphi());
1191  const int ie(hid.ietaAbs());
1192  const int dp(hid.depth());
1193  const int zn(hid.zside() < 0 ? 1 : 0);
1194  unsigned int retval = 0xFFFFFFFFu;
1195  if (topoVersion_ == 0) {
1196  retval = (ip - 1) * 8 + (ip / 2) * 20 +
1197  ((ie == 16 || ie == 17)
1198  ? ie - 16
1199  : ((ie >= 18 && ie <= 20)
1200  ? 2 + 2 * (ie - 18) + dp - 1
1201  : ((ie >= 21 && ie <= 26) ? 8 + 2 * (ie - 21) + dp - 1
1202  : ((ie >= 27 && ie <= 28) ? 20 + 3 * (ie - 27) + dp - 1
1203  : 26 + 2 * (ie - 29) + dp - 1)))) +
1204  zn * kHEhalf;
1205  } else if (topoVersion_ == 10) {
1206  retval = (dp - 1) + maxDepthHE_ * (ip - 1);
1207  if (hid.ieta() > 0)
1208  retval += maxDepthHE_ * maxPhiHE_ * (hid.ieta() - firstHERing());
1209  else
1210  retval += maxDepthHE_ * maxPhiHE_ * (hid.ieta() + lastHERing() + nEtaHE_);
1211  }
1212  return retval;
1213 }
1214 
1215 unsigned int HcalTopology::detId2denseIdHO(const DetId& id) const {
1216  HcalDetId hid(id);
1217  const int ip(hid.iphi());
1218  const int ie(hid.ietaAbs());
1219  const int zn(hid.zside() < 0 ? 1 : 0);
1220 
1221  unsigned int retval = 0xFFFFFFFFu;
1222  if (topoVersion_ == 0) {
1223  retval = (ip - 1) * 15 + (ie - 1) + zn * kHOhalf;
1224  } else if (topoVersion_ == 10) {
1225  if (hid.ieta() > 0)
1226  retval = (ip - 1) + IPHI_MAX * (hid.ieta() - 1);
1227  else
1228  retval = (ip - 1) + IPHI_MAX * (30 + hid.ieta());
1229  }
1230  return retval;
1231 }
1232 
1233 unsigned int HcalTopology::detId2denseIdHF(const DetId& id) const {
1234  HcalDetId hid(id);
1235  const int ip(hid.iphi());
1236  const int ie(hid.ietaAbs());
1237  const int dp(hid.depth());
1238  const int zn(hid.zside() < 0 ? 1 : 0);
1239 
1240  unsigned int retval = 0xFFFFFFFFu;
1241  if (topoVersion_ == 0) {
1242  retval = ((ip - 1) / 4) * 4 + ((ip - 1) / 2) * 22 + 2 * (ie - 29) + (dp - 1) + zn * kHFhalf;
1243  } else if (topoVersion_ == 10) {
1244  retval = dp - 1 + 2 * (ip - 1);
1245  if (hid.ieta() > 0)
1246  retval += maxDepthHF_ * IPHI_MAX * (hid.ieta() - 29);
1247  else
1248  retval += maxDepthHF_ * IPHI_MAX * ((41 + 13) + hid.ieta());
1249  }
1250  return retval;
1251 }
1252 
1253 unsigned int HcalTopology::detId2denseIdHT(const DetId& id) const {
1254  HcalTrigTowerDetId tid(id);
1255  int zside = tid.zside();
1256  unsigned int ietaAbs = tid.ietaAbs();
1257  unsigned int iphi = tid.iphi();
1258  unsigned int ivers = tid.version();
1259 
1260  unsigned int index;
1261  if (ivers == 0) {
1262  if ((iphi - 1) % 4 == 0)
1263  index = (iphi - 1) * 32 + (ietaAbs - 1) - (12 * ((iphi - 1) / 4));
1264  else
1265  index = (iphi - 1) * 28 + (ietaAbs - 1) + (4 * (((iphi - 1) / 4) + 1));
1266  if (zside == -1)
1267  index += kHThalf;
1268  } else {
1269  index = kHTSizePreLS1;
1270  if (zside == -1)
1271  index += ((kHTSizePhase1 - kHTSizePreLS1) / 2);
1272  index += (36 * (ietaAbs - 30) + ((iphi - 1) / 2));
1273  }
1274 
1275  return index;
1276 }
1277 
1278 unsigned int HcalTopology::detId2denseIdCALIB(const DetId& id) const {
1279  HcalCalibDetId tid(id);
1280  int channel = tid.cboxChannel();
1281  int ieta = tid.ieta();
1282  int iphi = tid.iphi();
1283  int zside = tid.zside();
1284  unsigned int index = 0xFFFFFFFFu;
1285 
1287  HcalSubdetector subDet = tid.hcalSubdet();
1288 
1289  if (subDet == HcalBarrel) {
1290  //std::cout<<"CALIB_HB: ";
1291  //dphi = 4 (18 phi values), 3 channel types (0,1,2), eta = -1 or 1
1292  //total of 18*3*2=108 channels
1294  auto kndx = std::find(chanCalibHB_, chanCalibHB_ + nchanCalibHB_, channel);
1295  if (indx != etaCalibHB_ + nEtaCalibHB_ && kndx != chanCalibHB_ + nchanCalibHB_) {
1296  int keta = static_cast<int>(indx - etaCalibHB_);
1297  int kchn = static_cast<int>(kndx - chanCalibHB_);
1298  index = ((iphi + 1) / mPhiCalibHB_ - 1) + kPhiCalibHB_ * kchn + keta * kchanCalibHB_ + kOffCalibHB_;
1299  }
1300  } else if (subDet == HcalEndcap) {
1301  //std::cout<<"CALIB_HE: ";
1302  //dphi = 4 (18 phi values), 7 channel types (0,1,2,3,4,5,6), eta = -1/+1
1303  //total of 18*7*2=252 channels
1304  // if (channel > 2) channel -= 1;
1306  if (indx != etaCalibHE_ + nEtaCalibHE_) {
1307  int keta = static_cast<int>(indx - etaCalibHE_);
1308  auto kndx = std::find(chanCalibHE1_, chanCalibHE1_ + nchanCalibHE1_, channel);
1309  if (kndx != chanCalibHE1_ + nchanCalibHE1_) {
1310  int kchn = static_cast<int>(kndx - chanCalibHE1_);
1311  index = ((iphi + 1) / mPhiCalibHE_ - 1) + kPhiCalibHE_ * kchn + keta * kchanCalibHE1_ + kOffCalibHE1_;
1312  } else if (channel == chanCalibHE2_) {
1313  index = ((iphi + 1) / mPhiCalibHE_ - 1) + keta * kchanCalibHE2_ + kOffCalibHE2_;
1314  }
1315  }
1316  } else if (subDet == HcalForward) {
1317  //std::cout<<"CALIB_HF: ";
1318  //dphi = 18 (4 phi values), 3 channel types (0,1,8), eta = -1 or +1
1319  // or iphi = 1; channel = 9, eta = -1 or +1
1320  //total channels 4*3*2=24 + 2
1322  if (indx != etaCalibHF_ + nEtaCalibHF_) {
1323  int keta = static_cast<int>(indx - etaCalibHF_);
1324  auto kndx = std::find(chanCalibHF1_, chanCalibHF1_ + nchanCalibHF1_, channel);
1325  if (kndx != chanCalibHF1_ + nchanCalibHF1_) {
1326  int kchn = static_cast<int>(kndx - chanCalibHF1_);
1327  index = ((iphi - 1) / mPhiCalibHF1_) + kPhiCalibHF1_ * kchn + keta * kchanCalibHF1_ + kOffCalibHF1_;
1328  } else if (channel == chanCalibHF2_) {
1329  index = keta * kchanCalibHF2_ + kOffCalibHF2_;
1330  }
1331  }
1332  } else if (subDet == HcalOuter) {
1333  //std::cout<<"CALIB_HO: ";
1335  if (indx != etaCalibHO_ + nEtaCalibHO_) {
1336  int keta = static_cast<int>(indx - etaCalibHO_);
1337  auto kndx = std::find(chanCalibHO_, chanCalibHO_ + nchanCalibHO_, channel);
1338  //there are 5 special calib crosstalk channels, one in each ring
1339  if (channel == chanCalibHOs_) {
1340  index = keta + kOffCalibHO2_;
1341  } else if (kndx != chanCalibHO_ + nchanCalibHO_) {
1342  //for HOM/HOP dphi = 6 (12 phi values), 2 channel types (0,1), eta = -2,-1 or 1,2
1343  //for HO0/YB0 dphi = 12 (6 phi values), 2 channel types (0,1), eta = 0
1344  int kchn = static_cast<int>(kndx - chanCalibHO_);
1345  int kphi = (ieta == 0) ? ((iphi + 1) / mPhiCalibHO0_ - 1) : ((iphi + 1) / mPhiCalibHO1_ - 1);
1346  if (ieta < 0) {
1347  index = kphi + kPhiCalibHO2_ * kchn + kPhiCalibHO1_ * keta + kOffCalibHO1_;
1348  } else if (ieta > 0) {
1349  index = kphi + kPhiCalibHO2_ * kchn + kPhiCalibHO1_ * (keta - 1) + kPhiCalibHO0_ + kOffCalibHO1_;
1350  } else {
1351  index = kphi + kPhiCalibHO2_ * kchn + kPhiCalibHO1_ * keta + kOffCalibHO1_;
1352  }
1353  }
1354  }
1355  } else {
1356  edm::LogWarning("HGCalGeom") << "HCAL Det Id not valid!";
1357  }
1358  } else if (tid.calibFlavor() == HcalCalibDetId::HOCrosstalk) {
1359  //std::cout<<"HX: ";
1360  //for YB0/HO0 phi is grouped in 6 groups of 6 with dphi=2 but the transitions are 1 or 3
1361  // in such a way that the %36 operation yeilds unique values for every iphi
1362  //ieta = 0 for HO2M/HO1M ieta=2 for HO1P/HO2P;
1363  //ieta = 1 YB0/HO0;
1364  int kphi = ((std::abs(ieta) == etaCalibHOX_[0]) ? ((iphi % 2 == 0) ? (iphi / 2 - 1) : (iphi - 1) / 2) : (iphi - 1));
1365  if (std::abs(ieta) == etaCalibHOX_[0]) {
1366  index = kphi + (((zside + 1) * nPhiCalibHOX_[0]) / 2) + nPhiCalibHOX_[1] + kOffCalibHOX_;
1367  } else if (std::abs(ieta) == etaCalibHOX_[1]) {
1368  index = kphi + ((zside + 1) * nPhiCalibHOX_[1]) + kOffCalibHOX_;
1369  }
1370  } else if (tid.calibFlavor() == HcalCalibDetId::HBX) {
1371  if (std::abs(ieta) == etaCalibHBX_) {
1372  index = kOffCalibHBX_ + (iphi - 1) + (zside + 1) * kPhiCalibHBX_ / 2;
1373  }
1374  } else if (tid.calibFlavor() == HcalCalibDetId::HEX) {
1375  if (std::abs(ieta) == etaCalibHEX_[0]) {
1376  index = kOffCalibHEX_ + (iphi - 1) / mPhiCalibHEX_ + (zside + 1) * kPhiCalibHEX_ / 2;
1377  } else if (std::abs(ieta) == etaCalibHEX_[1]) {
1378  index = kOffCalibHEX_ + (iphi - 1) / mPhiCalibHEX_ + (zside + 1) * kPhiCalibHEX_ / 2 + 2 * kPhiCalibHEX_;
1379  }
1380  }
1381  //std::cout << " " << ieta << " " << zside << " " << iphi << " " << depth << " " << index << std::endl;
1382  return index;
1383 }
1384 
1385 HcalCalibDetId HcalTopology::denseId2detIdCALIB(const unsigned int& hid) const {
1387  unsigned int hid0(hid);
1388  if (hid0 < kOffCalibHOX_) {
1389  HcalSubdetector subdet(HcalEmpty);
1390  int id0, keta, ieta, iphi, ichan, ctype;
1391  if (hid0 < kOffCalibHE1_) {
1392  id0 = static_cast<int>(hid0);
1393  subdet = HcalBarrel;
1394  iphi = hid0 % kPhiCalibHB_;
1395  keta = (hid0 < kchanCalibHB_) ? 0 : 1;
1396  ieta = etaCalibHB_[keta];
1397  ichan = (id0 - iphi - keta * kchanCalibHB_) / kPhiCalibHB_;
1398  iphi = mPhiCalibHB_ * (iphi + 1) - 1;
1399  ctype = chanCalibHB_[ichan];
1400  } else if (hid0 < kOffCalibHF1_) {
1401  hid0 -= kOffCalibHE1_;
1402  id0 = static_cast<int>(hid0);
1403  subdet = HcalEndcap;
1404  iphi = hid0 % kPhiCalibHE_;
1405  keta = (hid0 < kchanCalibHE1_) ? 0 : 1;
1406  ieta = etaCalibHE_[keta];
1407  ichan = (id0 - iphi - keta * kchanCalibHE1_) / kPhiCalibHE_;
1408  iphi = mPhiCalibHE_ * (iphi + 1) - 1;
1409  ctype = chanCalibHE1_[ichan];
1410  } else if (hid0 < kOffCalibHO1_) {
1411  hid0 -= kOffCalibHF1_;
1412  id0 = static_cast<int>(hid0);
1413  subdet = HcalForward;
1414  iphi = hid0 % kPhiCalibHF1_;
1415  keta = (hid0 < kchanCalibHF1_) ? 0 : 1;
1416  ieta = etaCalibHF_[keta];
1417  ichan = (id0 - iphi - keta * kchanCalibHF1_) / kPhiCalibHF1_;
1418  iphi = mPhiCalibHF1_ * iphi + 1;
1419  ctype = chanCalibHF1_[ichan];
1420  } else if (hid0 < kOffCalibHO2_) {
1421  hid0 -= kOffCalibHO1_;
1422  id0 = static_cast<int>(hid0);
1423  subdet = HcalOuter;
1424  unsigned int kphi = hid0 % kPhiCalibHO2_;
1425  if (kphi < 2 * kPhiCalibHO1_) {
1426  ieta = (kphi >= kPhiCalibHO1_) ? etaCalibHO_[1] : etaCalibHO_[0];
1427  iphi = kphi % kPhiCalibHO1_;
1428  ichan = (id0 - iphi - (ieta + 2) * kPhiCalibHO1_) / kPhiCalibHO2_;
1429  iphi = (iphi + 1) * mPhiCalibHO1_ - 1;
1430  } else if (kphi < (2 * kPhiCalibHO1_ + kPhiCalibHO0_)) {
1431  ieta = etaCalibHO_[2];
1432  iphi = kphi % kPhiCalibHO0_;
1433  ichan = (id0 - iphi - (ieta + 2) * kPhiCalibHO1_) / kPhiCalibHO2_;
1434  iphi = (iphi + 1) * mPhiCalibHO0_ - 1;
1435  } else {
1436  ieta = (kphi >= 3 * kPhiCalibHO1_ + kPhiCalibHO0_) ? etaCalibHO_[4] : etaCalibHO_[3];
1437  iphi = kphi % kPhiCalibHO1_;
1438  ichan = (id0 - iphi - (ieta + 1) * kPhiCalibHO1_ - kPhiCalibHO0_) / kPhiCalibHO2_;
1439  iphi = (iphi + 1) * mPhiCalibHO1_ - 1;
1440  }
1441  ctype = chanCalibHO_[ichan];
1442  } else if (hid0 < kOffCalibHE2_) {
1443  hid0 -= kOffCalibHO2_;
1444  subdet = HcalOuter;
1445  iphi = phiCalibHO_[hid0];
1446  ctype = static_cast<int>(chanCalibHOs_);
1447  ieta = etaCalibHO_[hid0];
1448  } else if (hid0 < kOffCalibHF2_) {
1449  hid0 -= kOffCalibHE2_;
1450  id0 = static_cast<int>(hid0);
1451  subdet = HcalEndcap;
1452  iphi = hid0 % kPhiCalibHE_;
1453  keta = (hid0 < kchanCalibHE2_) ? 0 : 1;
1454  ieta = etaCalibHE_[keta];
1455  iphi = mPhiCalibHE_ * (iphi + 1) - 1;
1456  ctype = chanCalibHE2_;
1457  } else {
1458  hid0 -= kOffCalibHF2_;
1459  id0 = static_cast<int>(hid0);
1460  subdet = HcalForward;
1461  keta = (hid0 < kchanCalibHF2_) ? 0 : 1;
1462  ieta = etaCalibHF_[keta];
1463  iphi = phiCalibHF2_;
1464  ctype = chanCalibHF2_;
1465  }
1466  id = HcalCalibDetId(subdet, ieta, iphi, ctype);
1467 #ifdef EDM_ML_DEBUG
1468  edm::LogVerbatim("HCalGeom") << "CalibrationBox: " << hid << " o/p " << ieta << ":" << iphi << ":" << ichan << ":"
1469  << ctype << " " << id;
1470 #endif
1471  } else if (hid < kOffCalibHBX_) {
1472  hid0 -= kOffCalibHOX_;
1473  int iphi, ieta;
1474  if (hid0 < nPhiCalibHOX_[1]) {
1475  iphi = static_cast<int>(hid0) + 1;
1476  ieta = -etaCalibHOX_[1];
1477  } else if (hid0 < (nPhiCalibHOX_[1] + nPhiCalibHOX_[0])) {
1478  hid0 -= nPhiCalibHOX_[1];
1479  iphi = ((hid0 + phiCalibHOX1_) % phiCalibHOX2_ < phiCalibHOX3_) ? 2 * hid0 + 1 : 2 * hid0 + 2;
1480  ieta = -etaCalibHOX_[0];
1481  } else if (hid0 < (nPhiCalibHOX_[1] + 2 * nPhiCalibHOX_[0])) {
1482  hid0 -= (nPhiCalibHOX_[1] + nPhiCalibHOX_[0]);
1483  iphi = ((hid0 + phiCalibHOX1_) % phiCalibHOX2_ < phiCalibHOX3_) ? 2 * hid0 + 1 : 2 * hid0 + 2;
1484  ieta = etaCalibHOX_[0];
1485  } else {
1486  hid0 -= (nPhiCalibHOX_[1] + 2 * nPhiCalibHOX_[0]);
1487  iphi = static_cast<int>(hid0) + 1;
1488  ieta = etaCalibHOX_[1];
1489  }
1491 #ifdef EDM_ML_DEBUG
1492  edm::LogVerbatim("HCalGeom") << "HOCrossTalk: " << hid << ":" << hid0 << " o/p " << ieta << ":" << iphi << " "
1493  << id;
1494 #endif
1495  } else if (hid < kOffCalibHEX_) {
1496  hid0 -= kOffCalibHBX_;
1497  int ieta = (hid0 >= kPhiCalibHBX_) ? etaCalibHBX_ : -etaCalibHBX_;
1498  int iphi = (hid0 % kPhiCalibHBX_) + 1;
1500 #ifdef EDM_ML_DEBUG
1501  edm::LogVerbatim("HCalGeom") << "HBX: " << hid << ":" << hid0 << " o/p " << ieta << ":" << iphi << " " << id;
1502 #endif
1503  } else if (hid < kOffCalibHFX_) {
1504  hid0 -= kOffCalibHEX_;
1505  int iphi = 2 * (hid0 % kPhiCalibHEX_) + 1;
1506  int ieta = ((hid0 < kPhiCalibHEX_)
1507  ? -etaCalibHEX_[0]
1508  : ((hid0 < 2 * kPhiCalibHEX_) ? etaCalibHEX_[0]
1509  : ((hid0 < 3 * kPhiCalibHEX_) ? -etaCalibHEX_[1] : etaCalibHEX_[1])));
1511 #ifdef EDM_ML_DEBUG
1512  edm::LogVerbatim("HCalGeom") << "HEX: " << hid << ":" << hid0 << " o/p " << ieta << ":" << iphi << " " << id;
1513 #endif
1514  }
1515  return id;
1516 }
1517 
1518 unsigned int HcalTopology::detId2denseId(const DetId& id) const {
1519  unsigned int retval(0);
1520  if (topoVersion_ == 0) { // pre-LS1
1521  retval = detId2denseIdPreLS1(id);
1522  } else if (topoVersion_ == 10) {
1523  HcalDetId hid(id);
1524  if (hid.subdet() == HcalBarrel) {
1525  retval = (hid.depth() - 1) + maxDepthHB_ * (hid.iphi() - 1);
1526  if (hid.ieta() > 0)
1527  retval += maxDepthHB_ * IPHI_MAX * (hid.ieta() - firstHBRing());
1528  else
1529  retval += maxDepthHB_ * IPHI_MAX * (hid.ieta() + lastHBRing() + nEtaHB_);
1530  } else if (hid.subdet() == HcalEndcap) {
1531  retval = HBSize_;
1532  retval += (hid.depth() - 1) + maxDepthHE_ * (hid.iphi() - 1);
1533  if (hid.ieta() > 0)
1534  retval += maxDepthHE_ * maxPhiHE_ * (hid.ieta() - firstHERing());
1535  else
1536  retval += maxDepthHE_ * maxPhiHE_ * (hid.ieta() + lastHERing() + nEtaHE_);
1537  } else if (hid.subdet() == HcalOuter) {
1538  retval = HBSize_ + HESize_;
1539  if (hid.ieta() > 0)
1540  retval += (hid.iphi() - 1) + IPHI_MAX * (hid.ieta() - 1);
1541  else
1542  retval += (hid.iphi() - 1) + IPHI_MAX * (30 + hid.ieta());
1543  } else if (hid.subdet() == HcalForward) {
1544  retval = HBSize_ + HESize_ + HOSize_;
1545  retval += (hid.depth() - 1) + maxDepthHF_ * (hid.iphi() - 1);
1546  if (hid.ieta() > 0)
1547  retval += maxDepthHF_ * IPHI_MAX * (hid.ieta() - 29);
1548  else
1549  retval += maxDepthHF_ * IPHI_MAX * ((41 + 13) + hid.ieta());
1550  } else {
1551  retval = 0xFFFFFFFu;
1552  }
1553  }
1554 #ifdef EDM_ML_DEBUG
1555  edm::LogVerbatim("HcalGeom") << "DetId2Dense " << topoVersion_ << " ID " << std::hex << id.rawId() << std::dec
1556  << " | " << HcalDetId(id) << " : " << std::hex << retval << std::dec;
1557 #endif
1558  return retval;
1559 }
1560 
1561 DetId HcalTopology::denseId2detId(unsigned int denseid) const {
1563  int ie(0);
1564  int ip(0);
1565  int dp(0);
1566  int in(denseid);
1567  int iz(1);
1568  if (topoVersion_ == 0) { //DL// pre-LS1
1569  if (denseid < kSizeForDenseIndexingPreLS1) {
1570  if (in > 2 * (kHBhalf + kHEhalf + kHOhalf) - 1) { // HF
1571  sd = HcalForward;
1572  in -= 2 * (kHBhalf + kHEhalf + kHOhalf);
1573  iz = (in < kHFhalf ? 1 : -1);
1574  in %= kHFhalf;
1575  ip = 4 * (in / 48);
1576  in %= 48;
1577  ip += 1 + (in > 21 ? 2 : 0);
1578  if (3 == ip % 4)
1579  in -= 22;
1580  ie = 29 + in / 2;
1581  dp = 1 + in % 2;
1582  } else if (in > 2 * (kHBhalf + kHEhalf) - 1) { // HO
1583  sd = HcalOuter;
1584  in -= 2 * (kHBhalf + kHEhalf);
1585  iz = (in < kHOhalf ? 1 : -1);
1586  in %= kHOhalf;
1587  dp = 4;
1588  ip = 1 + in / 15;
1589  ie = 1 + (in - 15 * (ip - 1));
1590  } else if (in > 2 * kHBhalf - 1) { // Endcap
1591  sd = HcalEndcap;
1592  in -= 2 * kHBhalf;
1593  iz = (in < kHEhalf ? 1 : -1);
1594  in %= kHEhalf;
1595  ip = 2 * (in / 36);
1596  in %= 36;
1597  ip += 1 + in / 28;
1598  if (0 == ip % 2)
1599  in %= 28;
1600  ie = 15 + (in < 2 ? 1 + in : 2 + (in < 20 ? 1 + (in - 2) / 2 : 9 + (in < 26 ? 1 + (in - 20) / 3 : 3)));
1601  dp = (in < 1
1602  ? 3
1603  : (in < 2 ? 1 : (in < 20 ? 1 + (in - 2) % 2 : (in < 26 ? 1 + (in - 20) % 3 : (1 + (in - 26) % 2)))));
1604  } else { // barrel
1605  iz = (in < kHBhalf ? 1 : -1);
1606  in %= kHBhalf;
1607  ip = in / 18 + 1;
1608  in %= 18;
1609  if (in < 14) {
1610  dp = 1;
1611  ie = in + 1;
1612  } else {
1613  in %= 14;
1614  dp = 1 + in % 2;
1615  ie = 15 + in / 2;
1616  }
1617  }
1618  }
1619  } else if (topoVersion_ == 10) {
1620  if (denseid < ncells()) {
1621  if (denseid >= (HBSize_ + HESize_ + HOSize_)) {
1622  sd = HcalForward;
1623  in -= (HBSize_ + HESize_ + HOSize_);
1624  dp = (in % maxDepthHF_) + 1;
1625  ip = (in - dp + 1) % (maxDepthHF_ * IPHI_MAX);
1626  ip = (ip / maxDepthHF_) + 1;
1627  ie = (in - dp + 1 - maxDepthHF_ * (ip - 1)) / (IPHI_MAX * maxDepthHF_);
1628  if (ie > 12) {
1629  ie = 54 - ie;
1630  iz = -1;
1631  } else {
1632  ie += 29;
1633  iz = 1;
1634  }
1635  } else if (denseid >= (HBSize_ + HESize_)) {
1636  sd = HcalOuter;
1637  in -= (HBSize_ + HESize_);
1638  dp = 4;
1639  ip = (in % IPHI_MAX) + 1;
1640  ie = (in - ip + 1) / IPHI_MAX;
1641  if (ie > 14) {
1642  ie = 30 - ie;
1643  iz = -1;
1644  } else {
1645  ie += 1;
1646  iz = 1;
1647  }
1648  } else if (denseid >= (HBSize_)) {
1649  sd = HcalEndcap;
1650  in -= (HBSize_);
1651  dp = (in % maxDepthHE_) + 1;
1652  ip = (in - dp + 1) % (maxDepthHE_ * maxPhiHE_);
1653  ip = (ip / maxDepthHE_) + 1;
1654  ie = (in - dp + 1 - maxDepthHE_ * (ip - 1)) / (maxPhiHE_ * maxDepthHE_);
1655  if (ie >= nEtaHE_) {
1656  ie = lastHERing() + nEtaHE_ - ie;
1657  iz = -1;
1658  } else {
1659  ie = firstHERing() + ie;
1660  iz = 1;
1661  }
1662  } else {
1663  sd = HcalBarrel;
1664  dp = (in % maxDepthHB_) + 1;
1665  ip = (in - dp + 1) % (maxDepthHB_ * IPHI_MAX);
1666  ip = (ip / maxDepthHB_) + 1;
1667  ie = (in - dp + 1 - maxDepthHB_ * (ip - 1)) / (IPHI_MAX * maxDepthHB_);
1668  if (ie >= nEtaHB_) {
1669  ie = lastHBRing() + nEtaHB_ - ie;
1670  iz = -1;
1671  } else {
1672  ie = firstHBRing() + ie;
1673  iz = 1;
1674  }
1675  }
1676  }
1677  }
1678  HcalDetId hid(sd, iz * int(ie), ip, dp);
1679 #ifdef EDM_ML_DEBUG
1680  edm::LogVerbatim("HcalGeom") << "Dens2Det " << topoVersion_ << " i/p " << std::hex << denseid << " : " << hid.rawId()
1681  << std::dec << " | " << hid;
1682 #endif
1683  return hid;
1684 }
1685 
1686 unsigned int HcalTopology::ncells() const { return HBSize_ + HESize_ + HOSize_ + HFSize_; }
1687 
HcalOther
Definition: HcalAssistant.h:38
HcalTopology::kPhiCalibHBX_
static constexpr unsigned int kPhiCalibHBX_
Definition: HcalTopology.h:301
HcalTopology::lastHFRing_
int lastHFRing_
Definition: HcalTopology.h:195
HcalTopology::CALIBSize_
unsigned int CALIBSize_
Definition: HcalTopology.h:213
HcalTopology::kPhiCalibHF1_
static constexpr unsigned int kPhiCalibHF1_
Definition: HcalTopology.h:265
HcalTopology::kOffCalibHEX_
static constexpr unsigned int kOffCalibHEX_
Definition: HcalTopology.h:303
HcalTopology::kOffCalibHO1_
static constexpr unsigned int kOffCalibHO1_
Definition: HcalTopology.h:270
HcalTopology::nEtaCalibHF_
static constexpr unsigned int nEtaCalibHF_
Definition: HcalTopology.h:264
HcalTopology::minMaxDepth_
static constexpr int minMaxDepth_
Definition: HcalTopology.h:247
HcalTopology::exclusionList_
std::vector< HcalDetId > exclusionList_
Definition: HcalTopology.h:187
mps_fire.i
i
Definition: mps_fire.py:355
HcalDDDRecConstants::getTopoMode
int getTopoMode() const
Definition: HcalDDDRecConstants.h:106
MessageLogger.h
HcalTopology::validHcal
bool validHcal(const HcalDetId &id) const
Definition: HcalTopology.cc:230
HcalTopology::south
std::vector< DetId > south(const DetId &id) const override
Definition: HcalTopology.cc:435
funct::false
false
Definition: Factorize.h:34
dqmiodumpmetadata.n
n
Definition: dqmiodumpmetadata.py:28
HcalTopologyMode::Mode
Mode
Definition: HcalTopologyMode.h:26
HcalTopology::kHFSizePreLS1
Definition: HcalTopology.h:243
HcalDDDRecConstants::isPlan1MergedId
bool isPlan1MergedId(const HcalDetId &id) const
Definition: HcalDDDRecConstants.h:125
HcalTopology::etaTable
std::vector< double > etaTable
Definition: HcalTopology.h:216
HcalTopology::nEtaHB_
int nEtaHB_
Definition: HcalTopology.h:199
HcalTopology::incIEta
int incIEta(const HcalDetId &id, HcalDetId neighbors[2]) const
Definition: HcalTopology.cc:729
HcalTopology::maxPhiHE_
int maxPhiHE_
Definition: HcalTopology.h:206
HcalTopology::maxDepthHE
int maxDepthHE() const
Definition: HcalTopology.h:140
HcalDetId::iphi
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
HcalDDDRecConstants::getPhiTableHF
const std::vector< double > & getPhiTableHF() const
Definition: HcalDDDRecConstants.h:99
HcalTopology::firstHFQuadPhiRing_
int firstHFQuadPhiRing_
Definition: HcalTopology.h:201
IPHI_MAX
static const int IPHI_MAX
Definition: HcalTopology.cc:13
HcalTopology::nEtaCalibHB_
static constexpr unsigned int nEtaCalibHB_
Definition: HcalTopology.h:250
min
T min(T a, T b)
Definition: MathUtil.h:58
ecaldqm::zside
int zside(DetId const &)
Definition: EcalDQMCommonUtils.cc:189
HcalTopology::kHOSizePreLS1
Definition: HcalTopology.h:242
HcalCalibDetId
Definition: HcalCalibDetId.h:45
HcalDDDRecConstants::getPhiOffs
const std::vector< double > & getPhiOffs() const
Definition: HcalDDDRecConstants.h:96
HcalTopology::lastHORing_
int lastHORing_
Definition: HcalTopology.h:196
HcalTopologyMode::TriggerMode_2009
Definition: HcalTopologyMode.h:29
HcalTopologyMode
Definition: HcalTopologyMode.h:25
pos
Definition: PixelAliasList.h:18
DetId::Hcal
Definition: DetId.h:28
HcalTopology::etaCalibHE_
static constexpr int etaCalibHE_[nEtaCalibHE_]
Definition: HcalTopology.h:260
ALCARECOPromptCalibProdSiPixelAli0T_cff.mode
mode
Definition: ALCARECOPromptCalibProdSiPixelAli0T_cff.py:96
HcalDDDRecConstants::getDepthEta16
int getDepthEta16(const int &det, const int &iphi, const int &zside) const
Definition: HcalDDDRecConstants.h:66
HcalTopology::phiCalibHO_
static constexpr int phiCalibHO_[nEtaCalibHO_]
Definition: HcalTopology.h:275
HcalTopologyMode::LHC
Definition: HcalTopologyMode.h:26
HcalTopology::chanCalibHOs_
static constexpr int chanCalibHOs_
Definition: HcalTopology.h:272
hcalSLHCTopologyConstants_cfi.maxDepthHB
maxDepthHB
Definition: hcalSLHCTopologyConstants_cfi.py:5
HcalTopology::kOffCalibHFX_
static constexpr unsigned int kOffCalibHFX_
Definition: HcalTopology.h:308
HcalDDDRecConstants::maxHFDepth
int maxHFDepth(int ieta, int iphi) const
Definition: HcalDDDRecConstants.h:111
HcalTopology::etaCalibHOX_
static constexpr int etaCalibHOX_[nEtaCalibHOX_]
Definition: HcalTopology.h:293
cms::cuda::assert
assert(be >=bs)
HcalCalibDetId::ieta
int ieta() const
Definition: HcalCalibDetId.cc:94
HcalTopology::denseId2detIdCALIB
HcalCalibDetId denseId2detIdCALIB(const unsigned int &id) const
return a Calib DetId from linear packed id
Definition: HcalTopology.cc:1385
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:215
HcalTopology::etaBinsHB_
std::vector< HcalDDDRecConstants::HcalEtaBin > etaBinsHB_
Definition: HcalTopology.h:198
HcalCalibDetId::uMNqie
Definition: HcalCalibDetId.h:51
HcalTopology::detId2denseIdHB
unsigned int detId2denseIdHB(const DetId &id) const
return a linear packed id from HB
Definition: HcalTopology.cc:1169
HcalTopology::chanCalibHF1_
static constexpr int chanCalibHF1_[nchanCalibHF1_]
Definition: HcalTopology.h:266
HcalDDDRecConstants::getNEta
int getNEta() const
Definition: HcalDDDRecConstants.h:91
HcalDetId::depth
constexpr int depth() const
get the tower depth
Definition: HcalDetId.h:164
HcalTopologyMode::SLHC
Definition: HcalTopologyMode.h:26
HcalTopology::kPhiCalibHO0_
static constexpr unsigned int kPhiCalibHO0_
Definition: HcalTopology.h:277
HcalTopology::kCALIBSizePreLS1
Definition: HcalTopology.h:246
HcalTopology::down
std::vector< DetId > down(const DetId &id) const override
Definition: HcalTopology.cc:457
HcalTopology::nEtaCalibHO_
static constexpr unsigned int nEtaCalibHO_
Definition: HcalTopology.h:271
HcalDDDRecConstants::getNPhi
int getNPhi(const int &type) const
Definition: HcalDDDRecConstants.h:93
HcalTopology::decAIEta
int decAIEta(const HcalDetId &id, HcalDetId neighbors[2]) const
Definition: HcalTopology.cc:769
HcalTopology::nchanCalibHO_
static constexpr unsigned int nchanCalibHO_
Definition: HcalTopology.h:271
HcalTrigTowerDetId::zside
int zside() const
get the z-side of the tower (1/-1)
Definition: HcalTrigTowerDetId.h:50
geant_units::operators
Definition: GeantUnits.h:18
HcalBarrel
Definition: HcalAssistant.h:33
HcalTopology::minPhi_
static constexpr unsigned int minPhi_
Definition: HcalTopology.h:248
HcalEmpty
Definition: HcalAssistant.h:32
HcalTopology::depthSegmentation_
SegmentationMap depthSegmentation_
Definition: HcalTopology.h:224
HcalTopology::decIEta
int decIEta(const HcalDetId &id, HcalDetId neighbors[2]) const
Definition: HcalTopology.cc:736
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
HcalTopology::phiCalibHOX1_
static constexpr int phiCalibHOX1_
Definition: HcalTopology.h:297
HcalTopology::firstHEQuadPhiRing_
int firstHEQuadPhiRing_
Definition: HcalTopology.h:201
HcalTrigTowerDetId::ietaAbs
int ietaAbs() const
get the absolute value of the tower ieta
Definition: HcalTrigTowerDetId.h:52
convertSQLiteXML.ok
bool ok
Definition: convertSQLiteXML.py:98
HcalTopology::kOffCalibHB_
static constexpr unsigned int kOffCalibHB_
Definition: HcalTopology.h:249
HcalTopology::firstHERing
int firstHERing() const
Definition: HcalTopology.h:93
HcalTopology::firstHEQuadPhiRing
int firstHEQuadPhiRing() const
Definition: HcalTopology.h:102
dqmdumpme.first
first
Definition: dqmdumpme.py:55
HcalTopology::kOffCalibHOX_
static constexpr unsigned int kOffCalibHOX_
Definition: HcalTopology.h:291
HcalCalibDetId::HEX
Definition: HcalCalibDetId.h:55
HcalTopology::etaHF2HE_
int etaHF2HE_
Definition: HcalTopology.h:205
HcalTopology::etaRing
int etaRing(HcalSubdetector subdet, double eta) const
eta and phi index from eta, phi values
Definition: HcalTopology.cc:997
HcalTopologyMode::TriggerMode_2017
Definition: HcalTopologyMode.h:32
kHFSizePreLS1
Definition: HcalDDDRecConstants.cc:13
HcalTopology::triggerMode_
HcalTopologyMode::TriggerMode triggerMode_
Definition: HcalTopology.h:191
HcalTopology::HOSize_
unsigned int HOSize_
Definition: HcalTopology.h:210
HcalTopology::excludeHB_
bool excludeHB_
Definition: HcalTopology.h:188
HcalTopology::etaHE2HF_
int etaHE2HF_
Definition: HcalTopology.h:205
HcalTopology::topoVersion
int topoVersion() const override
return a version which identifies the given topology
Definition: HcalTopology.cc:1688
HcalDDDRecConstants::getPhiTable
const std::vector< double > & getPhiTable() const
Definition: HcalDDDRecConstants.h:98
HcalTopology::nEtaCalibHEX_
static constexpr unsigned int nEtaCalibHEX_
Definition: HcalTopology.h:304
HcalDetId::changeForm
constexpr void changeForm()
Definition: HcalDetId.h:198
units
TString units(TString variable, Char_t axis)
HcalTopology::etaTableHF
std::vector< double > etaTableHF
Definition: HcalTopology.h:216
HcalTopology::maxDepth
int maxDepth(void) const
Definition: HcalTopology.cc:980
LEDCalibrationChannels.iphi
iphi
Definition: LEDCalibrationChannels.py:64
HcalTopology::unitPhi
std::vector< int > unitPhi
Definition: HcalTopology.h:218
HcalTopology::firstHEDoublePhiRing
int firstHEDoublePhiRing() const
Definition: HcalTopology.h:101
DetId
Definition: DetId.h:17
HcalTopology::firstHFRing
int firstHFRing() const
Definition: HcalTopology.h:96
HcalTopology::validDetIdPreLS1
bool validDetIdPreLS1(const HcalDetId &id) const
Definition: HcalTopology.cc:536
HcalTopology::firstHERing_
int firstHERing_
Definition: HcalTopology.h:194
HcalDDDRecConstants::getEtaTableHF
const std::vector< double > & getEtaTableHF() const
Definition: HcalDDDRecConstants.h:76
HcalTopology::kOffCalibHO2_
static constexpr unsigned int kOffCalibHO2_
Definition: HcalTopology.h:281
kHOSizePreLS1
Definition: HcalDDDRecConstants.cc:13
HcalTopology::chanCalibHE2_
static constexpr int chanCalibHE2_
Definition: HcalTopology.h:284
HcalTopology::etaCalibHB_
static constexpr int etaCalibHB_[nEtaCalibHB_]
Definition: HcalTopology.h:253
HcalCalibDetId::zside
int zside() const
get the sign of ieta (+/-1)
Definition: HcalCalibDetId.cc:112
HcalTopology::detId2denseIdPreLS1
unsigned int detId2denseIdPreLS1(const DetId &id) const
Definition: HcalTopology.cc:1140
HcalTopology::detId2denseIdHT
unsigned int detId2denseIdHT(const DetId &id) const
return a linear packed id from HT
Definition: HcalTopology.cc:1253
HcalTopology::lastHORing
int lastHORing() const
Definition: HcalTopology.h:99
HLT_2018_cff.maxPhi
maxPhi
Definition: HLT_2018_cff.py:51498
HcalCalibDetId::HBX
Definition: HcalCalibDetId.h:54
HcalTopology::HBSize_
unsigned int HBSize_
Definition: HcalTopology.h:208
Calorimetry_cff.dp
dp
Definition: Calorimetry_cff.py:157
cuda_std::upper_bound
__host__ constexpr __device__ RandomIt upper_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})
Definition: cudastdAlgorithm.h:45
PVValHelper::eta
Definition: PVValidationHelpers.h:69
HcalTopology::numberOfShapes_
unsigned int numberOfShapes_
Definition: HcalTopology.h:214
HcalTopology::doublePhiBins_
int doublePhiBins_
Definition: HcalTopology.h:203
HcalTopologyMode::H2HE
Definition: HcalTopologyMode.h:26
HcalTopology::etaCalibHF_
static constexpr int etaCalibHF_[nEtaCalibHF_]
Definition: HcalTopology.h:267
HcalOuter
Definition: HcalAssistant.h:35
HcalTopology::chanCalibHO_
static constexpr int chanCalibHO_[nchanCalibHO_]
Definition: HcalTopology.h:273
HcalTopology::exclude
void exclude(const HcalDetId &id)
Definition: HcalTopology.cc:376
HcalTopology::validHT
bool validHT(const HcalTrigTowerDetId &id) const
Definition: HcalTopology.cc:239
HcalTopology::firstHFRing_
int firstHFRing_
Definition: HcalTopology.h:195
dqmdumpme.k
k
Definition: dqmdumpme.py:60
HcalTrigTowerDetId::version
int version() const
get the version code for the trigger tower
Definition: HcalTrigTowerDetId.h:60
HcalTopology::detId2denseId
unsigned int detId2denseId(const DetId &id) const override
return a linear packed id
Definition: HcalTopology.cc:1518
HcalTopology::kPhiCalibHE_
static constexpr unsigned int kPhiCalibHE_
Definition: HcalTopology.h:258
HcalTopology::kHBhalf
Definition: HcalTopology.h:228
HcalTopology::kchanCalibHE1_
static constexpr unsigned int kchanCalibHE1_
Definition: HcalTopology.h:261
HcalTopology::lastHERing_
int lastHERing_
Definition: HcalTopology.h:194
HcalTopology::depthSegmentationOne_
SegmentationMap depthSegmentationOne_
Definition: HcalTopology.h:225
cuda_std::lower_bound
__host__ constexpr __device__ RandomIt lower_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})
Definition: cudastdAlgorithm.h:27
LEDCalibrationChannels.depth
depth
Definition: LEDCalibrationChannels.py:65
HcalDDDRecConstants::getMinDepth
int getMinDepth(const int &itype, const int &ieta, const int &iphi, const int &zside) const
Definition: HcalDDDRecConstants.cc:353
HcalTopology::firstHETripleDepthRing_
int firstHETripleDepthRing_
Definition: HcalTopology.h:202
HcalTopology::denseId2detId
DetId denseId2detId(unsigned int) const override
return a linear packed id
Definition: HcalTopology.cc:1561
HcalTopology::kOffCalibHE1_
static constexpr unsigned int kOffCalibHE1_
Definition: HcalTopology.h:256
HcalTopology::detId2denseIdHF
unsigned int detId2denseIdHF(const DetId &id) const
return a linear packed id from HF
Definition: HcalTopology.cc:1233
HcalTopology::nchanCalibHE1_
static constexpr unsigned int nchanCalibHE1_
Definition: HcalTopology.h:257
HcalTopology::phiCalibHOX2_
static constexpr int phiCalibHOX2_
Definition: HcalTopology.h:297
HcalTopology::nchanCalibHF1_
static constexpr unsigned int nchanCalibHF1_
Definition: HcalTopology.h:264
HcalTopology::etaBinsHE_
std::vector< HcalDDDRecConstants::HcalEtaBin > etaBinsHE_
Definition: HcalTopology.h:198
hcalSLHCTopologyConstants_cfi.maxDepthHE
maxDepthHE
Definition: hcalSLHCTopologyConstants_cfi.py:6
edm::LogWarning
Definition: MessageLogger.h:141
HcalTopology::decrementDepth
bool decrementDepth(HcalDetId &id) const
Definition: HcalTopology.cc:910
HcalTopology::singlePhiBins_
int singlePhiBins_
Definition: HcalTopology.h:203
HcalTopology::validRaw
bool validRaw(const HcalDetId &id) const
Definition: HcalTopology.cc:555
HcalCalibDetId::CastorRadFacility
Definition: HcalCalibDetId.h:52
HcalTopology::mPhiCalibHE_
static constexpr unsigned int mPhiCalibHE_
Definition: HcalTopology.h:258
HcalTopology::dPhiTableHF
std::vector< double > dPhiTableHF
Definition: HcalTopology.h:216
HcalTopology::phiCalibHF2_
static constexpr int phiCalibHF2_
Definition: HcalTopology.h:288
HcalTopology::detId2denseIdHE
unsigned int detId2denseIdHE(const DetId &id) const
return a linear packed id from HE
Definition: HcalTopology.cc:1188
LEDCalibrationChannels.ieta
ieta
Definition: LEDCalibrationChannels.py:63
HcalDetId::ieta
constexpr int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
HcalTopology::nEtaHE_
int nEtaHE_
Definition: HcalTopology.h:199
HcalTopology::excludeHE_
bool excludeHE_
Definition: HcalTopology.h:188
HcalTopology::etaCalibHEX_
static constexpr int etaCalibHEX_[nEtaCalibHEX_]
Definition: HcalTopology.h:305
HcalTopology::maxDepthHE_
int maxDepthHE_
Definition: HcalTopology.h:204
PVValHelper::phi
Definition: PVValidationHelpers.h:68
HcalTopology::etaCalibHO_
static constexpr int etaCalibHO_[nEtaCalibHO_]
Definition: HcalTopology.h:274
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
HcalTopology::HcalTopology
HcalTopology(const HcalDDDRecConstants *hcons, const bool mergePosition=false)
Definition: HcalTopology.cc:17
GeantUnits.h
HcalTopology::excludeSubdetector
void excludeSubdetector(HcalSubdetector subdet)
Definition: HcalTopology.cc:383
HcalTopology::incIPhi
bool incIPhi(const HcalDetId &id, HcalDetId &neighbor) const
Definition: HcalTopology.cc:626
HcalTopology::maxDepthHB_
int maxDepthHB_
Definition: HcalTopology.h:204
recoMuon::in
Definition: RecoMuonEnumerators.h:6
HcalTopology::kHESizePreLS1
Definition: HcalTopology.h:241
HcalDetId::subdet
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
HcalTopology::firstHFQuadPhiRing
int firstHFQuadPhiRing() const
Definition: HcalTopology.h:103
HcalTopology::mode_
HcalTopologyMode::Mode mode_
Definition: HcalTopology.h:190
HcalTopology::decIPhi
bool decIPhi(const HcalDetId &id, HcalDetId &neighbor) const
Definition: HcalTopology.cc:678
HcalDetId
Definition: HcalDetId.h:12
createfilelist.int
int
Definition: createfilelist.py:10
HcalTopology::firstHBRing_
int firstHBRing_
Definition: HcalTopology.h:193
HcalTopology::kSizeForDenseIndexingPreLS1
Definition: HcalTopology.h:239
HcalCalibDetId::iphi
int iphi() const
get the low-edge iphi (if relevant)
Definition: HcalCalibDetId.cc:104
edm::LogVerbatim
Definition: MessageLogger.h:297
HcalTopology::unitPhiHF
std::vector< int > unitPhiHF
Definition: HcalTopology.h:218
HcalTopology::nEtaCalibHOX_
static constexpr unsigned int nEtaCalibHOX_
Definition: HcalTopology.h:292
HcalTopology::firstHBRing
int firstHBRing() const
Definition: HcalTopology.h:91
HLT_2018_cff.nEta
nEta
Definition: HLT_2018_cff.py:5271
HcalTopology::kHFhalf
Definition: HcalTopology.h:231
HcalTopology::depthBinInformation
void depthBinInformation(HcalSubdetector subdet, int etaRing, int iphi, int zside, int &nDepthBins, int &startingBin) const
finds the number of depth bins and which is the number to start with
Definition: HcalTopology.cc:816
HcalCalibDetId::hcalSubdet
HcalSubdetector hcalSubdet() const
get the HcalSubdetector (if relevant)
Definition: HcalCalibDetId.cc:90
HcalTopology::lastHERing
int lastHERing() const
Definition: HcalTopology.h:94
HcalTopology::firstHORing_
int firstHORing_
Definition: HcalTopology.h:196
HcalTopology::kPhiCalibHO2_
static constexpr unsigned int kPhiCalibHO2_
Definition: HcalTopology.h:279
HcalTopology::segmentBoundaries
std::pair< int, int > segmentBoundaries(const unsigned ring, const unsigned depth, const bool flag=false) const
Definition: HcalTopology.cc:1092
HcalTopology::HFSize_
unsigned int HFSize_
Definition: HcalTopology.h:211
HcalTopology::validCalib
bool validCalib(const HcalCalibDetId &id) const
Definition: HcalTopology.cc:276
HcalCalibDetId::LASERMON
Definition: HcalCalibDetId.h:53
HcalTopology::kchanCalibHF1_
static constexpr unsigned int kchanCalibHF1_
Definition: HcalTopology.h:268
HcalCalibDetId::calibFlavor
CalibDetType calibFlavor() const
get the flavor of this calibration detid
Definition: HcalCalibDetId.h:77
HcalDetId::oldFormat
constexpr bool oldFormat() const
Definition: HcalDetId.h:139
HcalTopology::kHThalf
Definition: HcalTopology.h:232
HcalTopology::kchanCalibHE2_
static constexpr unsigned int kchanCalibHE2_
Definition: HcalTopology.h:285
HcalTopology::nEtaCalibHE_
static constexpr unsigned int nEtaCalibHE_
Definition: HcalTopology.h:257
unit
Basic3DVector unit() const
Definition: Basic3DVectorLD.h:162
HcalTopology::chanCalibHB_
static constexpr int chanCalibHB_[nchanCalibHB_]
Definition: HcalTopology.h:252
HcalTopology::mPhiCalibHO1_
static constexpr unsigned int mPhiCalibHO1_
Definition: HcalTopology.h:276
HcalTopology::incAIEta
int incAIEta(const HcalDetId &id, HcalDetId neighbors[2]) const
Definition: HcalTopology.cc:744
HcalTopology::kHOhalf
Definition: HcalTopology.h:230
HcalSubdetector
HcalSubdetector
Definition: HcalAssistant.h:31
HcalTopology::up
std::vector< DetId > up(const DetId &id) const override
Definition: HcalTopology.cc:446
HcalForward
Definition: HcalAssistant.h:36
HcalTopology::valid
bool valid(const DetId &id) const override
Definition: HcalTopology.cc:225
DDAxes::phi
HcalTopology::chanCalibHE1_
static constexpr int chanCalibHE1_[nchanCalibHE1_]
Definition: HcalTopology.h:259
HcalTopology::etaMax
double etaMax(HcalSubdetector subdet) const
Definition: HcalTopology.cc:1100
HcalTopology.h
HcalTopology::setDepthSegmentation
void setDepthSegmentation(const unsigned ring, const std::vector< int > &readoutDepths, const bool flag)
Definition: HcalTopology.cc:1084
HcalTopology::mPhiCalibHF1_
static constexpr unsigned int mPhiCalibHF1_
Definition: HcalTopology.h:265
HcalTopology::west
std::vector< DetId > west(const DetId &id) const override
Definition: HcalTopology.cc:413
HcalCalibDetId::HOCrosstalk
Definition: HcalCalibDetId.h:50
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
HcalTopology::phioff
std::vector< double > phioff
Definition: HcalTopology.h:217
HcalTopology::kPhiCalibHB_
static constexpr unsigned int kPhiCalibHB_
Definition: HcalTopology.h:251
HcalTopology::getDepthSegmentation
void getDepthSegmentation(const unsigned ring, std::vector< int > &readoutDepths, const bool flag=false) const
Definition: HcalTopology.cc:1064
HcalDDDRecConstants::getEtaRange
std::pair< int, int > getEtaRange(const int &i) const
Definition: HcalDDDRecConstants.h:74
HcalEndcap
Definition: HcalAssistant.h:34
HcalTopology::incrementDepth
bool incrementDepth(HcalDetId &id) const
Definition: HcalTopology.cc:869
HcalDDDRecConstants::getEtaBins
std::vector< HcalEtaBin > getEtaBins(const int &itype) const
Definition: HcalDDDRecConstants.cc:68
HcalTrigTowerDetId::iphi
int iphi() const
get the tower iphi
Definition: HcalTrigTowerDetId.h:56
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:31
HcalTopology::kchanCalibHB_
static constexpr unsigned int kchanCalibHB_
Definition: HcalTopology.h:254
officialStyle.chan
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi....
Definition: officialStyle.py:106
HcalTopology::firstHETripleDepthRing
int firstHETripleDepthRing() const
Definition: HcalTopology.h:104
HcalTopology::kHTSizePhase1
Definition: HcalTopology.h:245
HcalTopology::kHBSizePreLS1
Definition: HcalTopology.h:240
Exception
Definition: hltDiff.cc:246
HcalTriggerTower
Definition: HcalAssistant.h:37
HcalTopologyMode::H2
Definition: HcalTopologyMode.h:26
HcalTopology::lastHBRing_
int lastHBRing_
Definition: HcalTopology.h:193
HcalCalibDetId::cboxChannel
int cboxChannel() const
get the calibration box channel (if relevant)
Definition: HcalCalibDetId.cc:86
HcalDDDRecConstants::getTriggerMode
int getTriggerMode() const
Definition: HcalDDDRecConstants.h:107
relativeConstraints.ring
ring
Definition: relativeConstraints.py:68
HcalTopology::etaRange
std::pair< double, double > etaRange(HcalSubdetector subdet, int ieta) const
Definition: HcalTopology.cc:1124
HcalTopology::detId2denseIdHO
unsigned int detId2denseIdHO(const DetId &id) const
return a linear packed id from HO
Definition: HcalTopology.cc:1215
HcalTopology::detId2denseIdCALIB
unsigned int detId2denseIdCALIB(const DetId &id) const
return a linear packed id from CALIB
Definition: HcalTopology.cc:1278
HcalDDDRecConstants::getDepth
std::vector< int > getDepth(const int &det, const int &phi, const int &zside, const unsigned int &eta) const
Definition: HcalDDDRecConstants.cc:52
HcalTopology::ncells
unsigned int ncells() const override
return a count of valid cells (for dense indexing use)
Definition: HcalTopology.cc:1686
HcalTopology::mPhiCalibHB_
static constexpr unsigned int mPhiCalibHB_
Definition: HcalTopology.h:251
HcalTopology::lastHFRing
int lastHFRing() const
Definition: HcalTopology.h:97
HcalTopology::kchanCalibHF2_
static constexpr unsigned int kchanCalibHF2_
Definition: HcalTopology.h:289
or
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
HcalDDDRecConstants::getDepthEta29
int getDepthEta29(const int &iphi, const int &zside, const int &type) const
Definition: HcalDDDRecConstants.h:69
HcalTopology::etaCalibHBX_
static constexpr int etaCalibHBX_
Definition: HcalTopology.h:300
Exception.h
HcalTopology::excludeHF_
bool excludeHF_
Definition: HcalTopology.h:188
HcalTopologyMode::TriggerMode
TriggerMode
Definition: HcalTopologyMode.h:28
HcalTopology::kHEhalf
Definition: HcalTopology.h:229
HcalTopology::nchanCalibHB_
static constexpr unsigned int nchanCalibHB_
Definition: HcalTopology.h:250
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
HcalDDDRecConstants::getMaxDepth
int getMaxDepth(const int &type) const
Definition: HcalDDDRecConstants.h:88
sd
double sd
Definition: CascadeWrapper.h:113
HcalTopology::phiCalibHOX3_
static constexpr int phiCalibHOX3_
Definition: HcalTopology.h:297
HcalTopology::HESize_
unsigned int HESize_
Definition: HcalTopology.h:209
HcalDDDRecConstants
Definition: HcalDDDRecConstants.h:23
HcalTopology::nPhiBins
int nPhiBins(int etaRing) const
how many phi segments in this ring
Definition: HcalTopology.cc:955
HcalTopology::maxPhi_
static constexpr unsigned int maxPhi_
Definition: HcalTopology.h:248
geant_units
Definition: GeantUnits.h:11
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HcalTopology::topoVersion_
int topoVersion_
Definition: HcalTopology.h:220
HcalDetId::ietaAbs
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
HcalTopology::east
std::vector< DetId > east(const DetId &id) const override
Definition: HcalTopology.cc:402
HcalTopology::kPhiCalibHO1_
static constexpr unsigned int kPhiCalibHO1_
Definition: HcalTopology.h:278
HcalTopology::maxDepthHF_
int maxDepthHF_
Definition: HcalTopology.h:204
HcalCalibDetId::CalibrationBox
Definition: HcalCalibDetId.h:49
HcalDetId::zside
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
HcalDDDRecConstants::getNoff
int getNoff(const int &i) const
Definition: HcalDDDRecConstants.h:92
HcalTopology::kOffCalibHF2_
static constexpr unsigned int kOffCalibHF2_
Definition: HcalTopology.h:287
HcalTopology::firstHEDoublePhiRing_
int firstHEDoublePhiRing_
Definition: HcalTopology.h:201
HcalTopology::north
std::vector< DetId > north(const DetId &id) const override
Definition: HcalTopology.cc:424
HcalTopology::isExcluded
bool isExcluded(const HcalDetId &id) const
Definition: HcalTopology.cc:348
HcalTopology::maxEta_
int maxEta_
Definition: HcalTopology.h:206
HcalDDDRecConstants::isPlan1ToBeMergedId
bool isPlan1ToBeMergedId(const HcalDetId &id) const
Definition: HcalDDDRecConstants.h:124
HcalTopology::nPhiCalibHOX_
static constexpr unsigned int nPhiCalibHOX_[nEtaCalibHOX_]
Definition: HcalTopology.h:295
HcalTopology::chanCalibHF2_
static constexpr int chanCalibHF2_
Definition: HcalTopology.h:288
HcalTopology::validDetId
bool validDetId(HcalSubdetector subdet, int ieta, int iphi, int depth) const
Definition: HcalTopology.cc:235
HcalTopology::dPhiTable
std::vector< double > dPhiTable
Definition: HcalTopology.h:216
BeamSplash_cfg.version
version
Definition: BeamSplash_cfg.py:45
HcalTopologyMode::TriggerMode_2018legacy
Definition: HcalTopologyMode.h:31
TauDecayModes.dec
dec
Definition: TauDecayModes.py:143
cuy.ii
ii
Definition: cuy.py:590
HcalTopology::kOffCalibHF1_
static constexpr unsigned int kOffCalibHF1_
Definition: HcalTopology.h:263
HcalTopology::mPhiCalibHEX_
static constexpr unsigned int mPhiCalibHEX_
Definition: HcalTopology.h:304
HcalTopology::mPhiCalibHO0_
static constexpr unsigned int mPhiCalibHO0_
Definition: HcalTopology.h:276
HcalTopology::kOffCalibHBX_
static constexpr unsigned int kOffCalibHBX_
Definition: HcalTopology.h:298
d1
static constexpr float d1
Definition: L1EGammaCrystalsEmulatorProducer.cc:84
HcalTopology::hcons_
const HcalDDDRecConstants * hcons_
Definition: HcalTopology.h:185
HcalTopology::kOffCalibHE2_
static constexpr unsigned int kOffCalibHE2_
Definition: HcalTopology.h:283
HcalTopology::excludeHO_
bool excludeHO_
Definition: HcalTopology.h:188
HcalTopology::phiBin
int phiBin(HcalSubdetector subdet, int etaRing, double phi) const
Definition: HcalTopology.cc:1020
HcalTopology::kHTSizePreLS1
Definition: HcalTopology.h:244
RemoveAddSevLevel.flag
flag
Definition: RemoveAddSevLevel.py:116
HcalTopology::lastHBRing
int lastHBRing() const
Definition: HcalTopology.h:92
HcalTopology::maxDepthHB
int maxDepthHB() const
Definition: HcalTopology.h:139
HcalTopology::kPhiCalibHEX_
static constexpr unsigned int kPhiCalibHEX_
Definition: HcalTopology.h:306
HcalTrigTowerDetId
Definition: HcalTrigTowerDetId.h:14
HcalDDDRecConstants::getEtaTable
const std::vector< double > & getEtaTable() const
Definition: HcalDDDRecConstants.h:75
HcalTopology::HTSize_
unsigned int HTSize_
Definition: HcalTopology.h:212