Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-09 02:22:36

0001 #ifndef RecoParticleFlow_PFRecHitProducer_interface_alpaka_CalorimeterDefinitions_h
0002 #define RecoParticleFlow_PFRecHitProducer_interface_alpaka_CalorimeterDefinitions_h
0003 
0004 #include "DataFormats/DetId/interface/DetId.h"
0005 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
0006 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
0007 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
0008 #include "DataFormats/HcalDetId/interface/HcalSubdetector.h"
0009 #include "DataFormats/HcalRecHit/interface/HBHERecHit.h"
0010 #include "DataFormats/ParticleFlowReco/interface/CaloRecHitHostCollection.h"
0011 #include "DataFormats/ParticleFlowReco/interface/alpaka/CaloRecHitDeviceCollection.h"
0012 #include "RecoParticleFlow/PFRecHitProducer/interface/PFRecHitParamsRecord.h"
0013 #include "RecoParticleFlow/PFRecHitProducer/interface/PFRecHitTopologyHostCollection.h"
0014 #include "RecoParticleFlow/PFRecHitProducer/interface/PFRecHitTopologyRecord.h"
0015 #include "RecoParticleFlow/PFRecHitProducer/interface/alpaka/PFRecHitParamsDeviceCollection.h"
0016 #include "RecoParticleFlow/PFRecHitProducer/interface/alpaka/PFRecHitTopologyDeviceCollection.h"
0017 
0018 // This file defines two structs:
0019 // 1) ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer::HCAL
0020 // 2) ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer::ECAL
0021 // These are used as template arguments of the PFRecHitSoAProducer class and
0022 // related classes. This allows to specialise behaviour for the two calorimeter
0023 // types.
0024 namespace ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer {
0025 
0026   // Get subdetector encoded in detId to narrow the range of reference table values to search
0027   constexpr inline uint32_t getSubdet(uint32_t detId) { return DetId(detId).subdetId(); }
0028 
0029   struct HCAL {
0030     using CaloRecHitType = HBHERecHit;
0031     using CaloRecHitSoATypeHost = reco::CaloRecHitHostCollection;
0032     using CaloRecHitSoATypeDevice = reco::CaloRecHitDeviceCollection;
0033     using ParameterType = reco::PFRecHitHCALParamsDeviceCollection;
0034     using ParameterRecordType = PFRecHitHCALParamsRecord;
0035     using TopologyTypeHost = reco::PFRecHitHCALTopologyHostCollection;
0036     using TopologyTypeDevice = reco::PFRecHitHCALTopologyDeviceCollection;
0037     using TopologyRecordType = PFRecHitHCALTopologyRecord;
0038 
0039     static constexpr DetId::Detector kDetectorId = DetId::Detector::Hcal;
0040     static constexpr int kSubdetectorBarrelId = HcalSubdetector::HcalBarrel;
0041     static constexpr int kSubdetectorEndcapId = HcalSubdetector::HcalEndcap;
0042 
0043     static constexpr uint32_t kMaxDepthHB = 4;
0044     static constexpr uint32_t kMaxDepthHE = 7;
0045     static constexpr uint32_t kFirstHBRing = 1;
0046     static constexpr uint32_t kLastHBRing = 16;
0047     static constexpr uint32_t kFirstHERing = 16;
0048     static constexpr uint32_t kLastHERing = 29;
0049     static constexpr uint32_t kMaxIPhi = 72;
0050     static constexpr uint32_t kSizeBarrel = kMaxDepthHB * (kLastHBRing - kFirstHBRing + 1) * kMaxIPhi * 2;
0051     static constexpr uint32_t kSizeEndcap = kMaxDepthHE * (kLastHERing - kFirstHERing + 1) * kMaxIPhi * 2;
0052     static constexpr uint32_t kSize = kSizeBarrel + kSizeEndcap;  // maximum possible HCAL denseId (=23328)
0053 
0054     static constexpr bool detIdInRange(uint32_t detId) {
0055       return detId != 0 && DetId(detId).det() == DetId::Detector::Hcal &&
0056              (getSubdet(detId) == HcalSubdetector::HcalBarrel || getSubdet(detId) == HcalSubdetector::HcalEndcap);
0057     }
0058 
0059     static constexpr uint32_t getDepth(uint32_t detId) { return HcalDetId(detId).depth(); }
0060     static constexpr uint32_t getIetaAbs(uint32_t detId) { return HcalDetId(detId).ietaAbs(); }
0061     static constexpr uint32_t getIphi(uint32_t detId) { return HcalDetId(detId).iphi(); }
0062     static constexpr int getZside(uint32_t detId) { return HcalDetId(detId).zside(); }
0063 
0064     // https://cmssdt.cern.ch/lxr/source/Geometry/CaloTopology/src/HcalTopology.cc#1170
0065     static constexpr uint32_t detId2denseIdHB(uint32_t detId) {
0066       const uint32_t nEtaHB = (kLastHBRing - kFirstHBRing + 1);
0067       const uint32_t ip = getIphi(detId);
0068       const uint32_t ie = getIetaAbs(detId);
0069       const uint32_t dp = getDepth(detId);
0070       const int zn = getZside(detId);
0071       uint32_t retval = (dp - 1) + kMaxDepthHB * (ip - 1);
0072       if (zn > 0)
0073         retval += kMaxDepthHB * kMaxIPhi * (ie * zn - kFirstHBRing);
0074       else
0075         retval += kMaxDepthHB * kMaxIPhi * (ie * zn + kLastHBRing + nEtaHB);
0076 
0077       return retval;
0078     }
0079 
0080     // https://cmssdt.cern.ch/lxr/source/Geometry/CaloTopology/src/HcalTopology.cc#1189
0081     static constexpr uint32_t detId2denseIdHE(uint32_t detId) {
0082       const uint32_t nEtaHE = (kLastHERing - kFirstHERing + 1);
0083       const uint32_t ip = getIphi(detId);
0084       const uint32_t ie = getIetaAbs(detId);
0085       const uint32_t dp = getDepth(detId);
0086       const int zn = getZside(detId);
0087       uint32_t retval = (dp - 1) + kMaxDepthHE * (ip - 1);
0088       if (zn > 0)
0089         retval += kMaxDepthHE * kMaxIPhi * (ie * zn - kFirstHERing);
0090       else
0091         retval += kMaxDepthHE * kMaxIPhi * (ie * zn + kLastHERing + nEtaHE);
0092 
0093       return retval + kSizeBarrel;
0094     }
0095 
0096     static constexpr uint32_t detId2denseId(uint32_t detId) {
0097       const uint32_t subdet = getSubdet(detId);
0098       if (subdet == HcalBarrel)
0099         return detId2denseIdHB(detId);
0100       if (subdet == HcalEndcap)
0101         return detId2denseIdHE(detId);
0102 
0103       printf("invalid detId: %u\n", detId);
0104       return 0;
0105     }
0106   };
0107 
0108   struct ECAL {
0109     using CaloRecHitType = EcalRecHit;
0110     using CaloRecHitSoATypeHost = reco::CaloRecHitHostCollection;
0111     using CaloRecHitSoATypeDevice = reco::CaloRecHitDeviceCollection;
0112     using ParameterType = reco::PFRecHitECALParamsDeviceCollection;
0113     using ParameterRecordType = EcalPFRecHitThresholdsRcd;
0114     using TopologyTypeHost = reco::PFRecHitECALTopologyHostCollection;
0115     using TopologyTypeDevice = reco::PFRecHitECALTopologyDeviceCollection;
0116     using TopologyRecordType = PFRecHitECALTopologyRecord;
0117 
0118     static constexpr DetId::Detector kDetectorId = DetId::Detector::Ecal;
0119     static constexpr int kSubdetectorBarrelId = EcalSubdetector::EcalBarrel;
0120     static constexpr int kSubdetectorEndcapId = EcalSubdetector::EcalEndcap;
0121 
0122     using Flags = EcalRecHit::Flags;
0123 
0124     // https://cmssdt.cern.ch/lxr/source/DataFormats/EcalDetId/interface/EBDetId.h
0125     struct Barrel {
0126       static constexpr int kMaxIEta = 85;
0127       static constexpr int kMaxIPhi = 360;
0128       static constexpr int kSize = 2 * kMaxIPhi * kMaxIEta;
0129 
0130       static constexpr int ietaAbs(uint32_t detId) { return (detId >> 9) & 0x7F; }
0131       static constexpr int iphi(uint32_t detId) { return detId & 0x1FF; }
0132       static constexpr bool positiveZ(uint32_t detId) { return detId & 0x10000; }
0133       static constexpr uint32_t denseIndex(uint32_t detId) {
0134         return (kMaxIEta + (positiveZ(detId) ? ietaAbs(detId) - 1 : -ietaAbs(detId))) * kMaxIPhi + iphi(detId) - 1;
0135       }
0136     };
0137 
0138     // https://cmssdt.cern.ch/lxr/source/DataFormats/EcalDetId/interface/EEDetId.h
0139     struct Endcap {
0140       static constexpr uint32_t kEEhalf = 7324;
0141       static constexpr uint32_t kSize = kEEhalf * 2;
0142 
0143       static constexpr int ix(uint32_t detId) { return (detId >> 7) & 0x7F; }
0144       static constexpr int iy(uint32_t detId) { return detId & 0x7F; }
0145       static constexpr bool positiveZ(uint32_t detId) { return detId & 0x4000; }
0146 
0147       static constexpr uint32_t denseIndex(uint32_t detId) {
0148         const unsigned short kxf[] = {
0149             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,
0150             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,
0151             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,
0152             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,
0153             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,
0154             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,
0155             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,
0156             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};
0157 
0158         const unsigned short kdi[] = {
0159             0,    10,   20,   30,   40,   50,   60,   75,   90,   105,  120,  145,  170,  195,  220,  245,  270,
0160             300,  330,  360,  390,  420,  450,  480,  510,  540,  570,  605,  640,  675,  710,  747,  784,  821,
0161             858,  895,  932,  969,  1006, 1043, 1080, 1122, 1164, 1206, 1248, 1290, 1332, 1374, 1416, 1458, 1500,
0162             1545, 1590, 1635, 1680, 1725, 1770, 1815, 1860, 1905, 1950, 1995, 2040, 2085, 2130, 2175, 2220, 2265,
0163             2310, 2355, 2400, 2447, 2494, 2541, 2588, 2635, 2682, 2729, 2776, 2818, 2860, 2903, 2946, 2988, 3030,
0164             3071, 3112, 3152, 3192, 3232, 3272, 3311, 3350, 3389, 3428, 3467, 3506, 3545, 3584, 3623, 3662, 3701,
0165             3740, 3779, 3818, 3857, 3896, 3935, 3974, 4013, 4052, 4092, 4132, 4172, 4212, 4253, 4294, 4336, 4378,
0166             4421, 4464, 4506, 4548, 4595, 4642, 4689, 4736, 4783, 4830, 4877, 4924, 4969, 5014, 5059, 5104, 5149,
0167             5194, 5239, 5284, 5329, 5374, 5419, 5464, 5509, 5554, 5599, 5644, 5689, 5734, 5779, 5824, 5866, 5908,
0168             5950, 5992, 6034, 6076, 6118, 6160, 6202, 6244, 6281, 6318, 6355, 6392, 6429, 6466, 6503, 6540, 6577,
0169             6614, 6649, 6684, 6719, 6754, 6784, 6814, 6844, 6874, 6904, 6934, 6964, 6994, 7024, 7054, 7079, 7104,
0170             7129, 7154, 7179, 7204, 7219, 7234, 7249, 7264, 7274, 7284, 7294, 7304, 7314};
0171 
0172         const uint32_t jx = ix(detId);
0173         const uint32_t jd = 2 * (iy(detId) - 1) + (jx - 1) / 50;
0174         return ((positiveZ(detId) ? kEEhalf : 0) + kdi[jd] + jx - kxf[jd]);
0175       }
0176     };
0177 
0178     static constexpr bool checkFlag(uint32_t flagBits, int flag) { return flagBits & (0x1 << flag); }
0179 
0180     static constexpr uint32_t detId2denseId(uint32_t detId) {
0181       const uint32_t subdet = getSubdet(detId);
0182       if (subdet == EcalBarrel)
0183         return Barrel::denseIndex(detId);
0184       if (subdet == EcalEndcap)
0185         return Barrel::kSize + Endcap::denseIndex(detId);
0186 
0187       printf("invalid detId: %u\n", detId);
0188       return 0;
0189     }
0190 
0191     static constexpr bool detIdInRange(uint32_t detId) {
0192       return detId != 0 && DetId(detId).det() == DetId::Detector::Ecal &&
0193              (getSubdet(detId) == EcalSubdetector::EcalBarrel || getSubdet(detId) == EcalSubdetector::EcalEndcap);
0194     }
0195 
0196     static constexpr int getZside(uint32_t detId) {
0197       return ((getSubdet(detId) == EcalSubdetector::EcalBarrel) ? Barrel::positiveZ(detId) : Endcap::positiveZ(detId))
0198                  ? (1)
0199                  : (-1);
0200     }
0201 
0202     static constexpr uint32_t kSize = Barrel::kSize + Endcap::kSize;  // maximum possible ECAL denseId (=75848)
0203   };
0204 
0205 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE::particleFlowRecHitProducer
0206 
0207 #endif  // RecoParticleFlow_PFRecHitProducer_interface_alpaka_CalorimeterDefinitions_h