25 for(
size_t i=0;
i<
sines.size(); ++
i) {
33 const std::vector<l1t::CaloEmCand> & EMCands,
34 const std::vector<l1t::Jet> *
jets,
35 std::vector<l1t::EtSum> * etsums) {
56 int etSumEtaMinEt = 4;
57 int etSumEtaMaxEt = 17;
58 int etSumEtaMinHt = 4;
59 int etSumEtaMaxHt = 17;
63 std::vector<SimpleRegion> regionEtVect;
64 std::vector<SimpleRegion> regionHtVect;
67 bool regionOverflowEt(
false);
68 bool regionOverflowHt(
false);
69 for (
auto& region : regions) {
70 if(region.hwEta() >= etSumEtaMinEt && region.hwEta() <= etSumEtaMaxEt)
72 if(region.hwPt() >= 1023)
74 regionOverflowEt =
true;
77 if ( region.hwEta() >= etSumEtaMinHt && region.hwEta() <= etSumEtaMaxHt)
79 if(region.hwPt() >= 1023)
81 regionOverflowHt =
true;
91 for (
auto& region : regions) {
92 if ( region.hwEta() >= etSumEtaMinEt && region.hwEta() <= etSumEtaMaxEt)
94 if(region.hwPt() >= etSumEtThresholdEt)
97 r.
ieta = region.hwEta();
98 r.
iphi = region.hwPhi();
100 regionEtVect.push_back(r);
103 if ( region.hwEta() >= etSumEtaMinHt && region.hwEta() <= etSumEtaMaxHt)
105 if(region.hwPt() >= etSumEtThresholdHt)
108 r.
ieta = region.hwEta();
109 r.
iphi = region.hwPhi();
110 r.
et = region.hwPt();
111 regionHtVect.push_back(r);
116 int sumET,
MET, iPhiET;
119 int sumHT,
MHT, iPhiHT;
127 if(MET >= 0xfff || regionOverflowEt)
129 if(MHT >= 0x7f || regionOverflowHt)
131 if(sumET >= 0xfff || regionOverflowEt)
133 if(sumHT >= 0xfff || regionOverflowHt)
143 const ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > etLorentz(0,0,0,0);
149 std::vector<l1t::EtSum> preGtEtSums;
150 preGtEtSums.reserve(4);
152 preGtEtSums.push_back(etMiss);
153 preGtEtSums.push_back(htMiss);
154 preGtEtSums.push_back(etTot);
155 preGtEtSums.push_back(htTot);
161 std::tuple<int, int, int>
164 std::array<int, 18> sumEtaPos{};
165 std::array<int, 18> sumEtaNeg{};
166 for (
const auto&
r : regionEt)
169 sumEtaNeg[
r.iphi] +=
r.et;
171 sumEtaPos[
r.iphi] +=
r.et;
174 std::array<int, 18> sumEta{};
176 for(
size_t i=0;
i<sumEta.size(); ++
i)
178 assert(sumEtaPos[
i] >= 0 && sumEtaNeg[
i] >= 0);
179 sumEta[
i] = sumEtaPos[
i] + sumEtaNeg[
i];
184 std::array<int, 5> sumsForCos{};
185 std::array<int, 5> sumsForSin{};
186 for(
size_t iphi=0; iphi<sumEta.size(); ++iphi)
190 sumsForCos[iphi] += sumEta[iphi];
191 sumsForSin[iphi] += sumEta[iphi];
195 sumsForCos[9-iphi] -= sumEta[iphi];
196 sumsForSin[9-iphi] += sumEta[iphi];
198 else if ( iphi < 14 )
200 sumsForCos[iphi-9] -= sumEta[iphi];
201 sumsForSin[iphi-9] -= sumEta[iphi];
205 sumsForCos[18-iphi] += sumEta[iphi];
206 sumsForSin[18-iphi] -= sumEta[iphi];
212 for(
int i=0;
i<5; ++
i)
215 sumY += sumsForSin[
i]*
sines[
i];
217 assert(
abs(sumX)<(1
l<<48) &&
abs(sumY)<(1
l<<48));
218 int cordicX = sumX>>25;
219 int cordicY = sumY>>25;
221 uint32_t cordicMag(0);
223 cordic(cordicX, cordicY, cordicPhase, cordicMag);
229 met = (cordicMag % (1<<7)) | ((cordicMag >= (1<<7)) ? (1<<7):0);
231 assert(metPhi >=0 && metPhi < 18);
235 met = (cordicMag % (1<<12)) | ((cordicMag >= (1<<12)) ? (1<<12):0);
237 assert(metPhi >=0 && metPhi < 72);
240 return std::make_tuple(sumEt, met, metPhi);
248 assert(
abs(phase)<=205887);
260 if (jets->size()<2)
return dphi;
261 if ((*jets).at(0).hwPt() == 0)
return dphi;
262 if ((*jets).at(1).hwPt() == 0)
return dphi;
265 int iphi1 = (*jets).at(0).hwPhi();
266 int iphi2 = (*jets).at(1).hwPhi();
268 int difference=
abs(iphi1-iphi2);
285 result = result & 0x7f;
Sin< T >::type sin(const T &t)
std::array< long, 5 > sines
double etSumEtThreshold(unsigned isum) const
void processEvent(const std::vector< l1t::CaloRegion > ®ions, const std::vector< l1t::CaloEmCand > &EMCands, const std::vector< l1t::Jet > *jets, std::vector< l1t::EtSum > *sums) override
std::tuple< int, int, int > doSumAndMET(const std::vector< SimpleRegion > ®ionEt, ETSumType sumType)
Stage1Layer2EtSumAlgorithmImpHI(CaloParamsHelper const *params)
int DiJetPhi(const std::vector< l1t::Jet > *jets) const
void EtSumToGtScales(CaloParamsHelper const *params, const std::vector< l1t::EtSum > *input, std::vector< l1t::EtSum > *output)
Cos< T >::type cos(const T &t)
Abs< T >::type abs(const T &t)
int cordicToMETPhi(int phase)
std::array< long, 5 > cosines
CaloParamsHelper const *const params_
uint16_t MHToverHT(uint16_t, uint16_t) const
static const unsigned N_PHI
Power< A, B >::type pow(const A &a, const B &b)
std::array< int, 73 > cordicPhiValues