CMS 3D CMS Logo

Stage2Layer2DemuxSumsAlgoFirmwareImp1.cc
Go to the documentation of this file.
1 
12 
13 #include <vector>
14 #include <algorithm>
15 
16 
18  params_(params), cordic_(Cordic(144*16,17,8)) // These are the settings in the hardware - should probably make this configurable
19 {
20 }
21 
22 
23 void l1t::Stage2Layer2DemuxSumsAlgoFirmwareImp1::processEvent(const std::vector<l1t::EtSum> & inputSums,
24  std::vector<l1t::EtSum> & outputSums) {
25 
26  int et(0), etHF(0), etHFOnly(0), etem(0), metx(0), mety(0), metxHF(0), metyHF(0), ht(0), htHF(0), mhtx(0), mhty(0), mhtxHF(0), mhtyHF(0), metPhi(0), metPhiHF(0), mhtPhi(0), mhtPhiHF(0);
27  double etPos(0), etNeg(0), etHFPos(0), etHFNeg(0), htPos(0), htNeg(0), htHFPos(0), htHFNeg(0);
28  int cent(0);
29  unsigned int asymEt(0), asymEtHF(0), asymHt(0), asymHtHF(0);
30  bool posEt(false), posEtHF(false), posHt(false), posHtHF(false);
31  unsigned int met(0), metHF(0), mht(0), mhtHF(0);
32  unsigned int mbp0(0), mbm0(0), mbp1(0), mbm1(0);
33  unsigned int ntow(0);
34 
35  bool etSat(false), etHFSat(false), htSat(false), htHFSat(false);
36  bool metSat(false), metHFSat(false), mhtSat(false), mhtHFSat(false);
37 
38  // Add up the x, y and scalar components
39  for (auto&& eSum : inputSums)
40  {
41  switch (eSum.getType()) {
42 
44  if(eSum.hwPt()==0xffff) etSat=true;
45  et += eSum.hwPt();
46  if(posEt) etPos = eSum.hwPt();
47  else {
48  etNeg = eSum.hwPt();
49  posEt = true;
50  }
51  break;
52 
54  if(eSum.hwPt()==0xffff) etHFSat=true;
55  etHF += eSum.hwPt();
56  if(posEtHF) etHFPos = eSum.hwPt();
57  else {
58  etHFNeg = eSum.hwPt();
59  posEtHF = true;
60  }
61  break;
62 
64  etem += eSum.hwPt();
65  break;
66 
68  if(eSum.hwPt()==0x7fffffff) metSat=true;
69  else metx += eSum.hwPt();
70  break;
71 
73  if(eSum.hwPt()==0x7fffffff) metSat=true;
74  else mety += eSum.hwPt();
75  break;
76 
78  if(eSum.hwPt()==0xffff) htSat=true;
79  ht += eSum.hwPt();
80  if(posHt) htPos = eSum.hwPt();
81  else {
82  htNeg = eSum.hwPt();
83  posHt = true;
84  }
85  break;
86 
88  if(eSum.hwPt()==0xffff) htHFSat=true;
89  htHF += eSum.hwPt();
90  if(posHtHF) htHFPos = eSum.hwPt();
91  else {
92  htHFNeg = eSum.hwPt();
93  posHtHF = true;
94  }
95  break;
96 
98  if(eSum.hwPt()==0x7fffffff) mhtSat=true;
99  else mhtx += eSum.hwPt();
100  break;
101 
103  if(eSum.hwPt()==0x7fffffff) mhtSat=true;
104  else mhty += eSum.hwPt();
105  break;
106 
108  if(eSum.hwPt()==0x7fffffff) metHFSat=true;
109  else metxHF += eSum.hwPt();
110  break;
111 
113  if(eSum.hwPt()==0x7fffffff) metHFSat=true;
114  else metyHF += eSum.hwPt();
115  break;
116 
118  if(eSum.hwPt()==0x7fffffff) mhtHFSat=true;
119  else mhtxHF += eSum.hwPt();
120  break;
121 
123  if(eSum.hwPt()==0x7fffffff) mhtHFSat=true;
124  else mhtyHF += eSum.hwPt();
125  break;
126 
128  mbp0 = eSum.hwPt();
129  break;
130 
132  mbm0 = eSum.hwPt();
133  break;
134 
136  mbp1 = eSum.hwPt();
137  break;
138 
140  mbm1 = eSum.hwPt();
141  break;
142 
144  ntow = eSum.hwPt();
145  break;
146 
147  default:
148  continue; // Should throw an exception or something?
149  }
150  }
151 
152  // calculate centrality
153  etHFOnly = abs(etHF - et);
154  for(uint i=0; i<8; ++i){
155  if(etHFOnly >= (params_->etSumCentLower(i)/params_->towerLsbSum())
156  && etHFOnly <= (params_->etSumCentUpper(i)/params_->towerLsbSum())){
157  cent |= 1 << i;
158  }
159  }
160  if(etHFSat) cent = 0x80;
161 
162  // calculate HI imbalance
163  asymEt = l1t::CaloTools::gloriousDivision(abs(etPos-etNeg), et);
164  asymEtHF = l1t::CaloTools::gloriousDivision(abs(etHFPos-etHFNeg), etHF);
165  asymHt = l1t::CaloTools::gloriousDivision(abs(htPos-htNeg), ht);
166  asymHtHF = l1t::CaloTools::gloriousDivision(abs(htHFPos-htHFNeg), htHF);
167 
168  if(etSat) asymEt = 0xFF;
169  if(etHFSat) asymEtHF = 0xFF;
170  if(htSat) asymHt = 0xFF;
171  if(htHFSat) asymHtHF = 0xFF;
172 
173  if (et>0xFFF) et = 0xFFF;
174  if (etHF>0xFFF) etHF = 0xFFF;
175  if (etem>0xFFF) etem = 0xFFF;
176  if (ht>0xFFF) ht = 0xFFF;
177  if (htHF>0xFFF) htHF = 0xFFF;
178 
179  //if (mhtx>0xFFF) mhtx = 0xFFF;
180  //if (mhty>0xFFF) mhty = 0xFFF;
181 
182 
183  //mhtPhi = (111 << 4);
184  //mhtPhiHF = (111 << 4); // to match hw value if undefined
185 
186  // Final MET calculation
187  if ( (metx != 0 || mety != 0) && !metSat ) cordic_( metx , mety , metPhi , met );
188  // sets the met scale back to the original range for output into GT, this corresponds to
189  // the previous scaling of sin/cos factors in calculation of metx and mety by 2^10 = 1024
190  met >>= 10;
191 
192  // Final METHF calculation
193  if ( (metxHF != 0 || metyHF != 0) && !metHFSat ) cordic_( metxHF , metyHF , metPhiHF , metHF );
194  metHF >>= 10;
195 
196 
197  // Final MHT calculation
198  if ( (mhtx != 0 || mhty != 0) && !mhtSat ) cordic_( mhtx , mhty , mhtPhi , mht );
199  // sets the mht scale back to the original range for output into GT, the other 4
200  // bits are brought back just before the accumulation of ring sum in MP jet sum algorithm
201  mht >>= 6;
202 
203  if ( (mhtxHF != 0 || mhtyHF != 0) && !mhtHFSat ) cordic_( mhtxHF , mhtyHF , mhtPhiHF , mhtHF );
204  mhtHF >>= 6;
205 
206  if(metSat || met > 0xFFF) met=0xFFF;
207  if(metHFSat || metHF > 0xFFF) metHF=0xFFF;
208  if(mhtSat || mht > 0xFFF) mht=0xFFF;
209  if(mhtHFSat || mhtHF > 0xFFF) mhtHF=0xFFF;
210 
211  // Make final collection
213 
214  l1t::EtSum etSumTotalEt(p4,l1t::EtSum::EtSumType::kTotalEt,et,0,0,0);
215  l1t::EtSum etSumTotalEtHF(p4,l1t::EtSum::EtSumType::kTotalEtHF,etHF,0,0,0);
216  l1t::EtSum etSumTotalEtEm(p4,l1t::EtSum::EtSumType::kTotalEtEm,etem,0,0,0);
217  l1t::EtSum etSumMissingEt(p4,l1t::EtSum::EtSumType::kMissingEt,met,0,metPhi>>4,0);
218  l1t::EtSum etSumMissingEtHF(p4,l1t::EtSum::EtSumType::kMissingEtHF,metHF,0,metPhiHF>>4,0);
219  l1t::EtSum htSumht(p4,l1t::EtSum::EtSumType::kTotalHt,ht,0,0,0);
220  l1t::EtSum htSumhtHF(p4,l1t::EtSum::EtSumType::kTotalHtHF,htHF,0,0,0);
221  l1t::EtSum htSumMissingHt(p4,l1t::EtSum::EtSumType::kMissingHt,mht,0,mhtPhi>>4,0);
222  l1t::EtSum htSumMissingHtHF(p4,l1t::EtSum::EtSumType::kMissingHtHF,mhtHF,0,mhtPhiHF>>4,0);
223  l1t::EtSum etSumMinBiasHFP0(p4,l1t::EtSum::EtSumType::kMinBiasHFP0,mbp0,0,0,0);
224  l1t::EtSum etSumMinBiasHFM0(p4,l1t::EtSum::EtSumType::kMinBiasHFM0,mbm0,0,0,0);
225  l1t::EtSum etSumMinBiasHFP1(p4,l1t::EtSum::EtSumType::kMinBiasHFP1,mbp1,0,0,0);
226  l1t::EtSum etSumMinBiasHFM1(p4,l1t::EtSum::EtSumType::kMinBiasHFM1,mbm1,0,0,0);
227  l1t::EtSum etSumTowCount(p4,l1t::EtSum::EtSumType::kTowerCount,ntow,0,0,0);
228  l1t::EtSum etAsym(p4,l1t::EtSum::EtSumType::kAsymEt,asymEt,0,0,0);
229  l1t::EtSum etHFAsym(p4,l1t::EtSum::EtSumType::kAsymEtHF,asymEtHF,0,0,0);
230  l1t::EtSum htAsym(p4,l1t::EtSum::EtSumType::kAsymHt,asymHt,0,0,0);
231  l1t::EtSum htHFAsym(p4,l1t::EtSum::EtSumType::kAsymHtHF,asymHtHF,0,0,0);
232  l1t::EtSum centrality(p4,l1t::EtSum::EtSumType::kCentrality,cent,0,0,0);
233 
234  outputSums.push_back(etSumTotalEt);
235  outputSums.push_back(etSumTotalEtHF);
236  outputSums.push_back(etSumTotalEtEm);
237  outputSums.push_back(etSumMinBiasHFP0);
238  outputSums.push_back(htSumht);
239  outputSums.push_back(htSumhtHF);
240  outputSums.push_back(etSumMinBiasHFM0);
241  outputSums.push_back(etSumMissingEt);
242  outputSums.push_back(etSumMinBiasHFP1);
243  outputSums.push_back(htSumMissingHt);
244  outputSums.push_back(etSumMinBiasHFM1);
245  outputSums.push_back(etSumMissingEtHF);
246  outputSums.push_back(htSumMissingHtHF);
247  outputSums.push_back(etSumTowCount);
248  outputSums.push_back(etAsym);
249  outputSums.push_back(etHFAsym);
250  outputSums.push_back(htAsym);
251  outputSums.push_back(htHFAsym);
252  outputSums.push_back(centrality);
253 
254 }
static unsigned int gloriousDivision(uint32_t aNumerator, uint32_t aDenominator)
Definition: CaloTools.cc:462
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
void processEvent(const std::vector< l1t::EtSum > &inputSums, std::vector< l1t::EtSum > &outputSums) override
double p4[4]
Definition: TauolaWrapper.h:92
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Definition: Cordic.h:7
double etSumCentUpper(unsigned centClass) const
met
===> hadronic RAZOR
def uint(string)
et
define resolution functions of each parameter
double towerLsbSum() const
double etSumCentLower(unsigned centClass) const