25 for(
size_t i=0;
i<
sines.size(); ++
i) {
34 const std::vector<l1t::CaloEmCand> & EMCands,
35 const std::vector<l1t::Jet> *
jets,
36 std::vector<l1t::EtSum> * etsums) {
38 std::vector<l1t::CaloRegion> subRegions;
57 std::vector<SimpleRegion> regionEtVect;
58 std::vector<SimpleRegion> regionHtVect;
61 bool regionOverflowEt(
false);
62 bool regionOverflowHt(
false);
63 for (
auto& region : regions) {
64 if(region.hwEta() >= etSumEtaMinEt && region.hwEta() <= etSumEtaMaxEt)
66 if(region.hwPt() >= 1023)
68 regionOverflowEt =
true;
71 if ( region.hwEta() >= etSumEtaMinHt && region.hwEta() <= etSumEtaMaxHt)
73 if(region.hwPt() >= 1023)
75 regionOverflowHt =
true;
84 for (
auto& region : subRegions) {
85 if ( region.hwEta() >= etSumEtaMinEt && region.hwEta() <= etSumEtaMaxEt)
87 if(region.hwPt() >= etSumEtThresholdEt)
90 r.
ieta = region.hwEta();
91 r.
iphi = region.hwPhi();
93 regionEtVect.push_back(r);
96 if ( region.hwEta() >= etSumEtaMinHt && region.hwEta() <= etSumEtaMaxHt)
98 if(region.hwPt() >= etSumEtThresholdHt)
101 r.
ieta = region.hwEta();
102 r.
iphi = region.hwPhi();
103 r.
et = region.hwPt();
104 regionHtVect.push_back(r);
109 int sumET,
MET, iPhiET;
112 int sumHT,
MHT, iPhiHT;
120 if(MET > 0xfff || regionOverflowEt)
122 if(MHT > 0x7f || regionOverflowHt)
124 if(sumET > 0xfff || regionOverflowEt)
126 if(sumHT > 0xfff || regionOverflowHt)
135 const ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > etLorentz(0,0,0,0);
141 std::vector<l1t::EtSum> preGtEtSums = {etMiss, htMiss, etTot, htTot};
147 std::tuple<int, int, int>
150 std::array<int, 18> sumEtaPos{};
151 std::array<int, 18> sumEtaNeg{};
152 for (
const auto&
r : regionEt)
155 sumEtaNeg[
r.iphi] +=
r.et;
157 sumEtaPos[
r.iphi] +=
r.et;
160 std::array<int, 18> sumEta{};
162 for(
size_t i=0;
i<sumEta.size(); ++
i)
164 assert(sumEtaPos[
i] >= 0 && sumEtaNeg[
i] >= 0);
165 sumEta[
i] = sumEtaPos[
i] + sumEtaNeg[
i];
170 std::array<int, 5> sumsForCos{};
171 std::array<int, 5> sumsForSin{};
172 for(
size_t iphi=0; iphi<sumEta.size(); ++iphi)
176 sumsForCos[iphi] += sumEta[iphi];
177 sumsForSin[iphi] += sumEta[iphi];
181 sumsForCos[9-iphi] -= sumEta[iphi];
182 sumsForSin[9-iphi] += sumEta[iphi];
184 else if ( iphi < 14 )
186 sumsForCos[iphi-9] -= sumEta[iphi];
187 sumsForSin[iphi-9] -= sumEta[iphi];
191 sumsForCos[18-iphi] += sumEta[iphi];
192 sumsForSin[18-iphi] -= sumEta[iphi];
198 for(
int i=0;
i<5; ++
i)
201 sumY += sumsForSin[
i]*
sines[
i];
203 assert(
abs(sumX)<(1
l<<48) &&
abs(sumY)<(1
l<<48));
204 int cordicX = sumX>>25;
205 int cordicY = sumY>>25;
207 uint32_t cordicMag(0);
209 cordic(cordicX, cordicY, cordicPhase, cordicMag);
215 met = (cordicMag % (1<<7)) | ((cordicMag >= (1<<7)) ? (1<<7):0);
217 assert(metPhi >=0 && metPhi < 18);
221 met = (cordicMag % (1<<12)) | ((cordicMag >= (1<<12)) ? (1<<12):0);
223 assert(metPhi >=0 && metPhi < 72);
226 return std::make_tuple(sumEt, met, metPhi);
234 assert(
abs(phase)<=205887);
245 if (jets->size()<2)
return dphi;
246 if ((*jets).at(0).hwPt() == 0)
return dphi;
247 if ((*jets).at(1).hwPt() == 0)
return dphi;
250 int iphi1 = (*jets).at(0).hwPhi();
251 int iphi2 = (*jets).at(1).hwPhi();
253 int difference=
abs(iphi1-iphi2);
270 result = result & 0x7f;
std::tuple< int, int, int > doSumAndMET(const std::vector< SimpleRegion > ®ionEt, ETSumType sumType)
std::array< int, 73 > cordicPhiValues
Sin< T >::type sin(const T &t)
double etSumEtThreshold(unsigned isum) const
int etSumEtaMax(unsigned isum) const
int DiJetPhi(const std::vector< l1t::Jet > *jets) const
std::array< long, 5 > cosines
CaloParamsHelper const *const params_
void RegionCorrection(const std::vector< l1t::CaloRegion > ®ions, std::vector< l1t::CaloRegion > *subRegions, CaloParamsHelper const *params)
------— New region correction (PUsub, no response correction at the moment) --------— ...
int etSumEtaMin(unsigned isum) 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)
uint16_t MHToverHT(uint16_t, uint16_t) const
Stage1Layer2EtSumAlgorithmImpHW(CaloParamsHelper const *params)
static const unsigned N_PHI
int cordicToMETPhi(int phase)
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::array< long, 5 > sines
Power< A, B >::type pow(const A &a, const B &b)