CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CaloTools.cc
Go to the documentation of this file.
2 
3 
5 
8 
9 
10 bool l1t::CaloTools::insertTower(std::vector<l1t::CaloTower>& towers, const l1t::CaloTower& tower) {
11  size_t towerIndex = CaloTools::caloTowerHash(tower.hwEta(), tower.hwPhi());
12  if (towers.size() > towerIndex) {
13  towers.at(towerIndex) = tower;
14  return true;
15  }
16  else return false;
17 }
18 
19 //currently implemented as a brute force search but this will hopefully change in the future
20 //with standarising the layout of std::vector<l1t::CaloTower>
21 const l1t::CaloTower& l1t::CaloTools::getTower(const std::vector<l1t::CaloTower>& towers,int iEta,int iPhi)
22 {
23  size_t towerIndex = CaloTools::caloTowerHash(iEta, iPhi);
24  if(towerIndex<towers.size()){
25  if(towers[towerIndex].hwEta()!=iEta || towers[towerIndex].hwPhi()!=iPhi){ //it failed, this is bad, but we will not log the error due to policy and silently attempt to do a brute force search instead
26  // std::cout <<"error, tower "<<towers[towerIndex].hwEta()<<" "<<towers[towerIndex].hwPhi()<<" does not match "<<iEta<<" "<<iPhi<<" index "<<towerIndex<<" nr towrs "<<towers.size()<<std::endl;
27  for(size_t towerNr=0;towerNr<towers.size();towerNr++){
28  if(towers[towerNr].hwEta()==iEta && towers[towerNr].hwPhi()==iPhi) return towers[towerNr];
29  }
30  }else return towers[towerIndex];
31 
32  }
33  else{// in case the vector of towers do not contain all the towers (towerIndex can be > towers.size())
34  for(size_t towerNr=0;towerNr<towers.size();towerNr++){
35  if(towers[towerNr].hwEta()==iEta && towers[towerNr].hwPhi()==iPhi) return towers[towerNr];
36  }
37  }
38 
39  return nullTower_;
40 }
41 
42 const l1t::CaloCluster& l1t::CaloTools::getCluster(const std::vector<l1t::CaloCluster>& clusters,int iEta,int iPhi)
43 {
44  for(size_t clusterNr=0;clusterNr<clusters.size();clusterNr++){
45  if(clusters[clusterNr].hwEta()==iEta && clusters[clusterNr].hwPhi()==iPhi) return clusters[clusterNr];
46  }
47  return nullCluster_;
48 }
49 
50 
51 
52 //this implimentation has not all the necessary info yet, we need to check the exact HF numbering
53 //(iEta=-28,iPhi=1)=index 0 to (iEta=28,iPhi=72)=index 28*72*2-1
54 //HF then runs after that so -32,1 = 28*72*2
55 size_t l1t::CaloTools::caloTowerHash(int iEta,int iPhi)
56 {
57 
58  if(!isValidIEtaIPhi(iEta,iPhi)) return caloTowerHashMax();
59  else{
60  const int absIEta = abs(iEta);
61  if(absIEta>kHFEnd) return kNrTowers;
62  else if(absIEta<=kHBHEEnd){ //HBHE
63  int iEtaNoZero=iEta;
64  if(iEta>0) iEtaNoZero--;
65  return (iEtaNoZero+kHBHEEnd)*kHBHENrPhi+iPhi-1;
66  }else{ //HF
67  int iEtaIndex = iEta+kHFEnd; //iEta=-32 is 0
68  if(iEta>0) iEtaIndex= iEta-kHBHEEnd+(kHFEnd-kHBHEEnd)-1; //but iEta=29 is 4
69  return iEtaIndex*kHFNrPhi+iPhi/kHFPhiSeg + kNrHBHETowers;
70  }
71  }
72 }
73 
74 
76 {
77  return kNrTowers;
78 }
79 
80 
81 bool l1t::CaloTools::isValidIEtaIPhi(int iEta,int iPhi)
82 {
83  size_t absIEta = abs(iEta);
84  if(iPhi<=0 || iPhi>kHBHENrPhi) return false;
85  if(absIEta==0 || absIEta>kHFEnd) return false;
86  //if(absIEta>kHBHEEnd && iPhi%kHFPhiSeg!=1) return false;
87  return true;
88 
89 }
90 
91 int l1t::CaloTools::calHwEtSum(int iEta,int iPhi,const std::vector<l1t::CaloTower>& towers,
92  int localEtaMin,int localEtaMax,int localPhiMin,int localPhiMax,
93  SubDet etMode)
94 {
95 
96  return calHwEtSum(iEta,iPhi,towers,localEtaMin,localEtaMax,localPhiMin,localPhiMax,kHFEnd,etMode);
97 }
98 
99 int l1t::CaloTools::calHwEtSum(int iEta,int iPhi,const std::vector<l1t::CaloTower>& towers,
100  int localEtaMin,int localEtaMax,int localPhiMin,int localPhiMax,
101  int iEtaAbsMax,SubDet etMode)
102 {
103  int hwEtSum=0;
104  for(int etaNr=localEtaMin;etaNr<=localEtaMax;etaNr++){
105  for(int phiNr=localPhiMin;phiNr<=localPhiMax;phiNr++){
106 
107  int towerIEta = l1t::CaloStage2Nav::offsetIEta(iEta,etaNr);
108  int towerIPhi = l1t::CaloStage2Nav::offsetIPhi(iPhi,phiNr);
109  if(abs(towerIEta)<=iEtaAbsMax){
110  const l1t::CaloTower& tower = getTower(towers,towerIEta,towerIPhi);
111  if(etMode==ECAL) hwEtSum+=tower.hwEtEm();
112  else if(etMode==HCAL) hwEtSum+=tower.hwEtHad();
113  else if(etMode==CALO) hwEtSum+=tower.hwPt();
114  }
115  }
116  }
117  return hwEtSum;
118 }
119 
120 
121 size_t l1t::CaloTools::calNrTowers(int iEtaMin,int iEtaMax,int iPhiMin,int iPhiMax,const std::vector<l1t::CaloTower>& towers,int minHwEt,int maxHwEt,SubDet etMode)
122 {
123  size_t nrTowers=0;
124  l1t::CaloStage2Nav nav(iEtaMin,iPhiMin);
125  while(nav.currIEta()<=iEtaMax){
126  bool finishPhi = false;
127  while(!finishPhi){
128  const l1t::CaloTower& tower = l1t::CaloTools::getTower(towers,nav.currIEta(),nav.currIPhi());
129  int towerHwEt =0;
130  if(etMode==ECAL) towerHwEt+=tower.hwEtEm();
131  else if(etMode==HCAL) towerHwEt+=tower.hwEtHad();
132  else if(etMode==CALO) towerHwEt+=tower.hwPt();
133  if(towerHwEt>=minHwEt && towerHwEt<=maxHwEt) nrTowers++;
134  finishPhi = (nav.currIPhi() == iPhiMax);
135  nav.north();
136  }
137  nav.east();
138  nav.resetIPhi();
139  }
140  return nrTowers;
141 }
142 
143 std::pair<float,float> l1t::CaloTools::towerEtaBounds(int ieta)
144 {
145  if(ieta==0) ieta = 1;
146  if(ieta>32) ieta = 32;
147  if(ieta<-32) ieta = -32;
148  //const float towerEtas[33] = {0,0.087,0.174,0.261,0.348,0.435,0.522,0.609,0.696,0.783,0.870,0.957,1.044,1.131,1.218,1.305,1.392,1.479,1.566,1.653,1.740,1.830,1.930,2.043,2.172,2.322,2.5,2.650,3.000,3.5,4.0,4.5,5.0};
149  const float towerEtas[41] = {0,0.087,0.174,0.261,0.348,0.435,0.522,0.609,0.696,0.783,0.870,0.957,1.044,1.131,1.218,1.305,1.392,1.479,1.566,1.653,1.740,1.830,1.930,2.043,2.172,2.322,2.5,2.650,2.853,3.139,3.314,3.489,3.664,3.839,4.013,4.191,4.363,4.538,4.716,4.889,5.191};
150  return std::make_pair( towerEtas[abs(ieta)-1],towerEtas[abs(ieta)] );
151 }
152 
154 {
155  std::pair<float,float> bounds = towerEtaBounds(ieta);
156  float eta = (bounds.second+bounds.first)/2.;
157  float sign = ieta>0 ? 1. : -1.;
158  return sign*eta;
159 }
160 
161 float l1t::CaloTools::towerPhi(int ieta, int iphi)
162 {
163  return (float(iphi)-0.5)*towerPhiSize(ieta);
164 }
165 
167 {
168  std::pair<float,float> bounds = towerEtaBounds(ieta);
169  float size = (bounds.second-bounds.first);
170  return size;
171 }
172 
174 {
175  if(abs(ieta)<=28) return 2.*M_PI/72.;
176  else return 2.*M_PI/18.;
177 }
178 
179 
180 
181 
182 // this conversion is based on GT input definitions in CMS DN-2014/029
184 
185  return math::PtEtaPhiMLorentzVector( cand->hwPt() * 0.5 + 1.E-6,
186  cand->hwEta() * 0.0435,
187  cand->hwPhi() * 0.0435,
188  0. ) ;
189 
190 }
191 
192 
194 
195  return l1t::EGamma( p4Demux(&eg),
196  eg.hwPt(),
197  eg.hwEta(),
198  eg.hwPhi(),
199  eg.hwQual(),
200  eg.hwIso() );
201 
202 }
203 
204 
206 
207  return l1t::Tau( p4Demux(&tau),
208  tau.hwPt(),
209  tau.hwEta(),
210  tau.hwPhi(),
211  tau.hwQual(),
212  tau.hwIso() );
213 
214 }
215 
216 
218 
219  return l1t::Jet( p4Demux(&jet),
220  jet.hwPt(),
221  jet.hwEta(),
222  jet.hwPhi(),
223  jet.hwQual() );
224 
225 }
226 
227 
229 
230  return l1t::EtSum( p4Demux(&etsum),
231  etsum.getType(),
232  etsum.hwPt(),
233  etsum.hwEta(),
234  etsum.hwPhi(),
235  etsum.hwQual() );
236 
237 }
238 
239 
240 
241 //
243 
244  return math::PtEtaPhiMLorentzVector( cand->hwPt() * 0.5 + 1.E-6,
245  towerEta(cand->hwEta()),
246  towerPhi(cand->hwEta(), cand->hwPhi()),
247  0. ) ;
248 
249 }
250 
252 
253  return l1t::EGamma( p4MP(&eg),
254  eg.hwPt(),
255  eg.hwEta(),
256  eg.hwPhi(),
257  eg.hwQual(),
258  eg.hwIso() );
259 }
260 
261 
263 
264  return l1t::Tau( p4MP(&tau),
265  tau.hwPt(),
266  tau.hwEta(),
267  tau.hwPhi(),
268  tau.hwQual(),
269  tau.hwIso() );
270 }
271 
272 
274 
275  return l1t::Jet( p4MP(&jet),
276  jet.hwPt(),
277  jet.hwEta(),
278  jet.hwPhi(),
279  jet.hwQual() );
280 
281 }
282 
284 
285  return l1t::EtSum( p4MP(&etsum),
286  etsum.getType(),
287  etsum.hwPt(),
288  etsum.hwEta(),
289  etsum.hwPhi(),
290  etsum.hwQual() );
291 
292 }
static float towerEta(int ieta)
Definition: CaloTools.cc:153
static l1t::Tau tauP4MP(l1t::Tau &)
Definition: CaloTools.cc:262
static l1t::EtSum etSumP4MP(l1t::EtSum &)
Definition: CaloTools.cc:283
static bool isValidIEtaIPhi(int iEta, int iPhi)
Definition: CaloTools.cc:81
static float towerPhi(int ieta, int iphi)
Definition: CaloTools.cc:161
std::pair< int, int > north()
Definition: CaloStage2Nav.h:54
static l1t::EGamma egP4MP(l1t::EGamma &)
Definition: CaloTools.cc:251
Definition: Tau.h:16
static int offsetIEta(int iEta, int offset)
Definition: CaloStage2Nav.h:43
double sign(double x)
static float towerEtaSize(int ieta)
Definition: CaloTools.cc:166
static int calHwEtSum(int iEta, int iPhi, const std::vector< l1t::CaloTower > &towers, int localEtaMin, int localEtaMax, int localPhiMin, int localPhiMax, SubDet etMode=CALO)
Definition: CaloTools.cc:91
static math::PtEtaPhiMLorentzVector p4MP(l1t::L1Candidate *)
Definition: CaloTools.cc:242
int hwPhi() const
Definition: L1Candidate.cc:79
int hwEtEm() const
Definition: CaloTower.cc:64
static size_t caloTowerHash(int iEta, int iPhi)
Definition: CaloTools.cc:55
int currIPhi() const
Definition: CaloStage2Nav.h:61
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:25
int hwIso() const
Definition: L1Candidate.cc:84
Definition: Jet.h:16
static int offsetIPhi(int iPhi, int offset)
Definition: CaloStage2Nav.h:32
static size_t calNrTowers(int iEtaMin, int iEtaMax, int iPhiMin, int iPhiMax, const std::vector< l1t::CaloTower > &towers, int minHwEt, int maxHwEt, SubDet etMode=CALO)
Definition: CaloTools.cc:121
static l1t::EGamma egP4Demux(l1t::EGamma &)
Definition: CaloTools.cc:193
static const l1t::CaloCluster & getCluster(const std::vector< l1t::CaloCluster > &clusters, int iEta, int iPhi)
Definition: CaloTools.cc:42
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static l1t::Jet jetP4MP(l1t::Jet &)
Definition: CaloTools.cc:273
static l1t::Jet jetP4Demux(l1t::Jet &)
Definition: CaloTools.cc:217
int hwEta() const
Definition: L1Candidate.cc:74
int hwQual() const
Definition: L1Candidate.cc:89
#define M_PI
static float towerPhiSize(int ieta)
Definition: CaloTools.cc:173
static l1t::Tau tauP4Demux(l1t::Tau &)
Definition: CaloTools.cc:205
int hwPt() const
Definition: L1Candidate.cc:69
static std::pair< float, float > towerEtaBounds(int ieta)
Definition: CaloTools.cc:143
static size_t caloTowerHashMax()
Definition: CaloTools.cc:75
static const l1t::CaloTower nullTower_
Definition: CaloTools.h:102
static bool insertTower(std::vector< l1t::CaloTower > &towers, const l1t::CaloTower &tower)
Definition: CaloTools.cc:10
std::pair< int, int > east()
Definition: CaloStage2Nav.h:56
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:21
static math::PtEtaPhiMLorentzVector p4Demux(l1t::L1Candidate *)
Definition: CaloTools.cc:183
int hwEtHad() const
Definition: CaloTower.cc:69
static const l1t::CaloCluster nullCluster_
Definition: CaloTools.h:103
EtSumType getType() const
Definition: EtSum.cc:37
tuple size
Write out results.
static l1t::EtSum etSumP4Demux(l1t::EtSum &)
Definition: CaloTools.cc:228
int currIEta() const
Definition: CaloStage2Nav.h:60