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