File indexing completed on 2025-01-21 01:40:01
0001 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0002 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0003 #include "FWCore/Utilities/interface/HostDeviceConstant.h"
0004
0005 #include "KernelHelpers.h"
0006
0007 namespace ALPAKA_ACCELERATOR_NAMESPACE::ecal::reconstruction {
0008
0009 namespace internal::barrel {
0010
0011 ALPAKA_FN_ACC ALPAKA_FN_INLINE bool positiveZ(uint32_t id) { return id & 0x10000; }
0012
0013 ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ietaAbs(uint32_t id) { return (id >> 9) & 0x7F; }
0014
0015 ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iphi(uint32_t id) { return id & 0x1FF; }
0016
0017 ALPAKA_FN_ACC int dccFromSm(int ism) {
0018 int idcc = 9 + ism;
0019 if (ism > 18)
0020 idcc -= 18;
0021 else
0022 idcc += 18;
0023 return idcc;
0024 }
0025
0026 ALPAKA_FN_ACC int sm(int ieta, int iphi) {
0027 if (iphi > 360)
0028 iphi -= 360;
0029 int ism = (iphi - 1) / 20 + 1;
0030 if (ieta < 0)
0031 ism += 18;
0032 return ism;
0033 }
0034
0035 ALPAKA_FN_ACC int dcc(int ieta, int iphi) {
0036 int const ism = sm(ieta, iphi);
0037 return dccFromSm(ism);
0038 }
0039
0040 ALPAKA_FN_ACC int lm_channel(int iX, int iY) {
0041 static const int idx_[] = {
0042
0043
0044 1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,
0045 1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,
0046 1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9,
0047 1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9
0048
0049
0050 };
0051
0052 constexpr int iym = 4;
0053 constexpr int ixm = 17;
0054 int const il = iym - iY + 1;
0055 int const ic = iX;
0056 int const ii = il * ixm + ic;
0057 if (ii < 0 || ii > (int)(sizeof(idx_) / sizeof(int))) {
0058 return -1;
0059 };
0060 return idx_[ii];
0061 }
0062
0063 ALPAKA_FN_ACC int localCoord_x(int ieta) {
0064 int iz = 1;
0065 if (ieta < 0) {
0066 iz = -1;
0067 }
0068 ieta *= iz;
0069 int ix = ieta - 1;
0070
0071 return ix;
0072 }
0073
0074 ALPAKA_FN_ACC int localCoord_y(int ieta, int iphi) {
0075 if (iphi > 360) {
0076 iphi -= 360;
0077 }
0078 int iy = (iphi - 1) % 20;
0079 if (ieta < 0) {
0080 iy = 19 - iy;
0081 }
0082
0083 return iy;
0084 }
0085
0086 ALPAKA_FN_ACC int lmmod(int ieta, int iphi) {
0087 int const ix = localCoord_x(ieta);
0088 int const iy = localCoord_y(ieta, iphi);
0089
0090 return lm_channel(ix / 5, iy / 5);
0091 }
0092
0093 ALPAKA_FN_ACC int side(int ieta, int iphi) {
0094 int const ilmmod = lmmod(ieta, iphi);
0095 return (ilmmod % 2 == 0) ? 1 : 0;
0096 }
0097
0098 }
0099
0100 ALPAKA_FN_ACC uint32_t hashedIndexEB(uint32_t id) {
0101 using namespace internal::barrel;
0102 return (EBDetId::MAX_IETA + (positiveZ(id) ? ietaAbs(id) - 1 : -ietaAbs(id))) * EBDetId::MAX_IPHI + iphi(id) - 1;
0103 }
0104
0105
0106
0107
0108
0109 ALPAKA_FN_ACC int32_t laserMonitoringRegionEB(uint32_t id) {
0110 using namespace internal::barrel;
0111
0112 int ieta;
0113 if (positiveZ(id)) {
0114 ieta = ietaAbs(id);
0115 } else {
0116 ieta = -ietaAbs(id);
0117 }
0118
0119 int const idcc = dcc(ieta, (int)(iphi(id)));
0120 int const ism = idcc - 9;
0121
0122 int const iside = side(ieta, (int)(iphi(id)));
0123
0124 return (1 + 2 * (ism - 1) + iside);
0125 }
0126
0127 namespace internal::endcap {
0128
0129 ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id) { return (id >> 7) & 0x7F; }
0130
0131 ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id) { return id & 0x7F; }
0132
0133 ALPAKA_FN_ACC ALPAKA_FN_INLINE bool positiveZ(uint32_t id) { return id & 0x4000; }
0134
0135
0136 HOST_DEVICE_CONSTANT unsigned short kxf[] = {
0137 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,
0138 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,
0139 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,
0140 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,
0141 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,
0142 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,
0143 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,
0144 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};
0145
0146 HOST_DEVICE_CONSTANT unsigned short kdi[] = {
0147 0, 10, 20, 30, 40, 50, 60, 75, 90, 105, 120, 145, 170, 195, 220, 245, 270,
0148 300, 330, 360, 390, 420, 450, 480, 510, 540, 570, 605, 640, 675, 710, 747, 784, 821,
0149 858, 895, 932, 969, 1006, 1043, 1080, 1122, 1164, 1206, 1248, 1290, 1332, 1374, 1416, 1458, 1500,
0150 1545, 1590, 1635, 1680, 1725, 1770, 1815, 1860, 1905, 1950, 1995, 2040, 2085, 2130, 2175, 2220, 2265,
0151 2310, 2355, 2400, 2447, 2494, 2541, 2588, 2635, 2682, 2729, 2776, 2818, 2860, 2903, 2946, 2988, 3030,
0152 3071, 3112, 3152, 3192, 3232, 3272, 3311, 3350, 3389, 3428, 3467, 3506, 3545, 3584, 3623, 3662, 3701,
0153 3740, 3779, 3818, 3857, 3896, 3935, 3974, 4013, 4052, 4092, 4132, 4172, 4212, 4253, 4294, 4336, 4378,
0154 4421, 4464, 4506, 4548, 4595, 4642, 4689, 4736, 4783, 4830, 4877, 4924, 4969, 5014, 5059, 5104, 5149,
0155 5194, 5239, 5284, 5329, 5374, 5419, 5464, 5509, 5554, 5599, 5644, 5689, 5734, 5779, 5824, 5866, 5908,
0156 5950, 5992, 6034, 6076, 6118, 6160, 6202, 6244, 6281, 6318, 6355, 6392, 6429, 6466, 6503, 6540, 6577,
0157 6614, 6649, 6684, 6719, 6754, 6784, 6814, 6844, 6874, 6904, 6934, 6964, 6994, 7024, 7054, 7079, 7104,
0158 7129, 7154, 7179, 7204, 7219, 7234, 7249, 7264, 7274, 7284, 7294, 7304, 7314};
0159
0160 ALPAKA_FN_ACC int quadrant(int iX, int iY) {
0161 bool const near = iX >= 11;
0162 bool const far = !near;
0163 bool const top = iY >= 11;
0164 bool const bot = !top;
0165
0166 int iquad = 0;
0167 if (near && top)
0168 iquad = 1;
0169 else if (far && top)
0170 iquad = 2;
0171 else if (far && bot)
0172 iquad = 3;
0173 else
0174 iquad = 4;
0175
0176 return iquad;
0177 }
0178
0179 ALPAKA_FN_ACC int sector(int iX, int iY) {
0180
0181
0182
0183
0184
0185
0186
0187 static const int idx_[] = {
0188
0189
0190 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,
0191 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0,
0192 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 8, 0, 0, 0,
0193 0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 8, 8, 8, 0, 0,
0194 0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 8, 8, 8, 8, 0,
0195 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 9, 9, 9, 9, 8, 8, 8, 8, 8, 0,
0196 0, 2, 2, 2, 2, 2, 2, 1, 1, 1, 9, 9, 9, 8, 8, 8, 8, 8, 8, 0,
0197 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8,
0198 3, 3, 2, 2, 2, 2, 2, 2, 2, 0, 0, 8, 8, 8, 8, 8, 8, 8, 7, 7,
0199 3, 3, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 8, 7, 7, 7, 7, 7, 7, 7,
0200 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,
0201 3, 3, 3, 3, 3, 3, 3, 4, 4, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7,
0202 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7,
0203 0, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 0,
0204 0, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 0,
0205 0, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 0,
0206 0, 0, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 0, 0,
0207 0, 0, 0, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 0, 0, 0,
0208 0, 0, 0, 0, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 0, 0, 0, 0,
0209 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0
0210
0211
0212 };
0213
0214 constexpr int iym = 20;
0215 constexpr int ixm = 20;
0216 int const il = iym - iY;
0217 int const ic = iX - 1;
0218 int const ii = il * ixm + ic;
0219
0220 if (ii < 0 || ii > (int)(sizeof(idx_) / sizeof(int)) || idx_[ii] == 0) {
0221 return -1;
0222 };
0223 return idx_[ii];
0224 }
0225
0226 }
0227
0228 ALPAKA_FN_ACC uint32_t hashedIndexEE(uint32_t id) {
0229 using namespace internal::endcap;
0230
0231 const uint32_t jx(ix(id));
0232 const uint32_t jd(2 * (iy(id) - 1) + (jx - 1) / 50);
0233 return ((positiveZ(id) ? EEDetId::kEEhalf : 0) + kdi[jd] + jx - kxf[jd]);
0234 }
0235
0236
0237
0238
0239
0240
0241 ALPAKA_FN_ACC int32_t laserMonitoringRegionEE(uint32_t id) {
0242 using namespace internal::endcap;
0243
0244
0245 uint32_t const iX = (ix(id) - 1) / 5 + 1;
0246 uint32_t const iY = (iy(id) - 1) / 5 + 1;
0247
0248
0249
0250
0251
0252
0253 int const iz = positiveZ(id) ? 1 : -1;
0254
0255 int const iquad = quadrant(iX, iY);
0256 int const isect = sector(iX, iY);
0257 if (isect < 0)
0258 return -1;
0259
0260 int ilmr = 0;
0261 ilmr = isect - 6;
0262 if (ilmr <= 0)
0263 ilmr += 9;
0264 if (ilmr == 9)
0265 ilmr++;
0266 else if (ilmr == 8 && iquad == 4)
0267 ilmr++;
0268 if (iz == +1)
0269 ilmr += 72;
0270 else
0271 ilmr += 82;
0272
0273 return ilmr;
0274 }
0275
0276 ALPAKA_FN_ACC int32_t rechitSetMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width) {
0277 const uint32_t mask = ((1 << width) - 1) << offset;
0278 value &= ~mask;
0279 value |= (x & ((1U << width) - 1)) << offset;
0280 return value;
0281 }
0282
0283 HOST_DEVICE_CONSTANT float p10[] = {1.e-2f, 1.e-1f, 1.f, 1.e1f, 1.e2f, 1.e3f, 1.e4f, 1.e5f, 1.e6f};
0284
0285 ALPAKA_FN_ACC int32_t rechitGetPower10(float e) {
0286 int b = e < p10[4] ? 0 : 5;
0287 for (; b < 9; ++b)
0288 if (e < p10[b])
0289 break;
0290 return b;
0291 }
0292
0293 }