CMS 3D CMS Logo

L1RCTLookupTables.cc
Go to the documentation of this file.
1 #include <iostream>
2 using std::cout;
3 using std::endl;
4 
5 #include <fstream>
6 #include <string>
7 #include <vector>
8 #include <cmath>
9 
12 
14 
21 
22 unsigned int L1RCTLookupTables::lookup(unsigned short ecalInput,
23  unsigned short hcalInput,
24  unsigned short fgbit,
25  unsigned short crtNo,
26  unsigned short crdNo,
27  unsigned short twrNo) const
28 {
29  if(rctParameters_ == nullptr)
30  throw cms::Exception("L1RCTParameters Invalid")
31  << "L1RCTParameters should be set every event" << rctParameters_;
32  if(channelMask_ == nullptr)
33  throw cms::Exception("L1RCTChannelMask Invalid")
34  << "L1RCTChannelMask should be set every event" << channelMask_;
35  if(noisyChannelMask_ == nullptr)
36  throw cms::Exception("L1RCTNoisyChannelMask Invalid")
37  << "L1RCTNoisyChannelMask should be set every event" << noisyChannelMask_;
38  if(ecalInput > 0xFF)
39  throw cms::Exception("Invalid Data")
40  << "ECAL compressedET should be less than 0xFF, is " << ecalInput;
41  if(hcalInput > 0xFF)
42  throw cms::Exception("Invalid Data")
43  << "HCAL compressedET should be less than 0xFF, is " << hcalInput;
44  if(fgbit > 1)
45  throw cms::Exception("Invalid Data")
46  << "ECAL finegrain should be a single bit, is " << fgbit;
47  short iEta = (short) rctParameters_->calcIEta(crtNo, crdNo, twrNo);
48  unsigned short iAbsEta = (unsigned short) abs(iEta);
49  short sign = iEta/iAbsEta;
50  unsigned short iPhi = rctParameters_->calcIPhi(crtNo, crdNo, twrNo);
51  unsigned short phiSide = (iPhi/4)%2;
52  if(iAbsEta < 1 || iAbsEta > 28)
53  throw cms::Exception("Invalid Data")
54  << "1 <= |IEta| <= 28, is " << iAbsEta;
55 
56 
57  //Pre Input bits
58  unsigned short ecalAfterMask=0;
59  unsigned short hcalAfterMask=0;
60 
61 
62  // using channel mask to mask off ecal channels
63  //Mike: Introducing the hot channel mask
64  //If the Et is above the threshold then mask it as well
65 
66 
67 
68  float ecalBeforeMask = convertEcal(ecalInput, iAbsEta, sign);
69 
70 
71  bool resetECAL = (channelMask_->ecalMask[crtNo][phiSide][iAbsEta-1]) || //channel mask
72  (noisyChannelMask_->ecalMask[crtNo][phiSide][iAbsEta-1] &&
73  ecalBeforeMask<noisyChannelMask_->ecalThreshold)||//hot mask
74  (rctParameters_->eGammaECalScaleFactors()[iAbsEta-1] == 0.&&
75  rctParameters_->jetMETECalScaleFactors()[iAbsEta-1] == 0.);
76 
77 
78 
79  if (resetECAL) {
80  ecalAfterMask=0;
81  }
82  else {
83  ecalAfterMask=ecalInput;
84  }
85 
86  float ecal = convertEcal(ecalAfterMask, iAbsEta, sign);
87 
88 
89  // masking off hcal for channels in channel mask
90  float hcalBeforeMask = convertHcal(hcalInput, iAbsEta, sign);
91 
92  bool resetHCAL = channelMask_->hcalMask[crtNo][phiSide][iAbsEta-1]||
93  (noisyChannelMask_->hcalMask[crtNo][phiSide][iAbsEta-1] &&
94  hcalBeforeMask<noisyChannelMask_->hcalThreshold)||//hot mask
95  (rctParameters_->eGammaHCalScaleFactors()[iAbsEta-1] == 0.&&
96  rctParameters_->jetMETHCalScaleFactors()[iAbsEta-1] == 0.);
97 
98  if (resetHCAL) {
99  hcalAfterMask=0;
100  }
101  else {
102  hcalAfterMask=hcalInput;
103  }
104 
105  float hcal = convertHcal(hcalAfterMask, iAbsEta, sign);
106 
107  unsigned long etIn7Bits;
108  unsigned long etIn9Bits;
109 
110  if((ecalAfterMask == 0 && hcalAfterMask > 0) &&
111  ((rctParameters_->noiseVetoHB() && iAbsEta > 0 && iAbsEta < 18)
112  || (rctParameters_->noiseVetoHEplus() && iAbsEta>17 && crtNo>8)
113  || (rctParameters_->noiseVetoHEminus() && iAbsEta>17 && crtNo<9)))
114  {
115  etIn7Bits = 0;
116  etIn9Bits = 0;
117  }
118  else
119  {
120  etIn7Bits = eGammaETCode(ecal, hcal, iAbsEta);
121  etIn9Bits = jetMETETCode(ecal, hcal, iAbsEta);
122  }
123  // Saturated input towers cause tower ET pegging at the highest value
124  if((ecalAfterMask == 0xFF &&
125  rctParameters_->eGammaECalScaleFactors()[iAbsEta-1] != 0. )
126  || (hcalAfterMask == 0xFF &&
127  rctParameters_->eGammaHCalScaleFactors()[iAbsEta-1] != 0. )
128  )
129  {
130  etIn7Bits = 0x7F; // egamma path
131  }
132  if((ecalAfterMask == 0xFF &&
133  rctParameters_->jetMETECalScaleFactors()[iAbsEta-1] != 0. )
134  || (hcalAfterMask == 0xFF &&
135  rctParameters_->jetMETHCalScaleFactors()[iAbsEta-1] != 0. ))
136  {
137  etIn9Bits = 0x1FF; // sums path
138  }
139 
140  unsigned long shiftEtIn9Bits = etIn9Bits<<8;
141  unsigned long shiftHE_FGBit = hOeFGVetoBit(ecal, hcal, fgbit)<<7;
142  unsigned long shiftActivityBit = 0;
143  if ( rctParameters_->jetMETECalScaleFactors()[iAbsEta-1] == 0.
144  && rctParameters_->jetMETHCalScaleFactors()[iAbsEta-1] == 0. )
145  {
146  // do nothing, it's already zero
147  }
148  else if (rctParameters_->jetMETECalScaleFactors()[iAbsEta-1] == 0. )
149  {
150  shiftActivityBit = activityBit(0., hcal)<<17;
151  }
152  else if (rctParameters_->jetMETHCalScaleFactors()[iAbsEta-1] == 0. )
153  {
154  shiftActivityBit = activityBit(ecal, 0.)<<17;
155  }
156  else
157  {
158  shiftActivityBit = activityBit(ecal, hcal)<<17;
159  }
160  unsigned long output=etIn7Bits+shiftHE_FGBit+shiftEtIn9Bits+shiftActivityBit;
161  return output;
162 }
163 
164 unsigned int L1RCTLookupTables::lookup(unsigned short hfInput,
165  unsigned short crtNo,
166  unsigned short crdNo,
167  unsigned short twrNo
168  ) const
169 {
170  if(rctParameters_ == nullptr)
171  throw cms::Exception("L1RCTParameters Invalid")
172  << "L1RCTParameters should be set every event" << rctParameters_;
173  if(channelMask_ == nullptr)
174  throw cms::Exception("L1RCTChannelMask Invalid")
175  << "L1RCTChannelMask should be set every event" << channelMask_;
176  if(hfInput > 0xFF)
177  throw cms::Exception("Invalid Data")
178  << "HF compressedET should be less than 0xFF, is " << hfInput;
179  short iEta = rctParameters_->calcIEta(crtNo, crdNo, twrNo);
180  unsigned short iAbsEta = abs(iEta);
181  short sign = (iEta/iAbsEta);
182  unsigned short phiSide = twrNo/4;
183  if(iAbsEta < 29 || iAbsEta > 32)
184  throw cms::Exception("Invalid Data")
185  << "29 <= |iEta| <= 32, is " << iAbsEta;
186 
187  float et = convertHcal(hfInput, iAbsEta, sign);;
188 
189 
190 
191  if (channelMask_->hfMask[crtNo][phiSide][iAbsEta-29]||
192  (noisyChannelMask_->hfMask[crtNo][phiSide][iAbsEta-29]&&
193  et<noisyChannelMask_->hfThreshold))
194  {
195  et = 0;
196  }
197 
198  //cout << (int) rctParameters_->jetMETHCalScaleFactors()[iAbsEta-1] << endl;
199 
200  float scalehf = 1.;
201  if(rctParameters_->jetMETHCalScaleFactors().size()==32){
202  scalehf = (float) rctParameters_->jetMETHCalScaleFactors()[iAbsEta-1];
203  } // The max eta for the various scale factors is 32, check to see if used.
204  else if(rctParameters_->jetMETHCalScaleFactors().size()==32*10){
205  int ht_bin = ((int) floor(et)/5);
206  // lowest bin (1) is 0-10GeV
207  if ( ht_bin < 1 ) ht_bin = 1;
208  // highest bin (9) is 45GeV and up
209  if ( ht_bin > 9 ) ht_bin = 9;
210  scalehf = (float) rctParameters_->jetMETHCalScaleFactors()[32*ht_bin+iAbsEta-1];
211  } // et-dependent scale factors (optional, of course, if set to 1)
212 
213  et=scalehf*et; // Allow for scaling the HF as well e.g. zero out if needed
214 
215  unsigned int result = convertToInteger(et, rctParameters_->jetMETLSB(), 8);
216  return result;
217 }
218 
219 bool L1RCTLookupTables::hOeFGVetoBit(float ecal, float hcal, bool fgbit) const
220 {
221  if(rctParameters_ == nullptr)
222  throw cms::Exception("L1RCTParameters Invalid")
223  << "L1RCTParameters should be set every event" << rctParameters_;
224  bool veto = false;
225  if(ecal > rctParameters_->eMinForFGCut() &&
226  ecal < rctParameters_->eMaxForFGCut())
227  {
228  if(fgbit) veto = true;
229  }
230  if(ecal >= rctParameters_->eMinForHoECut() &&
231  ecal < rctParameters_->eMaxForHoECut())
232  {
233  if((hcal / ecal) > rctParameters_->hOeCut()) veto = true;
234  }
235  // else
236  if (ecal < rctParameters_->eMinForHoECut())
237  {
238  if(hcal >= rctParameters_->hMinForHoECut()) veto = true; // Changed from eMinForHoECut() - JLL 2008-Feb-13
239  }
240  return veto;
241 }
242 
243 bool L1RCTLookupTables::activityBit(float ecal, float hcal) const
244 {
245  // Redefined for upgrade as EM activity only
246  if(rctParameters_ == nullptr)
247  throw cms::Exception("L1RCTParameters Invalid")
248  << "L1RCTParameters should be set every event" << rctParameters_;
249  bool aBit = false;
251  // For RCT operations HoE cut and tauVeto are used
252  aBit = ((ecal > rctParameters_->eActivityCut()) ||
253  (hcal > rctParameters_->hActivityCut()));
254  }
255  else {
256  // We redefine tauVeto() for upgrade as EM activity only --
257  // both EG and Tau make it through the EIC and JSC to CTP cards
258  // In the CTP card we want to rechannel EG/Tau candidates to EG and Tau
259  if(ecal > rctParameters_->eActivityCut()) {
260  if((hcal/ecal) < rctParameters_->hOeCut()) {
261  aBit = true;
262  }
263  }
264  }
265  return aBit;
266 }
267 
268 // uses etScale
269 unsigned int L1RCTLookupTables::emRank(unsigned short energy) const
270 {
271  if(etScale_)
272  {
273  return etScale_->rank(energy);
274  }
275  else
276  // edm::LogInfo("L1RegionalCaloTrigger")
277  // << "CaloEtScale was not used - energy instead of rank" << std::endl;
278  return energy;
279 }
280 
281 // converts compressed ecal energy to linear (real) scale
282 float L1RCTLookupTables::convertEcal(unsigned short ecal, unsigned short iAbsEta, short sign) const
283 {
284  if(ecalScale_)
285  {
286  //std::cout << "[luts] energy " << ecal << " sign " << sign
287  //<< " iAbsEta " << iAbsEta << " iPhi " << iPhi << std::endl;
288  float dummy = 0;
289  dummy = float (ecalScale_->et( ecal, iAbsEta, sign ));
290  /*
291  if (ecal > 0)
292  {
293  std::cout << "[luts] ecal converted from " << ecal << " to "
294  << dummy << " with iAbsEta " << iAbsEta << std::endl;
295  }
296  */
297  return dummy;
298  }
299  //else if(rctParameters_ == 0)
300  // {
301  // throw cms::Exception("L1RCTParameters Invalid")
302  // << "L1RCTParameters should be set every event" << rctParameters_;
303  // }
304  else
305  {
306  return ((float) ecal) * rctParameters_->eGammaLSB();
307  }
308 }
309 
310 // converts compressed hcal energy to linear (real) scale
311 float L1RCTLookupTables::convertHcal(unsigned short hcal, unsigned short iAbsEta, short sign) const
312 {
313  if (hcalScale_ != nullptr)
314  {
315  return (hcalScale_->et( hcal, iAbsEta, sign ));
316  }
317  else
318  {
319  // edm::LogInfo("L1RegionalCaloTrigger")
320  // << "CaloTPGTranscoder was not used" << std::endl;
321  return ((float) hcal) * rctParameters_->jetMETLSB();
322  }
323 }
324 
325 // integerize given an LSB and set maximum value of 2^precision-1
327  float lsb,
328  int precision) const
329 {
330  unsigned long etBits = (unsigned long)(et/lsb);
331  unsigned long maxValue = (1 << precision) - 1;
332  if(etBits > maxValue)
333  return maxValue;
334  else
335  return etBits;
336 }
337 
338 unsigned int L1RCTLookupTables::eGammaETCode(float ecal, float hcal, int iAbsEta) const
339 {
340  if(rctParameters_ == nullptr)
341  throw cms::Exception("L1RCTParameters Invalid")
342  << "L1RCTParameters should be set every event" << rctParameters_;
343  float etLinear = rctParameters_->EGammaTPGSum(ecal,hcal,iAbsEta);
344  return convertToInteger(etLinear, rctParameters_->eGammaLSB(), 7);
345 }
346 
347 unsigned int L1RCTLookupTables::jetMETETCode(float ecal, float hcal, int iAbsEta) const
348 {
349  if(rctParameters_ == nullptr)
350  throw cms::Exception("L1RCTParameters Invalid")
351  << "L1RCTParameters should be set every event" << rctParameters_;
352  float etLinear = rctParameters_->JetMETTPGSum(ecal,hcal,iAbsEta);
353  return convertToInteger(etLinear, rctParameters_->jetMETLSB(), 9);
354 }
bool hOeFGVetoBit(float ecal, float hcal, bool fgbit) const
const std::vector< double > & eGammaHCalScaleFactors() const
const std::vector< double > & jetMETHCalScaleFactors() const
double eMaxForFGCut() const
const std::vector< double > & eGammaECalScaleFactors() const
short calcIEta(unsigned short iCrate, unsigned short iCard, unsigned short iTower) const
double eMinForFGCut() const
bool noiseVetoHEminus() const
bool ecalMask[18][2][28]
const L1RCTChannelMask * channelMask_
unsigned int eGammaETCode(float ecal, float hcal, int iAbsEta) const
unsigned int jetMETETCode(float ecal, float hcal, int iAbsEta) const
double eActivityCut() const
unsigned long convertToInteger(float et, float lsb, int precision) const
double et(unsigned short rank, unsigned short eta, short etaSign) const
convert from rank to physically meaningful quantity
uint16_t rank(const uint16_t linear) const
convert from linear Et scale to rank scale
const L1RCTNoisyChannelMask * noisyChannelMask_
bool noiseVetoHEplus() const
float EGammaTPGSum(const float &ecal, const float &hcal, const unsigned &iAbsEta) const
const std::vector< double > & jetMETECalScaleFactors() const
double et(unsigned short rank, unsigned short eta, short etaSign) const
convert from rank to physically meaningful quantity
double hActivityCut() const
float convertHcal(unsigned short hcal, unsigned short iAbsEta, short sign) const
double eMinForHoECut() const
double jetMETLSB() const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
unsigned int emRank(unsigned short energy) const
bool noiseVetoHB() const
const L1CaloEcalScale * ecalScale_
unsigned short calcIPhi(unsigned short iCrate, unsigned short iCard, unsigned short iTower) const
const L1RCTParameters * rctParameters_
double eGammaLSB() const
double hOeCut() const
bool activityBit(float ecal, float hcal) const
et
define resolution functions of each parameter
bool hcalMask[18][2][28]
float convertEcal(unsigned short ecal, unsigned short iAbsEta, short sign) const
double eMaxForHoECut() const
const L1CaloHcalScale * hcalScale_
const L1CaloEtScale * etScale_
bool hfMask[18][2][4]
unsigned int lookup(unsigned short ecalInput, unsigned short hcalInput, unsigned short fgbit, unsigned short crtNo, unsigned short crdNo, unsigned short twrNo) const
float JetMETTPGSum(const float &ecal, const float &hcal, const unsigned &iAbsEta) const
double hMinForHoECut() const