CMS 3D CMS Logo

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

#include <Stage1Layer2EtSumAlgorithmImp.h>

Inheritance diagram for l1t::Stage1Layer2EtSumAlgorithmImpHI:
l1t::Stage1Layer2EtSumAlgorithm

Classes

struct  SimpleRegion
 

Public Member Functions

virtual void processEvent (const std::vector< l1t::CaloRegion > &regions, const std::vector< l1t::CaloEmCand > &EMCands, const std::vector< l1t::Jet > *jets, std::vector< l1t::EtSum > *sums)
 
 Stage1Layer2EtSumAlgorithmImpHI (CaloParamsHelper *params)
 
virtual ~Stage1Layer2EtSumAlgorithmImpHI ()
 
- Public Member Functions inherited from l1t::Stage1Layer2EtSumAlgorithm
virtual ~Stage1Layer2EtSumAlgorithm ()
 

Private Types

enum  ETSumType { ETSumType::kHadronicSum, ETSumType::kEmSum }
 

Private Member Functions

int cordicToMETPhi (int phase)
 
int DiJetPhi (const std::vector< l1t::Jet > *jets) const
 
std::tuple< int, int, int > doSumAndMET (const std::vector< SimpleRegion > &regionEt, ETSumType sumType)
 
uint16_t MHToverHT (uint16_t, uint16_t) const
 

Private Attributes

CordicXilinx cordic {24, 19}
 
std::array< int, 73 > cordicPhiValues
 
std::array< long, 5 > cosines
 
CaloParamsHelper *const params_
 
std::array< long, 5 > sines
 

Detailed Description

Author
: Nick Smith (nick..nosp@m.smit.nosp@m.h@cer.nosp@m.n.ch)

Description: hardware emulation of et sum algorithm

Definition at line 88 of file Stage1Layer2EtSumAlgorithmImp.h.

Member Enumeration Documentation

Enumerator
kHadronicSum 
kEmSum 

Definition at line 108 of file Stage1Layer2EtSumAlgorithmImp.h.

108  {
109  kHadronicSum,
110  kEmSum
111  };

Constructor & Destructor Documentation

l1t::Stage1Layer2EtSumAlgorithmImpHI::Stage1Layer2EtSumAlgorithmImpHI ( CaloParamsHelper params)

Definition at line 19 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

References cordicPhiValues, funct::cos(), cosines, i, M_PI, funct::pow(), funct::sin(), and sines.

19  : params_(params)
20 {
21  //now do what ever initialization is needed
22  for(size_t i=0; i<cordicPhiValues.size(); ++i) {
23  cordicPhiValues[i] = static_cast<int>(pow(2.,16)*(((float) i)-36)*M_PI/36);
24  }
25  for(size_t i=0; i<sines.size(); ++i) {
26  sines[i] = static_cast<long>(pow(2,30)*sin(i*20*M_PI/180));
27  cosines[i] = static_cast<long>(pow(2,30)*cos(i*20*M_PI/180));
28  }
29 }
int i
Definition: DBlmapReader.cc:9
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
#define M_PI
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
l1t::Stage1Layer2EtSumAlgorithmImpHI::~Stage1Layer2EtSumAlgorithmImpHI ( )
virtual

Definition at line 32 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

32  {
33 
34 
35 }

Member Function Documentation

int l1t::Stage1Layer2EtSumAlgorithmImpHI::cordicToMETPhi ( int  phase)
private

Definition at line 277 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

References funct::abs(), assert(), and i.

278 {
279  assert(abs(phase)<=205887);
280  for(size_t i=0; i<cordicPhiValues.size()-1; ++i)
281  if ( phase >= cordicPhiValues[i] && phase < cordicPhiValues[i+1] )
282  return i;
283  // if phase == +205887 (+pi), return zero
284  return 0;
285 }
int i
Definition: DBlmapReader.cc:9
assert(m_qm.get())
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int l1t::Stage1Layer2EtSumAlgorithmImpHI::DiJetPhi ( const std::vector< l1t::Jet > *  jets) const
private

Definition at line 287 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

References funct::abs(), and L1CaloRegionDetId::N_PHI.

287  {
288 
289  // cout << "Number of jets: " << jets->size() << endl;
290 
291  int dphi = 10; // initialize to negative physical dphi value
292  if (jets->size()<2) return dphi; // size() not really reliable as we pad the size to 8 (4cen+4for) in the sorter
293  if ((*jets).at(0).hwPt() == 0) return dphi;
294  if ((*jets).at(1).hwPt() == 0) return dphi;
295 
296 
297  int iphi1 = (*jets).at(0).hwPhi();
298  int iphi2 = (*jets).at(1).hwPhi();
299 
300  int difference=abs(iphi1-iphi2);
301 
302  if ( difference > 9 ) difference= L1CaloRegionDetId::N_PHI - difference ; // make Physical dphi always positive
303  return difference;
304 }
vector< PseudoJet > jets
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static const unsigned N_PHI
std::tuple< int, int, int > l1t::Stage1Layer2EtSumAlgorithmImpHI::doSumAndMET ( const std::vector< SimpleRegion > &  regionEt,
ETSumType  sumType 
)
private

Definition at line 193 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

References funct::abs(), assert(), i, prof2calltree::l, objects.METAnalyzer::met, and alignCSCRings::r.

194 {
195  std::array<int, 18> sumEtaPos{};
196  std::array<int, 18> sumEtaNeg{};
197  for (const auto& r : regionEt)
198  {
199  if ( r.ieta < 11 )
200  sumEtaNeg[r.iphi] += r.et;
201  else
202  sumEtaPos[r.iphi] += r.et;
203  }
204 
205  std::array<int, 18> sumEta{};
206  int sumEt(0);
207  for(size_t i=0; i<sumEta.size(); ++i)
208  {
209  assert(sumEtaPos[i] >= 0 && sumEtaNeg[i] >= 0);
210  sumEta[i] = sumEtaPos[i] + sumEtaNeg[i];
211  sumEt += sumEta[i];
212  }
213 
214  // 0, 20, 40, 60, 80 degrees
215  std::array<int, 5> sumsForCos{};
216  std::array<int, 5> sumsForSin{};
217  for(size_t iphi=0; iphi<sumEta.size(); ++iphi)
218  {
219  if ( iphi < 5 )
220  {
221  sumsForCos[iphi] += sumEta[iphi];
222  sumsForSin[iphi] += sumEta[iphi];
223  }
224  else if ( iphi < 9 )
225  {
226  sumsForCos[9-iphi] -= sumEta[iphi];
227  sumsForSin[9-iphi] += sumEta[iphi];
228  }
229  else if ( iphi < 14 )
230  {
231  sumsForCos[iphi-9] -= sumEta[iphi];
232  sumsForSin[iphi-9] -= sumEta[iphi];
233  }
234  else
235  {
236  sumsForCos[18-iphi] += sumEta[iphi];
237  sumsForSin[18-iphi] -= sumEta[iphi];
238  }
239  }
240 
241  long sumX(0l);
242  long sumY(0l);
243  for(int i=0; i<5; ++i)
244  {
245  sumX += sumsForCos[i]*cosines[i];
246  sumY += sumsForSin[i]*sines[i];
247  }
248  assert(abs(sumX)<(1l<<48) && abs(sumY)<(1l<<48));
249  int cordicX = sumX>>25;
250  int cordicY = sumY>>25;
251 
252  uint32_t cordicMag(0);
253  int cordicPhase(0);
254  cordic(cordicX, cordicY, cordicPhase, cordicMag);
255 
256  int met(0);
257  int metPhi(0);
258  if ( sumType == ETSumType::kHadronicSum )
259  {
260  met = (cordicMag % (1<<7)) | ((cordicMag >= (1<<7)) ? (1<<7):0);
261  metPhi = cordicToMETPhi(cordicPhase) >> 2;
262  assert(metPhi >=0 && metPhi < 18);
263  }
264  else
265  {
266  met = (cordicMag % (1<<12)) | ((cordicMag >= (1<<12)) ? (1<<12):0);
267  metPhi = cordicToMETPhi(cordicPhase);
268  assert(metPhi >=0 && metPhi < 72);
269  }
270 
271  return std::make_tuple(sumEt, met, metPhi);
272 }
int i
Definition: DBlmapReader.cc:9
assert(m_qm.get())
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
uint16_t l1t::Stage1Layer2EtSumAlgorithmImpHI::MHToverHT ( uint16_t  num,
uint16_t  den 
) const
private

Definition at line 306 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

References cuy::denominator, cuy::numerator, and query::result.

306  {
307 
308  uint16_t result;
309  uint32_t numerator(num),denominator(den);
310 
311  if(numerator == denominator)
312  result = 0x7f;
313  else
314  {
315  numerator = numerator << 7;
316  result = numerator/denominator;
317  result = result & 0x7f;
318  }
319  // cout << "Result: " << result << endl;
320 
321  return result;
322 }
list numerator
Definition: cuy.py:483
list denominator
Definition: cuy.py:484
tuple result
Definition: query.py:137
void l1t::Stage1Layer2EtSumAlgorithmImpHI::processEvent ( const std::vector< l1t::CaloRegion > &  regions,
const std::vector< l1t::CaloEmCand > &  EMCands,
const std::vector< l1t::Jet > *  jets,
std::vector< l1t::EtSum > *  sums 
)
virtual

Implements l1t::Stage1Layer2EtSumAlgorithm.

Definition at line 37 of file Stage1Layer2EtSumAlgorithmImpHI.cc.

References gather_cfg::cout, l1t::Stage1Layer2EtSumAlgorithmImpHI::SimpleRegion::et, l1t::EtSumToGtScales(), l1t::Stage1Layer2EtSumAlgorithmImpHI::SimpleRegion::ieta, l1t::Stage1Layer2EtSumAlgorithmImpHI::SimpleRegion::iphi, HLT_25ns14e33_v3_cff::MET, alignCSCRings::r, HLT_25ns14e33_v3_cff::region, and cond::to_string().

40  {
41 
42  std::vector<l1t::CaloRegion> *subRegions = new std::vector<l1t::CaloRegion>();
43 
44 
45  //Region Correction will return uncorrected subregions if
46  //regionPUSType is set to None in the config
47  //double jetLsb=params_->jetLsb();
48  double jetLsb = 0.5; // HI O2O does not set this, and it will never change.
49 
50  int etSumEtaMinEt = params_->etSumEtaMin(0);
51  int etSumEtaMaxEt = params_->etSumEtaMax(0);
52  //double etSumEtThresholdEt = params_->etSumEtThreshold(0);
53  int etSumEtThresholdEt = (int) (params_->etSumEtThreshold(0) / jetLsb);
54 
55  int etSumEtaMinHt = params_->etSumEtaMin(1);
56  int etSumEtaMaxHt = params_->etSumEtaMax(1);
57  //double etSumEtThresholdHt = params_->etSumEtThreshold(1);
58  int etSumEtThresholdHt = (int) (params_->etSumEtThreshold(1) / jetLsb);
59 
60  //RegionCorrection(regions, subRegions, params_);
61 
62  std::vector<SimpleRegion> regionEtVect;
63  std::vector<SimpleRegion> regionHtVect;
64 
65  // check the un-subtracted regions for overflow
66  bool regionOverflowEt(false);
67  bool regionOverflowHt(false);
68  for (auto& region : regions) {
69  if(region.hwEta() >= etSumEtaMinEt && region.hwEta() <= etSumEtaMaxEt)
70  {
71  if(region.hwPt() >= 1023)
72  {
73  regionOverflowEt = true;
74  }
75  }
76  if ( region.hwEta() >= etSumEtaMinHt && region.hwEta() <= etSumEtaMaxHt)
77  {
78  if(region.hwPt() >= 1023)
79  {
80  regionOverflowHt = true;
81  }
82  }
83  }
84 
85  // hwPt() is the sum ET+HT in region, for stage 1 this will be
86  // the region sum input to MET algorithm
87  // In stage 2, we would move to hwEtEm() and hwEtHad() for separate MET/MHT
88  // Thresholds will be hardware values not physical
89  //for (auto& region : *subRegions) {
90  for (auto& region : regions) {
91  if ( region.hwEta() >= etSumEtaMinEt && region.hwEta() <= etSumEtaMaxEt)
92  {
93  if(region.hwPt() >= etSumEtThresholdEt)
94  {
95  SimpleRegion r;
96  r.ieta = region.hwEta();
97  r.iphi = region.hwPhi();
98  r.et = region.hwPt();
99  regionEtVect.push_back(r);
100  }
101  }
102  if ( region.hwEta() >= etSumEtaMinHt && region.hwEta() <= etSumEtaMaxHt)
103  {
104  if(region.hwPt() >= etSumEtThresholdHt)
105  {
106  SimpleRegion r;
107  r.ieta = region.hwEta();
108  r.iphi = region.hwPhi();
109  r.et = region.hwPt();
110  regionHtVect.push_back(r);
111  }
112  }
113  }
114 
115  int sumET, MET, iPhiET;
116  std::tie(sumET, MET, iPhiET) = doSumAndMET(regionEtVect, ETSumType::kEmSum);
117 
118  int sumHT, MHT, iPhiHT;
119  std::tie(sumHT, MHT, iPhiHT) = doSumAndMET(regionHtVect, ETSumType::kHadronicSum);
120 
121  // Set quality (i.e. overflow) bits appropriately
122  int METqual = 0;
123  int MHTqual = 0;
124  int ETTqual = 0;
125  int HTTqual = 0;
126  if(MET >= 0xfff || regionOverflowEt) // MET 12 bits
127  METqual = 1;
128  if(MHT >= 0x7f || regionOverflowHt) // MHT 7 bits
129  MHTqual = 1;
130  if(sumET >= 0xfff || regionOverflowEt)
131  ETTqual = 1;
132  if(sumHT >= 0xfff || regionOverflowHt)
133  HTTqual = 1;
134 
135  MHT &= 127; // limit MHT to 7 bits as the firmware does, but only after checking for overflow.
136  //MHT is replaced with MHT/HT
137  uint16_t MHToHT=MHToverHT(MHT,sumHT);
138  // std::cout << "MHT HT MHT/HT" << std::endl;
139  // std::cout << MHT << " " << sumHT << " " << MHToHT << std::endl;
140  //iPhiHt is replaced by the dPhi between two most energetic jets
141  iPhiHT = DiJetPhi(jets);
142 
143 
144  const ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > etLorentz(0,0,0,0);
145  l1t::EtSum etMiss(*&etLorentz,EtSum::EtSumType::kMissingEt,MET&0xfff,0,iPhiET,METqual);
146  l1t::EtSum htMiss(*&etLorentz,EtSum::EtSumType::kMissingHt,MHToHT&0x7f,0,iPhiHT,MHTqual);
147  l1t::EtSum etTot (*&etLorentz,EtSum::EtSumType::kTotalEt,sumET&0xfff,0,0,ETTqual);
148  l1t::EtSum htTot (*&etLorentz,EtSum::EtSumType::kTotalHt,sumHT&0xfff,0,0,HTTqual);
149 
150  std::vector<l1t::EtSum> *preGtEtSums = new std::vector<l1t::EtSum>();
151 
152  preGtEtSums->push_back(etMiss);
153  preGtEtSums->push_back(htMiss);
154  preGtEtSums->push_back(etTot);
155  preGtEtSums->push_back(htTot);
156 
157  EtSumToGtScales(params_, preGtEtSums, etsums);
158 
159  delete subRegions;
160  delete preGtEtSums;
161 
162  // Emulator - HDL simulation comparison printout
163  const bool verbose = false;
164  if(verbose)
165  {
166  for(std::vector<l1t::EtSum>::const_iterator itetsum = etsums->begin();
167  itetsum != etsums->end(); ++itetsum){
168  if(EtSum::EtSumType::kMissingEt == itetsum->getType())
169  {
170  cout << "Missing Et" << endl;
171  cout << bitset<7>(itetsum->hwPhi()).to_string() << bitset<1>(itetsum->hwQual()).to_string() << bitset<12>(itetsum->hwPt()).to_string() << endl;
172  }
173  if(EtSum::EtSumType::kMissingHt == itetsum->getType())
174  {
175  cout << "Missing Ht" << endl;
176  cout << bitset<1>(itetsum->hwQual()).to_string() << bitset<7>(itetsum->hwPt()).to_string() << bitset<5>(itetsum->hwPhi()).to_string() << endl;
177  }
178  if(EtSum::EtSumType::kTotalEt == itetsum->getType())
179  {
180  cout << "Total Et" << endl;
181  cout << bitset<1>(itetsum->hwQual()).to_string() << bitset<12>(itetsum->hwPt()).to_string() << endl;
182  }
183  if(EtSum::EtSumType::kTotalHt == itetsum->getType())
184  {
185  cout << "Total Ht" << endl;
186  cout << bitset<1>(itetsum->hwQual()).to_string() << bitset<12>(itetsum->hwPt()).to_string() << endl;
187  }
188  }
189  }
190 }
double etSumEtThreshold(unsigned isum) const
int etSumEtaMax(unsigned isum) const
void EtSumToGtScales(CaloParamsHelper *params, const std::vector< l1t::EtSum > *input, std::vector< l1t::EtSum > *output)
std::tuple< int, int, int > doSumAndMET(const std::vector< SimpleRegion > &regionEt, ETSumType sumType)
std::string to_string(const T &t)
Definition: Logger.cc:26
int DiJetPhi(const std::vector< l1t::Jet > *jets) const
int etSumEtaMin(unsigned isum) const
vector< PseudoJet > jets
uint16_t MHToverHT(uint16_t, uint16_t) const
tuple cout
Definition: gather_cfg.py:121

Member Data Documentation

CordicXilinx l1t::Stage1Layer2EtSumAlgorithmImpHI::cordic {24, 19}
private

Definition at line 120 of file Stage1Layer2EtSumAlgorithmImp.h.

std::array<int, 73> l1t::Stage1Layer2EtSumAlgorithmImpHI::cordicPhiValues
private

Definition at line 118 of file Stage1Layer2EtSumAlgorithmImp.h.

Referenced by Stage1Layer2EtSumAlgorithmImpHI().

std::array<long, 5> l1t::Stage1Layer2EtSumAlgorithmImpHI::cosines
private

Definition at line 123 of file Stage1Layer2EtSumAlgorithmImp.h.

Referenced by Stage1Layer2EtSumAlgorithmImpHI().

CaloParamsHelper* const l1t::Stage1Layer2EtSumAlgorithmImpHI::params_
private

Definition at line 98 of file Stage1Layer2EtSumAlgorithmImp.h.

std::array<long, 5> l1t::Stage1Layer2EtSumAlgorithmImpHI::sines
private

Definition at line 124 of file Stage1Layer2EtSumAlgorithmImp.h.

Referenced by Stage1Layer2EtSumAlgorithmImpHI().