CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
204  et=scalehf*et; // Allow for scaling the HF as well e.g. zero out if needed
205 
206  unsigned int result = convertToInteger(et, rctParameters_->jetMETLSB(), 8);
207  return result;
208 }
209 
210 bool L1RCTLookupTables::hOeFGVetoBit(float ecal, float hcal, bool fgbit) const
211 {
212  if(rctParameters_ == 0)
213  throw cms::Exception("L1RCTParameters Invalid")
214  << "L1RCTParameters should be set every event" << rctParameters_;
215  bool veto = false;
216  if(ecal > rctParameters_->eMinForFGCut() &&
217  ecal < rctParameters_->eMaxForFGCut())
218  {
219  if(fgbit) veto = true;
220  }
221  if(ecal >= rctParameters_->eMinForHoECut() &&
222  ecal < rctParameters_->eMaxForHoECut())
223  {
224  if((hcal / ecal) > rctParameters_->hOeCut()) veto = true;
225  }
226  // else
227  if (ecal < rctParameters_->eMinForHoECut())
228  {
229  if(hcal >= rctParameters_->hMinForHoECut()) veto = true; // Changed from eMinForHoECut() - JLL 2008-Feb-13
230  }
231  return veto;
232 }
233 
234 bool L1RCTLookupTables::activityBit(float ecal, float hcal) const
235 {
236  // Redefined for upgrade as EM activity only
237  if(rctParameters_ == 0)
238  throw cms::Exception("L1RCTParameters Invalid")
239  << "L1RCTParameters should be set every event" << rctParameters_;
240  bool aBit = false;
242  // For RCT operations HoE cut and tauVeto are used
243  aBit = ((ecal > rctParameters_->eActivityCut()) ||
244  (hcal > rctParameters_->hActivityCut()));
245  }
246  else {
247  // We redefine tauVeto() for upgrade as EM activity only --
248  // both EG and Tau make it through the EIC and JSC to CTP cards
249  // In the CTP card we want to rechannel EG/Tau candidates to EG and Tau
250  if(ecal > rctParameters_->eActivityCut()) {
251  if((hcal/ecal) < rctParameters_->hOeCut()) {
252  aBit = true;
253  }
254  }
255  }
256  return aBit;
257 }
258 
259 // uses etScale
260 unsigned int L1RCTLookupTables::emRank(unsigned short energy) const
261 {
262  if(etScale_)
263  {
264  return etScale_->rank(energy);
265  }
266  else
267  // edm::LogInfo("L1RegionalCaloTrigger")
268  // << "CaloEtScale was not used - energy instead of rank" << std::endl;
269  return energy;
270 }
271 
272 // converts compressed ecal energy to linear (real) scale
273 float L1RCTLookupTables::convertEcal(unsigned short ecal, unsigned short iAbsEta, short sign) const
274 {
275  if(ecalScale_)
276  {
277  //std::cout << "[luts] energy " << ecal << " sign " << sign
278  //<< " iAbsEta " << iAbsEta << " iPhi " << iPhi << std::endl;
279  float dummy = 0;
280  dummy = float (ecalScale_->et( ecal, iAbsEta, sign ));
281  /*
282  if (ecal > 0)
283  {
284  std::cout << "[luts] ecal converted from " << ecal << " to "
285  << dummy << " with iAbsEta " << iAbsEta << std::endl;
286  }
287  */
288  return dummy;
289  }
290  //else if(rctParameters_ == 0)
291  // {
292  // throw cms::Exception("L1RCTParameters Invalid")
293  // << "L1RCTParameters should be set every event" << rctParameters_;
294  // }
295  else
296  {
297  return ((float) ecal) * rctParameters_->eGammaLSB();
298  }
299 }
300 
301 // converts compressed hcal energy to linear (real) scale
302 float L1RCTLookupTables::convertHcal(unsigned short hcal, unsigned short iAbsEta, short sign) const
303 {
304  if (hcalScale_ != 0)
305  {
306  return (hcalScale_->et( hcal, iAbsEta, sign ));
307  }
308  else
309  {
310  // edm::LogInfo("L1RegionalCaloTrigger")
311  // << "CaloTPGTranscoder was not used" << std::endl;
312  return ((float) hcal) * rctParameters_->jetMETLSB();
313  }
314 }
315 
316 // integerize given an LSB and set maximum value of 2^precision-1
317 unsigned long L1RCTLookupTables::convertToInteger(float et,
318  float lsb,
319  int precision) const
320 {
321  unsigned long etBits = (unsigned long)(et/lsb);
322  unsigned long maxValue = (1 << precision) - 1;
323  if(etBits > maxValue)
324  return maxValue;
325  else
326  return etBits;
327 }
328 
329 unsigned int L1RCTLookupTables::eGammaETCode(float ecal, float hcal, int iAbsEta) const
330 {
331  if(rctParameters_ == 0)
332  throw cms::Exception("L1RCTParameters Invalid")
333  << "L1RCTParameters should be set every event" << rctParameters_;
334  float etLinear = rctParameters_->EGammaTPGSum(ecal,hcal,iAbsEta);
335  return convertToInteger(etLinear, rctParameters_->eGammaLSB(), 7);
336 }
337 
338 unsigned int L1RCTLookupTables::jetMETETCode(float ecal, float hcal, int iAbsEta) const
339 {
340  if(rctParameters_ == 0)
341  throw cms::Exception("L1RCTParameters Invalid")
342  << "L1RCTParameters should be set every event" << rctParameters_;
343  float etLinear = rctParameters_->JetMETTPGSum(ecal,hcal,iAbsEta);
344  return convertToInteger(etLinear, rctParameters_->jetMETLSB(), 9);
345 }
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
double sign(double x)
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
tuple result
Definition: query.py:137
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
bool hcalMask[18][2][28]
tuple cout
Definition: gather_cfg.py:121
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