Back to home page

Project CMSSW displayed by LXR

 
 

    


Warning, /RecoLocalCalo/EcalRecProducers/plugins/KernelHelpers.cu is written in an unsupported language. File is not indexed.

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