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.3 2010/05/12 12:57:50 vadler Exp $
3 //
4 
5 
7 
11 
12 #include <string>
13 #include <vector>
14 
16 
17 
20  : watchDB_( 0 )
21  , verbose_( 0 )
22  , gtDBKey_( "" )
23  , l1DBKey_( "" )
24  , hltDBKey_( "" )
25  , on_( true )
26  , onDcs_( true )
27  , onGt_( true )
28  , onL1_( true )
29  , onHlt_( true )
30  , configError_( "CONFIG_ERROR" )
31 {
32 
33  // General switch(es)
34  if ( config.exists( "andOr" ) ) {
35  andOr_ = config.getParameter< bool >( "andOr" );
36  if ( config.exists( "verbosityLevel" ) ) verbose_ = config.getParameter< unsigned >( "verbosityLevel" );
37  } else {
38  on_ = false;
39  onDcs_ = false;
40  onGt_ = false;
41  onL1_ = false;
42  onHlt_ = false;
43  }
44 
45  if ( on_ ) {
46  if ( config.exists( "andOrDcs" ) ) {
47  andOrDcs_ = config.getParameter< bool >( "andOrDcs" );
48  dcsInputTag_ = config.getParameter< edm::InputTag >( "dcsInputTag" );
49  dcsPartitions_ = config.getParameter< std::vector< int > >( "dcsPartitions" );
50  errorReplyDcs_ = config.getParameter< bool >( "errorReplyDcs" );
51  } else {
52  onDcs_ = false;
53  }
54  if ( config.exists( "andOrGt" ) ) {
55  andOrGt_ = config.getParameter< bool >( "andOrGt" );
56  gtInputTag_ = config.getParameter< edm::InputTag >( "gtInputTag" );
57  gtLogicalExpressions_ = config.getParameter< std::vector< std::string > >( "gtStatusBits" );
58  errorReplyGt_ = config.getParameter< bool >( "errorReplyGt" );
59  if ( config.exists( "gtDBKey" ) ) gtDBKey_ = config.getParameter< std::string >( "gtDBKey" );
60  } else {
61  onGt_ = false;
62  }
63  if ( config.exists( "andOrL1" ) ) {
64  andOrL1_ = config.getParameter< bool >( "andOrL1" );
65  l1LogicalExpressions_ = config.getParameter< std::vector< std::string > >( "l1Algorithms" );
66  errorReplyL1_ = config.getParameter< bool >( "errorReplyL1" );
67  if ( config.exists( "l1DBKey" ) ) l1DBKey_ = config.getParameter< std::string >( "l1DBKey" );
68  } else {
69  onL1_ = false;
70  }
71  if ( config.exists( "andOrHlt" ) ) {
72  andOrHlt_ = config.getParameter< bool >( "andOrHlt" );
73  hltInputTag_ = config.getParameter< edm::InputTag >( "hltInputTag" );
74  hltLogicalExpressions_ = config.getParameter< std::vector< std::string > >( "hltPaths" );
75  errorReplyHlt_ = config.getParameter< bool >( "errorReplyHlt" );
76  if ( config.exists( "hltDBKey" ) ) hltDBKey_ = config.getParameter< std::string >( "hltDBKey" );
77  } else {
78  onHlt_ = false;
79  }
80  if ( ! onDcs_ && ! onGt_ && ! onL1_ && ! onHlt_ ) on_ = false;
82  }
83 
84 }
85 
86 
89 {
90 
91  if ( on_ ) delete watchDB_;
92 
93 }
94 
95 
98 {
99 
100  // FIXME Can this stay safely in the run loop, or does it need to go to the event loop?
101  // Means: Are the event setups identical?
102  if ( watchDB_->check( setup ) ) {
103  if ( onGt_ && gtDBKey_.size() > 0 ) {
104  const std::vector< std::string > exprs( expressionsFromDB( gtDBKey_, setup ) );
105  if ( exprs.empty() || exprs.at( 0 ) != configError_ ) gtLogicalExpressions_ = exprs;
106  }
107  if ( onL1_ && l1DBKey_.size() > 0 ) {
108  const std::vector< std::string > exprs( expressionsFromDB( l1DBKey_, setup ) );
109  if ( exprs.empty() || exprs.at( 0 ) != configError_ ) l1LogicalExpressions_ = exprs;
110  }
111  if ( onHlt_ && hltDBKey_.size() > 0 ) {
112  const std::vector< std::string > exprs( expressionsFromDB( hltDBKey_, setup ) );
113  if ( exprs.empty() || exprs.at( 0 ) != configError_ ) hltLogicalExpressions_ = exprs;
114  }
115  }
116 
117  hltConfigInit_ = false;
118  if ( onHlt_ ) {
119  if ( hltInputTag_.process().size() == 0 ) {
120  if ( verbose_ > 0 ) edm::LogError( "GenericTriggerEventFlag" ) << "HLT TriggerResults InputTag \"" << hltInputTag_.encode() << "\" specifies no process";
121  } else {
122  bool hltChanged( false );
123  if ( ! hltConfig_.init( run, setup, hltInputTag_.process(), hltChanged ) ) {
124  if ( verbose_ > 0 ) edm::LogError( "GenericTriggerEventFlag" ) << "HLT config initialization error with process name \"" << hltInputTag_.process() << "\"";
125  } else if ( hltConfig_.size() <= 0 ) {
126  if ( verbose_ > 0 ) edm::LogError( "GenericTriggerEventFlag" ) << "HLT config size error";
127  } else hltConfigInit_ = true;
128  }
129  }
130 
131 }
132 
133 
136 {
137 
138  if ( ! on_ ) return true;
139 
140  // Determine decision
141  if ( andOr_ ) return ( acceptDcs( event ) || acceptGt( event ) || acceptL1( event, setup ) || acceptHlt( event ) );
142  return ( acceptDcs( event ) && acceptGt( event ) && acceptL1( event, setup ) && acceptHlt( event ) );
143 
144 }
145 
146 
148 {
149 
150  // An empty DCS partitions list acts as switch.
151  if ( ! onDcs_ || dcsPartitions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
152 
153  // Accessing the DcsStatusCollection
155  event.getByLabel( dcsInputTag_, dcsStatus );
156  if ( ! dcsStatus.isValid() ) {
157  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "DcsStatusCollection product with InputTag \"" << dcsInputTag_.encode() << "\" not in event ==> decision: " << errorReplyDcs_;
158  return errorReplyDcs_;
159  }
160  if ( ( *dcsStatus ).size() == 0 ) {
161  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "DcsStatusCollection product with InputTag \"" << dcsInputTag_.encode() << "\" empty ==> decision: " << errorReplyDcs_;
162  return errorReplyDcs_;
163  }
164 
165  // Determine decision of DCS partition combination and return
166  if ( andOrDcs_ ) { // OR combination
167  for ( std::vector< int >::const_iterator partitionNumber = dcsPartitions_.begin(); partitionNumber != dcsPartitions_.end(); ++partitionNumber ) {
168  if ( acceptDcsPartition( dcsStatus, *partitionNumber ) ) return true;
169  }
170  return false;
171  }
172  for ( std::vector< int >::const_iterator partitionNumber = dcsPartitions_.begin(); partitionNumber != dcsPartitions_.end(); ++partitionNumber ) {
173  if ( ! acceptDcsPartition( dcsStatus, *partitionNumber ) ) return false;
174  }
175  return true;
176 
177 }
178 
179 
181 {
182 
183  // Error checks
184  switch( dcsPartition ) {
185  case DcsStatus::EBp :
186  case DcsStatus::EBm :
187  case DcsStatus::EEp :
188  case DcsStatus::EEm :
189  case DcsStatus::HBHEa :
190  case DcsStatus::HBHEb :
191  case DcsStatus::HBHEc :
192  case DcsStatus::HF :
193  case DcsStatus::HO :
194  case DcsStatus::RPC :
195  case DcsStatus::DT0 :
196  case DcsStatus::DTp :
197  case DcsStatus::DTm :
198  case DcsStatus::CSCp :
199  case DcsStatus::CSCm :
200  case DcsStatus::CASTOR:
201  case DcsStatus::TIBTID:
202  case DcsStatus::TOB :
203  case DcsStatus::TECp :
204  case DcsStatus::TECm :
205  case DcsStatus::BPIX :
206  case DcsStatus::FPIX :
207  case DcsStatus::ESp :
208  case DcsStatus::ESm :
209  break;
210  default:
211  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "DCS partition number \"" << dcsPartition << "\" does not exist ==> decision: " << errorReplyDcs_;
212  return errorReplyDcs_;
213  }
214 
215  // Determine decision
216  return dcsStatus->at( 0 ).ready( dcsPartition );
217 
218 }
219 
220 
223 {
224 
225  // An empty GT status bits logical expressions list acts as switch.
226  if ( ! onGt_ || gtLogicalExpressions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
227 
228  // Accessing the L1GlobalTriggerReadoutRecord
230  event.getByLabel( gtInputTag_, gtReadoutRecord );
231  if ( ! gtReadoutRecord.isValid() ) {
232  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "L1GlobalTriggerReadoutRecord product with InputTag \"" << gtInputTag_.encode() << "\" not in event ==> decision: " << errorReplyGt_;
233  return errorReplyGt_;
234  }
235 
236  // Determine decision of GT status bits logical expression combination and return
237  if ( andOrGt_ ) { // OR combination
238  for ( std::vector< std::string >::const_iterator gtLogicalExpression = gtLogicalExpressions_.begin(); gtLogicalExpression != gtLogicalExpressions_.end(); ++gtLogicalExpression ) {
239  if ( acceptGtLogicalExpression( gtReadoutRecord, *gtLogicalExpression ) ) return true;
240  }
241  return false;
242  }
243  for ( std::vector< std::string >::const_iterator gtLogicalExpression = gtLogicalExpressions_.begin(); gtLogicalExpression != gtLogicalExpressions_.end(); ++gtLogicalExpression ) {
244  if ( ! acceptGtLogicalExpression( gtReadoutRecord, *gtLogicalExpression ) ) return false;
245  }
246  return true;
247 
248 }
249 
250 
252 bool GenericTriggerEventFlag::acceptGtLogicalExpression( const edm::Handle< L1GlobalTriggerReadoutRecord > & gtReadoutRecord, std::string gtLogicalExpression )
253 {
254 
255  // Check empty std::strings
256  if ( gtLogicalExpression.empty() ) {
257  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty logical expression ==> decision: " << errorReplyGt_;
258  return errorReplyGt_;
259  }
260 
261  // Negated paths
262  bool negExpr( negate( gtLogicalExpression ) );
263  if ( negExpr && gtLogicalExpression.empty() ) {
264  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty (negated) logical expression ==> decision: " << errorReplyGt_;
265  return errorReplyGt_;
266  }
267 
268  // Parse logical expression and determine GT status bit decision
269  L1GtLogicParser gtAlgoLogicParser( gtLogicalExpression );
270  // Loop over status bits
271  for ( size_t iStatusBit = 0; iStatusBit < gtAlgoLogicParser.operandTokenVector().size(); ++iStatusBit ) {
272  const std::string gtStatusBit( gtAlgoLogicParser.operandTokenVector().at( iStatusBit ).tokenName );
273  // Manipulate status bit decision as stored in the parser
274  bool decision;
275  // Hard-coded status bits!!!
276  if ( gtStatusBit == "PhysDecl" || gtStatusBit == "PhysicsDeclared" ) {
277  decision = ( gtReadoutRecord->gtFdlWord().physicsDeclared() == 1 );
278  } else {
279  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "GT status bit \"" << gtStatusBit << "\" is not defined ==> decision: " << errorReplyGt_;
280  decision = errorReplyDcs_;
281  }
282  gtAlgoLogicParser.operandTokenVector().at( iStatusBit ).tokenResult = decision;
283  }
284 
285  // Determine decision
286  const bool gtDecision( gtAlgoLogicParser.expressionResult() );
287  return negExpr ? ( ! gtDecision ) : gtDecision;
288 
289 }
290 
291 
294 {
295 
296  // An empty L1 logical expressions list acts as switch.
297  if ( ! onL1_ || l1LogicalExpressions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
298 
299  // Getting the L1 event setup
300  l1Gt_.retrieveL1EventSetup( setup ); // FIXME This can possibly go to initRun()
301 
302  // Determine decision of L1 logical expression combination and return
303  if ( andOrL1_ ) { // OR combination
304  for ( std::vector< std::string >::const_iterator l1LogicalExpression = l1LogicalExpressions_.begin(); l1LogicalExpression != l1LogicalExpressions_.end(); ++l1LogicalExpression ) {
305  if ( acceptL1LogicalExpression( event, *l1LogicalExpression ) ) return true;
306  }
307  return false;
308  }
309  for ( std::vector< std::string >::const_iterator l1LogicalExpression = l1LogicalExpressions_.begin(); l1LogicalExpression != l1LogicalExpressions_.end(); ++l1LogicalExpression ) {
310  if ( ! acceptL1LogicalExpression( event, *l1LogicalExpression ) ) return false;
311  }
312  return true;
313 
314 }
315 
316 
318 bool GenericTriggerEventFlag::acceptL1LogicalExpression( const edm::Event & event, std::string l1LogicalExpression )
319 {
320 
321  // Check empty std::strings
322  if ( l1LogicalExpression.empty() ) {
323  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty logical expression ==> decision: " << errorReplyL1_;
324  return errorReplyL1_;
325  }
326 
327  // Negated logical expression
328  bool negExpr( negate( l1LogicalExpression ) );
329  if ( negExpr && l1LogicalExpression.empty() ) {
330  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty (negated) logical expression ==> decision: " << errorReplyL1_;
331  return errorReplyL1_;
332  }
333 
334  // Parse logical expression and determine L1 decision
335  L1GtLogicParser l1AlgoLogicParser( l1LogicalExpression );
336  // Loop over algorithms
337  for ( size_t iAlgorithm = 0; iAlgorithm < l1AlgoLogicParser.operandTokenVector().size(); ++iAlgorithm ) {
338  const std::string l1AlgoName( l1AlgoLogicParser.operandTokenVector().at( iAlgorithm ).tokenName );
339  int error( -1 );
340  const bool decision( l1Gt_.decision( event, l1AlgoName, error ) );
341  // Error checks
342  if ( error != 0 ) {
343  if ( verbose_ > 2 ) {
344  if ( error == 1 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "L1 algorithm \"" << l1AlgoName << "\" does not exist in the L1 menu ==> decision: " << errorReplyL1_;
345  else edm::LogWarning( "GenericTriggerEventFlag" ) << "L1 algorithm \"" << l1AlgoName << "\" received error code " << error << " from L1GtUtils::decisionBeforeMask ==> decision: " << errorReplyL1_;
346  }
347  l1AlgoLogicParser.operandTokenVector().at( iAlgorithm ).tokenResult = errorReplyL1_;
348  continue;
349  }
350  // Manipulate algo decision as stored in the parser
351  l1AlgoLogicParser.operandTokenVector().at( iAlgorithm ).tokenResult = decision;
352  }
353 
354  // Return decision
355  const bool l1Decision( l1AlgoLogicParser.expressionResult() );
356  return negExpr ? ( ! l1Decision ) : l1Decision;
357 
358 }
359 
360 
363 {
364 
365  // An empty HLT logical expressions list acts as switch.
366  if ( ! onHlt_ || hltLogicalExpressions_.empty() ) return ( ! andOr_ ); // logically neutral, depending on base logical connective
367 
368  // Checking the HLT configuration,
369  if ( ! hltConfigInit_ ) {
370  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "HLT config error ==> decision: " << errorReplyHlt_;
371  return errorReplyHlt_;
372  }
373 
374  // Accessing the TriggerResults
375  edm::Handle< edm::TriggerResults > hltTriggerResults;
376  event.getByLabel( hltInputTag_, hltTriggerResults );
377  if ( ! hltTriggerResults.isValid() ) {
378  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "TriggerResults product with InputTag \"" << hltInputTag_.encode() << "\" not in event ==> decision: " << errorReplyHlt_;
379  return errorReplyHlt_;
380  }
381  if ( ( *hltTriggerResults ).size() == 0 ) {
382  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "TriggerResults product with InputTag \"" << hltInputTag_.encode() << "\" empty ==> decision: " << errorReplyHlt_;
383  return errorReplyDcs_;
384  }
385 
386  // Determine decision of HLT logical expression combination and return
387  if ( andOrHlt_ ) { // OR combination
388  for ( std::vector< std::string >::const_iterator hltLogicalExpression = hltLogicalExpressions_.begin(); hltLogicalExpression != hltLogicalExpressions_.end(); ++hltLogicalExpression ) {
389  if ( acceptHltLogicalExpression( hltTriggerResults, *hltLogicalExpression ) ) return true;
390  }
391  return false;
392  }
393  for ( std::vector< std::string >::const_iterator hltLogicalExpression = hltLogicalExpressions_.begin(); hltLogicalExpression != hltLogicalExpressions_.end(); ++hltLogicalExpression ) {
394  if ( ! acceptHltLogicalExpression( hltTriggerResults, *hltLogicalExpression ) ) return false;
395  }
396  return true;
397 
398 }
399 
400 
402 bool GenericTriggerEventFlag::acceptHltLogicalExpression( const edm::Handle< edm::TriggerResults > & hltTriggerResults, std::string hltLogicalExpression ) const
403 {
404 
405  // Check empty std::strings
406  if ( hltLogicalExpression.empty() ) {
407  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty logical expression ==> decision: " << errorReplyHlt_;
408  return errorReplyHlt_;
409  }
410 
411  // Negated paths
412  bool negExpr( negate( hltLogicalExpression ) );
413  if ( negExpr && hltLogicalExpression.empty() ) {
414  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "Empty (negated) logical expression ==> decision: " << errorReplyHlt_;
415  return errorReplyHlt_;
416  }
417 
418  // Parse logical expression and determine HLT decision
419  L1GtLogicParser hltAlgoLogicParser( hltLogicalExpression );
420  // Loop over paths
421  for ( size_t iPath = 0; iPath < hltAlgoLogicParser.operandTokenVector().size(); ++iPath ) {
422  const std::string hltPathName( hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenName );
423  const unsigned indexPath( hltConfig_.triggerIndex( hltPathName ) );
424  // Further error checks
425  if ( indexPath == hltConfig_.size() ) {
426  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "HLT path \"" << hltPathName << "\" is not found in process " << hltInputTag_.process() << " ==> decision: " << errorReplyHlt_;
427  hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenResult = errorReplyHlt_;
428  continue;
429  }
430  if ( hltTriggerResults->error( indexPath ) ) {
431  if ( verbose_ > 2 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "HLT path \"" << hltPathName << "\" in error ==> decision: " << errorReplyHlt_;
432  hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenResult = errorReplyHlt_;
433  continue;
434  }
435  // Manipulate algo decision as stored in the parser
436  const bool decision( hltTriggerResults->accept( indexPath ) );
437  hltAlgoLogicParser.operandTokenVector().at( iPath ).tokenResult = decision;
438  }
439 
440  // Determine decision
441  const bool hltDecision( hltAlgoLogicParser.expressionResult() );
442  return negExpr ? ( ! hltDecision ) : hltDecision;
443 
444 }
445 
446 
447 
449 std::vector< std::string > GenericTriggerEventFlag::expressionsFromDB( const std::string & key, const edm::EventSetup & setup )
450 {
451 
452  edm::ESHandle< AlCaRecoTriggerBits > logicalExpressions;
453  setup.get< AlCaRecoTriggerBitsRcd >().get( logicalExpressions );
454  const std::map< std::string, std::string > & expressionMap = logicalExpressions->m_alcarecoToTrig;
455  std::map< std::string, std::string >::const_iterator listIter = expressionMap.find( key );
456  if ( listIter == expressionMap.end() ) {
457  if ( verbose_ > 0 ) edm::LogWarning( "GenericTriggerEventFlag" ) << "No logical expressions found under key " << key << " in 'AlCaRecoTriggerBitsRcd'";
458  return std::vector< std::string >( 1, configError_ );
459  }
460  return logicalExpressions->decompose( listIter->second );
461 
462 }
463 
464 
465 
467 bool GenericTriggerEventFlag::negate( std::string & word ) const
468 {
469 
470  bool negate( false );
471  if ( word.at( 0 ) == '~' ) {
472  negate = true;
473  word.erase( 0, 1 );
474  }
475  return negate;
476 
477 }
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_
std::vector< std::string > gtLogicalExpressions_
std::vector< std::string > hltLogicalExpressions_
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::string encode() const
Definition: InputTag.cc:72
bool acceptHlt(const edm::Event &event)
Was this event accepted by the configured HLT logical expression combination?
bool acceptGtLogicalExpression(const edm::Handle< L1GlobalTriggerReadoutRecord > &gtReadoutRecord, std::string gtLogicalExpression)
Does this event fulfill this particular GT status bits&#39; logical expression?
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)
std::vector< std::string > expressionsFromDB(const std::string &key, const edm::EventSetup &setup)
Reads and returns logical expressions from DB.
const bool decision(const edm::Event &iEvent, const edm::InputTag &l1GtRecordInputTag, const edm::InputTag &l1GtReadoutRecordInputTag, const std::string &nameAlgoTechTrig, int &errorCode) const
Definition: L1GtUtils.cc:1184
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 acceptL1LogicalExpression(const edm::Event &event, std::string l1LogicalExpression)
Was this event accepted by this particular L1 algorithms&#39; logical expression?
GenericTriggerEventFlag(const edm::ParameterSet &config)
To be called from the ED module&#39;s c&#39;tor.
~GenericTriggerEventFlag()
To be called from d&#39;tors by &#39;delete&#39;.
void retrieveL1EventSetup(const edm::EventSetup &)
retrieve all the relevant L1 trigger event setup records and cache them to improve the speed ...
Definition: L1GtUtils.cc:107
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:76
edm::ESWatcher< AlCaRecoTriggerBitsRcd > * watchDB_
bool acceptDcs(const edm::Event &event)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
const T & get() const
Definition: EventSetup.h:55
std::vector< std::string > l1LogicalExpressions_
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:59
std::string const & process() const
Definition: InputTag.h:29
list key
Definition: combine.py:13
tuple config
Definition: cmsDriver.py:17
void initRun(const edm::Run &run, const edm::EventSetup &setup)
To be called from beginedm::Run() methods.
Definition: Run.h:31
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?