CMS 3D CMS Logo

CalorimeterDefinitions.h
Go to the documentation of this file.
1 #ifndef RecoParticleFlow_PFRecHitProducer_interface_alpaka_CalorimeterDefinitions_h
2 #define RecoParticleFlow_PFRecHitProducer_interface_alpaka_CalorimeterDefinitions_h
3 
17 
18 // This file defines two structs:
19 // 1) ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer::HCAL
20 // 2) ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer::ECAL
21 // These are used as template arguments of the PFRecHitSoAProducer class and
22 // related classes. This allows to specialise behaviour for the two calorimeter
23 // types.
25 
26  // Get subdetector encoded in detId to narrow the range of reference table values to search
27  constexpr inline uint32_t getSubdet(uint32_t detId) { return DetId(detId).subdetId(); }
28 
29  struct HCAL {
38 
39  static constexpr DetId::Detector kDetectorId = DetId::Detector::Hcal;
42 
43  static constexpr uint32_t kMaxDepthHB = 4;
44  static constexpr uint32_t kMaxDepthHE = 7;
45  static constexpr uint32_t kFirstHBRing = 1;
46  static constexpr uint32_t kLastHBRing = 16;
47  static constexpr uint32_t kFirstHERing = 16;
48  static constexpr uint32_t kLastHERing = 29;
49  static constexpr uint32_t kMaxIPhi = 72;
52  static constexpr uint32_t kSize = kSizeBarrel + kSizeEndcap; // maximum possible HCAL denseId (=23328)
53 
54  static constexpr bool detIdInRange(uint32_t detId) {
55  return detId != 0 && DetId(detId).det() == DetId::Detector::Hcal &&
57  }
58 
59  static constexpr uint32_t getDepth(uint32_t detId) { return HcalDetId(detId).depth(); }
60  static constexpr uint32_t getIetaAbs(uint32_t detId) { return HcalDetId(detId).ietaAbs(); }
61  static constexpr uint32_t getIphi(uint32_t detId) { return HcalDetId(detId).iphi(); }
62  static constexpr int getZside(uint32_t detId) { return HcalDetId(detId).zside(); }
63 
64  // https://cmssdt.cern.ch/lxr/source/Geometry/CaloTopology/src/HcalTopology.cc#1170
65  static constexpr uint32_t detId2denseIdHB(uint32_t detId) {
66  const uint32_t nEtaHB = (kLastHBRing - kFirstHBRing + 1);
67  const uint32_t ip = getIphi(detId);
68  const uint32_t ie = getIetaAbs(detId);
69  const uint32_t dp = getDepth(detId);
70  const int zn = getZside(detId);
71  uint32_t retval = (dp - 1) + kMaxDepthHB * (ip - 1);
72  if (zn > 0)
73  retval += kMaxDepthHB * kMaxIPhi * (ie * zn - kFirstHBRing);
74  else
75  retval += kMaxDepthHB * kMaxIPhi * (ie * zn + kLastHBRing + nEtaHB);
76 
77  return retval;
78  }
79 
80  // https://cmssdt.cern.ch/lxr/source/Geometry/CaloTopology/src/HcalTopology.cc#1189
81  static constexpr uint32_t detId2denseIdHE(uint32_t detId) {
82  const uint32_t nEtaHE = (kLastHERing - kFirstHERing + 1);
83  const uint32_t ip = getIphi(detId);
84  const uint32_t ie = getIetaAbs(detId);
85  const uint32_t dp = getDepth(detId);
86  const int zn = getZside(detId);
87  uint32_t retval = (dp - 1) + kMaxDepthHE * (ip - 1);
88  if (zn > 0)
89  retval += kMaxDepthHE * kMaxIPhi * (ie * zn - kFirstHERing);
90  else
91  retval += kMaxDepthHE * kMaxIPhi * (ie * zn + kLastHERing + nEtaHE);
92 
93  return retval + kSizeBarrel;
94  }
95 
96  static constexpr uint32_t detId2denseId(uint32_t detId) {
97  const uint32_t subdet = getSubdet(detId);
98  if (subdet == HcalBarrel)
99  return detId2denseIdHB(detId);
100  if (subdet == HcalEndcap)
101  return detId2denseIdHE(detId);
102 
103  printf("invalid detId: %u\n", detId);
104  return -1;
105  }
106  };
107 
108  struct ECAL {
117 
118  static constexpr DetId::Detector kDetectorId = DetId::Detector::Ecal;
121 
123 
124  // https://cmssdt.cern.ch/lxr/source/DataFormats/EcalDetId/interface/EBDetId.h
125  struct Barrel {
126  static constexpr int kMaxIEta = 85;
127  static constexpr int kMaxIPhi = 360;
128  static constexpr int kSize = 2 * kMaxIPhi * kMaxIEta;
129 
130  static constexpr int ietaAbs(uint32_t detId) { return (detId >> 9) & 0x7F; }
131  static constexpr int iphi(uint32_t detId) { return detId & 0x1FF; }
132  static constexpr bool positiveZ(uint32_t detId) { return detId & 0x10000; }
133  static constexpr uint32_t denseIndex(uint32_t detId) {
134  return (kMaxIEta + (positiveZ(detId) ? ietaAbs(detId) - 1 : -ietaAbs(detId))) * kMaxIPhi + iphi(detId) - 1;
135  }
136  };
137 
138  // https://cmssdt.cern.ch/lxr/source/DataFormats/EcalDetId/interface/EEDetId.h
139  struct Endcap {
140  static constexpr uint32_t kEEhalf = 7324;
141  static constexpr uint32_t kSize = kEEhalf * 2;
142 
143  static constexpr int ix(uint32_t detId) { return (detId >> 7) & 0x7F; }
144  static constexpr int iy(uint32_t detId) { return detId & 0x7F; }
145  static constexpr bool positiveZ(uint32_t detId) { return detId & 0x4000; }
146 
147  static constexpr uint32_t denseIndex(uint32_t detId) {
148  const unsigned short kxf[] = {
149  41, 51, 41, 51, 41, 51, 36, 51, 36, 51, 26, 51, 26, 51, 26, 51, 21, 51, 21, 51, 21, 51, 21, 51, 21,
150  51, 16, 51, 16, 51, 14, 51, 14, 51, 14, 51, 14, 51, 14, 51, 9, 51, 9, 51, 9, 51, 9, 51, 9, 51,
151  6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 4, 51, 4, 51, 4,
152  51, 4, 51, 4, 56, 1, 58, 1, 59, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62,
153  1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 61, 1, 61, 1, 60, 1, 59, 1, 58, 4, 56, 4, 51, 4,
154  51, 4, 51, 4, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51,
155  9, 51, 9, 51, 9, 51, 9, 51, 9, 51, 14, 51, 14, 51, 14, 51, 14, 51, 14, 51, 16, 51, 16, 51, 21,
156  51, 21, 51, 21, 51, 21, 51, 21, 51, 26, 51, 26, 51, 26, 51, 36, 51, 36, 51, 41, 51, 41, 51, 41, 51};
157 
158  const unsigned short kdi[] = {
159  0, 10, 20, 30, 40, 50, 60, 75, 90, 105, 120, 145, 170, 195, 220, 245, 270,
160  300, 330, 360, 390, 420, 450, 480, 510, 540, 570, 605, 640, 675, 710, 747, 784, 821,
161  858, 895, 932, 969, 1006, 1043, 1080, 1122, 1164, 1206, 1248, 1290, 1332, 1374, 1416, 1458, 1500,
162  1545, 1590, 1635, 1680, 1725, 1770, 1815, 1860, 1905, 1950, 1995, 2040, 2085, 2130, 2175, 2220, 2265,
163  2310, 2355, 2400, 2447, 2494, 2541, 2588, 2635, 2682, 2729, 2776, 2818, 2860, 2903, 2946, 2988, 3030,
164  3071, 3112, 3152, 3192, 3232, 3272, 3311, 3350, 3389, 3428, 3467, 3506, 3545, 3584, 3623, 3662, 3701,
165  3740, 3779, 3818, 3857, 3896, 3935, 3974, 4013, 4052, 4092, 4132, 4172, 4212, 4253, 4294, 4336, 4378,
166  4421, 4464, 4506, 4548, 4595, 4642, 4689, 4736, 4783, 4830, 4877, 4924, 4969, 5014, 5059, 5104, 5149,
167  5194, 5239, 5284, 5329, 5374, 5419, 5464, 5509, 5554, 5599, 5644, 5689, 5734, 5779, 5824, 5866, 5908,
168  5950, 5992, 6034, 6076, 6118, 6160, 6202, 6244, 6281, 6318, 6355, 6392, 6429, 6466, 6503, 6540, 6577,
169  6614, 6649, 6684, 6719, 6754, 6784, 6814, 6844, 6874, 6904, 6934, 6964, 6994, 7024, 7054, 7079, 7104,
170  7129, 7154, 7179, 7204, 7219, 7234, 7249, 7264, 7274, 7284, 7294, 7304, 7314};
171 
172  const uint32_t jx = ix(detId);
173  const uint32_t jd = 2 * (iy(detId) - 1) + (jx - 1) / 50;
174  return ((positiveZ(detId) ? kEEhalf : 0) + kdi[jd] + jx - kxf[jd]);
175  }
176  };
177 
178  static constexpr bool checkFlag(uint32_t flagBits, int flag) { return flagBits & (0x1 << flag); }
179 
180  static constexpr uint32_t detId2denseId(uint32_t detId) {
181  const uint32_t subdet = getSubdet(detId);
182  if (subdet == EcalBarrel)
183  return Barrel::denseIndex(detId);
184  if (subdet == EcalEndcap)
186 
187  printf("invalid detId: %u\n", detId);
188  return 0;
189  }
190 
191  static constexpr bool detIdInRange(uint32_t detId) {
192  return detId != 0 && DetId(detId).det() == DetId::Detector::Ecal &&
194  }
195 
196  static constexpr int getZside(uint32_t detId) {
198  ? (1)
199  : (-1);
200  }
201 
202  static constexpr uint32_t kSize = Barrel::kSize + Endcap::kSize; // maximum possible ECAL denseId (=75848)
203  };
204 
205 } // namespace ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer
206 
207 #endif // RecoParticleFlow_PFRecHitProducer_interface_alpaka_CalorimeterDefinitions_h
PortableHostCollection< CaloRecHitSoA > CaloRecHitHostCollection
PortableCollection<::reco::PFRecHitECALTopologySoA > PFRecHitECALTopologyDeviceCollection
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
PortableHostCollection< PFRecHitHCALTopologySoA > PFRecHitHCALTopologyHostCollection
PortableCollection<::reco::PFRecHitECALParamsSoA > PFRecHitECALParamsDeviceCollection
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
reco::PFRecHitHCALTopologyDeviceCollection TopologyTypeDevice
static constexpr bool checkFlag(uint32_t flagBits, int flag)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
PortableCollection<::reco::PFRecHitHCALTopologySoA > PFRecHitHCALTopologyDeviceCollection
Definition: HCAL.py:1
Definition: DetId.h:17
Detector
Definition: DetId.h:24
ALPAKA_STATIC_ACC_MEM_CONSTANT const unsigned short kdi[]
PortableCollection<::reco::CaloRecHitSoA > CaloRecHitDeviceCollection
PortableCollection<::reco::PFRecHitHCALParamsSoA > PFRecHitHCALParamsDeviceCollection
ALPAKA_STATIC_ACC_MEM_CONSTANT const unsigned short kxf[]
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
PortableHostCollection< PFRecHitECALTopologySoA > PFRecHitECALTopologyHostCollection
constexpr int depth() const
get the tower depth
Definition: HcalDetId.h:164