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