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 const float l1t::CaloTools::kGTEtaLSB = 0.0435;
10 const float l1t::CaloTools::kGTPhiLSB = 0.0435;
11 const float l1t::CaloTools::kGTEtLSB = 0.5;
12 
13 
14 
15 bool l1t::CaloTools::insertTower(std::vector<l1t::CaloTower>& towers, const l1t::CaloTower& tower) {
16  size_t towerIndex = CaloTools::caloTowerHash(tower.hwEta(), tower.hwPhi());
17  if (towers.size() > towerIndex) {
18  towers.at(towerIndex) = tower;
19  return true;
20  }
21  else return false;
22 }
23 
24 //currently implemented as a brute force search but this will hopefully change in the future
25 //with standarising the layout of std::vector<l1t::CaloTower>
26 const l1t::CaloTower& l1t::CaloTools::getTower(const std::vector<l1t::CaloTower>& towers,int iEta,int iPhi)
27 {
28  size_t towerIndex = CaloTools::caloTowerHash(iEta, iPhi);
29  if(towerIndex<towers.size()){
30  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
31  // std::cout <<"error, tower "<<towers[towerIndex].hwEta()<<" "<<towers[towerIndex].hwPhi()<<" does not match "<<iEta<<" "<<iPhi<<" index "<<towerIndex<<" nr towrs "<<towers.size()<<std::endl;
32  for(size_t towerNr=0;towerNr<towers.size();towerNr++){
33  if(towers[towerNr].hwEta()==iEta && towers[towerNr].hwPhi()==iPhi) return towers[towerNr];
34  }
35  }else return towers[towerIndex];
36 
37  }
38  else{// in case the vector of towers do not contain all the towers (towerIndex can be > towers.size())
39  for(size_t towerNr=0;towerNr<towers.size();towerNr++){
40  if(towers[towerNr].hwEta()==iEta && towers[towerNr].hwPhi()==iPhi) return towers[towerNr];
41  }
42  }
43 
44  return nullTower_;
45 }
46 
47 const l1t::CaloCluster& l1t::CaloTools::getCluster(const std::vector<l1t::CaloCluster>& clusters,int iEta,int iPhi)
48 {
49  for(size_t clusterNr=0;clusterNr<clusters.size();clusterNr++){
50  if(clusters[clusterNr].hwEta()==iEta && clusters[clusterNr].hwPhi()==iPhi) return clusters[clusterNr];
51  }
52  return nullCluster_;
53 }
54 
55 
56 
57 //this implimentation has not all the necessary info yet, we need to check the exact HF numbering
58 //(iEta=-28,iPhi=1)=index 0 to (iEta=28,iPhi=72)=index 28*72*2-1
59 //HF then runs after that so -32,1 = 28*72*2
60 size_t l1t::CaloTools::caloTowerHash(int iEta,int iPhi)
61 {
62 
63  if(!isValidIEtaIPhi(iEta,iPhi)) return caloTowerHashMax();
64  else{
65  const int absIEta = abs(iEta);
66  if(absIEta>kHFEnd) return kNrTowers;
67  else if(absIEta<=kHBHEEnd){ //HBHE
68  int iEtaNoZero=iEta;
69  if(iEta>0) iEtaNoZero--;
70  return (iEtaNoZero+kHBHEEnd)*kHBHENrPhi+iPhi-1;
71  }else{ //HF
72  int iEtaIndex = iEta+kHFEnd; //iEta=-32 is 0
73  if(iEta>0) iEtaIndex= iEta-kHBHEEnd+(kHFEnd-kHBHEEnd)-1; //but iEta=29 is 4
74  return iEtaIndex*kHFNrPhi+iPhi/kHFPhiSeg + kNrHBHETowers;
75  }
76  }
77 }
78 
79 
81 {
82  return kNrTowers;
83 }
84 
85 
86 bool l1t::CaloTools::isValidIEtaIPhi(int iEta,int iPhi)
87 {
88  size_t absIEta = abs(iEta);
89  if(iPhi<=0 || iPhi>kNPhi) return false;
90  if(absIEta==0 || absIEta>kHFEnd) return false;
91  //if(absIEta>kHBHEEnd && iPhi%kHFPhiSeg!=1) return false;
92  return true;
93 
94 }
95 
96 int l1t::CaloTools::calHwEtSum(int iEta,int iPhi,const std::vector<l1t::CaloTower>& towers,
97  int localEtaMin,int localEtaMax,int localPhiMin,int localPhiMax,
98  SubDet etMode)
99 {
100 
101  return calHwEtSum(iEta,iPhi,towers,localEtaMin,localEtaMax,localPhiMin,localPhiMax,kHFEnd,etMode);
102 }
103 
104 int l1t::CaloTools::calHwEtSum(int iEta,int iPhi,const std::vector<l1t::CaloTower>& towers,
105  int localEtaMin,int localEtaMax,int localPhiMin,int localPhiMax,
106  int iEtaAbsMax,SubDet etMode)
107 {
108  int hwEtSum=0;
109  for(int etaNr=localEtaMin;etaNr<=localEtaMax;etaNr++){
110  for(int phiNr=localPhiMin;phiNr<=localPhiMax;phiNr++){
111 
112  int towerIEta = l1t::CaloStage2Nav::offsetIEta(iEta,etaNr);
113  int towerIPhi = l1t::CaloStage2Nav::offsetIPhi(iPhi,phiNr);
114  if(abs(towerIEta)<=iEtaAbsMax){
115  const l1t::CaloTower& tower = getTower(towers,towerIEta,towerIPhi);
116  if(etMode==ECAL) hwEtSum+=tower.hwEtEm();
117  else if(etMode==HCAL) hwEtSum+=tower.hwEtHad();
118  else if(etMode==CALO) hwEtSum+=tower.hwPt();
119  }
120  }
121  }
122  return hwEtSum;
123 }
124 
125 
126 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)
127 {
128  size_t nrTowers=0;
129  l1t::CaloStage2Nav nav(iEtaMin,iPhiMin);
130  while(nav.currIEta()<=iEtaMax){
131  bool finishPhi = false;
132  while(!finishPhi){
133  const l1t::CaloTower& tower = l1t::CaloTools::getTower(towers,nav.currIEta(),nav.currIPhi());
134  int towerHwEt =0;
135  if(etMode==ECAL) towerHwEt+=tower.hwEtEm();
136  else if(etMode==HCAL) towerHwEt+=tower.hwEtHad();
137  else if(etMode==CALO) towerHwEt+=tower.hwPt();
138  if(towerHwEt>=minHwEt && towerHwEt<=maxHwEt) nrTowers++;
139  finishPhi = (nav.currIPhi() == iPhiMax);
140  nav.north();
141  }
142  nav.east();
143  nav.resetIPhi();
144  }
145  return nrTowers;
146 }
147 
148 std::pair<float,float> l1t::CaloTools::towerEtaBounds(int ieta)
149 {
150  if(ieta==0) ieta = 1;
151  if(ieta>kHFEnd) ieta = kHFEnd;
152  if(ieta<(-1*kHFEnd)) ieta = -1*kHFEnd;
153  //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};
154  const float towerEtas[42] = {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,5.191};
155  return std::make_pair( towerEtas[abs(ieta)-1],towerEtas[abs(ieta)] );
156 }
157 
159 {
160  std::pair<float,float> bounds = towerEtaBounds(ieta);
161  float eta = (bounds.second+bounds.first)/2.;
162  float sign = ieta>0 ? 1. : -1.;
163  return sign*eta;
164 }
165 
166 float l1t::CaloTools::towerPhi(int ieta, int iphi)
167 {
168  float phi = (float(iphi)-0.5)*towerPhiSize(ieta);
169  if (phi > M_PI) phi = phi - (2*M_PI);
170  return phi;
171 }
172 
174 {
175  std::pair<float,float> bounds = towerEtaBounds(ieta);
176  float size = (bounds.second-bounds.first);
177  return size;
178 }
179 
181 {
182  return 2.*M_PI/kNPhi;
183 }
184 
185 
186 // convert from calo ieta to internal MP ieta
187 int l1t::CaloTools::mpEta(int ieta) {
188 
189  if (ieta>kHFBegin) return ieta-1;
190  else if (ieta<-1*kHFBegin) return ieta+1;
191  else return ieta;
192 
193 }
194 
195 
196 // convert from internal MP ieta to calo ieta
197 int l1t::CaloTools::caloEta(int mpEta) {
198 
199  if (mpEta>kHFBegin) return mpEta+1;
200  else if (mpEta<-1*kHFBegin) return mpEta-1;
201  else return mpEta;
202 
203 }
204 
205 
206 // convert calorimeter ieta to RCT region index
208 {
209 
210  // outside HF
211  if (abs(ieta) > kHFEnd)
212  return (ieta<0 ? 0 : 21);
213 
214  // inside HBHE
215  if (abs(ieta) <= kHFBegin)
216  {
217  if (ieta<0)
218  return 11 - ceil( double (abs(ieta) /4.) );
219  else
220  return ceil( double (abs(ieta) /4.) ) + 10;
221  }
222 
223  // in HF
224  if (ieta<0)
225  return 4 - ceil( double (abs(ieta)-29) /4. );
226  else
227  return ceil( double (abs(ieta)-29) /4. ) + 17;
228 
229 }
230 
231 
232 int l1t::CaloTools::gtEta(int ieta) {
233 
234  double eta = towerEta(ieta);
235  return round ( eta / kGTEtaLSB );
236 
237 }
238 
239 int l1t::CaloTools::gtPhi(int ieta, int iphi) {
240 
241  double phi = towerPhi(ieta, iphi);
242  if (phi<0) phi = phi + 2*M_PI;
243  return round ( phi / kGTPhiLSB );
244 
245 }
246 
247 
248 
249 
250 
251 // this conversion is based on GT input definitions in CMS DN-2014/029
253 
254  return math::PtEtaPhiMLorentzVector( cand->hwPt() * kGTEtLSB + 1.E-6,
255  cand->hwEta() * kGTEtaLSB,
256  cand->hwPhi() * kGTPhiLSB,
257  0. ) ;
258 
259 }
260 
261 
263 
264  return l1t::EGamma( p4Demux(&eg),
265  eg.hwPt(),
266  eg.hwEta(),
267  eg.hwPhi(),
268  eg.hwQual(),
269  eg.hwIso() );
270 
271 }
272 
273 
275 
276  return l1t::Tau( p4Demux(&tau),
277  tau.hwPt(),
278  tau.hwEta(),
279  tau.hwPhi(),
280  tau.hwQual(),
281  tau.hwIso() );
282 
283 }
284 
285 
287 
288  return l1t::Jet( p4Demux(&jet),
289  jet.hwPt(),
290  jet.hwEta(),
291  jet.hwPhi(),
292  jet.hwQual() );
293 
294 }
295 
296 
298 
299  return l1t::EtSum( p4Demux(&etsum),
300  etsum.getType(),
301  etsum.hwPt(),
302  etsum.hwEta(),
303  etsum.hwPhi(),
304  etsum.hwQual() );
305 
306 }
307 
308 
309 
310 //
312 
313  return math::PtEtaPhiMLorentzVector( cand->hwPt() * 0.5 + 1.E-6,
314  towerEta(cand->hwEta()),
315  towerPhi(cand->hwEta(), cand->hwPhi()),
316  0. ) ;
317 
318 }
319 
321 
322  return l1t::EGamma( p4MP(&eg),
323  eg.hwPt(),
324  eg.hwEta(),
325  eg.hwPhi(),
326  eg.hwQual(),
327  eg.hwIso() );
328 }
329 
330 
332 
333  return l1t::Tau( p4MP(&tau),
334  tau.hwPt(),
335  tau.hwEta(),
336  tau.hwPhi(),
337  tau.hwQual(),
338  tau.hwIso() );
339 }
340 
341 
343 
344  return l1t::Jet( p4MP(&jet),
345  jet.hwPt(),
346  jet.hwEta(),
347  jet.hwPhi(),
348  jet.hwQual() );
349 
350 }
351 
353 
354  return l1t::EtSum( p4MP(&etsum),
355  etsum.getType(),
356  etsum.hwPt(),
357  etsum.hwEta(),
358  etsum.hwPhi(),
359  etsum.hwQual() );
360 
361 }
static float towerEta(int ieta)
Definition: CaloTools.cc:158
static l1t::Tau tauP4MP(l1t::Tau &)
Definition: CaloTools.cc:331
static l1t::EtSum etSumP4MP(l1t::EtSum &)
Definition: CaloTools.cc:352
static bool isValidIEtaIPhi(int iEta, int iPhi)
Definition: CaloTools.cc:86
static const float kGTPhiLSB
Definition: CaloTools.h:114
static float towerPhi(int ieta, int iphi)
Definition: CaloTools.cc:166
std::pair< int, int > north()
Definition: CaloStage2Nav.h:54
static int mpEta(int ieta)
Definition: CaloTools.cc:187
static l1t::EGamma egP4MP(l1t::EGamma &)
Definition: CaloTools.cc:320
static int regionEta(int ieta)
Definition: CaloTools.cc:207
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:173
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:96
static const float kGTEtaLSB
Definition: CaloTools.h:113
static math::PtEtaPhiMLorentzVector p4MP(l1t::L1Candidate *)
Definition: CaloTools.cc:311
int hwPhi() const
Definition: L1Candidate.cc:79
int hwEtEm() const
Definition: CaloTower.cc:64
static int gtPhi(int ieta, int iphi)
Definition: CaloTools.cc:239
static size_t caloTowerHash(int iEta, int iPhi)
Definition: CaloTools.cc:60
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:126
static l1t::EGamma egP4Demux(l1t::EGamma &)
Definition: CaloTools.cc:262
static int gtEta(int ieta)
Definition: CaloTools.cc:232
static const l1t::CaloCluster & getCluster(const std::vector< l1t::CaloCluster > &clusters, int iEta, int iPhi)
Definition: CaloTools.cc:47
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static l1t::Jet jetP4MP(l1t::Jet &)
Definition: CaloTools.cc:342
static l1t::Jet jetP4Demux(l1t::Jet &)
Definition: CaloTools.cc:286
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:180
static l1t::Tau tauP4Demux(l1t::Tau &)
Definition: CaloTools.cc:274
int hwPt() const
Definition: L1Candidate.cc:69
static std::pair< float, float > towerEtaBounds(int ieta)
Definition: CaloTools.cc:148
static size_t caloTowerHashMax()
Definition: CaloTools.cc:80
static const l1t::CaloTower nullTower_
Definition: CaloTools.h:110
Geom::Phi< T > phi() const
static bool insertTower(std::vector< l1t::CaloTower > &towers, const l1t::CaloTower &tower)
Definition: CaloTools.cc:15
std::pair< int, int > east()
Definition: CaloStage2Nav.h:56
static int caloEta(int ietaMP)
Definition: CaloTools.cc:197
static const l1t::CaloTower & getTower(const std::vector< l1t::CaloTower > &towers, int iEta, int iPhi)
Definition: CaloTools.cc:26
static const float kGTEtLSB
Definition: CaloTools.h:115
static math::PtEtaPhiMLorentzVector p4Demux(l1t::L1Candidate *)
Definition: CaloTools.cc:252
int hwEtHad() const
Definition: CaloTower.cc:69
static const l1t::CaloCluster nullCluster_
Definition: CaloTools.h:111
EtSumType getType() const
Definition: EtSum.cc:37
tuple size
Write out results.
static l1t::EtSum etSumP4Demux(l1t::EtSum &)
Definition: CaloTools.cc:297
int currIEta() const
Definition: CaloStage2Nav.h:60