Back to home page

Project CMSSW displayed by LXR

 
 

    


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           // clang-format off
0043      // 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
0044         1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,  // 3
0045         1, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,  // 2
0046         1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9,  // 1
0047         1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9  // 0
0048      // 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
0049           // clang-format on
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   }  // namespace internal::barrel
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   // https://cmssdt.cern.ch/lxr/source/CalibCalorimetry/EcalLaserAnalyzer/src/MEEBGeom.cc
0107   //  function: "lmr"
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     // these constants come from EE Det Id
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       //  Y (towards the surface)
0181       //  T
0182       //  |
0183       //  |
0184       //  |
0185       //  o---------| X  (towards center of LHC)
0186       //
0187       static const int idx_[] = {
0188           // clang-format off
0189          // 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
0190             0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0,  // 20
0191             0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0,  // 19
0192             0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 8, 0, 0, 0,  // 18
0193             0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 8, 8, 8, 0, 0,  // 17
0194             0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 8, 8, 8, 8, 0,  // 16
0195             0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 9, 9, 9, 9, 8, 8, 8, 8, 8, 0,  // 15
0196             0, 2, 2, 2, 2, 2, 2, 1, 1, 1, 9, 9, 9, 8, 8, 8, 8, 8, 8, 0,  // 14
0197             2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8,  // 13
0198             3, 3, 2, 2, 2, 2, 2, 2, 2, 0, 0, 8, 8, 8, 8, 8, 8, 8, 7, 7,  // 12
0199             3, 3, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 8, 7, 7, 7, 7, 7, 7, 7,  // 11
0200             3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7,  // 10
0201             3, 3, 3, 3, 3, 3, 3, 4, 4, 0, 0, 6, 6, 7, 7, 7, 7, 7, 7, 7,  // 9
0202             3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7,  // 8
0203             0, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 0,  // 7
0204             0, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 0,  // 6
0205             0, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 0,  // 5
0206             0, 0, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 0, 0,  // 4
0207             0, 0, 0, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 0, 0, 0,  // 3
0208             0, 0, 0, 0, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 0, 0, 0, 0,  // 2
0209             0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0   // 1
0210          // 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
0211           // clang-format on
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   }  // namespace internal::endcap
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   // https://cmssdt.cern.ch/lxr/source/CalibCalorimetry/EcalLaserAnalyzer/src/MEEEGeom.cc
0238   // https://github.com/cms-sw/cmssw/blob/master/CalibCalorimetry/EcalLaserCorrection/src/EcalLaserDbService.cc
0239   //
0240 
0241   ALPAKA_FN_ACC int32_t laserMonitoringRegionEE(uint32_t id) {
0242     using namespace internal::endcap;
0243 
0244     // SuperCrysCoord
0245     uint32_t const iX = (ix(id) - 1) / 5 + 1;
0246     uint32_t const iY = (iy(id) - 1) / 5 + 1;
0247 
0248     // Correct convention
0249     //   * @param iz iz/zside index: -1 for EE-, +1 for EE+
0250     //   https://github.com/cms-sw/cmssw/blob/master/DataFormats/EcalDetId/interface/EEDetId.h#L68-L71
0251     //   zside in https://github.com/cms-sw/cmssw/blob/master/CalibCalorimetry/EcalLaserCorrection/src/EcalLaserDbService.cc#L63
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 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE::ecal::reconstruction