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