19 return a.
pt() > b.
pt();
34 const std::vector<l1t::CaloTower>& towers,
35 std::vector<l1t::Tau> &
taus) {
38 merging (clusters, towers, taus);
45 const std::vector<l1t::CaloTower>& towers,
46 std::vector<l1t::Tau>&
taus)
55 for (
const auto& mainCluster : clusters){
59 if (mainCluster.isValid()){
63 taus.emplace_back(mainCluster);
66 int iEta = mainCluster.hwEta();
67 int iPhi = mainCluster.hwPhi();
78 std::vector<l1t::CaloTower> satellites;
90 std::vector<int> sites;
125 auto secClusters =
makeSecClusters (towers, sites, mainCluster, caloNav);
130 std::vector<int>::iterator isNeigh0 =
find(sites.begin(), sites.end(), 0);
131 std::vector<int>::iterator isNeigh1 =
find(sites.begin(), sites.end(), 1);
132 std::vector<int>::iterator isNeigh2 =
find(sites.begin(), sites.end(), 2);
133 std::vector<int>::iterator isNeigh3 =
find(sites.begin(), sites.end(), 3);
134 std::vector<int>::iterator isNeigh4 =
find(sites.begin(), sites.end(), 4);
135 std::vector<int>::iterator isNeigh5 =
find(sites.begin(), sites.end(), 5);
136 std::vector<int>::iterator isNeigh6 =
find(sites.begin(), sites.end(), 6);
137 std::vector<int>::iterator isNeigh7 =
find(sites.begin(), sites.end(), 7);
140 if (isNeigh0 != sites.end()) secMaxN = secClusters.at(isNeigh0 - sites.begin()).
get();
141 else if (isNeigh2 != sites.end()) secMaxN = secClusters.at(isNeigh2 - sites.begin()).
get();
143 else if ( isNeigh1 != sites.end() && isNeigh3 != sites.end() ) {
145 if ((secClusters.at(isNeigh1 - sites.begin()))->hwPt() == (secClusters.at(isNeigh3 - sites.begin()))->hwPt()) {
147 if(mainCluster.hwEta()>0) secMaxN = secClusters.at(isNeigh1 - sites.begin()).
get();
148 else secMaxN = secClusters.at(isNeigh3 - sites.begin()).
get();
152 if ((secClusters.at(isNeigh1 - sites.begin()))->hwPt() > (secClusters.at(isNeigh3 - sites.begin()))->hwPt()){
153 secMaxN = secClusters.at(isNeigh1 - sites.begin()).
get();
155 else secMaxN = secClusters.at(isNeigh3 - sites.begin()).
get();
160 else if (isNeigh1 != sites.end()) secMaxN = secClusters.at(isNeigh1 - sites.begin()).
get();
161 else if (isNeigh3 != sites.end()) secMaxN = secClusters.at(isNeigh3 - sites.begin()).
get();
164 if (isNeigh7 != sites.end()) secMaxS = secClusters.at(isNeigh7 - sites.begin()).
get();
165 else if (isNeigh5 != sites.end()) secMaxS = secClusters.at(isNeigh5 - sites.begin()).
get();
167 else if (isNeigh4 != sites.end() && isNeigh6 != sites.end() ) {
169 if ((secClusters.at(isNeigh4 - sites.begin()))->hwPt() == (secClusters.at(isNeigh6 - sites.begin()))->hwPt()){
171 if(mainCluster.hwEta()>0) secMaxN = secClusters.at(isNeigh4 - sites.begin()).
get();
172 else secMaxN = secClusters.at(isNeigh6 - sites.begin()).
get();
176 if ((secClusters.at(isNeigh4 - sites.begin()))->hwPt() > (secClusters.at(isNeigh6 - sites.begin()))->hwPt()) secMaxS = secClusters.at(isNeigh4 - sites.begin()).
get();
177 else secMaxS = secClusters.at(isNeigh6 - sites.begin()).
get();
182 else if (isNeigh4 != sites.end()) secMaxS = secClusters.at(isNeigh4 - sites.begin()).
get();
183 else if (isNeigh6 != sites.end()) secMaxS = secClusters.at(isNeigh6 - sites.begin()).
get();
186 if (secMaxN !=
nullptr && secMaxS !=
nullptr) {
187 if (secMaxN->
hwPt() > secMaxS->
hwPt()) secondaryCluster = secMaxN;
188 else secondaryCluster = secMaxS;
191 if (secMaxN !=
nullptr) secondaryCluster = secMaxN;
192 else if (secMaxS !=
nullptr) secondaryCluster = secMaxS;
197 int neigEta [8] = {0, -1, 0, 1, -1, 0, 1, 0};
198 int neigPhi [8] = {3, 2, 2, 2, -2, -2, -2, -3};
200 vector <pair<int, int> > TTPos (10);
201 TTPos.at(0) = make_pair (-1, 1);
202 TTPos.at(1) = make_pair (0, 1);
203 TTPos.at(2) = make_pair (1, 1);
204 TTPos.at(3) = make_pair (1, 0);
205 TTPos.at(4) = make_pair (1, -1);
206 TTPos.at(5) = make_pair (0, -1);
207 TTPos.at(6) = make_pair (-1, -1);
208 TTPos.at(7) = make_pair (-1, 0);
209 TTPos.at(8) = make_pair (0, 2);
210 TTPos.at(9) = make_pair (0, -2);
212 vector <CaloCluster::ClusterFlag> TTPosRemap (10);
227 int secondaryClusterHwPt = 0;
229 if(!secClusters.empty()){
231 secondaryClusterHwPt = secondaryCluster->
hwPt();
233 int iSecIdxPosition = find_if (secClusters.begin(), secClusters.end(), [&](
auto const& element) {
return element.get() ==secondaryCluster;}) - secClusters.begin();
234 int secondaryClusterSite = sites.at(iSecIdxPosition);
236 for (
unsigned int iTT = 0; iTT < TTPos.size(); iTT++) {
239 int thisTTinMainEta = neigEta[secondaryClusterSite] + TTPos.at(iTT).first;
240 int thisTTinMainPhi = neigPhi[secondaryClusterSite] + TTPos.at(iTT).second;
241 pair<int, int> thisTT = make_pair (thisTTinMainEta, thisTTinMainPhi);
243 auto thisTTItr =
find (TTPos.begin(), TTPos.end(), thisTT);
244 if (thisTTItr != TTPos.end()){
245 int idx = thisTTItr - TTPos.begin();
266 int seedEt = seed .
hwPt();
267 int towerEtNW = towerNW.
hwPt();
268 int towerEtN = towerN .
hwPt();
269 int towerEtNE = towerNE.
hwPt();
270 int towerEtE = towerE .
hwPt();
271 int towerEtSE = towerSE.
hwPt();
272 int towerEtS = towerS .
hwPt();
273 int towerEtSW = towerSW.
hwPt();
274 int towerEtW = towerW .
hwPt();
275 int towerEtNN = towerNN.
hwPt();
276 int towerEtSS = towerSS.
hwPt();
312 int tauHwFootprint = tau.
rawEt();
313 unsigned int LUTaddress =
isoLutIndex(tauHwFootprint, mainCluster.hwEta(), nrTowers);
316 int hwIsoEnergy = hwEtSum - tauHwFootprint;
317 if (hwIsoEnergy < 0) hwIsoEnergy = 0;
328 bool denomZeroFlag = ((qual&0x1) > 0);
329 bool eOverHFlag = ((qual&0x2) > 0);
330 int hasEM = (eOverHFlag || !denomZeroFlag);
332 tau.
setIsoEt((
short int) hwIsoEnergy);
333 tau.
setNTT((
short int) nrTowers);
342 if(mainCluster.fgEta()==0) eta = seedEta;
343 else if(mainCluster.fgEta()==2) eta = seedEta + seedEtaSize*0.251;
344 else if(mainCluster.fgEta()==1) eta = seedEta - seedEtaSize*0.251;
360 if(EtDown>EtUp) fgPhi = 2;
361 else if(EtUp>EtDown) fgPhi = 1;
363 if(fgPhi==0) phi = seedPhi;
364 else if(fgPhi==2) phi = seedPhi + seedPhiSize*0.251;
365 else if(fgPhi==1) phi = seedPhi - seedPhiSize*0.251;
389 l1t::Tau tempTau (emptyP4, 0, 0, 0, 0);
390 std::vector< std::vector<l1t::Tau> > tauEtaPos(
params_->
isoTauEtaMax() , std::vector<l1t::Tau>(18, tempTau));
391 std::vector< std::vector<l1t::Tau> > tauEtaNeg(
params_->
isoTauEtaMax() , std::vector<l1t::Tau>(18, tempTau));
393 for (
unsigned int iTau = 0; iTau < taus.size(); iTau++)
396 if (taus.at(iTau).hwEta() > 0) tauEtaPos.at( taus.at(iTau).hwEta()-1).at((72-taus.at(iTau).hwPhi())/4) = taus.at(iTau);
397 else tauEtaNeg.at( -(taus.at(iTau).hwEta()+1)).at((72-taus.at(iTau).hwPhi())/4) = taus.at(iTau);
406 std::vector<l1t::Tau> accumEtaPos;
407 std::vector<l1t::Tau> accumEtaNeg;
412 std::vector<l1t::Tau>::iterator start_, end_;
413 start_ = tauEtaPos.at(ieta).begin();
414 end_ = tauEtaPos.at(ieta).end();
415 BitonicSort<l1t::Tau>(
down, start_, end_);
416 etaPosSorter.
Merge( tauEtaPos.at(ieta) , accumEtaPos );
419 start_ = tauEtaNeg.at(ieta).begin();
420 end_ = tauEtaNeg.at(ieta).end();
421 BitonicSort<l1t::Tau>(
down, start_, end_);
422 etaNegSorter.
Merge( tauEtaNeg.at(ieta) , accumEtaNeg );
431 if (acctau.hwPt() > 0) taus.push_back(acctau);
435 if (acctau.hwPt() > 0) taus.push_back(acctau);
447 float minScaleEta = 0.5;
448 float maxScaleEta = 1.5;
456 enum {LUT_UPPER = 3};
457 enum {LUT_OFFSET = 0x80};
460 unsigned int nBins = (1 << (lut->
nrBitsAddress() - LUT_UPPER));
463 std::vector<float> emptyCoeff;
464 emptyCoeff.resize(nBins,0.);
466 for(
unsigned iLut=0; iLut < 6; ++iLut ) {
468 for(
unsigned addr=0;addr<nBins;addr++) {
469 float y = (
float)lut->
data(iLut*LUT_OFFSET + addr);
477 emptyCoeff.resize(nBins,0.);
478 binSize = (maxScaleEta-minScaleEta)/(
float)
size;
480 for(
unsigned addr=0;addr<nBins;addr++) {
481 float y = (
float)lut->
data(6*LUT_OFFSET + addr);
490 if (TT1.
hwPt() < TT2.
hwPt())
return true;
491 if (TT1.
hwPt() > TT2.
hwPt())
return false;
504 int iEta = tower.
hwEta();
505 int iPhi = tower.
hwPhi();
516 for (
int deta = -1; deta < 2; deta++)
518 for (
int dphi = -1; dphi < 2; dphi++)
520 int iEtaNeigh = caloNav.
offsetIEta(iEta, deta);
521 int iPhiNeigh = caloNav.
offsetIPhi(iPhi, dphi);
523 if ( mask[2-(dphi+1)][deta +1] == 0 )
continue;
524 if ( mask[2-(dphi+1)][deta +1] == 1 ) vetoTT = (tower.
hwPt() < towerNeigh.
hwPt());
525 if ( mask[2-(dphi+1)][deta +1] == 2 ) vetoTT = (tower.
hwPt() <= towerNeigh.
hwPt());
537 constexpr int neigEta [8] = {0, -1, 0, 1, -1, 0, 1, 0};
538 constexpr int neigPhi [8] = {3, 2, 2, 2, -2, -2, -2, -3};
541 int iEtamain = mainCluster.
hwEta();
542 int iPhimain = mainCluster.
hwPhi();
544 std::vector<unique_ptr<CaloCluster>> secClusters;
545 for (
unsigned int isite = 0; isite < sites.size(); isite++)
548 const int siteNumber = sites.at(isite);
549 int iSecEta = caloNav.
offsetIEta(iEtamain, neigEta[siteNumber]);
550 int iSecPhi = caloNav.
offsetIPhi(iPhimain, neigPhi[siteNumber]);
555 auto secondaryCluster = std::make_unique<l1t::CaloCluster> ( emptyP4, towerSec.
hwPt(), towerSec.
hwEta(), towerSec.
hwPhi() ) ;
557 secondaryCluster->setHwPtEm(towerSec.
hwEtEm());
558 secondaryCluster->setHwPtHad(towerSec.
hwEtHad());
559 secondaryCluster->setHwSeedPt(towerSec.
hwPt());
560 secondaryCluster->setHwPt(towerSec.
hwPt());
562 int iSecEtaP = caloNav.
offsetIEta(iSecEta, 1);
563 int iSecEtaM = caloNav.
offsetIEta(iSecEta, -1);
564 int iSecPhiP = caloNav.
offsetIPhi(iSecPhi, 1);
565 int iSecPhiP2 = caloNav.
offsetIPhi(iSecPhi, 2);
566 int iSecPhiM = caloNav.
offsetIPhi(iSecPhi, -1);
567 int iSecPhiM2 = caloNav.
offsetIPhi(iSecPhi, -2);
580 int towerEtNW = towerNW.
hwPt();
581 int towerEtN = towerN .
hwPt();
582 int towerEtNE = towerNE.
hwPt();
583 int towerEtE = towerE .
hwPt();
584 int towerEtSE = towerSE.
hwPt();
585 int towerEtS = towerS .
hwPt();
586 int towerEtSW = towerSW.
hwPt();
587 int towerEtW = towerW .
hwPt();
588 int towerEtNN = towerNN.
hwPt();
589 int towerEtSS = towerSS.
hwPt();
591 int towerEtEmNW = towerNW.
hwEtEm();
592 int towerEtEmN = towerN .
hwEtEm();
593 int towerEtEmNE = towerNE.
hwEtEm();
594 int towerEtEmE = towerE .
hwEtEm();
595 int towerEtEmSE = towerSE.
hwEtEm();
596 int towerEtEmS = towerS .
hwEtEm();
597 int towerEtEmSW = towerSW.
hwEtEm();
598 int towerEtEmW = towerW .
hwEtEm();
599 int towerEtEmNN = towerNN.
hwEtEm();
600 int towerEtEmSS = towerSS.
hwEtEm();
602 int towerEtHadNW = towerNW.
hwEtHad();
603 int towerEtHadN = towerN .
hwEtHad();
604 int towerEtHadNE = towerNE.
hwEtHad();
605 int towerEtHadE = towerE .
hwEtHad();
606 int towerEtHadSE = towerSE.
hwEtHad();
607 int towerEtHadS = towerS .
hwEtHad();
608 int towerEtHadSW = towerSW.
hwEtHad();
609 int towerEtHadW = towerW .
hwEtHad();
610 int towerEtHadNN = towerNN.
hwEtHad();
611 int towerEtHadSS = towerSS.
hwEtHad();
615 if(towerEtN < clusterThreshold)
623 if(towerEtS < clusterThreshold)
635 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NW)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtNW);
636 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_N)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtN);
637 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NE)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtNE);
638 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_E)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtE);
639 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SE)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtSE);
640 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_S)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtS);
641 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SW)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtSW);
642 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_W)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtW);
643 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NN)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtNN);
644 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SS)) secondaryCluster->setHwPt(secondaryCluster->hwPt() + towerEtSS);
646 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NW)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmNW);
647 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_N)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmN);
648 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NE)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmNE);
649 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_E)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmE);
650 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SE)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmSE);
651 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_S)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmS);
652 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SW)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmSW);
653 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_W)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmW);
654 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NN)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmNN);
655 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SS)) secondaryCluster->setHwPtEm(secondaryCluster->hwPtEm() + towerEtEmSS);
657 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NW)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadNW);
658 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_N)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadN);
659 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NE)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadNE);
660 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_E)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadE);
661 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SE)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadSE);
662 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_S)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadS);
663 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SW)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadSW);
664 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_W)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadW);
665 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_NN)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadNN);
666 if(secondaryCluster->checkClusterFlag(
CaloCluster::INCLUDE_SS)) secondaryCluster->setHwPtHad(secondaryCluster->hwPtHad() + towerEtHadSS);
669 secClusters.emplace_back (
std::move(secondaryCluster));
677 int absieta =
abs(ieta);
678 if (absieta > 28) absieta = 28;
679 if (Et > 255) Et = 255;
684 unsigned int address = (compressedEta<<7)+(compressedEt<<2)+(hasEM<<1)+isMerged;
693 int qual = seedTT.
hwQual();
694 bool denomZeroFlag = ((qual&0x1) > 0);
695 bool eOverHFlag = ((qual&0x2) > 0);
696 int hasEM = (eOverHFlag || !denomZeroFlag);
697 int isMergedI = (isMerged ? 1 : 0);
705 if (rawPt > 8191) rawPt = 8191;
707 int corrXrawPt = corr*
rawPt;
708 int calibPt = (corrXrawPt>>9);
709 if (calibPt > 4095) calibPt = 4095;
717 int aeta =
abs(hweta);
723 if (Et >= 255) Et = 255;
724 if (aeta >= 31) aeta = 31;
725 if (nrTowers >= 1023) nrTowers = 1023;
741 unsigned int address = ( (etaCmpr << 10) | (etCmpr << 5) | nTTCmpr );
std::vector< std::vector< float > > coefficients_
void setHasEM(bool hasEM)
void Merge(const std::vector< T > &aInput, std::vector< T > &aOutput)
static int offsetIEta(int iEta, int offset)
void setRawEt(short int et)
unsigned int calibLutIndex(int ieta, int Et, int hasEM, int isMerged)
unsigned tauIsoAreaNrTowersPhi() const
double pt() const final
transverse momentum
unsigned tauIsoAreaNrTowersEta() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
double egSeedThreshold() const
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
bool checkClusterFlag(ClusterFlag flag) const
unsigned int nrBitsData() const
bool is3x3Maximum(const l1t::CaloTower &tower, const std::vector< CaloTower > &towers, l1t::CaloStage2Nav &caloNav)
~Stage2Layer2TauAlgorithmFirmwareImp1() override
static int offsetIPhi(int iPhi, int offset)
void processEvent(const std::vector< CaloCluster > &clusters, const std::vector< CaloTower > &towers, std::vector< Tau > &taus) override
void loadCalibrationLuts()
int pileUpTowerThreshold() const
l1t::LUT * tauCompressLUT()
Abs< T >::type abs(const T &t)
std::vector< std::unique_ptr< l1t::CaloCluster > > makeSecClusters(const std::vector< l1t::CaloTower > &towers, std::vector< int > &sites, const l1t::CaloCluster &mainCluster, l1t::CaloStage2Nav &caloNav)
void dosorting(std::vector< l1t::Tau > &taus)
int calibratedPt(const l1t::CaloCluster &clus, const std::vector< l1t::CaloTower > &towers, int hwPt, bool isMerged)
Stage2Layer2TauAlgorithmFirmwareImp1(CaloParamsHelper const *params)
static bool compareTowers(l1t::CaloTower TT1, l1t::CaloTower TT2)
double egNeighbourThreshold() const
unsigned int nrBitsAddress() const
void merging(const std::vector< l1t::CaloCluster > &clusters, const std::vector< l1t::CaloTower > &towers, std::vector< l1t::Tau > &taus)
double tauPUSParam(int ipar) const
void setNTT(short int ntt)
CaloParamsHelper const * params_
void setTowerIEta(short int ieta)
double towerLsbSum() const
l1t::LUT * tauCalibrationLUT()
int data(unsigned int address) const
l1t::LUT * tauIsolationLUT()
bool operator>(const l1t::Jet &a, l1t::Jet &b)
void setP4(const LorentzVector &p4) final
set 4-momentum
void setIsoEt(short int et)
void setClusterFlag(ClusterFlag flag, bool val=true)
void setTowerIPhi(short int iphi)
void setIsMerged(bool isMerged)
unsigned int isoLutIndex(int Et, int hweta, unsigned int nrTowers)