CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1 Class Reference

#include <Stage2Layer2ClusterAlgorithmFirmware.h>

Inheritance diagram for l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1:
l1t::Stage2Layer2ClusterAlgorithm

Public Types

enum  ClusterInput { E = 0, H = 1, EH = 2 }
 

Public Member Functions

virtual void processEvent (const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
 
 Stage2Layer2ClusterAlgorithmFirmwareImp1 (CaloParamsHelper *params, ClusterInput clusterInput)
 
virtual ~Stage2Layer2ClusterAlgorithmFirmwareImp1 ()
 
- Public Member Functions inherited from l1t::Stage2Layer2ClusterAlgorithm
virtual ~Stage2Layer2ClusterAlgorithm ()
 

Private Member Functions

void clustering (const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
 
void filtering (const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
 
void refining (const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
 
void sharing (const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
 

Private Attributes

ClusterInput clusterInput_
 
int clusterThreshold_
 
int hcalThreshold_
 
CaloParamsHelperparams_
 
int seedThreshold_
 

Detailed Description

Author
: Jim Brooke

Description: first iteration of stage 2 jet algo

Definition at line 23 of file Stage2Layer2ClusterAlgorithmFirmware.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::Stage2Layer2ClusterAlgorithmFirmwareImp1 ( CaloParamsHelper params,
ClusterInput  clusterInput 
)
l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::~Stage2Layer2ClusterAlgorithmFirmwareImp1 ( )
virtual

Definition at line 31 of file Stage2Layer2ClusterAlgorithmFirmwareImp1.cc.

33 {
34 }

Member Function Documentation

void l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::clustering ( const std::vector< l1t::CaloTower > &  towers,
std::vector< l1t::CaloCluster > &  clusters 
)
private

Definition at line 66 of file Stage2Layer2ClusterAlgorithmFirmwareImp1.cc.

References l1t::CaloTools::getTower(), class-composition::H, l1t::CaloTower::hwEtEm(), l1t::CaloTower::hwEtHad(), l1t::CaloCluster::INCLUDE_E, l1t::CaloCluster::INCLUDE_N, l1t::CaloCluster::INCLUDE_NE, l1t::CaloCluster::INCLUDE_NN, l1t::CaloCluster::INCLUDE_NW, l1t::CaloCluster::INCLUDE_S, l1t::CaloCluster::INCLUDE_SE, l1t::CaloCluster::INCLUDE_SS, l1t::CaloCluster::INCLUDE_SW, l1t::CaloCluster::INCLUDE_W, l1t::CaloStage2Nav::offsetIEta(), l1t::CaloStage2Nav::offsetIPhi(), l1t::CaloCluster::setFgECAL(), l1t::CaloCluster::setHOverE(), l1t::CaloCluster::setHwPtEm(), l1t::CaloCluster::setHwPtHad(), and l1t::CaloCluster::setHwSeedPt().

68 {
69  // navigator
70  l1t::CaloStage2Nav caloNav;
71 
72  // Build clusters passing seed threshold
73  for(const auto& tower : towers)
74  {
75  int iEta = tower.hwEta();
76  int iPhi = tower.hwPhi();
77  int hwEt = 0;
78  if(clusterInput_==E) hwEt = tower.hwEtEm();
79  else if(clusterInput_==EH) hwEt = tower.hwEtEm() + tower.hwEtHad();
80  else if(clusterInput_==H) hwEt = tower.hwEtHad();
81  int hwEtEm = tower.hwEtEm();
82  int hwEtHad = tower.hwEtHad();
83  // Check if the seed tower pass the seed threshold
84  if(hwEt>=seedThreshold_)
85  {
87  clusters.push_back( l1t::CaloCluster(emptyP4, hwEt, iEta, iPhi) );
88  l1t::CaloCluster& cluster = clusters.back();
89  cluster.setHwPtEm(hwEtEm);
90  cluster.setHwPtHad(hwEtHad);
91  cluster.setHwSeedPt(hwEt);
92  // H/E of the cluster is H/E of the seed, with possible threshold on H
93  // H/E is currently encoded on 9 bits, from 0 to 1
94  int hwEtHadTh = (tower.hwEtHad()>=hcalThreshold_ ? tower.hwEtHad() : 0);
95  int hOverE = (tower.hwEtEm()>0 ? (hwEtHadTh<<9)/tower.hwEtEm() : 511);
96  if(hOverE>511) hOverE = 511;
97  cluster.setHOverE(hOverE);
98  // FG of the cluster is FG of the seed
99  bool fg = (tower.hwQual() & (0x1<<2));
100  cluster.setFgECAL((int)fg);
101  }
102  }
103 
104 
105  // check if neighbour towers are below clustering threshold
106  for(auto& cluster : clusters)
107  {
108  if( cluster.isValid() )
109  {
110  // look at the energies in neighbour towers
111  int iEta = cluster.hwEta();
112  int iPhi = cluster.hwPhi();
113  int iEtaP = caloNav.offsetIEta(iEta, 1);
114  int iEtaM = caloNav.offsetIEta(iEta, -1);
115  int iPhiP = caloNav.offsetIPhi(iPhi, 1);
116  int iPhiP2 = caloNav.offsetIPhi(iPhi, 2);
117  int iPhiM = caloNav.offsetIPhi(iPhi, -1);
118  int iPhiM2 = caloNav.offsetIPhi(iPhi, -2);
119  const l1t::CaloTower& towerNW = l1t::CaloTools::getTower(towers, iEtaM, iPhiM);
120  const l1t::CaloTower& towerN = l1t::CaloTools::getTower(towers, iEta , iPhiM);
121  const l1t::CaloTower& towerNE = l1t::CaloTools::getTower(towers, iEtaP, iPhiM);
122  const l1t::CaloTower& towerE = l1t::CaloTools::getTower(towers, iEtaP, iPhi );
123  const l1t::CaloTower& towerSE = l1t::CaloTools::getTower(towers, iEtaP, iPhiP);
124  const l1t::CaloTower& towerS = l1t::CaloTools::getTower(towers, iEta , iPhiP);
125  const l1t::CaloTower& towerSW = l1t::CaloTools::getTower(towers, iEtaM, iPhiP);
126  const l1t::CaloTower& towerW = l1t::CaloTools::getTower(towers, iEtaM, iPhi );
127  const l1t::CaloTower& towerNN = l1t::CaloTools::getTower(towers, iEta , iPhiM2);
128  const l1t::CaloTower& towerSS = l1t::CaloTools::getTower(towers, iEta , iPhiP2);
129  int towerEtNW = 0;
130  int towerEtN = 0;
131  int towerEtNE = 0;
132  int towerEtE = 0;
133  int towerEtSE = 0;
134  int towerEtS = 0;
135  int towerEtSW = 0;
136  int towerEtW = 0;
137  int towerEtNN = 0;
138  int towerEtSS = 0;
139  if(clusterInput_==E)
140  {
141  towerEtNW = towerNW.hwEtEm();
142  towerEtN = towerN .hwEtEm();
143  towerEtNE = towerNE.hwEtEm();
144  towerEtE = towerE .hwEtEm();
145  towerEtSE = towerSE.hwEtEm();
146  towerEtS = towerS .hwEtEm();
147  towerEtSW = towerSW.hwEtEm();
148  towerEtW = towerW .hwEtEm();
149  towerEtNN = towerNN.hwEtEm();
150  towerEtSS = towerSS.hwEtEm();
151  }
152  else if(clusterInput_==EH)
153  {
154  towerEtNW = towerNW.hwEtEm() + towerNW.hwEtHad();
155  towerEtN = towerN .hwEtEm() + towerN .hwEtHad();
156  towerEtNE = towerNE.hwEtEm() + towerNE.hwEtHad();
157  towerEtE = towerE .hwEtEm() + towerE .hwEtHad();
158  towerEtSE = towerSE.hwEtEm() + towerSE.hwEtHad();
159  towerEtS = towerS .hwEtEm() + towerS .hwEtHad();
160  towerEtSW = towerSW.hwEtEm() + towerSW.hwEtHad();
161  towerEtW = towerW .hwEtEm() + towerW .hwEtHad();
162  towerEtNN = towerNN.hwEtEm() + towerNN.hwEtHad();
163  towerEtSS = towerSS.hwEtEm() + towerSS.hwEtHad();
164  }
165  else if(clusterInput_==H)
166  {
167  towerEtNW = towerNW.hwEtHad();
168  towerEtN = towerN .hwEtHad();
169  towerEtNE = towerNE.hwEtHad();
170  towerEtE = towerE .hwEtHad();
171  towerEtSE = towerSE.hwEtHad();
172  towerEtS = towerS .hwEtHad();
173  towerEtSW = towerSW.hwEtHad();
174  towerEtW = towerW .hwEtHad();
175  towerEtNN = towerNN.hwEtHad();
176  towerEtSS = towerSS.hwEtHad();
177  }
178 
179  // check which towers can be clustered to the seed
180  if(towerEtNW < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_NW, false);
181  if(towerEtN < clusterThreshold_)
182  {
183  cluster.setClusterFlag(CaloCluster::INCLUDE_N , false);
184  cluster.setClusterFlag(CaloCluster::INCLUDE_NN, false);
185  }
186  if(towerEtNE < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_NE, false);
187  if(towerEtE < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_E , false);
188  if(towerEtSE < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_SE, false);
189  if(towerEtS < clusterThreshold_)
190  {
191  cluster.setClusterFlag(CaloCluster::INCLUDE_S , false);
192  cluster.setClusterFlag(CaloCluster::INCLUDE_SS, false);
193  }
194  if(towerEtSW < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_SW, false);
195  if(towerEtW < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_W , false);
196  if(towerEtNN < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_NN, false);
197  if(towerEtSS < clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_SS, false);
198 
199  }
200  }
201 
202 }
static int offsetIEta(int iEta, int offset)
Definition: CaloStage2Nav.h:43
bool isValid() const
Definition: CaloCluster.cc:71
int hwPhi() const
Definition: L1Candidate.cc:79
int hwEtEm() const
Definition: CaloTower.cc:64
void setHwSeedPt(int pt)
Definition: CaloCluster.cc:41
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
void setFgECAL(int fgECAL)
Definition: CaloCluster.cc:61
void setHwPtHad(int pt)
Definition: CaloCluster.cc:36
static int offsetIPhi(int iPhi, int offset)
Definition: CaloStage2Nav.h:32
int hwEta() const
Definition: L1Candidate.cc:74
void setHOverE(int hOverE)
Definition: CaloCluster.cc:56
void setHwPtEm(int pt)
Definition: CaloCluster.cc:31
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:11
int hwEtHad() const
Definition: CaloTower.cc:69
void setClusterFlag(ClusterFlag flag, bool val=true)
Definition: CaloCluster.cc:19
void l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::filtering ( const std::vector< l1t::CaloTower > &  towers,
std::vector< l1t::CaloCluster > &  clusters 
)
private

Definition at line 206 of file Stage2Layer2ClusterAlgorithmFirmwareImp1.cc.

References l1t::CaloTools::getCluster(), l1t::CaloTools::getTower(), class-composition::H, l1t::CaloTower::hwEtEm(), l1t::CaloTower::hwEtHad(), l1t::L1Candidate::hwPt(), l1t::CaloCluster::INCLUDE_SEED, l1t::CaloStage2Nav::offsetIEta(), and l1t::CaloStage2Nav::offsetIPhi().

208 {
209  // navigator
210  l1t::CaloStage2Nav caloNav;
211 
212  // Filter: keep only local maxima
213  // If two neighbor seeds have the same energy, favor the most central one
214  for(auto& cluster : clusters)
215  {
216  // retrieve neighbour clusters. At this stage they only contain the seed tower.
217  int iEta = cluster.hwEta();
218  int iPhi = cluster.hwPhi();
219  int iEtaP = caloNav.offsetIEta(iEta, 1);
220  int iEtaM = caloNav.offsetIEta(iEta, -1);
221  int iPhiP = caloNav.offsetIPhi(iPhi, 1);
222  int iPhiP2 = caloNav.offsetIPhi(iPhi, 2);
223  int iPhiM = caloNav.offsetIPhi(iPhi, -1);
224  int iPhiM2 = caloNav.offsetIPhi(iPhi, -2);
225  const l1t::CaloCluster& clusterNW = l1t::CaloTools::getCluster(clusters, iEtaM, iPhiM);
226  const l1t::CaloCluster& clusterN = l1t::CaloTools::getCluster(clusters, iEta , iPhiM);
227  const l1t::CaloCluster& clusterNE = l1t::CaloTools::getCluster(clusters, iEtaP, iPhiM);
228  const l1t::CaloCluster& clusterE = l1t::CaloTools::getCluster(clusters, iEtaP, iPhi );
229  const l1t::CaloCluster& clusterSE = l1t::CaloTools::getCluster(clusters, iEtaP, iPhiP);
230  const l1t::CaloCluster& clusterS = l1t::CaloTools::getCluster(clusters, iEta , iPhiP);
231  const l1t::CaloCluster& clusterSW = l1t::CaloTools::getCluster(clusters, iEtaM, iPhiP);
232  const l1t::CaloCluster& clusterW = l1t::CaloTools::getCluster(clusters, iEtaM, iPhi );
233  const l1t::CaloCluster& clusterNN = l1t::CaloTools::getCluster(clusters, iEta , iPhiM2);
234  const l1t::CaloCluster& clusterSS = l1t::CaloTools::getCluster(clusters, iEta , iPhiP2);
235 
236  const l1t::CaloTower& towerN = l1t::CaloTools::getTower(towers, iEta , iPhiM);
237  const l1t::CaloTower& towerS = l1t::CaloTools::getTower(towers, iEta , iPhiP);
238  int towerEtN = 0;
239  int towerEtS = 0;
240  if(clusterInput_==E)
241  {
242  towerEtN = towerN .hwEtEm();
243  towerEtS = towerS .hwEtEm();
244  }
245  else if(clusterInput_==EH)
246  {
247  towerEtN = towerN .hwEtEm() + towerN .hwEtHad();
248  towerEtS = towerS .hwEtEm() + towerS .hwEtHad();
249  }
250  else if(clusterInput_==H)
251  {
252  towerEtN = towerN .hwEtHad();
253  towerEtS = towerS .hwEtHad();
254  }
255 
256 
257  // remove clusters with smaller energies than neighbours
258  if(iEta>1)
259  {
260  if(clusterNW.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
261  if(clusterN .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
262  if(clusterNE.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
263  if(clusterE .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
264  if(clusterSE.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
265  if(clusterS .hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
266  if(clusterSW.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
267  if(clusterW .hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
268  // NOT_IN_FIRMWARE
269  if(towerEtN >= clusterThreshold_ && clusterNN.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
270  if(towerEtS >= clusterThreshold_ && clusterSS.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
271  // END NOT_IN_FIRMWARE
272  }
273  else if(iEta<0)
274  {
275  if(clusterNW.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
276  if(clusterN .hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
277  if(clusterNE.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
278  if(clusterE .hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
279  if(clusterSE.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
280  if(clusterS .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
281  if(clusterSW.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
282  if(clusterW .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
283  // NOT_IN_FIRMWARE
284  if(towerEtN >= clusterThreshold_ && clusterNN.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
285  if(towerEtS >= clusterThreshold_ && clusterSS.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
286  // END NOT_IN_FIRMWARE
287  }
288  else // iEta==1
289  {
290  if(clusterNW.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
291  if(clusterN .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
292  if(clusterNE.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
293  if(clusterE .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
294  if(clusterSE.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
295  if(clusterS .hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
296  if(clusterSW.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
297  if(clusterW .hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
298  // NOT_IN_FIRMWARE
299  if(towerEtN >= clusterThreshold_ && clusterNN.hwPt() > cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
300  if(towerEtS >= clusterThreshold_ && clusterSS.hwPt() >= cluster.hwPt()) cluster.setClusterFlag(CaloCluster::INCLUDE_SEED, false);
301  // END NOT_IN_FIRMWARE
302  }
303  }
304 
305 }
static int offsetIEta(int iEta, int offset)
Definition: CaloStage2Nav.h:43
int hwEtEm() const
Definition: CaloTower.cc:64
static int offsetIPhi(int iPhi, int offset)
Definition: CaloStage2Nav.h:32
static const l1t::CaloCluster & getCluster(const std::vector< l1t::CaloCluster > &clusters, int iEta, int iPhi)
Definition: CaloTools.cc:32
int hwPt() const
Definition: L1Candidate.cc:69
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:11
int hwEtHad() const
Definition: CaloTower.cc:69
void l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::processEvent ( const std::vector< l1t::CaloTower > &  towers,
std::vector< l1t::CaloCluster > &  clusters 
)
virtual

Implements l1t::Stage2Layer2ClusterAlgorithm.

Definition at line 38 of file Stage2Layer2ClusterAlgorithmFirmwareImp1.cc.

References class-composition::H.

40 {
41  if (clusterInput_==E)
42  {
45  }
46  else if (clusterInput_==EH)
47  {
49  clusterThreshold_ = floor(params_->egNeighbourThreshold()/params_->towerLsbSum());
50  }
51  if (clusterInput_==H)
52  {
54  clusterThreshold_ = floor(params_->egNeighbourThreshold()/params_->towerLsbH());
55  }
56 
58 
63 }
void filtering(const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
double egSeedThreshold() const
void refining(const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
double egHcalThreshold() const
double egNeighbourThreshold() const
double towerLsbSum() const
double towerLsbE() const
void clustering(const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
void sharing(const std::vector< l1t::CaloTower > &towers, std::vector< l1t::CaloCluster > &clusters)
double towerLsbH() const
void l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::refining ( const std::vector< l1t::CaloTower > &  towers,
std::vector< l1t::CaloCluster > &  clusters 
)
private

Definition at line 570 of file Stage2Layer2ClusterAlgorithmFirmwareImp1.cc.

References l1t::CaloTools::getTower(), class-composition::H, l1t::CaloTower::hwEtEm(), l1t::CaloTower::hwEtHad(), l1t::CaloCluster::INCLUDE_E, l1t::CaloCluster::INCLUDE_N, l1t::CaloCluster::INCLUDE_NE, l1t::CaloCluster::INCLUDE_NN, l1t::CaloCluster::INCLUDE_NW, l1t::CaloCluster::INCLUDE_S, l1t::CaloCluster::INCLUDE_SE, l1t::CaloCluster::INCLUDE_SS, l1t::CaloCluster::INCLUDE_SW, l1t::CaloCluster::INCLUDE_W, l1t::CaloStage2Nav::offsetIEta(), l1t::CaloStage2Nav::offsetIPhi(), and l1t::CaloCluster::TRIM_LEFT.

572 {
573  // navigator
574  l1t::CaloStage2Nav caloNav;
575 
576  // trim cluster
577  for(auto& cluster : clusters)
578  {
579  if( cluster.isValid() )
580  {
581  int iEta = cluster.hwEta();
582  int iPhi = cluster.hwPhi();
583  int iEtaP = caloNav.offsetIEta(iEta, 1);
584  int iEtaM = caloNav.offsetIEta(iEta, -1);
585  int iPhiP = caloNav.offsetIPhi(iPhi, 1);
586  int iPhiP2 = caloNav.offsetIPhi(iPhi, 2);
587  int iPhiM = caloNav.offsetIPhi(iPhi, -1);
588  int iPhiM2 = caloNav.offsetIPhi(iPhi, -2);
589  const l1t::CaloTower& towerNW = l1t::CaloTools::getTower(towers, iEtaM, iPhiM);
590  const l1t::CaloTower& towerN = l1t::CaloTools::getTower(towers, iEta , iPhiM);
591  const l1t::CaloTower& towerNE = l1t::CaloTools::getTower(towers, iEtaP, iPhiM);
592  const l1t::CaloTower& towerE = l1t::CaloTools::getTower(towers, iEtaP, iPhi );
593  const l1t::CaloTower& towerSE = l1t::CaloTools::getTower(towers, iEtaP, iPhiP);
594  const l1t::CaloTower& towerS = l1t::CaloTools::getTower(towers, iEta , iPhiP);
595  const l1t::CaloTower& towerSW = l1t::CaloTools::getTower(towers, iEtaM, iPhiP);
596  const l1t::CaloTower& towerW = l1t::CaloTools::getTower(towers, iEtaM, iPhi );
597  const l1t::CaloTower& towerNN = l1t::CaloTools::getTower(towers, iEta , iPhiM2);
598  const l1t::CaloTower& towerSS = l1t::CaloTools::getTower(towers, iEta , iPhiP2);
599 
600  int towerEtNW = 0;
601  int towerEtN = 0;
602  int towerEtNE = 0;
603  int towerEtE = 0;
604  int towerEtSE = 0;
605  int towerEtS = 0;
606  int towerEtSW = 0;
607  int towerEtW = 0;
608  int towerEtNN = 0;
609  int towerEtSS = 0;
610  if(clusterInput_==E)
611  {
612  towerEtNW = towerNW.hwEtEm();
613  towerEtN = towerN .hwEtEm();
614  towerEtNE = towerNE.hwEtEm();
615  towerEtE = towerE .hwEtEm();
616  towerEtSE = towerSE.hwEtEm();
617  towerEtS = towerS .hwEtEm();
618  towerEtSW = towerSW.hwEtEm();
619  towerEtW = towerW .hwEtEm();
620  towerEtNN = towerNN.hwEtEm();
621  towerEtSS = towerSS.hwEtEm();
622  }
623  else if(clusterInput_==EH)
624  {
625  towerEtNW = towerNW.hwEtEm() + towerNW.hwEtHad();
626  towerEtN = towerN .hwEtEm() + towerN .hwEtHad();
627  towerEtNE = towerNE.hwEtEm() + towerNE.hwEtHad();
628  towerEtE = towerE .hwEtEm() + towerE .hwEtHad();
629  towerEtSE = towerSE.hwEtEm() + towerSE.hwEtHad();
630  towerEtS = towerS .hwEtEm() + towerS .hwEtHad();
631  towerEtSW = towerSW.hwEtEm() + towerSW.hwEtHad();
632  towerEtW = towerW .hwEtEm() + towerW .hwEtHad();
633  towerEtNN = towerNN.hwEtEm() + towerNN.hwEtHad();
634  towerEtSS = towerSS.hwEtEm() + towerSS.hwEtHad();
635  }
636  else if(clusterInput_==H)
637  {
638  towerEtNW = towerNW.hwEtHad();
639  towerEtN = towerN .hwEtHad();
640  towerEtNE = towerNE.hwEtHad();
641  towerEtE = towerE .hwEtHad();
642  towerEtSE = towerSE.hwEtHad();
643  towerEtS = towerS .hwEtHad();
644  towerEtSW = towerSW.hwEtHad();
645  towerEtW = towerW .hwEtHad();
646  towerEtNN = towerNN.hwEtHad();
647  towerEtSS = towerSS.hwEtHad();
648  }
649 
650  int towerEtEmNW = towerNW.hwEtEm();
651  int towerEtEmN = towerN .hwEtEm();
652  int towerEtEmNE = towerNE.hwEtEm();
653  int towerEtEmE = towerE .hwEtEm();
654  int towerEtEmSE = towerSE.hwEtEm();
655  int towerEtEmS = towerS .hwEtEm();
656  int towerEtEmSW = towerSW.hwEtEm();
657  int towerEtEmW = towerW .hwEtEm();
658  int towerEtEmNN = towerNN.hwEtEm();
659  int towerEtEmSS = towerSS.hwEtEm();
660  //
661  int towerEtHadNW = towerNW.hwEtHad();
662  int towerEtHadN = towerN .hwEtHad();
663  int towerEtHadNE = towerNE.hwEtHad();
664  int towerEtHadE = towerE .hwEtHad();
665  int towerEtHadSE = towerSE.hwEtHad();
666  int towerEtHadS = towerS .hwEtHad();
667  int towerEtHadSW = towerSW.hwEtHad();
668  int towerEtHadW = towerW .hwEtHad();
669  int towerEtHadNN = towerNN.hwEtHad();
670  int towerEtHadSS = towerSS.hwEtHad();
671 
672  // trim corners
673  //if(m_trimCorners) {
674  // // IN_FIRMWARE
675  // //if(towerEtN<clusterThreshold_ && towerEtW<clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_NW, false);
676  // //if(towerEtN<clusterThreshold_ && towerEtE<clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_NE, false);
677  // //if(towerEtS<clusterThreshold_ && towerEtW<clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_SW, false);
678  // //if(towerEtS<clusterThreshold_ && towerEtE<clusterThreshold_) cluster.setClusterFlag(CaloCluster::INCLUDE_SE, false);
679  // // END IN_FIRMWARE
680  // // NOT_IN_FIRMWARE
681  // if(!cluster.checkClusterFlag(CaloCluster::INCLUDE_N) && !cluster.checkClusterFlag(CaloCluster::INCLUDE_W)) cluster.setClusterFlag(CaloCluster::INCLUDE_NW, false);
682  // if(!cluster.checkClusterFlag(CaloCluster::INCLUDE_N) && !cluster.checkClusterFlag(CaloCluster::INCLUDE_E)) cluster.setClusterFlag(CaloCluster::INCLUDE_NE, false);
683  // if(!cluster.checkClusterFlag(CaloCluster::INCLUDE_S) && !cluster.checkClusterFlag(CaloCluster::INCLUDE_W)) cluster.setClusterFlag(CaloCluster::INCLUDE_SW, false);
684  // if(!cluster.checkClusterFlag(CaloCluster::INCLUDE_S) && !cluster.checkClusterFlag(CaloCluster::INCLUDE_E)) cluster.setClusterFlag(CaloCluster::INCLUDE_SE, false);
685  // // END NOT_IN_FIRMWARE
686  //}
687 
688  // trim one eta-side
689  // The side with largest energy will be kept
690  int EtEtaRight = 0;
691  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NE)) EtEtaRight += towerEtNE;
692  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_E)) EtEtaRight += towerEtE;
693  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SE)) EtEtaRight += towerEtSE;
694  int EtEtaLeft = 0;
695  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NW)) EtEtaLeft += towerEtNW;
696  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_W)) EtEtaLeft += towerEtW;
697  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SW)) EtEtaLeft += towerEtSW;
698 
699  // favour most central part
700  if(iEta>0) cluster.setClusterFlag(CaloCluster::TRIM_LEFT, (EtEtaRight> EtEtaLeft) );
701  else cluster.setClusterFlag(CaloCluster::TRIM_LEFT, (EtEtaRight>=EtEtaLeft) );
702 
703  if(cluster.checkClusterFlag(CaloCluster::TRIM_LEFT))
704  {
705  cluster.setClusterFlag(CaloCluster::INCLUDE_NW, false);
706  cluster.setClusterFlag(CaloCluster::INCLUDE_W , false);
707  cluster.setClusterFlag(CaloCluster::INCLUDE_SW, false);
708  }
709  else
710  {
711  cluster.setClusterFlag(CaloCluster::INCLUDE_NE, false);
712  cluster.setClusterFlag(CaloCluster::INCLUDE_E , false);
713  cluster.setClusterFlag(CaloCluster::INCLUDE_SE, false);
714  }
715 
716 
717  // compute cluster energy according to cluster flags
718  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NW)) cluster.setHwPt(cluster.hwPt() + towerEtNW);
719  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_N)) cluster.setHwPt(cluster.hwPt() + towerEtN);
720  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NE)) cluster.setHwPt(cluster.hwPt() + towerEtNE);
721  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_E)) cluster.setHwPt(cluster.hwPt() + towerEtE);
722  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SE)) cluster.setHwPt(cluster.hwPt() + towerEtSE);
723  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_S)) cluster.setHwPt(cluster.hwPt() + towerEtS);
724  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SW)) cluster.setHwPt(cluster.hwPt() + towerEtSW);
725  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_W)) cluster.setHwPt(cluster.hwPt() + towerEtW);
726  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NN)) cluster.setHwPt(cluster.hwPt() + towerEtNN);
727  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SS)) cluster.setHwPt(cluster.hwPt() + towerEtSS);
728  //
729  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NW)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmNW);
730  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_N)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmN);
731  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NE)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmNE);
732  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_E)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmE);
733  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SE)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmSE);
734  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_S)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmS);
735  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SW)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmSW);
736  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_W)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmW);
737  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NN)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmNN);
738  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SS)) cluster.setHwPtEm(cluster.hwPtEm() + towerEtEmSS);
739  //
740  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NW)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadNW);
741  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_N)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadN);
742  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NE)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadNE);
743  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_E)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadE);
744  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SE)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadSE);
745  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_S)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadS);
746  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SW)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadSW);
747  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_W)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadW);
748  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NN)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadNN);
749  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SS)) cluster.setHwPtHad(cluster.hwPtHad() + towerEtHadSS);
750 
751 
752  // Compute fine-grain position within the seed tower,
753  // according to the distribution of energy in the cluster
754  int fgEta = 0;
755  int fgPhi = 0;
756  if(EtEtaRight!=0 || EtEtaLeft!=0)
757  {
758  if(cluster.checkClusterFlag(CaloCluster::TRIM_LEFT)) fgEta = 2;
759  else fgEta = 1;
760  }
761  int EtUp = 0;
762  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NE)) EtUp += towerEtNE;
763  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_N)) EtUp += towerEtN;
764  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NW)) EtUp += towerEtNW;
765  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_NN)) EtUp += towerEtNN;
766  int EtDown = 0;
767  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SE)) EtDown += towerEtSE;
768  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_S)) EtDown += towerEtS;
769  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SW)) EtDown += towerEtSW;
770  if(cluster.checkClusterFlag(CaloCluster::INCLUDE_SS)) EtDown += towerEtSS;
771  //
772  if(EtDown>EtUp) fgPhi = 2;
773  else if(EtUp>EtDown) fgPhi = 1;
774  //
775  cluster.setFgEta(fgEta);
776  cluster.setFgPhi(fgPhi);
777  }
778  }
779 }
static int offsetIEta(int iEta, int offset)
Definition: CaloStage2Nav.h:43
int hwEtEm() const
Definition: CaloTower.cc:64
static int offsetIPhi(int iPhi, int offset)
Definition: CaloStage2Nav.h:32
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:11
int hwEtHad() const
Definition: CaloTower.cc:69
void l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::sharing ( const std::vector< l1t::CaloTower > &  towers,
std::vector< l1t::CaloCluster > &  clusters 
)
private

Definition at line 309 of file Stage2Layer2ClusterAlgorithmFirmwareImp1.cc.

References l1t::CaloTools::getCluster(), l1t::CaloTools::getTower(), class-composition::H, l1t::CaloTower::hwEtEm(), l1t::CaloTower::hwEtHad(), l1t::L1Candidate::hwPt(), l1t::CaloCluster::INCLUDE_E, l1t::CaloCluster::INCLUDE_N, l1t::CaloCluster::INCLUDE_NE, l1t::CaloCluster::INCLUDE_NN, l1t::CaloCluster::INCLUDE_NW, l1t::CaloCluster::INCLUDE_S, l1t::CaloCluster::INCLUDE_SE, l1t::CaloCluster::INCLUDE_SS, l1t::CaloCluster::INCLUDE_SW, l1t::CaloCluster::INCLUDE_W, l1t::CaloStage2Nav::offsetIEta(), and l1t::CaloStage2Nav::offsetIPhi().

311 {
312  // navigator
313  l1t::CaloStage2Nav caloNav;
314 
315  // Share tower energies between neighbour clusters
316  for(auto& cluster : clusters)
317  {
318  if( cluster.isValid() )
319  {
320  int iEta = cluster.hwEta();
321  int iPhi = cluster.hwPhi();
322  int iEtaP = caloNav.offsetIEta(iEta, 1);
323  int iEtaP2 = caloNav.offsetIEta(iEta, 2);
324  int iEtaM = caloNav.offsetIEta(iEta, -1);
325  int iEtaM2 = caloNav.offsetIEta(iEta, -2);
326  int iPhiP = caloNav.offsetIPhi(iPhi, 1);
327  int iPhiP2 = caloNav.offsetIPhi(iPhi, 2);
328  int iPhiP3 = caloNav.offsetIPhi(iPhi, 3);
329  int iPhiP4 = caloNav.offsetIPhi(iPhi, 4);
330  int iPhiM = caloNav.offsetIPhi(iPhi, -1);
331  int iPhiM2 = caloNav.offsetIPhi(iPhi, -2);
332  int iPhiM3 = caloNav.offsetIPhi(iPhi, -3);
333  int iPhiM4 = caloNav.offsetIPhi(iPhi, -4);
334  const l1t::CaloCluster& clusterNNWW = l1t::CaloTools::getCluster(clusters, iEtaM2, iPhiM2);
335  const l1t::CaloCluster& clusterNNW = l1t::CaloTools::getCluster(clusters, iEtaM , iPhiM2);
336  const l1t::CaloCluster& clusterNN = l1t::CaloTools::getCluster(clusters, iEta , iPhiM2);
337  const l1t::CaloCluster& clusterNNE = l1t::CaloTools::getCluster(clusters, iEtaP , iPhiM2);
338  const l1t::CaloCluster& clusterNNEE = l1t::CaloTools::getCluster(clusters, iEtaP2, iPhiM2);
339  const l1t::CaloCluster& clusterNEE = l1t::CaloTools::getCluster(clusters, iEtaP2, iPhiM);
340  const l1t::CaloCluster& clusterEE = l1t::CaloTools::getCluster(clusters, iEtaP2, iPhi);
341  const l1t::CaloCluster& clusterSEE = l1t::CaloTools::getCluster(clusters, iEtaP2, iPhiP);
342  const l1t::CaloCluster& clusterSSEE = l1t::CaloTools::getCluster(clusters, iEtaP2, iPhiP2);
343  const l1t::CaloCluster& clusterSSE = l1t::CaloTools::getCluster(clusters, iEtaP , iPhiP2);
344  const l1t::CaloCluster& clusterSS = l1t::CaloTools::getCluster(clusters, iEta , iPhiP2);
345  const l1t::CaloCluster& clusterSSW = l1t::CaloTools::getCluster(clusters, iEtaM , iPhiP2);
346  const l1t::CaloCluster& clusterSSWW = l1t::CaloTools::getCluster(clusters, iEtaM2, iPhiP2);
347  const l1t::CaloCluster& clusterSWW = l1t::CaloTools::getCluster(clusters, iEtaM2, iPhiP);
348  const l1t::CaloCluster& clusterWW = l1t::CaloTools::getCluster(clusters, iEtaM2, iPhi);
349  const l1t::CaloCluster& clusterNWW = l1t::CaloTools::getCluster(clusters, iEtaM2, iPhiM);
350  const l1t::CaloCluster& clusterNNNW = l1t::CaloTools::getCluster(clusters, iEtaM , iPhiM3);
351  const l1t::CaloCluster& clusterNNN = l1t::CaloTools::getCluster(clusters, iEta , iPhiM3);
352  const l1t::CaloCluster& clusterNNNE = l1t::CaloTools::getCluster(clusters, iEtaP , iPhiM3);
353  const l1t::CaloCluster& clusterSSSW = l1t::CaloTools::getCluster(clusters, iEtaM , iPhiP3);
354  const l1t::CaloCluster& clusterSSS = l1t::CaloTools::getCluster(clusters, iEta , iPhiP3);
355  const l1t::CaloCluster& clusterSSSE = l1t::CaloTools::getCluster(clusters, iEtaP , iPhiP3);
356  const l1t::CaloCluster& clusterNNNN = l1t::CaloTools::getCluster(clusters, iEta , iPhiM4);
357  const l1t::CaloCluster& clusterSSSS = l1t::CaloTools::getCluster(clusters, iEta , iPhiP4);
358 
359  // check if neighbour clusters (composed of the seed tower only) have larger energies
360  // if iEta>1
361  bool filterNNWW = (clusterNNWW.hwPt() >= cluster.hwPt());
362  bool filterNNW = (clusterNNW .hwPt() >= cluster.hwPt());
363  bool filterNN = (clusterNN .hwPt() > cluster.hwPt());
364  bool filterNNE = (clusterNNE .hwPt() > cluster.hwPt());
365  bool filterNNEE = (clusterNNEE.hwPt() > cluster.hwPt());
366  bool filterNEE = (clusterNEE .hwPt() > cluster.hwPt());
367  bool filterEE = (clusterEE .hwPt() > cluster.hwPt());
368  bool filterSEE = (clusterSEE .hwPt() > cluster.hwPt());
369  bool filterSSEE = (clusterSSEE.hwPt() > cluster.hwPt());
370  bool filterSSE = (clusterSSE .hwPt() > cluster.hwPt());
371  bool filterSS = (clusterSS .hwPt() >= cluster.hwPt());
372  bool filterSSW = (clusterSSW .hwPt() >= cluster.hwPt());
373  bool filterSSWW = (clusterSSWW.hwPt() >= cluster.hwPt());
374  bool filterSWW = (clusterSWW .hwPt() >= cluster.hwPt());
375  bool filterWW = (clusterWW .hwPt() >= cluster.hwPt());
376  bool filterNWW = (clusterNWW .hwPt() >= cluster.hwPt());
377  bool filterNNNW = (clusterNNNW.hwPt() >= cluster.hwPt());
378  bool filterNNN = (clusterNNN .hwPt() > cluster.hwPt());
379  bool filterNNNE = (clusterNNNE.hwPt() > cluster.hwPt());
380  bool filterSSSW = (clusterSSSW.hwPt() >= cluster.hwPt());
381  bool filterSSS = (clusterSSS .hwPt() >= cluster.hwPt());
382  bool filterSSSE = (clusterSSSE.hwPt() > cluster.hwPt());
383  bool filterNNNN = (clusterNNNN.hwPt() > cluster.hwPt());
384  bool filterSSSS = (clusterSSSS.hwPt() >= cluster.hwPt());
385  if(iEta<-1)
386  {
387  filterNNWW = (clusterNNWW.hwPt() > cluster.hwPt());
388  filterNNW = (clusterNNW .hwPt() > cluster.hwPt());
389  filterNN = (clusterNN .hwPt() >= cluster.hwPt());
390  filterNNE = (clusterNNE .hwPt() >= cluster.hwPt());
391  filterNNEE = (clusterNNEE.hwPt() >= cluster.hwPt());
392  filterNEE = (clusterNEE .hwPt() >= cluster.hwPt());
393  filterEE = (clusterEE .hwPt() >= cluster.hwPt());
394  filterSEE = (clusterSEE .hwPt() >= cluster.hwPt());
395  filterSSEE = (clusterSSEE.hwPt() >= cluster.hwPt());
396  filterSSE = (clusterSSE .hwPt() >= cluster.hwPt());
397  filterSS = (clusterSS .hwPt() > cluster.hwPt());
398  filterSSW = (clusterSSW .hwPt() > cluster.hwPt());
399  filterSSWW = (clusterSSWW.hwPt() > cluster.hwPt());
400  filterSWW = (clusterSWW .hwPt() > cluster.hwPt());
401  filterWW = (clusterWW .hwPt() > cluster.hwPt());
402  filterNWW = (clusterNWW .hwPt() > cluster.hwPt());
403  filterNNNW = (clusterNNNW.hwPt() > cluster.hwPt());
404  filterNNN = (clusterNNN .hwPt() >= cluster.hwPt());
405  filterNNNE = (clusterNNNE.hwPt() >= cluster.hwPt());
406  filterSSSW = (clusterSSSW.hwPt() > cluster.hwPt());
407  filterSSS = (clusterSSS .hwPt() > cluster.hwPt());
408  filterSSSE = (clusterSSSE.hwPt() >= cluster.hwPt());
409  filterNNNN = (clusterNNNN.hwPt() >= cluster.hwPt());
410  filterSSSS = (clusterSSSS.hwPt() > cluster.hwPt());
411  }
412  else if(iEta==1)
413  {
414  filterNNWW = (clusterNNWW.hwPt() > cluster.hwPt());
415  filterNNW = (clusterNNW .hwPt() > cluster.hwPt());
416  filterNN = (clusterNN .hwPt() > cluster.hwPt());
417  filterNNE = (clusterNNE .hwPt() > cluster.hwPt());
418  filterNNEE = (clusterNNEE.hwPt() > cluster.hwPt());
419  filterNEE = (clusterNEE .hwPt() > cluster.hwPt());
420  filterEE = (clusterEE .hwPt() > cluster.hwPt());
421  filterSEE = (clusterSEE .hwPt() > cluster.hwPt());
422  filterSSEE = (clusterSSEE.hwPt() > cluster.hwPt());
423  filterSSE = (clusterSSE .hwPt() > cluster.hwPt());
424  filterSS = (clusterSS .hwPt() >= cluster.hwPt());
425  filterSSW = (clusterSSW .hwPt() >= cluster.hwPt());
426  filterSSWW = (clusterSSWW.hwPt() > cluster.hwPt());
427  filterSWW = (clusterSWW .hwPt() > cluster.hwPt());
428  filterWW = (clusterWW .hwPt() > cluster.hwPt());
429  filterNWW = (clusterNWW .hwPt() > cluster.hwPt());
430  filterNNNW = (clusterNNNW.hwPt() > cluster.hwPt());
431  filterNNN = (clusterNNN .hwPt() > cluster.hwPt());
432  filterNNNE = (clusterNNNE.hwPt() > cluster.hwPt());
433  filterSSSW = (clusterSSSW.hwPt() >= cluster.hwPt());
434  filterSSS = (clusterSSS .hwPt() >= cluster.hwPt());
435  filterSSSE = (clusterSSSE.hwPt() > cluster.hwPt());
436  filterNNNN = (clusterNNNN.hwPt() > cluster.hwPt());
437  filterSSSS = (clusterSSSS.hwPt() >= cluster.hwPt());
438  }
439  else if(iEta==-1)
440  {
441  filterNNWW = (clusterNNWW.hwPt() > cluster.hwPt());
442  filterNNW = (clusterNNW .hwPt() > cluster.hwPt());
443  filterNN = (clusterNN .hwPt() > cluster.hwPt());
444  filterNNE = (clusterNNE .hwPt() > cluster.hwPt());
445  filterNNEE = (clusterNNEE.hwPt() > cluster.hwPt());
446  filterNEE = (clusterNEE .hwPt() > cluster.hwPt());
447  filterEE = (clusterEE .hwPt() > cluster.hwPt());
448  filterSEE = (clusterSEE .hwPt() > cluster.hwPt());
449  filterSSEE = (clusterSSEE.hwPt() > cluster.hwPt());
450  filterSSE = (clusterSSE .hwPt() >= cluster.hwPt());
451  filterSS = (clusterSS .hwPt() >= cluster.hwPt());
452  filterSSW = (clusterSSW .hwPt() > cluster.hwPt());
453  filterSSWW = (clusterSSWW.hwPt() > cluster.hwPt());
454  filterSWW = (clusterSWW .hwPt() > cluster.hwPt());
455  filterWW = (clusterWW .hwPt() > cluster.hwPt());
456  filterNWW = (clusterNWW .hwPt() > cluster.hwPt());
457  filterNNNW = (clusterNNNW.hwPt() > cluster.hwPt());
458  filterNNN = (clusterNNN .hwPt() > cluster.hwPt());
459  filterNNNE = (clusterNNNE.hwPt() > cluster.hwPt());
460  filterSSSW = (clusterSSSW.hwPt() > cluster.hwPt());
461  filterSSS = (clusterSSS .hwPt() >= cluster.hwPt());
462  filterSSSE = (clusterSSSE.hwPt() >= cluster.hwPt());
463  filterNNNN = (clusterNNNN.hwPt() > cluster.hwPt());
464  filterSSSS = (clusterSSSS.hwPt() >= cluster.hwPt());
465  }
466 
467  // IN_FIRMWARE
468  //if(filterNNWW || filterNNW || filterNN || filterWW || filterNWW || filterNNNW) cluster.setClusterFlag(CaloCluster::INCLUDE_NW, false);
469  //if(filterNNW || filterNN || filterNNE || filterNNN) cluster.setClusterFlag(CaloCluster::INCLUDE_N , false);
470  //if(filterNN || filterNNE || filterNNEE || filterNEE || filterEE || filterNNNE) cluster.setClusterFlag(CaloCluster::INCLUDE_NE, false);
471  //if(filterNEE || filterEE || filterSEE || filterNNE || filterSSE) cluster.setClusterFlag(CaloCluster::INCLUDE_E , false);
472  //if(filterEE || filterSEE || filterSSEE || filterSSE || filterSS || filterSSSE) cluster.setClusterFlag(CaloCluster::INCLUDE_SE, false);
473  //if(filterSSE || filterSS || filterSSW || filterSSS) cluster.setClusterFlag(CaloCluster::INCLUDE_S , false);
474  //if(filterSS || filterSSW || filterSSWW || filterSWW || filterWW || filterSSSW) cluster.setClusterFlag(CaloCluster::INCLUDE_SW, false);
475  //if(filterSWW || filterWW || filterNWW || filterNNW || filterSSW) cluster.setClusterFlag(CaloCluster::INCLUDE_W , false);
476  //if(filterNNW || filterNNE || filterNNNW || filterNNN || filterNNNE || filterNNNN) cluster.setClusterFlag(CaloCluster::INCLUDE_NN, false);
477  //if(filterSSW || filterSSE || filterSSSW || filterSSS || filterSSSE || filterSSSS) cluster.setClusterFlag(CaloCluster::INCLUDE_SS, false);
478  // END IN_FIRMWARE
479 
480  // NOT_IN_FIRMWARE
481  const l1t::CaloTower& towerNW = l1t::CaloTools::getTower(towers, iEtaM , iPhiM);
482  const l1t::CaloTower& towerNE = l1t::CaloTools::getTower(towers, iEtaP , iPhiM);
483  const l1t::CaloTower& towerSE = l1t::CaloTools::getTower(towers, iEtaP , iPhiP);
484  const l1t::CaloTower& towerSW = l1t::CaloTools::getTower(towers, iEtaM , iPhiP);
485  const l1t::CaloTower& towerNN = l1t::CaloTools::getTower(towers, iEta , iPhiM2);
486  const l1t::CaloTower& towerNNW = l1t::CaloTools::getTower(towers, iEtaP , iPhiM2);
487  const l1t::CaloTower& towerNNE = l1t::CaloTools::getTower(towers, iEtaM , iPhiM2);
488  const l1t::CaloTower& towerSS = l1t::CaloTools::getTower(towers, iEta , iPhiP2);
489  const l1t::CaloTower& towerSSW = l1t::CaloTools::getTower(towers, iEtaP , iPhiP2);
490  const l1t::CaloTower& towerSSE = l1t::CaloTools::getTower(towers, iEtaM , iPhiP2);
491  const l1t::CaloTower& towerNNN = l1t::CaloTools::getTower(towers, iEta , iPhiM3);
492  const l1t::CaloTower& towerSSS = l1t::CaloTools::getTower(towers, iEta , iPhiP3);
493  int towerEtNW = 0;
494  int towerEtNE = 0;
495  int towerEtSE = 0;
496  int towerEtSW = 0;
497  int towerEtNN = 0;
498  int towerEtNNE = 0;
499  int towerEtNNW = 0;
500  int towerEtSS = 0;
501  int towerEtSSE = 0;
502  int towerEtSSW = 0;
503  int towerEtNNN = 0;
504  int towerEtSSS = 0;
505  if(clusterInput_==E)
506  {
507  towerEtNW = towerNW .hwEtEm();
508  towerEtNE = towerNE .hwEtEm();
509  towerEtSE = towerSE .hwEtEm();
510  towerEtSW = towerSW .hwEtEm();
511  towerEtNN = towerNN .hwEtEm();
512  towerEtNNE = towerNNE.hwEtEm();
513  towerEtNNW = towerNNW.hwEtEm();
514  towerEtSS = towerSS .hwEtEm();
515  towerEtSSE = towerSSE.hwEtEm();
516  towerEtSSW = towerSSW.hwEtEm();
517  towerEtNNN = towerNNN.hwEtEm();
518  towerEtSSS = towerSSS.hwEtEm();
519  }
520  else if(clusterInput_==EH)
521  {
522  towerEtNW = towerNW .hwEtEm() + towerNW .hwEtHad();
523  towerEtNE = towerNE .hwEtEm() + towerNE .hwEtHad();
524  towerEtSE = towerSE .hwEtEm() + towerSE .hwEtHad();
525  towerEtSW = towerSW .hwEtEm() + towerSW .hwEtHad();
526  towerEtNN = towerNN .hwEtEm() + towerNN .hwEtHad();
527  towerEtNNE = towerNNE.hwEtEm() + towerNNE.hwEtHad();
528  towerEtNNW = towerNNW.hwEtEm() + towerNNW.hwEtHad();
529  towerEtSS = towerSS .hwEtEm() + towerSS .hwEtHad();
530  towerEtSSE = towerSSE.hwEtEm() + towerSSE.hwEtHad();
531  towerEtSSW = towerSSW.hwEtEm() + towerSSW.hwEtHad();
532  towerEtNNN = towerNNN.hwEtEm() + towerNNN.hwEtHad();
533  towerEtSSS = towerSSS.hwEtEm() + towerSSS.hwEtHad();
534  }
535  else if(clusterInput_==H)
536  {
537  towerEtNW = towerNW .hwEtHad();
538  towerEtNE = towerNE .hwEtHad();
539  towerEtSE = towerSE .hwEtHad();
540  towerEtSW = towerSW .hwEtHad();
541  towerEtNN = towerNN .hwEtHad();
542  towerEtNNE = towerNNE.hwEtHad();
543  towerEtNNW = towerNNW.hwEtHad();
544  towerEtSS = towerSS .hwEtHad();
545  towerEtSSE = towerSSE.hwEtHad();
546  towerEtSSW = towerSSW.hwEtHad();
547  towerEtNNN = towerNNN.hwEtHad();
548  towerEtSSS = towerSSS.hwEtHad();
549  }
550 
551 
552  // Remove tower from the cluster if it is taken by an other cluster
553  if(filterNNWW || filterNNW || filterNN || filterWW || filterNWW || (filterNNNW && towerEtNNW>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_NW, false);
554  if(filterNNW || filterNN || filterNNE || (filterNNN && towerEtNN>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_N , false);
555  if(filterNN || filterNNE || filterNNEE || filterNEE || filterEE || (filterNNNE && towerEtNNE>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_NE, false);
556  if(filterNEE || filterEE || filterSEE || (filterNNE && towerEtNE>=clusterThreshold_) || (filterSSE && towerEtSE>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_E , false);
557  if(filterEE || filterSEE || filterSSEE || filterSSE || filterSS || (filterSSSE && towerEtSSE>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_SE, false);
558  if(filterSSE || filterSS || filterSSW || (filterSSS && towerEtSS>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_S , false);
559  if(filterSS || filterSSW || filterSSWW || filterSWW || filterWW || (filterSSSW && towerEtSSW>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_SW, false);
560  if(filterSWW || filterWW || filterNWW || (filterNNW && towerEtNW>=clusterThreshold_) || (filterSSW && towerEtSW>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_W , false);
561  if(filterNNW || filterNNE || filterNNNW || filterNNN || filterNNNE || (filterNNNN && towerEtNNN>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_NN, false);
562  if(filterSSW || filterSSE || filterSSSW || filterSSS || filterSSSE || (filterSSSS && towerEtSSS>=clusterThreshold_)) cluster.setClusterFlag(CaloCluster::INCLUDE_SS, false);
563  // END NOT_IN_FIRMWARE
564 
565  }
566  }
567 }
static int offsetIEta(int iEta, int offset)
Definition: CaloStage2Nav.h:43
int hwEtEm() const
Definition: CaloTower.cc:64
static int offsetIPhi(int iPhi, int offset)
Definition: CaloStage2Nav.h:32
static const l1t::CaloCluster & getCluster(const std::vector< l1t::CaloCluster > &clusters, int iEta, int iPhi)
Definition: CaloTools.cc:32
int hwPt() const
Definition: L1Candidate.cc:69
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:11
int hwEtHad() const
Definition: CaloTower.cc:69

Member Data Documentation

ClusterInput l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::clusterInput_
private

Definition at line 44 of file Stage2Layer2ClusterAlgorithmFirmware.h.

int l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::clusterThreshold_
private

Definition at line 46 of file Stage2Layer2ClusterAlgorithmFirmware.h.

int l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::hcalThreshold_
private

Definition at line 47 of file Stage2Layer2ClusterAlgorithmFirmware.h.

CaloParamsHelper* l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::params_
private

Definition at line 48 of file Stage2Layer2ClusterAlgorithmFirmware.h.

int l1t::Stage2Layer2ClusterAlgorithmFirmwareImp1::seedThreshold_
private

Definition at line 45 of file Stage2Layer2ClusterAlgorithmFirmware.h.