CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
l1t::MuCondition Class Reference

#include <MuCondition.h>

Inheritance diagram for l1t::MuCondition:
l1t::ConditionEvaluation

Public Member Functions

const bool evaluateCondition (const int bxEval) const override
 the core function to check if the condition matches More...
 
const int gtCorrParDeltaPhiNrBins () const
 get / set maximum number of bins for the delta phi scales More...
 
const GlobalBoardgtGTL () const
 get / set the pointer to GTL More...
 
const int gtIfMuEtaNumberBits () const
 get / set the number of bits for eta of muon objects More...
 
const MuonTemplategtMuonTemplate () const
 get / set the pointer to a Condition More...
 
 MuCondition ()
 
 MuCondition (const GlobalCondition *, const GlobalBoard *, const int nrL1Mu, const int ifMuEtaNumberBits)
 from base template condition (from event setup usually) More...
 
 MuCondition (const MuCondition &)
 
MuConditionoperator= (const MuCondition &)
 
void print (std::ostream &myCout) const override
 print condition More...
 
void setGtCorrParDeltaPhiNrBins (const int &)
 
void setGtGTL (const GlobalBoard *)
 set the pointer to GTL More...
 
void setGtIfMuEtaNumberBits (const int &)
 
void setGtMuonTemplate (const MuonTemplate *)
 
 ~MuCondition () override
 
- Public Member Functions inherited from l1t::ConditionEvaluation
 ConditionEvaluation ()
 constructor More...
 
bool condLastResult () const
 get the latest result for the condition More...
 
int condMaxNumberObjects () const
 
void evaluateConditionStoreResult (const int bxEval)
 call evaluateCondition and save last result More...
 
CombinationsInCond const & getCombinationsInCond () const
 get all the object combinations evaluated to true in the condition More...
 
virtual std::string getNumericExpression () const
 get numeric expression More...
 
void setCondMaxNumberObjects (int condMaxNumberObjectsValue)
 
void setVerbosity (const int verbosity)
 
virtual ~ConditionEvaluation ()
 destructor More...
 

Private Member Functions

const bool checkObjectParameter (const int iCondition, const l1t::Muon &cand, const unsigned int index) const
 function to check a single object if it matches a condition More...
 
void copy (const MuCondition &cp)
 copy function for copy constructor and operator= More...
 
const l1t::MuongetCandidate (const int bx, const int indexCand) const
 load muon candidates More...
 

Private Attributes

unsigned int m_corrParDeltaPhiNrBins
 
const GlobalBoardm_gtGTL
 pointer to GTL, to be able to get the trigger objects More...
 
const MuonTemplatem_gtMuonTemplate
 pointer to a MuonTemplate More...
 
int m_ifMuEtaNumberBits
 number of bits for eta of muon objects More...
 

Additional Inherited Members

- Protected Member Functions inherited from l1t::ConditionEvaluation
template<class Type1 >
const bool checkBit (const Type1 &mask, const unsigned int bitNumber) const
 check if a bit with a given number is set in a mask More...
 
template<class Type1 >
const bool checkIndex (const Type1 &indexLo, const Type1 &indexHi, const unsigned int index) const
 check if a index is in a given range More...
 
template<class Type1 >
const bool checkRangeDeltaEta (const unsigned int obj1Eta, const unsigned int obj2Eta, const Type1 &lowerR, const Type1 &upperR, const unsigned int nEtaBits) const
 check if a value is in a given deltaEta range More...
 
template<class Type1 >
const bool checkRangeDeltaPhi (const unsigned int obj1Phi, const unsigned int obj2Phi, const Type1 &lowerR, const Type1 &upperR) const
 check if a value is in a given deltaPhi range More...
 
template<class Type1 >
const bool checkRangeEta (const unsigned int bitNumber, const std::vector< Type1 > &windows, const unsigned int nEtaBits) const
 
template<class Type1 >
const bool checkRangePhi (const unsigned int bitNumber, const Type1 &W1beginR, const Type1 &W1endR, const Type1 &W2beginR, const Type1 &W2endR) const
 check if a value is in a given phi range and outside of a veto range More...
 
template<class Type1 >
const bool checkRangeTfMuonIndex (const unsigned int bitNumber, const std::vector< Type1 > &windows) const
 check if a value is in a given muon track finder index range More...
 
template<class Type1 , class Type2 >
const bool checkThreshold (const Type1 &thresholdL, const Type1 &thresholdH, const Type2 &value, bool condGEqValue) const
 
template<class Type1 , class Type2 >
const bool checkUnconstrainedPt (const Type1 &thresholdL, const Type1 &thresholdH, const Type2 &value, bool condGEqValue) const
 
CombinationsInCondcombinationsInCond () const
 get all the object combinations (to fill it...) More...
 
- Protected Attributes inherited from l1t::ConditionEvaluation
CombinationsInCond m_combinationsInCond
 store all the object combinations evaluated to true in the condition More...
 
bool m_condLastResult
 the last result of evaluateCondition() More...
 
int m_condMaxNumberObjects
 
int m_verbosity
 verbosity level More...
 

Detailed Description

Definition at line 37 of file MuCondition.h.

Constructor & Destructor Documentation

◆ MuCondition() [1/3]

MuCondition::MuCondition ( )

constructors default

Definition at line 41 of file MuCondition.cc.

42  // empty
43 }

◆ MuCondition() [2/3]

MuCondition::MuCondition ( const GlobalCondition muonTemplate,
const GlobalBoard ptrGTL,
const int  nrL1Mu,
const int  ifMuEtaNumberBits 
)

from base template condition (from event setup usually)

Definition at line 46 of file MuCondition.cc.

References l1t::ConditionEvaluation::m_condMaxNumberObjects, and m_corrParDeltaPhiNrBins.

51  m_gtMuonTemplate(static_cast<const MuonTemplate*>(muonTemplate)),
52  m_gtGTL(ptrGTL),
53  m_ifMuEtaNumberBits(ifMuEtaNumberBits) {
55  m_condMaxNumberObjects = nrL1Mu;
56 }
const GlobalBoard * m_gtGTL
pointer to GTL, to be able to get the trigger objects
Definition: MuCondition.h:98
int m_ifMuEtaNumberBits
number of bits for eta of muon objects
Definition: MuCondition.h:101
unsigned int m_corrParDeltaPhiNrBins
Definition: MuCondition.h:104
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95

◆ MuCondition() [3/3]

MuCondition::MuCondition ( const MuCondition cp)

Definition at line 73 of file MuCondition.cc.

References copy().

73 : ConditionEvaluation() { copy(cp); }
void copy(const MuCondition &cp)
copy function for copy constructor and operator=
Definition: MuCondition.cc:59

◆ ~MuCondition()

MuCondition::~MuCondition ( )
override

Definition at line 76 of file MuCondition.cc.

76  {
77  // empty
78 }

Member Function Documentation

◆ checkObjectParameter()

const bool MuCondition::checkObjectParameter ( const int  iCondition,
const l1t::Muon cand,
const unsigned int  index 
) const
private

function to check a single object if it matches a condition

checkObjectParameter - Compare a single particle with a numbered condition.

Parameters
iConditionThe number of the condition.
candThe candidate to compare.
Returns
The result of the comparison (false if a condition does not exist).

Definition at line 338 of file MuCondition.cc.

References MuonTemplate::ObjectParameter::charge, TauDecayModes::dec, MuonTemplate::ObjectParameter::enableIso, MuonTemplate::ObjectParameter::enableMip, MuonTemplate::ObjectParameter::etaRange, MuonTemplate::ObjectParameter::etaWindows, MuonTemplate::ObjectParameter::impactParameterLUT, MuonTemplate::ObjectParameter::indexHigh, MuonTemplate::ObjectParameter::indexLow, MuonTemplate::ObjectParameter::isolationLUT, LogDebug, MuonTemplate::ObjectParameter::phiHigh, MuonTemplate::ObjectParameter::phiLow, MuonTemplate::ObjectParameter::phiWindow1Lower, MuonTemplate::ObjectParameter::phiWindow1Upper, MuonTemplate::ObjectParameter::phiWindow2Lower, MuonTemplate::ObjectParameter::phiWindow2Upper, MuonTemplate::ObjectParameter::ptHighThreshold, MuonTemplate::ObjectParameter::ptLowThreshold, MuonTemplate::ObjectParameter::qualityLUT, MuonTemplate::ObjectParameter::requestIso, MuonTemplate::ObjectParameter::tfMuonIndexWindows, MuonTemplate::ObjectParameter::unconstrainedPtHigh, and MuonTemplate::ObjectParameter::unconstrainedPtLow.

340  {
341  // number of objects in condition
342  int nObjInCond = m_gtMuonTemplate->nrObjects();
343 
344  if (iCondition >= nObjInCond || iCondition < 0) {
345  return false;
346  }
347 
348  // // empty candidates can not be compared
349  // if (cand.empty()) {
350  // return false;
351  // }
352 
353  const MuonTemplate::ObjectParameter objPar = (*(m_gtMuonTemplate->objectParameter()))[iCondition];
354 
355  // using the logic table from GTL-9U-module.pdf
356  // "Truth table for Isolation bit"
357 
358  // check thresholds:
359 
360  // value < low pt threshold
361  // fail trigger
362 
363  // low pt threshold <= value < high pt threshold & non-isolated muon:
364  // requestIso true: fail trigger
365  // requestIso false, enableIso true: fail trigger
366  // requestIso false, enableIso false: OK, trigger
367 
368  // low pt threshold <= value < high pt threshold & isolated muon:
369  // requestIso true: OK, trigger
370  // requestIso false, enableIso true: OK, trigger
371  // requestIso false, enableIso false: OK, trigger
372 
373  // value >= high pt threshold & non-isolated muon:
374  // requestIso true: fail trigger
375  // requestIso false: OK, trigger
376 
377  // value >= high pt threshold & isolated muon:
378  // OK, trigger
379 
380  LogDebug("L1TGlobal") << "\n MuonTemplate::ObjectParameter : " << std::hex << "\n\t ptHighThreshold = 0x "
381  << objPar.ptHighThreshold << "\n\t ptLowThreshold = 0x " << objPar.ptLowThreshold
382  << "\n\t indexHigh = 0x " << objPar.indexHigh << "\n\t indexLow = 0x "
383  << objPar.indexLow << "\n\t requestIso = 0x " << objPar.requestIso
384  << "\n\t enableIso = 0x " << objPar.enableIso << "\n\t etaRange = 0x "
385  << objPar.etaRange << "\n\t phiLow = 0x " << objPar.phiLow
386  << "\n\t phiHigh = 0x " << objPar.phiHigh << "\n\t phiWindow1Lower = 0x "
387  << objPar.phiWindow1Lower << "\n\t phiWindow1Upper = 0x " << objPar.phiWindow1Upper
388  << "\n\t phiWindow2Lower = 0x " << objPar.phiWindow2Lower << "\n\t phiWindow2Lower = 0x "
389  << objPar.phiWindow2Lower << "\n\t charge = 0x " << objPar.charge
390  << "\n\t qualityLUT = 0x " << objPar.qualityLUT << "\n\t isolationLUT = 0x "
391  << objPar.isolationLUT << "\n\t enableMip = 0x " << objPar.enableMip << std::endl;
392 
393  LogDebug("L1TGlobal") << "\n l1t::Muon : "
394  << "\n\t hwPt = 0x " << cand.hwPt() << "\n\t hwEtaAtVtx = 0x " << cand.hwEtaAtVtx()
395  << "\n\t hwPhiAtVtx = 0x " << cand.hwPhiAtVtx() << "\n\t hwCharge = 0x " << cand.hwCharge()
396  << "\n\t hwQual = 0x " << cand.hwQual() << "\n\t hwIso = 0x " << cand.hwIso()
397  << std::dec << std::endl;
398 
399  if (objPar.unconstrainedPtHigh > 0) // Rick Cavanaugh: Check if unconstrained pT cut-window is valid
400  {
402  objPar.unconstrainedPtHigh,
403  cand.hwPtUnconstrained(),
405  LogDebug("L1TGlobal") << "\t\t Muon Failed unconstrainedPt checkThreshold; iCondition = " << iCondition
406  << std::endl;
407  return false;
408  }
409  }
410  if (objPar.impactParameterLUT !=
411  0) // Rick Cavanaugh: Check if impact parameter LUT is valid. 0xF is default; 0x0 is invalid
412  {
413  // check impact parameter ( bit check ) with impact parameter LUT
414  // sanity check on candidate impact parameter
415  if (cand.hwDXY() > 3) {
416  LogDebug("L1TGlobal") << "\t\t l1t::Candidate has out of range hwDXY = " << cand.hwDXY() << std::endl;
417  return false;
418  }
419  bool passImpactParameterLUT = ((objPar.impactParameterLUT >> cand.hwDXY()) & 1);
420  if (!passImpactParameterLUT) {
421  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed impact parameter requirement" << std::endl;
422  return false;
423  }
424  }
425 
426  if (!checkThreshold(objPar.ptLowThreshold, objPar.ptHighThreshold, cand.hwPt(), m_gtMuonTemplate->condGEq())) {
427  LogDebug("L1TGlobal") << "\t\t Muon Failed checkThreshold " << std::endl;
428  return false;
429  }
430 
431  // check index
432  if (!checkIndex(objPar.indexLow, objPar.indexHigh, index)) {
433  LogDebug("L1TGlobal") << "\t\t Muon Failed checkIndex " << std::endl;
434  return false;
435  }
436 
437  // check eta
438  if (!checkRangeEta(cand.hwEtaAtVtx(), objPar.etaWindows, 8)) {
439  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed checkRangeEta" << std::endl;
440  return false;
441  }
442 
443  // check phi
444  if (!checkRangePhi(cand.hwPhiAtVtx(),
445  objPar.phiWindow1Lower,
446  objPar.phiWindow1Upper,
447  objPar.phiWindow2Lower,
448  objPar.phiWindow2Upper)) {
449  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed checkRange(phi)" << std::endl;
450  return false;
451  }
452 
453  // check charge
454  if (objPar.charge >= 0) {
455  if (cand.hwCharge() != objPar.charge) {
456  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed charge requirement" << std::endl;
457  return false;
458  }
459  }
460 
461  // check quality ( bit check ) with quality LUT
462  // sanity check on candidate quality
463  if (cand.hwQual() > 16) {
464  LogDebug("L1TGlobal") << "\t\t l1t::Candidate has out of range hwQual = " << cand.hwQual() << std::endl;
465  return false;
466  }
467  bool passQualLUT = ((objPar.qualityLUT >> cand.hwQual()) & 1);
468  if (!passQualLUT) {
469  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed quality requirement" << std::endl;
470  return false;
471  }
472 
473  // check isolation ( bit check ) with isolation LUT
474  // sanity check on candidate isolation
475  if (cand.hwIso() > 4) {
476  LogDebug("L1TGlobal") << "\t\t l1t::Candidate has out of range hwIso = " << cand.hwIso() << std::endl;
477  return false;
478  }
479  bool passIsoLUT = ((objPar.isolationLUT >> cand.hwIso()) & 1);
480  if (!passIsoLUT) {
481  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed isolation requirement" << std::endl;
482  return false;
483  }
484 
485  // check muon TF index
486  if (!checkRangeTfMuonIndex(cand.tfMuonIndex(), objPar.tfMuonIndexWindows)) {
487  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed checkRangeTfMuonIndex" << std::endl;
488  return false;
489  }
490 
491  // A number of values is required to trigger (at least one).
492  // "Don't care" means that all values are allowed.
493  // Qual = 000 means then NO MUON (GTL module)
494 
495  // if (cand.hwQual() == 0) {
496  // LogDebug("L1TGlobal") << "\t\t Muon Failed hwQual() == 0" << std::endl;
497  // return false;
498  // }
499 
500  // if (objPar.qualityRange == 0) {
501  // LogDebug("L1TGlobal") << "\t\t Muon Failed qualityRange == 0" << std::endl;
502  // return false;
503  // }
504  // else {
505  // if (!checkBit(objPar.qualityRange, cand.hwQual())) {
506  // LogDebug("L1TGlobal") << "\t\t Muon Failed checkBit(qualityRange) " << std::endl;
507  // return false;
508  // }
509  // }
510 
511  // check mip
512  if (objPar.enableMip) {
513  // if (!cand.hwMip()) {
514  // LogDebug("L1TGlobal") << "\t\t Muon Failed enableMip" << std::endl;
515  // return false;
516  // }
517  }
518 
519  // particle matches if we get here
520  //LogTrace("L1TGlobal")
521  // << " checkObjectParameter: muon object OK, passes all requirements\n" << std::endl;
522 
523  return true;
524 }
const bool checkUnconstrainedPt(const Type1 &thresholdL, const Type1 &thresholdH, const Type2 &value, bool condGEqValue) const
const bool checkRangePhi(const unsigned int bitNumber, const Type1 &W1beginR, const Type1 &W1endR, const Type1 &W2beginR, const Type1 &W2endR) const
check if a value is in a given phi range and outside of a veto range
const bool checkThreshold(const Type1 &thresholdL, const Type1 &thresholdH, const Type2 &value, bool condGEqValue) const
const bool condGEq() const
get / set condition GEq flag
unsigned long long etaRange
Definition: MuonTemplate.h:79
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95
const bool checkIndex(const Type1 &indexLo, const Type1 &indexHi, const unsigned int index) const
check if a index is in a given range
const std::vector< ObjectParameter > * objectParameter() const
Definition: MuonTemplate.h:119
const bool checkRangeEta(const unsigned int bitNumber, const std::vector< Type1 > &windows, const unsigned int nEtaBits) const
std::vector< Window > etaWindows
Definition: MuonTemplate.h:85
const int nrObjects() const
get number of trigger objects
std::vector< Window > tfMuonIndexWindows
Definition: MuonTemplate.h:92
const bool checkRangeTfMuonIndex(const unsigned int bitNumber, const std::vector< Type1 > &windows) const
check if a value is in a given muon track finder index range
#define LogDebug(id)

◆ copy()

void MuCondition::copy ( const MuCondition cp)
private

copy function for copy constructor and operator=

Definition at line 59 of file MuCondition.cc.

Referenced by MuCondition().

59  {
60  m_gtMuonTemplate = cp.gtMuonTemplate();
61  m_gtGTL = cp.gtGTL();
62 
63  m_ifMuEtaNumberBits = cp.gtIfMuEtaNumberBits();
64  m_corrParDeltaPhiNrBins = cp.m_corrParDeltaPhiNrBins;
65 
66  m_condMaxNumberObjects = cp.condMaxNumberObjects();
67  m_condLastResult = cp.condLastResult();
68  m_combinationsInCond = cp.getCombinationsInCond();
69 
70  m_verbosity = cp.m_verbosity;
71 }
const GlobalBoard * m_gtGTL
pointer to GTL, to be able to get the trigger objects
Definition: MuCondition.h:98
int m_ifMuEtaNumberBits
number of bits for eta of muon objects
Definition: MuCondition.h:101
unsigned int m_corrParDeltaPhiNrBins
Definition: MuCondition.h:104
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95
CombinationsInCond m_combinationsInCond
store all the object combinations evaluated to true in the condition
int m_verbosity
verbosity level
bool m_condLastResult
the last result of evaluateCondition()

◆ evaluateCondition()

const bool MuCondition::evaluateCondition ( const int  bxEval) const
overridevirtual

the core function to check if the condition matches

Implements l1t::ConditionEvaluation.

Definition at line 103 of file MuCondition.cc.

References BXVector< T >::at(), MuonTemplate::CorrelationParameter::chargeCorrelation, MuonTemplate::CorrelationParameter::deltaEtaRangeLower, MuonTemplate::CorrelationParameter::deltaEtaRangeUpper, MuonTemplate::CorrelationParameter::deltaPhiRangeLower, MuonTemplate::CorrelationParameter::deltaPhiRangeUpper, BXVector< T >::getLastBX(), l1trig_cff::hwCharge, l1trig_cff::hwChargeValid, l1trig_cff::hwEtaAtVtx, l1trig_cff::hwPhiAtVtx, mps_fire::i, LogDebug, push_back(), and BXVector< T >::size().

103  {
104  // BLW Need to pass this as an argument
105  //const int bxEval=0; //BLW Change for BXVector
106 
107  // number of trigger objects in the condition
108  int nObjInCond = m_gtMuonTemplate->nrObjects();
109 
110  // the candidates
111  const BXVector<const l1t::Muon*>* candVec = m_gtGTL->getCandL1Mu(); //BLW Change for BXVector
112 
113  // Look at objects in bx = bx + relativeBx
114  int useBx = bxEval + m_gtMuonTemplate->condRelativeBx();
115 
116  // Fail condition if attempting to get Bx outside of range
117  if ((useBx < candVec->getFirstBX()) || (useBx > candVec->getLastBX())) {
118  return false;
119  }
120 
121  int numberObjects = candVec->size(useBx); //BLW Change for BXVector
122  //LogTrace("L1TGlobal") << " numberObjects: " << numberObjects
123  // << std::endl;
124  if (numberObjects < nObjInCond) {
125  return false;
126  }
127 
128  std::vector<int> index(numberObjects);
129 
130  for (int i = 0; i < numberObjects; ++i) {
131  index[i] = i;
132  }
133 
134  int numberForFactorial = numberObjects - nObjInCond;
135 
136  // TEMPORARY FIX UNTIL IMPLEMENT NEW MUON CONDITIONS
137  int myfactorial = 1;
138  for (int i = numberForFactorial; i > 0; i--)
139  myfactorial *= i;
140 
141  int jumpIndex = 1;
142  int jump = myfactorial; //factorial(numberObjects - nObjInCond);
143 
144  int totalLoops = 0;
145  int passLoops = 0;
146 
147  // condition result condResult set to true if at least one permutation
148  // passes all requirements
149  // all possible permutations are checked
150  bool condResult = false;
151 
152  // store the indices of the muon objects
153  // from the combination evaluated in the condition
154  SingleCombInCond objectsInComb;
155  objectsInComb.reserve(nObjInCond);
156 
157  // clear the m_combinationsInCond vector
158  combinationsInCond().clear();
159 
160  do {
161  if (--jumpIndex)
162  continue;
163 
164  jumpIndex = jump;
165  totalLoops++;
166 
167  // clear the indices in the combination
168  objectsInComb.clear();
169 
170  bool tmpResult = true;
171 
172  bool passCondition = false;
173  // check if there is a permutation that matches object-parameter requirements
174  for (int i = 0; i < nObjInCond; i++) {
175  passCondition = checkObjectParameter(i, *(candVec->at(useBx, index[i])), index[i]); //BLW Change for BXVector
176  tmpResult &= passCondition;
177  if (passCondition)
178  LogDebug("L1TGlobal") << "===> MuCondition::evaluateCondition, CONGRATS!! This muon passed the condition."
179  << std::endl;
180  else
181  LogDebug("L1TGlobal") << "===> MuCondition::evaluateCondition, FAIL!! This muon failed the condition."
182  << std::endl;
183  objectsInComb.push_back(index[i]);
184  }
185 
186  // if permutation does not match particle conditions
187  // skip charge correlation and spatial correlations
188  if (!tmpResult) {
189  continue;
190  }
191 
192  // get the correlation parameters (chargeCorrelation included here also)
194 
195  // charge_correlation consists of 3 relevant bits (D2, D1, D0)
196  unsigned int chargeCorr = corrPar.chargeCorrelation;
197 
198  // charge ignore bit (D0) not set?
199  if ((chargeCorr & 1) == 0) {
200  LogDebug("L1TGlobal") << "===> MuCondition:: Checking Charge Correlation" << std::endl;
201 
202  for (int i = 0; i < nObjInCond; i++) {
203  // check valid charge - skip if invalid charge
204  int chargeValid = (candVec->at(useBx, index[i]))->hwChargeValid(); //BLW Change for BXVector
205  tmpResult &= chargeValid;
206 
207  if (chargeValid == 0) { //BLW type change for New Muon Class
208  continue;
209  }
210  }
211 
212  if (!tmpResult) {
213  LogDebug("L1TGlobal") << "===> MuCondition:: Charge Correlation Failed...No Valid Charges" << std::endl;
214  continue;
215  }
216 
217  if (nObjInCond > 1) { // more objects condition
218 
219  // find out if signs are equal
220  bool equalSigns = true;
221  for (int i = 0; i < nObjInCond - 1; i++) {
222  if ((candVec->at(useBx, index[i]))->hwCharge() !=
223  (candVec->at(useBx, index[i + 1]))->hwCharge()) { //BLW Change for BXVector
224  equalSigns = false;
225  break;
226  }
227  }
228 
229  LogDebug("L1TGlobal") << "===> MuCondition:: Checking Charge Correlation equalSigns = " << equalSigns
230  << std::endl;
231 
232  // two or three particle condition
233  if (nObjInCond == 2 || nObjInCond == 3) {
234  if (!(((chargeCorr & 2) != 0 && equalSigns) || ((chargeCorr & 4) != 0 && !equalSigns))) {
235  LogDebug("L1TGlobal") << "===> MuCondition:: 2/3 Muon Fail Charge Correlation Condition =" << chargeCorr
236  << std::endl;
237  continue;
238  }
239  } else if (nObjInCond == 4) {
240  //counter to count positive charges to determine if there are pairs
241  unsigned int posCount = 0;
242 
243  for (int i = 0; i < nObjInCond; i++) {
244  if ((candVec->at(useBx, index[i]))->hwCharge() > 0) { //BLW Change for BXVector
245  posCount++;
246  }
247  }
248 
249  // Original OS 4 muon condition (disagreement with firmware):
250  // if (!(((chargeCorr & 2) != 0 && equalSigns) || ((chargeCorr & 4) != 0 && posCount == 2))) {
251  // Fix by R. Cavanaugh:
252  // Note that negative charge => hwCharge = 0
253  // positive charge => hwCharge = 1
254  // Hence: (0,0,0,0) => (posCount = 0) => 4 SS muons
255  // (1,0,0,0) => (posCount = 1) => 1 OS muon pair, 1 SS muon pair
256  // (1,1,0,0) => (posCount = 2) => 2 OS muon pairs
257  // (1,0,1,0) => (posCount = 2) => 2 OS muon pairs
258  // (0,0,1,1) => (posCount = 2) => 2 OS muon pairs
259  // (1,1,1,0) => (posCount = 3) => 1 SS muon pair, 1 OS muon pair
260  // (1,1,1,1) => (posCount = 4) => 4 SS muons
261  // A requirement (posCount == 2) implies there must be exactly 2 OS pairs of muons
262  // A requirement of at least 1 pair of OS muons implies condition should be (posCount > 0 && posCount < 4)
263  if (!(((chargeCorr & 2) != 0 && equalSigns) || ((chargeCorr & 4) != 0 && (posCount > 0 && posCount < 4)))) {
264  LogDebug("L1TGlobal") << "===> MuCondition:: 4 Muon Fail Charge Correlation Condition = " << chargeCorr
265  << " posCnt " << posCount << std::endl;
266  continue;
267  }
268  }
269  } // end require nObjInCond > 1
270  } // end signchecks
271 
272  if (m_gtMuonTemplate->wsc()) {
273  // wsc requirements have always nObjInCond = 2
274  // one can use directly index[0] and index[1] to compute
275  // eta and phi differences
276  const int ObjInWscComb = 2;
277  if (nObjInCond != ObjInWscComb) {
278  edm::LogError("L1TGlobal") << "\n Error: "
279  << "number of particles in condition with spatial correlation = " << nObjInCond
280  << "\n it must be = " << ObjInWscComb << std::endl;
281  // TODO Perhaps I should throw here an exception,
282  // since something is really wrong if nObjInCond != ObjInWscComb (=2)
283  continue;
284  }
285 
286  // check delta eta
287  if (!checkRangeDeltaEta((candVec->at(useBx, 0))->hwEtaAtVtx(),
288  (candVec->at(useBx, 1))->hwEtaAtVtx(),
289  corrPar.deltaEtaRangeLower,
290  corrPar.deltaEtaRangeUpper,
291  8)) {
292  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed checkRangeDeltaEta" << std::endl;
293  continue;
294  }
295 
296  // check delta phi
297  if (!checkRangeDeltaPhi((candVec->at(useBx, 0))->hwPhiAtVtx(),
298  (candVec->at(useBx, 1))->hwPhiAtVtx(),
299  corrPar.deltaPhiRangeLower,
300  corrPar.deltaPhiRangeUpper)) {
301  LogDebug("L1TGlobal") << "\t\t l1t::Candidate failed checkRangeDeltaPhi" << std::endl;
302  continue;
303  }
304 
305  } // end wsc check
306 
307  // if we get here all checks were successfull for this combination
308  // set the general result for evaluateCondition to "true"
309 
310  condResult = true;
311  passLoops++;
312  (combinationsInCond()).push_back(objectsInComb);
313 
314  } while (std::next_permutation(index.begin(), index.end()));
315 
316  //LogTrace("L1TGlobal")
317  // << "\n MuCondition: total number of permutations found: " << totalLoops
318  // << "\n MuCondition: number of permutations passing requirements: " << passLoops
319  // << "\n" << std::endl;
320 
321  return condResult;
322 }
int getLastBX() const
const bool checkRangeDeltaEta(const unsigned int obj1Eta, const unsigned int obj2Eta, const Type1 &lowerR, const Type1 &upperR, const unsigned int nEtaBits) const
check if a value is in a given deltaEta range
const bool wsc() const
const bool checkObjectParameter(const int iCondition, const l1t::Muon &cand, const unsigned int index) const
function to check a single object if it matches a condition
Definition: MuCondition.cc:338
std::vector< int > SingleCombInCond
typedefs
const GlobalBoard * m_gtGTL
pointer to GTL, to be able to get the trigger objects
Definition: MuCondition.h:98
Log< level::Error, false > LogError
unsigned size(int bx) const
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95
const T & at(int bx, unsigned i) const
deadvectors [0] push_back({0.0175431, 0.538005, 6.80997, 13.29})
const BXVector< const l1t::Muon * > * getCandL1Mu() const
return global muon trigger candidate
Definition: GlobalBoard.h:150
const int & condRelativeBx() const
get / set the condition relative bx
const bool checkRangeDeltaPhi(const unsigned int obj1Phi, const unsigned int obj2Phi, const Type1 &lowerR, const Type1 &upperR) const
check if a value is in a given deltaPhi range
const int nrObjects() const
get number of trigger objects
const CorrelationParameter * correlationParameter() const
Definition: MuonTemplate.h:121
CombinationsInCond & combinationsInCond() const
get all the object combinations (to fill it...)
#define LogDebug(id)

◆ getCandidate()

const l1t::Muon * MuCondition::getCandidate ( const int  bx,
const int  indexCand 
) const
private

load muon candidates

Definition at line 325 of file MuCondition.cc.

References l1GtPatternGenerator_cfi::bx.

325  {
326  return (m_gtGTL->getCandL1Mu())->at(bx, indexCand); //BLW Change for BXVector
327 }
const GlobalBoard * m_gtGTL
pointer to GTL, to be able to get the trigger objects
Definition: MuCondition.h:98
const BXVector< const l1t::Muon * > * getCandL1Mu() const
return global muon trigger candidate
Definition: GlobalBoard.h:150

◆ gtCorrParDeltaPhiNrBins()

const int l1t::MuCondition::gtCorrParDeltaPhiNrBins ( ) const
inline

get / set maximum number of bins for the delta phi scales

Definition at line 79 of file MuCondition.h.

References m_corrParDeltaPhiNrBins.

79 { return m_corrParDeltaPhiNrBins; }
unsigned int m_corrParDeltaPhiNrBins
Definition: MuCondition.h:104

◆ gtGTL()

const GlobalBoard* l1t::MuCondition::gtGTL ( ) const
inline

get / set the pointer to GTL

Definition at line 69 of file MuCondition.h.

References m_gtGTL.

69 { return m_gtGTL; }
const GlobalBoard * m_gtGTL
pointer to GTL, to be able to get the trigger objects
Definition: MuCondition.h:98

◆ gtIfMuEtaNumberBits()

const int l1t::MuCondition::gtIfMuEtaNumberBits ( ) const
inline

get / set the number of bits for eta of muon objects

Definition at line 74 of file MuCondition.h.

References m_ifMuEtaNumberBits.

74 { return m_ifMuEtaNumberBits; }
int m_ifMuEtaNumberBits
number of bits for eta of muon objects
Definition: MuCondition.h:101

◆ gtMuonTemplate()

const MuonTemplate* l1t::MuCondition::gtMuonTemplate ( ) const
inline

get / set the pointer to a Condition

Definition at line 64 of file MuCondition.h.

References m_gtMuonTemplate.

64 { return m_gtMuonTemplate; }
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95

◆ operator=()

l1t::MuCondition & MuCondition::operator= ( const MuCondition cp)

Definition at line 81 of file MuCondition.cc.

References filterCSVwithJSON::copy.

81  {
82  copy(cp);
83  return *this;
84 }
void copy(const MuCondition &cp)
copy function for copy constructor and operator=
Definition: MuCondition.cc:59

◆ print()

void MuCondition::print ( std::ostream &  myCout) const
overridevirtual

print condition

Reimplemented from l1t::ConditionEvaluation.

Definition at line 526 of file MuCondition.cc.

References l1t::ConditionEvaluation::print().

Referenced by l1t::CorrCondition::evaluateCondition(), l1t::CorrThreeBodyCondition::evaluateCondition(), l1t::CorrWithOverlapRemovalCondition::evaluateCondition(), and l1t::GlobalBoard::runGTL().

526  {
527  m_gtMuonTemplate->print(myCout);
528 
529  myCout << " Number of bits for eta of muon objects = " << m_ifMuEtaNumberBits << std::endl;
530  myCout << " Maximum number of bins for the delta phi scales = " << m_corrParDeltaPhiNrBins << "\n " << std::endl;
531 
533 }
void print(std::ostream &myCout) const override
print the condition
Definition: MuonTemplate.cc:71
int m_ifMuEtaNumberBits
number of bits for eta of muon objects
Definition: MuCondition.h:101
unsigned int m_corrParDeltaPhiNrBins
Definition: MuCondition.h:104
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95
virtual void print(std::ostream &myCout) const
print condition

◆ setGtCorrParDeltaPhiNrBins()

void MuCondition::setGtCorrParDeltaPhiNrBins ( const int &  corrParDeltaPhiNrBins)

Definition at line 98 of file MuCondition.cc.

98  {
99  m_corrParDeltaPhiNrBins = corrParDeltaPhiNrBins;
100 }
unsigned int m_corrParDeltaPhiNrBins
Definition: MuCondition.h:104

◆ setGtGTL()

void MuCondition::setGtGTL ( const GlobalBoard ptrGTL)

set the pointer to GTL

Definition at line 90 of file MuCondition.cc.

90 { m_gtGTL = ptrGTL; }
const GlobalBoard * m_gtGTL
pointer to GTL, to be able to get the trigger objects
Definition: MuCondition.h:98

◆ setGtIfMuEtaNumberBits()

void MuCondition::setGtIfMuEtaNumberBits ( const int &  ifMuEtaNumberBitsValue)

Definition at line 93 of file MuCondition.cc.

93  {
94  m_ifMuEtaNumberBits = ifMuEtaNumberBitsValue;
95 }
int m_ifMuEtaNumberBits
number of bits for eta of muon objects
Definition: MuCondition.h:101

◆ setGtMuonTemplate()

void MuCondition::setGtMuonTemplate ( const MuonTemplate muonTempl)

Definition at line 87 of file MuCondition.cc.

87 { m_gtMuonTemplate = muonTempl; }
const MuonTemplate * m_gtMuonTemplate
pointer to a MuonTemplate
Definition: MuCondition.h:95

Member Data Documentation

◆ m_corrParDeltaPhiNrBins

unsigned int l1t::MuCondition::m_corrParDeltaPhiNrBins
private

Definition at line 104 of file MuCondition.h.

Referenced by gtCorrParDeltaPhiNrBins(), and MuCondition().

◆ m_gtGTL

const GlobalBoard* l1t::MuCondition::m_gtGTL
private

pointer to GTL, to be able to get the trigger objects

Definition at line 98 of file MuCondition.h.

Referenced by gtGTL().

◆ m_gtMuonTemplate

const MuonTemplate* l1t::MuCondition::m_gtMuonTemplate
private

pointer to a MuonTemplate

Definition at line 95 of file MuCondition.h.

Referenced by gtMuonTemplate().

◆ m_ifMuEtaNumberBits

int l1t::MuCondition::m_ifMuEtaNumberBits
private

number of bits for eta of muon objects

Definition at line 101 of file MuCondition.h.

Referenced by gtIfMuEtaNumberBits().