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