Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-09-05 05:04:37

0001 #ifndef _PHASE_2_L1_CALO_PFCLUSTER_EMULATOR_H_
0002 #define _PHASE_2_L1_CALO_PFCLUSTER_EMULATOR_H_
0003 
0004 #include <cstdlib>
0005 
0006 //    eta:  0  1  2  3  4   5  6  7  8   9 10 11 12  13 14 15 16  17 18 19 20
0007 // 0             |                                                     |
0008 // 1             |                                                     |
0009 //               |-----------------------------------------------------|
0010 // 2             |                                                     |
0011 // 3             |                                                     |
0012 // 4             |                                                     |
0013 // 5             |                                                     |
0014 //               | ----------------------------------------------------|
0015 // 6             |                                                     |
0016 // 7             |                                                     |
0017 //
0018 // 8 PFclusters are created in one 21x8 (2+17+2 x 2+4+2)
0019 
0020 static constexpr int nTowerEta = 34;
0021 static constexpr int nTowerPhi = 72;
0022 static constexpr int nSLR = 36;
0023 static constexpr int nTowerEtaSLR = 21;  // including overlap: 2+17+2
0024 static constexpr int nTowerPhiSLR = 8;   // including overlap: 2+4+2
0025 static constexpr int nPFClusterSLR = 8;
0026 static constexpr int nHfEta = 24;
0027 static constexpr int nHfPhi = 72;
0028 static constexpr int nHfRegions = 12;
0029 
0030 namespace gctpf {
0031 
0032   typedef struct {
0033     float et;
0034     int eta;
0035     int phi;
0036   } GCTpfcluster_t;
0037 
0038   typedef struct {
0039     GCTpfcluster_t GCTpfclusters[nPFClusterSLR];
0040   } PFcluster_t;
0041 
0042   typedef struct {
0043     float et;
0044     int eta;
0045     int phi;
0046   } GCTint_t;
0047 
0048   typedef struct {
0049     GCTint_t t[nTowerPhiSLR];
0050   } GCTEtaStrip_t;
0051 
0052   typedef struct {
0053     GCTint_t t[nHfPhi / 6];
0054   } GCTEtaHFStrip_t;
0055 
0056   typedef struct {
0057     GCTint_t p[nTowerEtaSLR - 2];
0058   } GCTEtaStripPeak_t;
0059 
0060   typedef struct {
0061     GCTint_t p[nHfEta];
0062   } GCTEtaHFStripPeak_t;
0063 
0064   typedef struct {
0065     GCTEtaStrip_t s[nTowerEtaSLR];
0066   } Region_t;
0067 
0068   typedef struct {
0069     GCTEtaHFStrip_t s[nHfEta];
0070   } RegionHF_t;
0071 
0072   inline GCTint_t bestOf2(const GCTint_t& t0, const GCTint_t& t1) {
0073     GCTint_t x;
0074     x = (t0.et > t1.et) ? t0 : t1;
0075 
0076     return x;
0077   }
0078 
0079   inline GCTint_t getPeakOfStrip(const GCTEtaStrip_t& etaStrip) {
0080     GCTint_t best12 = bestOf2(etaStrip.t[1], etaStrip.t[2]);
0081     GCTint_t best34 = bestOf2(etaStrip.t[3], etaStrip.t[4]);
0082     GCTint_t best56 = bestOf2(etaStrip.t[5], etaStrip.t[6]);
0083     GCTint_t best1234 = bestOf2(best12, best34);
0084     GCTint_t bestAll = bestOf2(best1234, best56);
0085 
0086     return bestAll;
0087   }
0088 
0089   inline GCTint_t getPeakOfHFStrip(const GCTEtaHFStrip_t& etaStrip) {
0090     GCTint_t best01 = bestOf2(etaStrip.t[0], etaStrip.t[1]);
0091     GCTint_t best23 = bestOf2(etaStrip.t[2], etaStrip.t[3]);
0092     GCTint_t best45 = bestOf2(etaStrip.t[4], etaStrip.t[5]);
0093     GCTint_t best67 = bestOf2(etaStrip.t[6], etaStrip.t[7]);
0094     GCTint_t best89 = bestOf2(etaStrip.t[8], etaStrip.t[9]);
0095     GCTint_t best1011 = bestOf2(etaStrip.t[10], etaStrip.t[11]);
0096     GCTint_t best0123 = bestOf2(best01, best23);
0097     GCTint_t best4567 = bestOf2(best45, best67);
0098     GCTint_t best891011 = bestOf2(best89, best1011);
0099     GCTint_t best01234567 = bestOf2(best0123, best4567);
0100     GCTint_t bestAll = bestOf2(best01234567, best891011);
0101 
0102     return bestAll;
0103   }
0104 
0105   inline GCTint_t getPeakBin(const GCTEtaStripPeak_t& etaStripPeak) {
0106     GCTint_t best01 = bestOf2(etaStripPeak.p[0], etaStripPeak.p[1]);
0107     GCTint_t best23 = bestOf2(etaStripPeak.p[2], etaStripPeak.p[3]);
0108     GCTint_t best45 = bestOf2(etaStripPeak.p[4], etaStripPeak.p[5]);
0109     GCTint_t best67 = bestOf2(etaStripPeak.p[6], etaStripPeak.p[7]);
0110     GCTint_t best89 = bestOf2(etaStripPeak.p[8], etaStripPeak.p[9]);
0111     GCTint_t best1011 = bestOf2(etaStripPeak.p[10], etaStripPeak.p[11]);
0112     GCTint_t best1213 = bestOf2(etaStripPeak.p[12], etaStripPeak.p[13]);
0113     GCTint_t best1415 = bestOf2(etaStripPeak.p[14], etaStripPeak.p[15]);
0114     GCTint_t best1617 = bestOf2(etaStripPeak.p[16], etaStripPeak.p[17]);
0115     GCTint_t best0123 = bestOf2(best01, best23);
0116     GCTint_t best4567 = bestOf2(best45, best67);
0117     GCTint_t best891011 = bestOf2(best89, best1011);
0118     GCTint_t best12131415 = bestOf2(best1213, best1415);
0119     GCTint_t best01234567 = bestOf2(best0123, best4567);
0120     GCTint_t best01234567891011 = bestOf2(best01234567, best891011);
0121     GCTint_t best121314151617 = bestOf2(best12131415, best1617);
0122     GCTint_t best12131415161718 = bestOf2(best121314151617, etaStripPeak.p[18]);
0123     GCTint_t bestAll = bestOf2(best01234567891011, best12131415161718);
0124 
0125     return bestAll;
0126   }
0127 
0128   inline GCTint_t getPeakBinHF(const GCTEtaHFStripPeak_t& etaStripPeak) {
0129     GCTint_t best01 = bestOf2(etaStripPeak.p[0], etaStripPeak.p[1]);
0130     GCTint_t best23 = bestOf2(etaStripPeak.p[2], etaStripPeak.p[3]);
0131     GCTint_t best45 = bestOf2(etaStripPeak.p[4], etaStripPeak.p[5]);
0132     GCTint_t best67 = bestOf2(etaStripPeak.p[6], etaStripPeak.p[7]);
0133     GCTint_t best89 = bestOf2(etaStripPeak.p[8], etaStripPeak.p[9]);
0134     GCTint_t best1011 = bestOf2(etaStripPeak.p[10], etaStripPeak.p[11]);
0135     GCTint_t best1213 = bestOf2(etaStripPeak.p[12], etaStripPeak.p[13]);
0136     GCTint_t best1415 = bestOf2(etaStripPeak.p[14], etaStripPeak.p[15]);
0137     GCTint_t best1617 = bestOf2(etaStripPeak.p[16], etaStripPeak.p[17]);
0138     GCTint_t best1819 = bestOf2(etaStripPeak.p[18], etaStripPeak.p[19]);
0139     GCTint_t best2021 = bestOf2(etaStripPeak.p[20], etaStripPeak.p[21]);
0140     GCTint_t best2223 = bestOf2(etaStripPeak.p[22], etaStripPeak.p[23]);
0141     GCTint_t best0123 = bestOf2(best01, best23);
0142     GCTint_t best4567 = bestOf2(best45, best67);
0143     GCTint_t best891011 = bestOf2(best89, best1011);
0144     GCTint_t best12131415 = bestOf2(best1213, best1415);
0145     GCTint_t best16171819 = bestOf2(best1617, best1819);
0146     GCTint_t best20212223 = bestOf2(best2021, best2223);
0147     GCTint_t best0to7 = bestOf2(best0123, best4567);
0148     GCTint_t best8to15 = bestOf2(best891011, best12131415);
0149     GCTint_t best16to23 = bestOf2(best16171819, best20212223);
0150     GCTint_t best0to15 = bestOf2(best0to7, best8to15);
0151     GCTint_t bestAll = bestOf2(best0to15, best16to23);
0152 
0153     return bestAll;
0154   }
0155 
0156   inline GCTint_t getPeakPosition(const Region_t& region) {
0157     GCTEtaStripPeak_t etaPeak;
0158     for (int i = 0; i < nTowerEtaSLR - 2; i++) {
0159       etaPeak.p[i] = getPeakOfStrip(region.s[i + 1]);
0160     }
0161     GCTint_t max = getPeakBin(etaPeak);
0162 
0163     return max;
0164   }
0165 
0166   inline GCTint_t getPeakPositionHF(const RegionHF_t& region) {
0167     GCTEtaHFStripPeak_t etaPeak;
0168     for (int i = 0; i < nHfPhi / 6; i++) {
0169       etaPeak.p[i] = getPeakOfHFStrip(region.s[i]);
0170     }
0171     GCTint_t max = getPeakBinHF(etaPeak);
0172 
0173     return max;
0174   }
0175 
0176   inline Region_t initStructure(float temp[nTowerEtaSLR][nTowerPhiSLR]) {
0177     Region_t r;
0178 
0179     for (int i = 0; i < nTowerPhiSLR; i++) {
0180       for (int j = 0; j < nTowerEtaSLR; j++) {
0181         r.s[j].t[i].et = temp[j][i];
0182         r.s[j].t[i].eta = j;
0183         r.s[j].t[i].phi = i;
0184       }
0185     }
0186 
0187     return r;
0188   }
0189 
0190   inline RegionHF_t initStructureHF(float temp[nHfEta][nHfPhi / 6]) {
0191     RegionHF_t r;
0192 
0193     for (int i = 0; i < nHfPhi / 6; i++) {
0194       for (int j = 0; j < nHfEta; j++) {
0195         r.s[j].t[i].et = temp[j][i];
0196         r.s[j].t[i].eta = j;
0197         r.s[j].t[i].phi = i;
0198       }
0199     }
0200 
0201     return r;
0202   }
0203 
0204   inline float getEt(float temp[nTowerEtaSLR][nTowerPhiSLR], int eta, int phi) {
0205     float et_sumEta[3] = {0., 0., 0.};
0206 
0207     for (int i = 0; i < (nTowerEtaSLR - 2); i++) {
0208       for (int j = 0; j < (nTowerPhiSLR - 2); j++) {
0209         if (i + 1 == eta && j + 1 == phi) {
0210           for (int k = 0; k < 3; k++) {
0211             et_sumEta[k] = temp[i + k][j] + temp[i + k][j + 1] + temp[i + k][j + 2];
0212           }
0213         }
0214       }
0215     }
0216 
0217     float pfcluster_et = et_sumEta[0] + et_sumEta[1] + et_sumEta[2];
0218 
0219     return pfcluster_et;
0220   }
0221 
0222   inline float getEtHF(float temp[nHfEta][nHfPhi / 6], int eta, int phi) {
0223     float tempX[nHfEta + 2][nHfPhi / 6 + 2];
0224     float et_sumEta[3] = {0., 0., 0.};
0225 
0226     for (int i = 0; i < nHfEta + 2; i++) {
0227       for (int k = 0; k < nHfPhi / 6 + 2; k++) {
0228         tempX[i][k] = 0;
0229       }
0230     }
0231 
0232     for (int i = 0; i < nHfEta; i++) {
0233       for (int k = 0; k < nHfPhi / 6; k++) {
0234         tempX[i + 1][k + 1] = temp[i][k];
0235       }
0236     }
0237 
0238     for (int i = 0; i < nHfEta; i++) {
0239       for (int j = 0; j < nHfPhi / 6; j++) {
0240         if (i == eta && j == phi) {
0241           for (int k = 0; k < 3; k++) {
0242             et_sumEta[k] = tempX[i + k][j] + tempX[i + k][j + 1] + tempX[i + k][j + 2];
0243           }
0244         }
0245       }
0246     }
0247 
0248     float pfcluster_et = et_sumEta[0] + et_sumEta[1] + et_sumEta[2];
0249 
0250     return pfcluster_et;
0251   }
0252 
0253   inline void RemoveTmp(float temp[nTowerEtaSLR][nTowerPhiSLR], int eta, int phi) {
0254     for (int i = 0; i < nTowerEtaSLR; i++) {
0255       if (i + 1 >= eta && i <= eta + 1) {
0256         for (int j = 0; j < nTowerPhiSLR; j++) {
0257           if (j + 1 >= phi && j <= phi + 1) {
0258             temp[i][j] = 0;
0259           }
0260         }
0261       }
0262     }
0263 
0264     return;
0265   }
0266 
0267   inline void RemoveTmpHF(float temp[nHfEta][nHfPhi / 6], int eta, int phi) {
0268     for (int i = 0; i < nHfEta; i++) {
0269       if (i + 1 >= eta && i <= eta + 1) {
0270         for (int j = 0; j < nHfPhi / 6; j++) {
0271           if (j + 1 >= phi && j <= phi + 1) {
0272             temp[i][j] = 0;
0273           }
0274         }
0275       }
0276     }
0277 
0278     return;
0279   }
0280 
0281   inline GCTpfcluster_t recoPfcluster(float temporary[nTowerEtaSLR][nTowerPhiSLR], int etaoffset, int phioffset) {
0282     GCTpfcluster_t pfclusterReturn;
0283 
0284     Region_t region;
0285 
0286     region = initStructure(temporary);
0287 
0288     GCTint_t regionMax = getPeakPosition(region);
0289 
0290     float pfcluster_et = getEt(temporary, regionMax.eta, regionMax.phi);
0291 
0292     RemoveTmp(temporary, regionMax.eta, regionMax.phi);
0293 
0294     if (!(regionMax.eta >= 2 && regionMax.eta < (nTowerEtaSLR - 2) && regionMax.phi >= 2 &&
0295           regionMax.phi < (nTowerPhiSLR - 2)))
0296       pfcluster_et = 0;
0297 
0298     pfclusterReturn.et = pfcluster_et;
0299     pfclusterReturn.eta = regionMax.eta - 2 + etaoffset;
0300     pfclusterReturn.phi = regionMax.phi - 2 + phioffset;
0301 
0302     return pfclusterReturn;
0303   }
0304 
0305   inline GCTpfcluster_t recoPfclusterHF(float temporary[nHfEta][nHfPhi / 6], int etaoffset, int phioffset) {
0306     GCTpfcluster_t pfclusterReturn;
0307 
0308     RegionHF_t region;
0309 
0310     region = initStructureHF(temporary);
0311 
0312     GCTint_t regionMax = getPeakPositionHF(region);
0313 
0314     float pfcluster_et = getEtHF(temporary, regionMax.eta, regionMax.phi);
0315 
0316     RemoveTmpHF(temporary, regionMax.eta, regionMax.phi);
0317 
0318     pfclusterReturn.et = pfcluster_et;
0319     pfclusterReturn.eta = regionMax.eta + etaoffset;
0320     pfclusterReturn.phi = regionMax.phi + phioffset;
0321     if (pfclusterReturn.phi < 0)
0322       pfclusterReturn.phi += nHfPhi;
0323 
0324     return pfclusterReturn;
0325   }
0326 
0327   inline PFcluster_t pfcluster(float temporary[nTowerEtaSLR][nTowerPhiSLR], int etaoffset, int phioffset) {
0328     GCTpfcluster_t pfcluster[nPFClusterSLR];
0329 
0330     for (int i = 0; i < nPFClusterSLR; i++) {
0331       pfcluster[i] = recoPfcluster(temporary, etaoffset, phioffset);
0332     }
0333 
0334     PFcluster_t GCTPfclusters;
0335 
0336     for (int i = 0; i < nPFClusterSLR; i++) {
0337       GCTPfclusters.GCTpfclusters[i].et = pfcluster[i].et;
0338       GCTPfclusters.GCTpfclusters[i].eta = pfcluster[i].eta;
0339       GCTPfclusters.GCTpfclusters[i].phi = pfcluster[i].phi;
0340     }
0341 
0342     return GCTPfclusters;
0343   }
0344 
0345   inline PFcluster_t pfclusterHF(float temporary[nHfEta][nHfPhi / 6], int etaoffset, int phioffset) {
0346     GCTpfcluster_t pfcluster[nPFClusterSLR];
0347 
0348     for (int i = 0; i < nPFClusterSLR; i++) {
0349       pfcluster[i] = recoPfclusterHF(temporary, etaoffset, phioffset);
0350     }
0351 
0352     PFcluster_t GCTPfclusters;
0353 
0354     for (int i = 0; i < nPFClusterSLR; i++) {
0355       GCTPfclusters.GCTpfclusters[i].et = pfcluster[i].et;
0356       GCTPfclusters.GCTpfclusters[i].eta = pfcluster[i].eta;
0357       GCTPfclusters.GCTpfclusters[i].phi = pfcluster[i].phi;
0358     }
0359 
0360     return GCTPfclusters;
0361   }
0362 
0363 }  // namespace gctpf
0364 
0365 #endif