25 Stage1Layer2TauAlgorithmImpHW::Stage1Layer2TauAlgorithmImpHW(
CaloParamsHelper const* params) : params_(params),
26 isoTauLut{ make_unique<Stage1TauIsolationLUT>(
params_)}
36 const std::vector<l1t::CaloRegion> &
regions,
37 std::vector<l1t::Tau> * isoTaus,
38 std::vector<l1t::Tau> *
taus) {
48 std::vector<l1t::CaloRegion> subRegions;
58 std::vector<l1t::Jet> unCorrJets;
61 std::vector<l1t::Tau> preGtTaus;
62 std::vector<l1t::Tau> preSortTaus;
63 std::vector<l1t::Tau> sortedTaus;
64 std::vector<l1t::Tau> preGtIsoTaus;
65 std::vector<l1t::Tau> preSortIsoTaus;
66 std::vector<l1t::Tau> sortedIsoTaus;
69 region != subRegions.end(); region++) {
70 if(region->hwEta() < 4 || region->hwEta() > 17)
73 int regionEt = region->hwPt();
74 if(regionEt < tauSeedThreshold)
continue;
76 int regionEta = region->hwEta();
77 int regionPhi = region->hwPhi();
83 int highestNeighborEt=-1;
84 int highestNeighborEta=-1;
85 int highestNeighborPhi=-1;
86 int highestNeighborTauVeto=-1;
90 neighbor != subRegions.end(); neighbor++) {
92 int neighborPhi = neighbor->hwPhi();
93 int neighborEta = neighbor->hwEta();
94 if(neighborEta < 4 || neighborEta > 17)
97 int deltaPhi = regionPhi - neighborPhi;
99 deltaPhi = -deltaPhi/
std::abs(deltaPhi);
104 if (deltaPhi + deltaEta > 0 && deltaPhi + deltaEta < 2) {
105 if (neighbor->hwPt() > highestNeighborEt) {
106 highestNeighborEt = neighbor->hwPt();
107 highestNeighborEta = neighbor->hwEta();
108 highestNeighborPhi = neighbor->hwPhi();
109 highestNeighborTauVeto = neighbor->hwQual() & 0x1;
114 string NESW =
findNESW(regionEta, regionPhi, highestNeighborEta, highestNeighborPhi);
116 if((tauEt > highestNeighborEt && (NESW==
"isEast" || NESW==
"isNorth"))
117 || (tauEt >= highestNeighborEt && (NESW==
"isSouth" || NESW==
"isWest"))
118 || highestNeighborEt == 0 ) {
120 if (highestNeighborEt >= tauNeighbourThreshold) tauEt += highestNeighborEt;
122 int regionTauVeto = region->hwQual() & 0x1;
125 if (region->hwEta() >= isoTauEtaMin && region->hwEta() <= isoTauEtaMax ){
126 if ((highestNeighborTauVeto == 0 && regionTauVeto == 0) || tauEt > tauMaxPtTauVeto) {
127 int jetEt=
AssociatedJetPt(region->hwEta(), region->hwPhi(),&unCorrJets);
131 unsigned lutAddress =
isoTauLut->lutAddress(tauEt,jetEt);
133 if (lutAddress > MAX_LUT_ADDRESS) lutAddress = MAX_LUT_ADDRESS;
143 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > tauLorentz(0,0,0,0);
145 l1t::Tau theTau(*&tauLorentz, tauEt, region->hwEta(), region->hwPhi(),
quality, isoFlag);
147 preGtTaus.push_back(theTau);
149 preGtIsoTaus.push_back(theTau);
158 SortTaus(&preSortTaus, &sortedTaus);
159 SortTaus(&preSortIsoTaus, &sortedIsoTaus);
165 for(std::vector<l1t::Tau>::iterator iTau = isoTaus->begin(); iTau != isoTaus->end(); ++iTau)
172 const std::vector<l1t::Jet> &
jets)
const {
175 jet != jets.end();
jet++) {
177 if (ieta==
jet->hwEta() && iphi==
jet->hwPhi()){
194 deltaPhi = -deltaPhi/
std::abs(deltaPhi);
202 else if (deltaEta==0) {
220 const std::vector<l1t::Jet> *
jets)
const {
226 itJet != jets->end(); ++itJet){
228 int jetEta = itJet->hwEta();
229 int jetPhi = itJet->hwPhi();
230 if ((jetEta == ieta) && (jetPhi == iphi)){
245 const unsigned int nbitsTau=8;
246 const unsigned int nbitsJet=8;
248 const unsigned int maxJet =
pow(2,nbitsJet)-1;
249 const unsigned int maxTau =
pow(2,nbitsTau)-1;
257 else if (nbitsTau == 7)
261 else if (nbitsTau == 8)
273 else if (nbitsJet == 7)
277 else if (nbitsJet == 8)
283 if (jetPt>maxJet) jetPt=maxJet;
284 if (tauPt>maxTau) tauPt=maxTau;
286 unsigned int address= (jetPt << nbitsTau) + tauPt;
double JetIsolation(int et, int ieta, int iphi, const std::vector< l1t::Jet > &jets) const
unsigned int maxSize() const
double tauMaxPtTauVeto() const
void calibrateAndRankTaus(CaloParamsHelper const *params, const std::vector< l1t::Tau > *input, std::vector< l1t::Tau > *output)
double tauNeighbourThreshold() const
CaloParamsHelper const *const params_
void TwelveByTwelveFinder(const int, const std::vector< l1t::CaloRegion > *regions, std::vector< l1t::Jet > *uncalibjets)
void SortTaus(std::vector< l1t::Tau > *input, std::vector< l1t::Tau > *output)
static const double deltaEta
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) --------— ...
string findNESW(int ieta, int iphi, int neta, int nphi) const
unsigned isoLutIndex(unsigned int tauPt, unsigned int jetPt) const
void processEvent(const std::vector< l1t::CaloEmCand > &EMCands, const std::vector< l1t::CaloRegion > ®ions, std::vector< l1t::Tau > *isoTaus, std::vector< l1t::Tau > *taus) override
Abs< T >::type abs(const T &t)
int AssociatedJetPt(int ieta, int iphi, const std::vector< l1t::Jet > *jets) const
void TauToGtEtaScales(CaloParamsHelper const *params, const std::vector< l1t::Tau > *input, std::vector< l1t::Tau > *output)
et
define resolution functions of each parameter
double tauSeedThreshold() const
double towerLsbSum() const
int data(unsigned int address) const
std::unique_ptr< Stage1TauIsolationLUT > isoTauLut
static const unsigned N_PHI
l1t::LUT * tauIsolationLUT()
Power< A, B >::type pow(const A &a, const B &b)
std::vector< T >::const_iterator const_iterator