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
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
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;
0024 static constexpr int nTowerPhiSLR = 8;
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 }
0364
0365 #endif