CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GenericTriggerEventFlag.cc
Go to the documentation of this file.
1 //
2 // $Id: GenericTriggerEventFlag.cc,v 1.13 2012/04/22 15:09:29 vadler Exp $
3 //
4 
5 
7 
13 
14 #include <vector>
15 
17 
18 
19 // Constants' definitions
20 static const bool useL1EventSetup( true );
21 static const bool useL1GtTriggerMenuLite( false );
22 
23 
26  : watchDB_( 0 )
27  , hltConfigInit_( false )
28  , andOr_( false )
29  , dbLabel_( "" )
30  , verbose_( 0 )
31  , andOrDcs_( false )
32  , errorReplyDcs_( false )
33  , andOrGt_( false )
34  , gtInputTag_( "" )
35  , gtEvmInputTag_( "" )
36  , gtDBKey_( "" )
37  , errorReplyGt_( false )
38  , andOrL1_( false )
39  , stage2_( false )
40  , l1BeforeMask_( true )
41  , l1DBKey_( "" )
42  , errorReplyL1_( false )
43  , andOrHlt_( false )
44  , hltDBKey_( "" )
45  , errorReplyHlt_( false )
46  , on_( true )
47  , onDcs_( true )
48  , onGt_( true )
49  , onL1_( true )
50  , onHlt_( true )
51  , configError_( "CONFIG_ERROR" )
52  , emptyKeyError_( "EMPTY_KEY_ERROR" )
53 {
54 
55  // General switch(es)
56  if ( config.exists( "andOr" ) ) {
57  andOr_ = config.getParameter< bool >( "andOr" );
58  if ( config.exists( "verbosityLevel" ) ) verbose_ = config.getParameter< unsigned >( "verbosityLevel" );
59  } else {
60  on_ = false;
61  onDcs_ = false;
62  onGt_ = false;
63  onL1_ = false;
64  onHlt_ = false;
65  }
66 
67  if ( on_ ) {
68  if ( config.exists( "andOrDcs" ) ) {
69  andOrDcs_ = config.getParameter< bool >( "andOrDcs" );
70  dcsInputTag_ = config.getParameter< edm::InputTag >( "dcsInputTag" );
72  dcsPartitions_ = config.getParameter< std::vector< int > >( "dcsPartitions" );
73  errorReplyDcs_ = config.getParameter< bool >( "errorReplyDcs" );
74  } else {
75  onDcs_ = false;
76  }
77  if ( config.exists( "andOrGt" ) ) {
78  andOrGt_ = config.getParameter< bool >( "andOrGt" );
79  gtInputTag_ = config.getParameter< edm::InputTag >( "gtInputTag" );
81  gtLogicalExpressions_ = config.getParameter< std::vector< std::string > >( "gtStatusBits" );
82  errorReplyGt_ = config.getParameter< bool >( "errorReplyGt" );
83  if ( config.exists( "gtEvmInputTag" ) ) {
84  gtEvmInputTag_ = config.getParameter< edm::InputTag >( "gtEvmInputTag" );
86  }
87  if ( config.exists( "gtDBKey" ) ) gtDBKey_ = config.getParameter< std::string >( "gtDBKey" );
88  } else {
89  onGt_ = false;
90  }
91  if ( config.exists( "andOrL1" ) ) {
92  andOrL1_ = config.getParameter< bool >( "andOrL1" );
93  if ( config.exists( "stage2" ) )
94  stage2_ = config.getParameter< bool> ( "stage2" );
95  else
96  stage2_ = false;
97  l1LogicalExpressionsCache_ = config.getParameter< std::vector< std::string > >( "l1Algorithms" );
98  errorReplyL1_ = config.getParameter< bool >( "errorReplyL1" );
99  if ( config.exists( "l1DBKey" ) ) l1DBKey_ = config.getParameter< std::string >( "l1DBKey" );
100  if ( config.exists( "l1BeforeMask" ) ) l1BeforeMask_ = config.getParameter< bool >( "l1BeforeMask" );
101  } else {
102  onL1_ = false;
103  }
104  if ( config.exists( "andOrHlt" ) ) {
105  andOrHlt_ = config.getParameter< bool >( "andOrHlt" );
106  hltInputTag_ = config.getParameter< edm::InputTag >( "hltInputTag" );
108  hltLogicalExpressionsCache_ = config.getParameter< std::vector< std::string > >( "hltPaths" );
109  errorReplyHlt_ = config.getParameter< bool >( "errorReplyHlt" );
110  if ( config.exists( "hltDBKey" ) ) hltDBKey_ = config.getParameter< std::string >( "hltDBKey" );
111  } else {
112  onHlt_ = false;
113  }
114  if ( ! onDcs_ && ! onGt_ && ! onL1_ && ! onHlt_ ) on_ = false;
115  else {
116  if ( config.exists( "dbLabel" ) ) dbLabel_ = config.getParameter< std::string >( "dbLabel" );
118  }
119  }
120 
121 }
122 
123 
126 {
127 
128  if ( on_ ) delete watchDB_;
129 
130 }
131 
132 
135 {
136 
137  if ( watchDB_->check( setup ) ) {
138  if ( onGt_ && gtDBKey_.size() > 0 ) {
139  const std::vector< std::string > exprs( expressionsFromDB( gtDBKey_, setup ) );
140  if ( exprs.empty() || exprs.at( 0 ) != configError_ ) gtLogicalExpressions_ = exprs;
141  }
142  if ( onL1_ && l1DBKey_.size() > 0 ) {
143  const std::vector< std::string > exprs( expressionsFromDB( l1DBKey_, setup ) );
144  if ( exprs.empty() || exprs.at( 0 ) != configError_ ) l1LogicalExpressionsCache_ = exprs;
145  }
146  if ( onHlt_ && hltDBKey_.size() > 0 ) {
147  const std::vector< std::string > exprs( expressionsFromDB( hltDBKey_, setup ) );
148  if ( exprs.empty() || exprs.at( 0 ) != configError_ ) hltLogicalExpressionsCache_ = exprs;
149  }
150  }
151 
152  // Re-initialise starting valuse before wild-card expansion
155 
156  hltConfigInit_ = false;
157  if ( onHlt_ ) {
158  if ( hltInputTag_.process().size() == 0 ) {
159  if ( verbose_ > 0 ) edm::LogError( "GenericTriggerEventFlag" ) << "HLT TriggerResults InputTag \"" << hltInputTag_.encode() << "\" specifies no process";
160  } else {
161  bool hltChanged( false );
162  if ( ! hltConfig_.init( run, setup, hltInputTag_.process(), hltChanged ) ) {
163  if ( verbose_ > 0 ) edm::LogError( "GenericTriggerEventFlag" ) << "HLT config initialization error with process name \"" << hltInputTag_.process() << "\"";
164  } else if ( hltConfig_.size() <= 0 ) {
165  if ( verbose_ > 0 ) edm::LogError( "GenericTriggerEventFlag" ) << "HLT config size error";
166  } else hltConfigInit_ = true;
167  }
168  }
169 
170  // Expand version wild-cards in HLT logical expressions
171  // L1
172  if ( onL1_ ) {
173  // build vector of algo names
174 
175  std::vector< std::string > algoNames;
176 
177  if (stage2_) {
178  l1uGt_->retrieveL1Setup(setup);
179 
180  const std::vector<std::pair<std::string, int> > prescales = l1uGt_->prescales();
181  for(auto ip : prescales)
182  algoNames.push_back(ip.first);
183  } else {
184  l1Gt_->getL1GtRunCache( run, setup, useL1EventSetup, useL1GtTriggerMenuLite );
185  edm::ESHandle< L1GtTriggerMenu > handleL1GtTriggerMenu;
186  setup.get< L1GtTriggerMenuRcd >().get( handleL1GtTriggerMenu );
187 
188  const AlgorithmMap l1GtPhys( handleL1GtTriggerMenu->gtAlgorithmMap() );
189  for ( CItAlgo iAlgo = l1GtPhys.begin(); iAlgo != l1GtPhys.end(); ++iAlgo ) {
190  algoNames.push_back( iAlgo->second.algoName() );
191  }
192  const AlgorithmMap l1GtTech( handleL1GtTriggerMenu->gtTechnicalTriggerMap() );
193  for ( CItAlgo iAlgo = l1GtTech.begin(); iAlgo != l1GtTech.end(); ++iAlgo ) {
194  algoNames.push_back( iAlgo->second.algoName() );
195  }
196  }
197 
198 
199  for ( unsigned iExpr = 0; iExpr < l1LogicalExpressions_.size(); ++iExpr ) {
200  std::string l1LogicalExpression( l1LogicalExpressions_.at( iExpr ) );
201  L1GtLogicParser l1AlgoLogicParser( l1LogicalExpression );
202  // Loop over algorithms
203  for ( size_t iAlgo = 0; iAlgo < l1AlgoLogicParser.operandTokenVector().size(); ++iAlgo ) {
204  const std::string l1AlgoName( l1AlgoLogicParser.operandTokenVector().at( iAlgo ).tokenName );
205  if ( l1AlgoName.find( '*' ) != std::string::npos ) {
206  l1LogicalExpression.replace( l1LogicalExpression.find( l1AlgoName ), l1AlgoName.size(), expandLogicalExpression( algoNames, l1AlgoName ) );
207  }
208  }
209  l1LogicalExpressions_[ iExpr ] = l1LogicalExpression;
210  }
211  std::vector<std::string> tmp = l1LogicalExpressions_;
212  for ( unsigned iExpr = 0; iExpr < tmp.size(); ++iExpr )
213  if ( std::find(algoNames.begin(),algoNames.end(),tmp[ iExpr ]) == algoNames.end() ) {
214  l1LogicalExpressions_.erase(l1LogicalExpressions_.begin()+iExpr);
215  if ( verbose_ > 1 )
216  edm::LogWarning( "GenericTriggerEventFlag" ) << "L1 algorithm \"" << tmp[ iExpr ] << "\" does not exist in the L1 menu ==> drop it from the list of l1LogicalExpressions";
217  }
218  }
219  // HLT
220  if ( hltConfigInit_ ) {
221  for ( unsigned iExpr = 0; iExpr < hltLogicalExpressions_.size(); ++iExpr ) {
222  std::string hltLogicalExpression( hltLogicalExpressions_.at( iExpr ) );
223  L1GtLogicParser hltAlgoLogicParser( hltLogicalExpression );
224  // Loop over paths
225  for ( size_t iPath = 0; iPath < hltAlgoLogicParser.operandTokenVector().size(); ++iPath ) {
226  const std::string hltPathName( hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenName );
227  if ( hltPathName.find( '*' ) != std::string::npos ) {
228  hltLogicalExpression.replace( hltLogicalExpression.find( hltPathName ), hltPathName.size(), expandLogicalExpression( hltConfig_.triggerNames(), hltPathName ) );
229  }
230  }
231  hltLogicalExpressions_[ iExpr ] = hltLogicalExpression;
232  }
233  }
234 
235 }
236 
237 
240 {
241 
242  if ( ! on_ ) return true;
243 
244  // Determine decision
245  if ( andOr_ ) return ( acceptDcs( event ) || acceptGt( event ) || acceptL1( event, setup ) || acceptHlt( event ) );
246  return ( acceptDcs( event ) && acceptGt( event ) && acceptL1( event, setup ) && acceptHlt( event ) );
247 
248 }
249 
250 
252 {
253 
254  // An empty DCS partitions list acts as switch.
255  if ( ! onDcs_ || dcsPartitions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
256 
257  // Accessing the DcsStatusCollection
259  event.getByToken( dcsInputToken_, dcsStatus );
260  if ( ! dcsStatus.isValid() ) {
261  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "DcsStatusCollection product with InputTag \"" << dcsInputTag_.encode() << "\" not in event ==> decision: " << errorReplyDcs_;
262  return errorReplyDcs_;
263  }
264  if ( ( *dcsStatus ).size() == 0 ) {
265  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "DcsStatusCollection product with InputTag \"" << dcsInputTag_.encode() << "\" empty ==> decision: " << errorReplyDcs_;
266  return errorReplyDcs_;
267  }
268 
269  // Determine decision of DCS partition combination and return
270  if ( andOrDcs_ ) { // OR combination
271  for ( std::vector< int >::const_iterator partitionNumber = dcsPartitions_.begin(); partitionNumber != dcsPartitions_.end(); ++partitionNumber ) {
272  if ( acceptDcsPartition( dcsStatus, *partitionNumber ) ) return true;
273  }
274  return false;
275  }
276  for ( std::vector< int >::const_iterator partitionNumber = dcsPartitions_.begin(); partitionNumber != dcsPartitions_.end(); ++partitionNumber ) {
277  if ( ! acceptDcsPartition( dcsStatus, *partitionNumber ) ) return false;
278  }
279  return true;
280 
281 }
282 
283 
285 {
286 
287  // Error checks
288  switch( dcsPartition ) {
289  case DcsStatus::EBp :
290  case DcsStatus::EBm :
291  case DcsStatus::EEp :
292  case DcsStatus::EEm :
293  case DcsStatus::HBHEa :
294  case DcsStatus::HBHEb :
295  case DcsStatus::HBHEc :
296  case DcsStatus::HF :
297  case DcsStatus::HO :
298  case DcsStatus::RPC :
299  case DcsStatus::DT0 :
300  case DcsStatus::DTp :
301  case DcsStatus::DTm :
302  case DcsStatus::CSCp :
303  case DcsStatus::CSCm :
304  case DcsStatus::CASTOR:
305  case DcsStatus::TIBTID:
306  case DcsStatus::TOB :
307  case DcsStatus::TECp :
308  case DcsStatus::TECm :
309  case DcsStatus::BPIX :
310  case DcsStatus::FPIX :
311  case DcsStatus::ESp :
312  case DcsStatus::ESm :
313  break;
314  default:
315  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "DCS partition number \"" << dcsPartition << "\" does not exist ==> decision: " << errorReplyDcs_;
316  return errorReplyDcs_;
317  }
318 
319  // Determine decision
320  return dcsStatus->at( 0 ).ready( dcsPartition );
321 
322 }
323 
324 
327 {
328 
329  // An empty GT status bits logical expressions list acts as switch.
330  if ( ! onGt_ || gtLogicalExpressions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
331 
332  // Determine decision of GT status bits logical expression combination and return
333  if ( andOrGt_ ) { // OR combination
334  for ( std::vector< std::string >::const_iterator gtLogicalExpression = gtLogicalExpressions_.begin(); gtLogicalExpression != gtLogicalExpressions_.end(); ++gtLogicalExpression ) {
335  if ( acceptGtLogicalExpression( event, *gtLogicalExpression ) ) return true;
336  }
337  return false;
338  }
339  for ( std::vector< std::string >::const_iterator gtLogicalExpression = gtLogicalExpressions_.begin(); gtLogicalExpression != gtLogicalExpressions_.end(); ++gtLogicalExpression ) {
340  if ( ! acceptGtLogicalExpression( event, *gtLogicalExpression ) ) return false;
341  }
342  return true;
343 
344 }
345 
346 
349 {
350 
351  // Check empty std::strings
352  if ( gtLogicalExpression.empty() ) {
353  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty logical expression ==> decision: " << errorReplyGt_;
354  return errorReplyGt_;
355  }
356 
357  // Negated paths
358  bool negExpr( negate( gtLogicalExpression ) );
359  if ( negExpr && gtLogicalExpression.empty() ) {
360  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty (negated) logical expression ==> decision: " << errorReplyGt_;
361  return errorReplyGt_;
362  }
363 
364  // Parse logical expression and determine GT status bit decision
365  L1GtLogicParser gtAlgoLogicParser( gtLogicalExpression );
366  // Loop over status bits
367  for ( size_t iStatusBit = 0; iStatusBit < gtAlgoLogicParser.operandTokenVector().size(); ++iStatusBit ) {
368  const std::string gtStatusBit( gtAlgoLogicParser.operandTokenVector().at( iStatusBit ).tokenName );
369  // Manipulate status bit decision as stored in the parser
370  bool decision( errorReplyDcs_ );
371  // Hard-coded status bits!!!
372  if ( gtStatusBit == "PhysDecl" || gtStatusBit == "PhysicsDeclared" ) {
374  event.getByToken( gtInputToken_, gtReadoutRecord );
375  if ( ! gtReadoutRecord.isValid() ) {
376  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "L1GlobalTriggerReadoutRecord product with InputTag \"" << gtInputTag_.encode() << "\" not in event ==> decision: " << errorReplyGt_;
377  gtAlgoLogicParser.operandTokenVector().at( iStatusBit ).tokenResult = errorReplyDcs_;
378  continue;
379  }
380  decision = ( gtReadoutRecord->gtFdlWord().physicsDeclared() == 1 );
381  } else if ( gtStatusBit == "Stable" || gtStatusBit == "StableBeam" || gtStatusBit == "Adjust" || gtStatusBit == "Sqeeze" || gtStatusBit == "Flat" || gtStatusBit == "FlatTop" ||
382  gtStatusBit == "7TeV" || gtStatusBit == "8TeV" || gtStatusBit == "13TeV" || gtStatusBit == "2360GeV" || gtStatusBit == "900GeV" ) {
384  event.getByToken( gtEvmInputToken_, gtEvmReadoutRecord );
385  if ( ! gtEvmReadoutRecord.isValid() ) {
386  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "L1GlobalTriggerEvmReadoutRecord product with InputTag \"" << gtEvmInputTag_.encode() << "\" not in event ==> decision: " << errorReplyGt_;
387  gtAlgoLogicParser.operandTokenVector().at( iStatusBit ).tokenResult = errorReplyDcs_;
388  continue;
389  }
390  if ( gtStatusBit == "Stable" || gtStatusBit == "StableBeam" ) {
391  decision = ( gtEvmReadoutRecord->gtfeWord().beamMode() == 11 );
392  } else if ( gtStatusBit == "Adjust" ) {
393  decision = ( 10 <= gtEvmReadoutRecord->gtfeWord().beamMode() && gtEvmReadoutRecord->gtfeWord().beamMode() <= 11 );
394  } else if ( gtStatusBit == "Sqeeze" ) {
395  decision = ( 9 <= gtEvmReadoutRecord->gtfeWord().beamMode() && gtEvmReadoutRecord->gtfeWord().beamMode() <= 11 );
396  } else if ( gtStatusBit == "Flat" || gtStatusBit == "FlatTop" ) {
397  decision = ( 8 <= gtEvmReadoutRecord->gtfeWord().beamMode() && gtEvmReadoutRecord->gtfeWord().beamMode() <= 11 );
398  } else if ( gtStatusBit == "7TeV" ) {
399  decision = ( gtEvmReadoutRecord->gtfeWord().beamMomentum() == 3500 );
400  } else if ( gtStatusBit == "8TeV" ) {
401  decision = ( gtEvmReadoutRecord->gtfeWord().beamMomentum() == 4000 );
402  } else if ( gtStatusBit == "13TeV" ) {
403  decision = ( gtEvmReadoutRecord->gtfeWord().beamMomentum() == 6500 );
404  } else if ( gtStatusBit == "2360GeV" ) {
405  decision = ( gtEvmReadoutRecord->gtfeWord().beamMomentum() == 1180 );
406  } else if ( gtStatusBit == "900GeV" ) {
407  decision = ( gtEvmReadoutRecord->gtfeWord().beamMomentum() == 450 );
408  }
409  } else {
410  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "GT status bit \"" << gtStatusBit << "\" is not defined ==> decision: " << errorReplyGt_;
411  }
412  gtAlgoLogicParser.operandTokenVector().at( iStatusBit ).tokenResult = decision;
413  }
414 
415  // Determine decision
416  const bool gtDecision( gtAlgoLogicParser.expressionResult() );
417  return negExpr ? ( ! gtDecision ) : gtDecision;
418 
419 }
420 
421 
424 {
425 
426  // An empty L1 logical expressions list acts as switch.
427  if ( ! onL1_ || l1LogicalExpressions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
428 
429  // Determine decision of L1 logical expression combination and return
430  if ( andOrL1_ ) { // OR combination
431  for ( std::vector< std::string >::const_iterator l1LogicalExpression = l1LogicalExpressions_.begin(); l1LogicalExpression != l1LogicalExpressions_.end(); ++l1LogicalExpression ) {
432  if ( acceptL1LogicalExpression( event, setup, *l1LogicalExpression ) ) return true;
433  }
434  return false;
435  }
436  for ( std::vector< std::string >::const_iterator l1LogicalExpression = l1LogicalExpressions_.begin(); l1LogicalExpression != l1LogicalExpressions_.end(); ++l1LogicalExpression ) {
437  if ( ! acceptL1LogicalExpression( event, setup, *l1LogicalExpression ) ) return false;
438  }
439  return true;
440 
441 }
442 
443 
446 {
447 
448  // Getting the L1 event setup
449  if ( stage2_ )
450  l1uGt_->retrieveL1(event,setup);
451  else
452  l1Gt_->getL1GtRunCache( event, setup, useL1EventSetup, useL1GtTriggerMenuLite ); // FIXME This can possibly go to initRun()
453 
454 
455  // Check empty std::strings
456  if ( l1LogicalExpression.empty() ) {
457  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty logical expression ==> decision: " << errorReplyL1_;
458  return errorReplyL1_;
459  }
460 
461  // Negated logical expression
462  bool negExpr( negate( l1LogicalExpression ) );
463  if ( negExpr && l1LogicalExpression.empty() ) {
464  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty (negated) logical expression ==> decision: " << errorReplyL1_;
465  return errorReplyL1_;
466  }
467 
468  // Parse logical expression and determine L1 decision
469  L1GtLogicParser l1AlgoLogicParser( l1LogicalExpression );
470  // Loop over algorithms
471  for ( size_t iAlgorithm = 0; iAlgorithm < l1AlgoLogicParser.operandTokenVector().size(); ++iAlgorithm ) {
472  const std::string l1AlgoName( l1AlgoLogicParser.operandTokenVector().at( iAlgorithm ).tokenName );
473 
474 
475  bool decision = false;
476  bool error = false;
477  if ( stage2_ ) {
478  bool errorBOOL = (l1BeforeMask_ ? l1uGt_->getInitialDecisionByName(l1AlgoName,decision) : l1uGt_->getFinalDecisionByName(l1AlgoName,decision) );
479  error = !errorBOOL;
480  } else {
481  int errorINT( -1 );
482  // const bool decision( l1BeforeMask_ ? l1Gt_->decisionBeforeMask( event, l1AlgoName, errorINT ) : l1Gt_->decisionAfterMask( event, l1AlgoName, errorINT ) );
483  decision = ( l1BeforeMask_ ? l1Gt_->decisionBeforeMask( event, l1AlgoName, errorINT ) : l1Gt_->decisionAfterMask( event, l1AlgoName, errorINT ) );
484  error = ( errorINT != 0 );
485  if ( errorINT > 1 )
486  if ( verbose_ > 1 )
487  edm::LogWarning( "GenericTriggerEventFlag" ) << "L1 algorithm \"" << l1AlgoName << "\" received error code " << error << " from L1GtUtils::decisionBeforeMask ==> decision: " << errorReplyL1_;
488  }
489 
490  // Error checks
491  if ( error ) {
492  if ( verbose_ > 1 )
493  edm::LogWarning( "GenericTriggerEventFlag" ) << "L1 algorithm \"" << l1AlgoName << "\" does not exist in the L1 menu ==> decision: " << errorReplyL1_;
494  l1AlgoLogicParser.operandTokenVector().at( iAlgorithm ).tokenResult = errorReplyL1_;
495  continue;
496  }
497  // Manipulate algo decision as stored in the parser
498  l1AlgoLogicParser.operandTokenVector().at( iAlgorithm ).tokenResult = decision;
499  }
500 
501  // Return decision
502  const bool l1Decision( l1AlgoLogicParser.expressionResult() );
503  return negExpr ? ( ! l1Decision ) : l1Decision;
504 
505 }
506 
507 
510 {
511 
512  // An empty HLT logical expressions list acts as switch.
513  if ( ! onHlt_ || hltLogicalExpressions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
514 
515  // Checking the HLT configuration,
516  if ( ! hltConfigInit_ ) {
517  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "HLT config error ==> decision: " << errorReplyHlt_;
518  return errorReplyHlt_;
519  }
520 
521  // Accessing the TriggerResults
522  edm::Handle< edm::TriggerResults > hltTriggerResults;
523  event.getByToken( hltInputToken_, hltTriggerResults );
524  if ( ! hltTriggerResults.isValid() ) {
525  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "TriggerResults product with InputTag \"" << hltInputTag_.encode() << "\" not in event ==> decision: " << errorReplyHlt_;
526  return errorReplyHlt_;
527  }
528  if ( ( *hltTriggerResults ).size() == 0 ) {
529  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "TriggerResults product with InputTag \"" << hltInputTag_.encode() << "\" empty ==> decision: " << errorReplyHlt_;
530  return errorReplyDcs_;
531  }
532 
533  // Determine decision of HLT logical expression combination and return
534  if ( andOrHlt_ ) { // OR combination
535  for ( std::vector< std::string >::const_iterator hltLogicalExpression = hltLogicalExpressions_.begin(); hltLogicalExpression != hltLogicalExpressions_.end(); ++hltLogicalExpression ) {
536  if ( acceptHltLogicalExpression( hltTriggerResults, *hltLogicalExpression ) ) return true;
537  }
538  return false;
539  }
540  for ( std::vector< std::string >::const_iterator hltLogicalExpression = hltLogicalExpressions_.begin(); hltLogicalExpression != hltLogicalExpressions_.end(); ++hltLogicalExpression ) {
541  if ( ! acceptHltLogicalExpression( hltTriggerResults, *hltLogicalExpression ) ) return false;
542  }
543  return true;
544 
545 }
546 
547 
550 {
551 
552  // Check empty std::strings
553  if ( hltLogicalExpression.empty() ) {
554  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty logical expression ==> decision: " << errorReplyHlt_;
555  return errorReplyHlt_;
556  }
557 
558  // Negated paths
559  bool negExpr( negate( hltLogicalExpression ) );
560  if ( negExpr && hltLogicalExpression.empty() ) {
561  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty (negated) logical expression ==> decision: " << errorReplyHlt_;
562  return errorReplyHlt_;
563  }
564 
565  // Parse logical expression and determine HLT decision
566  L1GtLogicParser hltAlgoLogicParser( hltLogicalExpression );
567  // Loop over paths
568  for ( size_t iPath = 0; iPath < hltAlgoLogicParser.operandTokenVector().size(); ++iPath ) {
569  const std::string hltPathName( hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenName );
570  const unsigned indexPath( hltConfig_.triggerIndex( hltPathName ) );
571  // Further error checks
572  if ( indexPath == hltConfig_.size() ) {
573  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "HLT path \"" << hltPathName << "\" is not found in process " << hltInputTag_.process() << " ==> decision: " << errorReplyHlt_;
574  hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenResult = errorReplyHlt_;
575  continue;
576  }
577  if ( hltTriggerResults->error( indexPath ) ) {
578  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "HLT path \"" << hltPathName << "\" in error ==> decision: " << errorReplyHlt_;
579  hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenResult = errorReplyHlt_;
580  continue;
581  }
582  // Manipulate algo decision as stored in the parser
583  const bool decision( hltTriggerResults->accept( indexPath ) );
584  hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenResult = decision;
585  }
586 
587  // Determine decision
588  const bool hltDecision( hltAlgoLogicParser.expressionResult() );
589  return negExpr ? ( ! hltDecision ) : hltDecision;
590 
591 }
592 
593 
594 
596 std::string GenericTriggerEventFlag::expandLogicalExpression( const std::vector< std::string > & targets, const std::string & expr, bool useAnd ) const
597 {
598 
599  // Find matching entries in the menu
600  std::vector< std::string > matched;
601  const std::string versionWildcard( "_v*" );
602  if ( expr.substr( expr.size() - versionWildcard.size() ) == versionWildcard ) {
603  const std::string exprBase( expr.substr( 0, expr.size() - versionWildcard.size() ) );
604  matched = hltConfig_.restoreVersion( targets, exprBase );
605  } else {
606  matched = hltConfig_.matched( targets, expr );
607  }
608 
609  // Return input, if no match is found
610  if ( matched.empty() ) {
611  if ( verbose_ > 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Logical expression: \"" << expr << "\" could not be resolved";
612  return expr;
613  }
614 
615  // Compose logical expression
616  std::string expanded( "(" );
617  for ( unsigned iVers = 0; iVers < matched.size(); ++iVers ) {
618  if ( iVers > 0 ) expanded.append( useAnd ? " AND " : " OR " );
619  expanded.append( matched.at( iVers ) );
620  }
621  expanded.append( ")" );
622  if ( verbose_ > 1 ) edm::LogInfo( "GenericTriggerEventFlag" ) << "Logical expression: \"" << expr << "\"\n"
623  << " --> expanded to \"" << expanded << "\"";
624 
625  return expanded;
626 
627 }
628 
629 
630 
633 {
634 
635  bool negate( false );
636  if ( word.at( 0 ) == '~' ) {
637  negate = true;
638  word.erase( 0, 1 );
639  }
640  return negate;
641 
642 }
643 
644 
645 
648 {
649  if ( key.size() == 0 ) return std::vector< std::string >( 1, emptyKeyError_ );
650  edm::ESHandle< AlCaRecoTriggerBits > logicalExpressions;
651  std::vector< edm::eventsetup::DataKey > labels;
652  setup.get< AlCaRecoTriggerBitsRcd >().fillRegisteredDataKeys( labels );
653  std::vector< edm::eventsetup::DataKey >::const_iterator iKey = labels.begin();
654  while ( iKey != labels.end() && iKey->name().value() != dbLabel_ ) ++iKey;
655  if ( iKey == labels.end() ) {
656  if ( verbose_ > 0 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Label " << dbLabel_ << " not found in DB for 'AlCaRecoTriggerBitsRcd'";
657  return std::vector< std::string >( 1, configError_ );
658  }
659  setup.get< AlCaRecoTriggerBitsRcd >().get( dbLabel_, logicalExpressions );
660  const std::map< std::string, std::string > & expressionMap = logicalExpressions->m_alcarecoToTrig;
661  std::map< std::string, std::string >::const_iterator listIter = expressionMap.find( key );
662  if ( listIter == expressionMap.end() ) {
663  if ( verbose_ > 0 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "No logical expressions found under key " << key << " in 'AlCaRecoTriggerBitsRcd'";
664  return std::vector< std::string >( 1, configError_ );
665  }
666  return logicalExpressions->decompose( listIter->second );
667 
668 }
unsigned int size() const
number of trigger paths in trigger table
bool negate(std::string &word) const
Checks for negated words.
T getParameter(std::string const &) const
std::vector< int > dcsPartitions_
static const std::vector< std::string > matched(const std::vector< std::string > &inputs, const std::string &pattern)
regexp processing
static const bool useL1GtTriggerMenuLite(false)
edm::EDGetTokenT< L1GlobalTriggerReadoutRecord > gtInputToken_
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
std::map< std::string, L1GtAlgorithm > AlgorithmMap
map containing the algorithms
std::vector< std::string > gtLogicalExpressions_
std::vector< std::string > hltLogicalExpressions_
const std::vector< std::string > & triggerNames() const
names of trigger paths
GenericTriggerEventFlag(const edm::ParameterSet &config, edm::ConsumesCollector &&iC, T &module)
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::EDGetTokenT< edm::TriggerResults > hltInputToken_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
std::string encode() const
Definition: InputTag.cc:164
std::unique_ptr< L1GtUtils > l1Gt_
std::vector< std::string > l1LogicalExpressionsCache_
bool acceptHlt(const edm::Event &event)
Was this event accepted by the configured HLT logical expression combination?
AlgorithmMap::const_iterator CItAlgo
iterators through map containing the algorithms
bool acceptDcsPartition(const edm::Handle< DcsStatusCollection > &dcsStatus, int dcsPartition) const
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
edm::EDGetTokenT< DcsStatusCollection > dcsInputToken_
std::vector< std::string > expressionsFromDB(const std::string &key, const edm::EventSetup &setup)
Reads and returns logical expressions from DB.
std::vector< OperandToken > & operandTokenVector()
return the vector of operand tokens
bool accept(const edm::Event &event, const edm::EventSetup &setup)
To be called from analyze/filter() methods.
bool acceptGtLogicalExpression(const edm::Event &event, std::string gtLogicalExpression)
Does this event fulfill this particular GT status bits&#39; logical expression?
~GenericTriggerEventFlag()
To be called from d&#39;tors by &#39;delete&#39;.
edm::EDGetTokenT< L1GlobalTriggerEvmReadoutRecord > gtEvmInputToken_
static const bool useL1EventSetup(true)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool isValid() const
Definition: HandleBase.h:75
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
std::vector< DcsStatus > DcsStatusCollection
Definition: DcsStatus.h:116
edm::ESWatcher< AlCaRecoTriggerBitsRcd > * watchDB_
bool acceptDcs(const edm::Event &event)
std::vector< std::string > hltLogicalExpressionsCache_
static const std::vector< std::string > restoreVersion(const std::vector< std::string > &inputs, const std::string &trigger)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
const T & get() const
Definition: EventSetup.h:56
bool acceptL1LogicalExpression(const edm::Event &event, const edm::EventSetup &setup, std::string l1LogicalExpression)
Was this event accepted by this particular L1 algorithms&#39; logical expression?
std::vector< std::string > l1LogicalExpressions_
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
std::string const & process() const
Definition: InputTag.h:40
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
volatile std::atomic< bool > shutdown_flag false
void initRun(const edm::Run &run, const edm::EventSetup &setup)
To be called from beginRun() methods.
std::string expandLogicalExpression(const std::vector< std::string > &target, const std::string &expr, bool useAnd=false) const
Expand wild-carded logical expressions, giving version postfixes priority.
std::unique_ptr< l1t::L1TGlobalUtil > l1uGt_
Definition: Run.h:43
bool acceptHltLogicalExpression(const edm::Handle< edm::TriggerResults > &hltTriggerResults, std::string hltLogicalExpression) const
Was this event accepted by this particular HLT paths&#39; logical expression?
bool acceptL1(const edm::Event &event, const edm::EventSetup &setup)
Was this event accepted by the configured L1 logical expression combination?
virtual const bool expressionResult() const
bool acceptGt(const edm::Event &event)
Does this event fulfill the configured GT status logical expression combination?