CMS 3D CMS Logo

EnergySumCondition.cc
Go to the documentation of this file.
1 
13 // this class header
15 
16 // system include files
17 #include <iostream>
18 #include <iomanip>
19 
20 #include <string>
21 #include <vector>
22 #include <algorithm>
23 
24 // user include files
25 // base classes
30 
33 
34 // constructors
35 // default
37  //empty
38 }
39 
40 // from base template condition (from event setup usually)
43  m_gtEnergySumTemplate(static_cast<const EnergySumTemplate*>(eSumTemplate)),
44  m_uGtB(ptrGTB)
45 
46 {
47  // maximum number of objects received for the evaluation of the condition
48  // energy sums are global quantities - one object per event
49 
51 }
52 
53 // copy constructor
55  m_gtEnergySumTemplate = cp.gtEnergySumTemplate();
56  m_uGtB = cp.getuGtB();
57 
58  m_condMaxNumberObjects = cp.condMaxNumberObjects();
59  m_condLastResult = cp.condLastResult();
60  m_combinationsInCond = cp.getCombinationsInCond();
61 
62  m_verbosity = cp.m_verbosity;
63 }
64 
66 
67 // destructor
69  // empty
70 }
71 
72 // equal operator
74  copy(cp);
75  return *this;
76 }
77 
78 // methods
80  m_gtEnergySumTemplate = eSumTempl;
81 }
82 
84 void l1t::EnergySumCondition::setuGtB(const GlobalBoard* ptrGTB) { m_uGtB = ptrGTB; }
85 
86 // try all object permutations and check spatial correlations, if required
87 const bool l1t::EnergySumCondition::evaluateCondition(const int bxEval) const {
88  // number of trigger objects in the condition
89  // in fact, there is only one object
90  int iCondition = 0;
91 
92  // condition result condResult set to true if the energy sum
93  // passes all requirements
94  bool condResult = false;
95 
96  // store the indices of the calorimeter objects
97  // from the combination evaluated in the condition
98  SingleCombInCond objectsInComb;
99 
100  // clear the m_combinationsInCond vector
101  (combinationsInCond()).clear();
102 
103  // clear the indices in the combination
104  objectsInComb.clear();
105 
106  const BXVector<const l1t::EtSum*>* candVec = m_uGtB->getCandL1EtSum();
107 
108  // Look at objects in bx = bx + relativeBx
109  int useBx = bxEval + m_gtEnergySumTemplate->condRelativeBx();
110 
111  // Fail condition if attempting to get Bx outside of range
112  if ((useBx < candVec->getFirstBX()) || (useBx > candVec->getLastBX())) {
113  return false;
114  }
115 
116  // If no candidates, no use looking any further.
117  int numberObjects = candVec->size(useBx);
118  if (numberObjects < 1) {
119  return false;
120  }
121 
123  bool MissingEnergy = false;
124  int centbit = 0;
125  switch ((m_gtEnergySumTemplate->objectType())[0]) {
126  case gtETM:
128  MissingEnergy = true;
129  break;
130  case gtETT:
132  MissingEnergy = false;
133  break;
134  case gtETTem:
136  MissingEnergy = false;
137  break;
138  case gtHTM:
140  MissingEnergy = true;
141  break;
142  case gtHTT:
144  MissingEnergy = false;
145  break;
146  case gtETMHF:
148  MissingEnergy = true;
149  break;
150  case gtHTMHF:
152  MissingEnergy = true;
153  break;
154  case gtTowerCount:
156  MissingEnergy = false;
157  break;
158  case gtMinBiasHFP0:
160  MissingEnergy = false;
161  break;
162  case gtMinBiasHFM0:
164  MissingEnergy = false;
165  break;
166  case gtMinBiasHFP1:
168  MissingEnergy = false;
169  break;
170  case gtMinBiasHFM1:
172  MissingEnergy = false;
173  break;
174  case gtAsymmetryEt:
176  MissingEnergy = false;
177  break;
178  case gtAsymmetryHt:
180  MissingEnergy = false;
181  break;
182  case gtAsymmetryEtHF:
184  MissingEnergy = false;
185  break;
186  case gtAsymmetryHtHF:
188  MissingEnergy = false;
189  break;
190  case gtCentrality0:
191  centbit = 0;
193  MissingEnergy = false;
194  break;
195  case gtCentrality1:
196  centbit = 1;
198  MissingEnergy = false;
199  break;
200  case gtCentrality2:
201  centbit = 2;
203  MissingEnergy = false;
204  break;
205  case gtCentrality3:
206  centbit = 3;
208  MissingEnergy = false;
209  break;
210  case gtCentrality4:
211  centbit = 4;
213  MissingEnergy = false;
214  break;
215  case gtCentrality5:
216  centbit = 5;
218  MissingEnergy = false;
219  break;
220  case gtCentrality6:
221  centbit = 6;
223  MissingEnergy = false;
224  break;
225  case gtCentrality7:
226  centbit = 7;
228  MissingEnergy = false;
229  break;
230  case gtZDCP:
232  MissingEnergy = false;
233  break;
234  case gtZDCM:
236  MissingEnergy = false;
237  break;
238  default:
239  edm::LogError("L1TGlobal")
240  << "\n Error: "
241  << "Unmatched object type from template to EtSumType, (m_gtEnergySumTemplate->objectType())[0] = "
242  << (m_gtEnergySumTemplate->objectType())[0] << std::endl;
244  break;
245  }
246 
247  // get energy, phi (ETM and HTM) and overflow for the trigger object
248  unsigned int candEt = 0;
249  unsigned int candPhi = 0;
250  bool candOverflow = false;
251  for (int iEtSum = 0; iEtSum < numberObjects; ++iEtSum) {
252  l1t::EtSum cand = *(candVec->at(useBx, iEtSum));
253  if (cand.getType() != type)
254  continue;
255  candEt = cand.hwPt();
256  candPhi = cand.hwPhi();
257  }
258 
259  const EnergySumTemplate::ObjectParameter objPar = (*(m_gtEnergySumTemplate->objectParameter()))[iCondition];
260 
261  // check energy threshold and overflow
262  // overflow evaluation:
263  // for condGEq >=
264  // candidate overflow true -> condition true
265  // candidate overflow false -> evaluate threshold
266  // for condGEq =
267  // candidate overflow true -> condition false
268  // candidate overflow false -> evaluate threshold
269  //
270 
271  bool condGEqVal = m_gtEnergySumTemplate->condGEq();
272 
274  bool myres = checkBit(candEt, centbit);
275  //std::cout << "CCLC: Checking bit " << centbit << "\tResult is: " << myres << std::endl;
276  if (!myres) {
277  LogDebug("L1TGlobal") << "\t\t l1t::EtSum failed Centrality bit" << std::endl;
278  return false;
279  }
281  return false;
282  } else {
283  // check energy threshold
284  if (!checkThreshold(objPar.etLowThreshold, objPar.etHighThreshold, candEt, condGEqVal)) {
285  LogDebug("L1TGlobal") << "\t\t l1t::EtSum failed checkThreshold" << std::endl;
286  return false;
287  }
288 
289  if (!condGEqVal && candOverflow)
290  return false;
291 
292  // for ETM and HTM check phi also
293  // for overflow, the phi requirements are ignored
294  if (MissingEnergy) {
295  // check phi
296  if (!checkRangePhi(
297  candPhi, objPar.phiWindow1Lower, objPar.phiWindow1Upper, objPar.phiWindow2Lower, objPar.phiWindow2Upper)) {
298  LogDebug("L1TGlobal") << "\t\t l1t::EtSum failed checkRange(phi)" << std::endl;
299  return false;
300  }
301  }
302  }
303 
304  // index is always zero, as they are global quantities (there is only one object)
305  int indexObj = 0;
306 
307  objectsInComb.push_back(indexObj);
308  (combinationsInCond()).push_back(objectsInComb);
309 
310  // if we get here all checks were successfull for this combination
311  // set the general result for evaluateCondition to "true"
312 
313  condResult = true;
314  return condResult;
315 }
316 
317 void l1t::EnergySumCondition::print(std::ostream& myCout) const {
318  m_gtEnergySumTemplate->print(myCout);
320 }
int getLastBX() const
std::vector< int > SingleCombInCond
typedefs
void setuGtB(const GlobalBoard *)
set the pointer to uGT GlobalBoard
Log< level::Error, false > LogError
unsigned size(int bx) const
EnergySumCondition & operator=(const EnergySumCondition &)
void print(std::ostream &myCout) const override
print condition
typedef for a single object template
const T & at(int bx, unsigned i) const
virtual void print(std::ostream &myCout) const
print condition
deadvectors [0] push_back({0.0175431, 0.538005, 6.80997, 13.29})
const bool evaluateCondition(const int bxEval) const override
the core function to check if the condition matches
void clear(EGIsoObj &c)
Definition: egamma.h:82
EtSumType
Definition: EtSum.h:27
void setGtEnergySumTemplate(const EnergySumTemplate *)
void copy(const EnergySumCondition &cp)
copy function for copy constructor and operator=
#define LogDebug(id)