CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PATTriggerProducer.cc
Go to the documentation of this file.
1 //
2 //
3 
4 
6 
7 #include <vector>
8 #include <map>
9 #include <utility>
10 #include <cassert>
11 #include <string>
12 
14 
24 
30 
33 
34 using namespace pat;
35 using namespace edm;
36 
37 
38 // Constants' definitions
42 static const bool useL1EventSetup( true );
43 static const bool useL1GtTriggerMenuLite( false );
44 
45 
47  nameProcess_( iConfig.getParameter< std::string >( "processName" ) ),
48  autoProcessName_( nameProcess_ == "*" ),
49  onlyStandAlone_( iConfig.getParameter< bool >( "onlyStandAlone" ) ),
50  firstInRun_( true ),
51  // L1 configuration parameters
52  addL1Algos_( false ),
53  tagL1GlobalTriggerObjectMaps_( "l1L1GtObjectMap" ),
54  tagL1ExtraMu_(),
55  tagL1ExtraNoIsoEG_(),
56  tagL1ExtraIsoEG_(),
57  tagL1ExtraCenJet_(),
58  tagL1ExtraForJet_(),
59  tagL1ExtraTauJet_(),
60  tagL1ExtraETM_(),
61  tagL1ExtraHTM_(),
62  autoProcessNameL1ExtraMu_( false ),
63  autoProcessNameL1ExtraNoIsoEG_( false ),
64  autoProcessNameL1ExtraIsoEG_( false ),
65  autoProcessNameL1ExtraCenJet_( false ),
66  autoProcessNameL1ExtraForJet_( false ),
67  autoProcessNameL1ExtraTauJet_( false ),
68  autoProcessNameL1ExtraETM_( false ),
69  autoProcessNameL1ExtraHTM_( false ),
70  mainBxOnly_( true ),
71  saveL1Refs_( false ),
72  // HLTConfigProvider
73  hltConfigInit_( false ),
74  // HLT configuration parameters
75  tagTriggerResults_( "TriggerResults" ),
76  tagTriggerEvent_( "hltTriggerSummaryAOD" ),
77  hltPrescaleLabel_(),
78  labelHltPrescaleTable_(),
79  hltPrescaleTableRun_(),
80  hltPrescaleTableLumi_(),
81  addPathModuleLabels_( false ),
82  packPathNames_( iConfig.existsAs<bool>("packTriggerPathNames") ? iConfig.getParameter<bool>("packTriggerPathNames") : false ),
83  packPrescales_( iConfig.existsAs<bool>("packTriggerPrescales") ? iConfig.getParameter<bool>("packTriggerPrescales") : true )
84 {
85 
86  // L1 configuration parameters
87  if ( iConfig.exists( "addL1Algos" ) ) addL1Algos_ = iConfig.getParameter< bool >( "addL1Algos" );
88  if ( iConfig.exists( "l1GlobalTriggerObjectMaps" ) ) tagL1GlobalTriggerObjectMaps_ = iConfig.getParameter< InputTag >( "l1GlobalTriggerObjectMaps" );
89  l1GlobalTriggerObjectMapsToken_ = mayConsume< L1GlobalTriggerObjectMaps >( tagL1GlobalTriggerObjectMaps_ );
90  if ( iConfig.exists( "l1ExtraMu" ) ) {
91  tagL1ExtraMu_ = iConfig.getParameter< InputTag >( "l1ExtraMu" );
92  if ( tagL1ExtraMu_.process() == "*" ) {
95  }
97  }
98  if ( iConfig.exists( "l1ExtraNoIsoEG" ) ) {
99  tagL1ExtraNoIsoEG_ = iConfig.getParameter< InputTag >( "l1ExtraNoIsoEG" );
100  if ( tagL1ExtraNoIsoEG_.process() == "*" ) {
103  }
105  }
106  if ( iConfig.exists( "l1ExtraIsoEG" ) ) {
107  tagL1ExtraIsoEG_ = iConfig.getParameter< InputTag >( "l1ExtraIsoEG" );
108  if ( tagL1ExtraIsoEG_.process() == "*" ) {
111  }
113  }
114  if ( iConfig.exists( "l1ExtraCenJet" ) ) {
115  tagL1ExtraCenJet_ = iConfig.getParameter< InputTag >( "l1ExtraCenJet" );
116  if ( tagL1ExtraCenJet_.process() == "*" ) {
119  }
121  }
122  if ( iConfig.exists( "l1ExtraForJet" ) ) {
123  tagL1ExtraForJet_ = iConfig.getParameter< InputTag >( "l1ExtraForJet" );
124  if ( tagL1ExtraForJet_.process() == "*" ) {
127  }
129  }
130  if ( iConfig.exists( "l1ExtraTauJet" ) ) {
131  tagL1ExtraTauJet_ = iConfig.getParameter< InputTag >( "l1ExtraTauJet" );
132  if ( tagL1ExtraTauJet_.process() == "*" ) {
135  }
137  }
138  if ( iConfig.exists( "l1ExtraETM" ) ) {
139  tagL1ExtraETM_ = iConfig.getParameter< InputTag >( "l1ExtraETM" );
140  if ( tagL1ExtraETM_.process() == "*" ) {
143  }
145  }
146  if ( iConfig.exists( "l1ExtraHTM" ) ) {
147  tagL1ExtraHTM_ = iConfig.getParameter< InputTag >( "l1ExtraHTM" );
148  if ( tagL1ExtraHTM_.process() == "*" ) {
151  }
153  }
154  if ( iConfig.exists( "mainBxOnly" ) ) mainBxOnly_ = iConfig.getParameter< bool >( "mainBxOnly" );
155  if ( iConfig.exists( "saveL1Refs" ) ) saveL1Refs_ = iConfig.getParameter< bool >( "saveL1Refs" );
156 
157  // HLT configuration parameters
158  if ( iConfig.exists( "triggerResults" ) ) tagTriggerResults_ = iConfig.getParameter< InputTag >( "triggerResults" );
160  if ( iConfig.exists( "triggerEvent" ) ) tagTriggerEvent_ = iConfig.getParameter< InputTag >( "triggerEvent" );
162  if ( iConfig.exists( "hltPrescaleLabel" ) ) hltPrescaleLabel_ = iConfig.getParameter< std::string >( "hltPrescaleLabel" );
163  if ( iConfig.exists( "hltPrescaleTable" ) ) {
164  labelHltPrescaleTable_ = iConfig.getParameter< std::string >( "hltPrescaleTable" );
168  }
169  if ( iConfig.exists( "addPathModuleLabels" ) ) addPathModuleLabels_ = iConfig.getParameter< bool >( "addPathModuleLabels" );
170  exludeCollections_.clear();
171  if ( iConfig.exists( "exludeCollections" ) ) exludeCollections_ = iConfig.getParameter< std::vector< std::string > >( "exludeCollections" );
172 
173  callWhenNewProductsRegistered( [ this, &iConfig ]( BranchDescription const& bd ) {
174  if ( iConfig.exists( "l1ExtraMu" ) ) l1ExtraMuGetter_( bd );
175  if ( iConfig.exists( "l1ExtraNoIsoEG" ) ) l1ExtraNoIsoEGGetter_( bd );
176  if ( iConfig.exists( "l1ExtraIsoEG" ) ) l1ExtraIsoEGGetter_( bd );
177  if ( iConfig.exists( "l1ExtraCenJet" ) ) l1ExtraCenJetGetter_( bd );
178  if ( iConfig.exists( "l1ExtraForJet" ) ) l1ExtraForJetGetter_( bd );
179  if ( iConfig.exists( "l1ExtraTauJet" ) ) l1ExtraTauJetGetter_( bd );
180  if ( iConfig.exists( "l1ExtraETM" ) ) l1ExtraETMGetter_( bd );
181  if ( iConfig.exists( "l1ExtraHTM" ) ) l1ExtraHTMGetter_( bd );
182  triggerResultsGetter_( bd );
183  triggerEventGetter_( bd );
184  if ( iConfig.exists( "hltPrescaleTable" ) ) {
188  }
189  } );
190 
191  if ( ! onlyStandAlone_ ) {
192  produces< TriggerAlgorithmCollection >();
193  produces< TriggerConditionCollection >();
194  produces< TriggerPathCollection >();
195  produces< TriggerFilterCollection >();
196  produces< TriggerObjectCollection >();
197  }
198  if (packPrescales_) {
199  produces< PackedTriggerPrescales >();
200  produces< PackedTriggerPrescales >("l1max");
201  produces< PackedTriggerPrescales >("l1min");
202  }
203  produces< TriggerObjectStandAloneCollection >();
204 
205 }
206 
207 
208 void PATTriggerProducer::beginRun(const Run & iRun, const EventSetup & iSetup )
209 {
210 
211  // Initialize
212  firstInRun_ = true;
213  l1PSet_ = 0;
214  hltConfigInit_ = false;
215 
216  // Initialize process name
217  if ( autoProcessName_ ) {
218  // reset
219  nameProcess_ = "*";
220  // determine process name from last run TriggerSummaryProducerAOD module in process history of input
221  const ProcessHistory & processHistory( iRun.processHistory() );
223  ParameterSet processPSet;
224  // unbroken loop, which relies on time ordering (accepts the last found entry)
225  for ( ProcessHistory::const_iterator iHist = processHistory.begin(); iHist != processHistory.end(); ++iHist ) {
226  if ( processHistory.getConfigurationForProcess( iHist->processName(), processConfiguration ) &&
227  pset::Registry::instance()->getMapped( processConfiguration.parameterSetID(), processPSet ) &&
228  processPSet.exists( tagTriggerEvent_.label() )
229  ) {
230  nameProcess_ = iHist->processName();
231  LogDebug( "autoProcessName" ) << "HLT process name '" << nameProcess_ << "' discovered";
232  }
233  }
234  // terminate, if nothing is found
235  if ( nameProcess_ == "*" ) {
236  LogError( "autoProcessName" ) << "trigger::TriggerEvent product with label '" << tagTriggerEvent_.label() << "' not produced according to process history of input data\n"
237  << "No trigger information produced";
238  return;
239  }
240  LogInfo( "autoProcessName" ) << "HLT process name' " << nameProcess_ << "' used for PAT trigger information";
241  }
242  // adapt configuration of used input tags
243  if ( tagTriggerResults_.process().empty() || tagTriggerResults_.process() == "*" ) {
245  } else if ( tagTriggerEvent_.process() != nameProcess_ ) {
246  LogWarning( "inputTags" ) << "TriggerResults process name '" << tagTriggerResults_.process() << "' differs from HLT process name '" << nameProcess_ << "'";
247  }
248  if ( tagTriggerEvent_.process().empty() || tagTriggerEvent_.process() == "*" ) {
250  } else if ( tagTriggerEvent_.process() != nameProcess_ ) {
251  LogWarning( "inputTags" ) << "TriggerEvent process name '" << tagTriggerEvent_.process() << "' differs from HLT process name '" << nameProcess_ << "'";
252  }
261 
262  // Initialize HLTConfigProvider
263  bool changed( true );
264  if ( ! hltConfig_.init( iRun, iSetup, nameProcess_, changed ) ) {
265  LogError( "hltConfig" ) << "HLT config extraction error with process name '" << nameProcess_ << "'";
266  } else if ( hltConfig_.size() <= 0 ) {
267  LogError( "hltConfig" ) << "HLT config size error";
268  } else hltConfigInit_ = true;
269 
270  // Update mapping from filter names to path names
272 
273  // Extract pre-scales
274  if ( hltConfigInit_ ) {
275  // Start empty
277  // Try run product, if configured
278  if ( ! labelHltPrescaleTable_.empty() ) {
279  Handle< trigger::HLTPrescaleTable > handleHltPrescaleTable;
280  iRun.getByLabel( InputTag( labelHltPrescaleTable_, "Run", nameProcess_ ), handleHltPrescaleTable );
281  if ( handleHltPrescaleTable.isValid() ) {
282  hltPrescaleTableRun_ = trigger::HLTPrescaleTable( handleHltPrescaleTable->set(), handleHltPrescaleTable->labels(), handleHltPrescaleTable->table() );
283  }
284  }
285  }
286 
287 }
288 
289 
290 void PATTriggerProducer::beginLuminosityBlock(const LuminosityBlock & iLuminosityBlock, const EventSetup & iSetup )
291 {
292 
293  // Terminate, if auto process name determination failed
294  if ( nameProcess_ == "*" ) return;
295 
296  // Extract pre-scales
297  if ( hltConfigInit_ ) {
298  // Start from run
300  // Try lumi product, if configured and available
301  if ( ! labelHltPrescaleTable_.empty() ) {
302  Handle< trigger::HLTPrescaleTable > handleHltPrescaleTable;
303  iLuminosityBlock.getByLabel( InputTag( labelHltPrescaleTable_, "Lumi", nameProcess_ ), handleHltPrescaleTable );
304  if ( handleHltPrescaleTable.isValid() ) {
305  hltPrescaleTableLumi_ = trigger::HLTPrescaleTable( handleHltPrescaleTable->set(), handleHltPrescaleTable->labels(), handleHltPrescaleTable->table() );
306  }
307  }
308  }
309 
310 }
311 
312 
314 {
315 
316  // Terminate, if auto process name determination failed
317  if ( nameProcess_ == "*" ) return;
318 
319  std::auto_ptr< TriggerObjectCollection > triggerObjects( new TriggerObjectCollection() );
320  std::auto_ptr< TriggerObjectStandAloneCollection > triggerObjectsStandAlone( new TriggerObjectStandAloneCollection() );
321  std::auto_ptr< PackedTriggerPrescales > packedPrescales, packedPrescalesL1min, packedPrescalesL1max;
322 
323  // HLT
324 
325  // Get and check HLT event data
326  Handle< trigger::TriggerEvent > handleTriggerEvent;
327  iEvent.getByLabel( tagTriggerEvent_, handleTriggerEvent );
328  Handle< TriggerResults > handleTriggerResults;
329  iEvent.getByLabel( tagTriggerResults_, handleTriggerResults );
330  bool goodHlt( hltConfigInit_ );
331  if ( goodHlt ) {
332  if( ! handleTriggerResults.isValid() ) {
333  LogError( "triggerResultsValid" ) << "TriggerResults product with InputTag '" << tagTriggerResults_.encode() << "' not in event\n"
334  << "No HLT information produced";
335  goodHlt = false;
336  } else if ( ! handleTriggerEvent.isValid() ) {
337  LogError( "triggerEventValid" ) << "trigger::TriggerEvent product with InputTag '" << tagTriggerEvent_.encode() << "' not in event\n"
338  << "No HLT information produced";
339  goodHlt = false;
340  }
341  }
342 
343  // Produce HLT paths and determine status of modules
344 
345  if ( goodHlt ) {
346 
347  // Extract pre-scales
348  // Start from lumi
350  // Try event product, if configured and available
351  if ( ! labelHltPrescaleTable_.empty() ) {
352  Handle< trigger::HLTPrescaleTable > handleHltPrescaleTable;
353  iEvent.getByLabel( InputTag( labelHltPrescaleTable_, "Event", nameProcess_ ), handleHltPrescaleTable );
354  if ( handleHltPrescaleTable.isValid() ) {
355  hltPrescaleTable = trigger::HLTPrescaleTable( handleHltPrescaleTable->set(), handleHltPrescaleTable->labels(), handleHltPrescaleTable->table() );
356  }
357  }
358  // Try event setup, if no product
359  if ( hltPrescaleTable.size() == 0 ) {
360  if ( ! labelHltPrescaleTable_.empty() ) {
361  LogWarning( "hltPrescaleInputTag" ) << "HLTPrescaleTable product with label '" << labelHltPrescaleTable_ << "' not found in process" << nameProcess_ << "\n"
362  << "Using default from event setup";
363  }
364  if ( hltConfig_.prescaleSize() > 0 ) {
365  if ( hltConfig_.prescaleSet( iEvent, iSetup ) != -1 ) {
367  LogDebug( "hltPrescaleTable" ) << "HLT prescale table found in event setup";
368  } else {
369  LogWarning( "hltPrescaleSet" ) << "HLTPrescaleTable from event setup has error";
370  }
371  }
372  }
373  unsigned set( hltPrescaleTable.set() );
374  if ( hltPrescaleTable.size() > 0 ) {
375  if ( hltPrescaleLabel_.size() > 0 ) {
376  bool foundPrescaleLabel( false );
377  for ( unsigned iLabel = 0; iLabel < hltPrescaleTable.labels().size(); ++iLabel ) {
378  if ( hltPrescaleTable.labels().at( iLabel ) == hltPrescaleLabel_ ) {
379  set = iLabel;
380  foundPrescaleLabel = true;
381  break;
382  }
383  }
384  if ( ! foundPrescaleLabel ) {
385  LogWarning( "hltPrescaleLabel" ) << "HLT prescale label '" << hltPrescaleLabel_ << "' not in prescale table\n"
386  << "Using default";
387  }
388  }
389  } else if ( iEvent.isRealData() ) {
390  if ( ( labelHltPrescaleTable_.empty() && firstInRun_ ) || ! labelHltPrescaleTable_.empty() ) {
391  LogError( "hltPrescaleTable" ) << "No HLT prescale table found\n"
392  << "Using default empty table with all prescales 1";
393  }
394  }
395 
396  const unsigned sizePaths( hltConfig_.size() );
397  const unsigned sizeFilters( handleTriggerEvent->sizeFilters() );
398  const unsigned sizeObjects( handleTriggerEvent->sizeObjects() );
399 
400  std::map< std::string, int > moduleStates;
401 
402  if ( ! onlyStandAlone_ ) {
403  std::auto_ptr< TriggerPathCollection > triggerPaths( new TriggerPathCollection() );
404  triggerPaths->reserve( sizePaths );
405  const std::vector<std::string> & pathNames = hltConfig_.triggerNames();
406  for ( size_t indexPath = 0; indexPath < sizePaths; ++indexPath ) {
407  const std::string & namePath = pathNames.at( indexPath );
408  unsigned indexLastFilterPathModules( handleTriggerResults->index( indexPath ) + 1 );
409  unsigned indexLastFilterFilters( sizeFilters );
410  while ( indexLastFilterPathModules > 0 ) {
411  --indexLastFilterPathModules;
412  const std::string & labelLastFilterPathModules( hltConfig_.moduleLabel( indexPath, indexLastFilterPathModules ) );
413  indexLastFilterFilters = handleTriggerEvent->filterIndex( InputTag( labelLastFilterPathModules, "", nameProcess_ ) );
414  if ( indexLastFilterFilters < sizeFilters ) {
415  if ( hltConfig_.moduleType( labelLastFilterPathModules ) == "HLTBool" ) continue;
416  break;
417  }
418  }
419  TriggerPath triggerPath( namePath, indexPath, hltConfig_.prescaleValue( set, namePath ), handleTriggerResults->wasrun( indexPath ), handleTriggerResults->accept( indexPath ), handleTriggerResults->error( indexPath ), indexLastFilterPathModules, hltConfig_.saveTagsModules( namePath ).size() );
420  // add module names to path and states' map
421  const unsigned sizeModulesPath( hltConfig_.size( indexPath ) );
422  assert( indexLastFilterPathModules < sizeModulesPath );
423  std::map< unsigned, std::string > indicesModules;
424  for ( size_t iM = 0; iM < sizeModulesPath; ++iM ) {
425  const std::string nameModule( hltConfig_.moduleLabel( indexPath, iM ) );
426  if ( addPathModuleLabels_ ) {
427  triggerPath.addModule( nameModule );
428  }
429  const unsigned indexFilter( handleTriggerEvent->filterIndex( InputTag( nameModule, "", nameProcess_ ) ) );
430  if ( indexFilter < sizeFilters ) {
431  triggerPath.addFilterIndex( indexFilter );
432  }
433  const unsigned slotModule( hltConfig_.moduleIndex( indexPath, nameModule ) );
434  indicesModules.insert( std::pair< unsigned, std::string >( slotModule, nameModule ) );
435  }
436  // add L1 seeds
437  const L1SeedCollection l1Seeds( hltConfig_.hltL1GTSeeds( namePath ) );
438  for ( L1SeedCollection::const_iterator iSeed = l1Seeds.begin(); iSeed != l1Seeds.end(); ++iSeed ) {
439  triggerPath.addL1Seed( *iSeed );
440  }
441  // store path
442  triggerPaths->push_back( triggerPath );
443  // cache module states to be used for the filters
444  for ( std::map< unsigned, std::string >::const_iterator iM = indicesModules.begin(); iM != indicesModules.end(); ++iM ) {
445  if ( iM->first < indexLastFilterPathModules ) {
446  moduleStates[ iM->second ] = 1;
447  } else if ( iM->first == indexLastFilterPathModules ) {
448  moduleStates[ iM->second ] = handleTriggerResults->accept( indexPath );
449  } else if ( moduleStates.find( iM->second ) == moduleStates.end() ) {
450  moduleStates[ iM->second ] = -1;
451  }
452  }
453  }
454  // Put HLT paths to event
455  iEvent.put( triggerPaths );
456  }
457 
458  // Store used trigger objects and their types for HLT filters
459  // (only active filter(s) available from trigger::TriggerEvent)
460 
461  std::multimap< trigger::size_type, int > objectTypes;
462  std::multimap< trigger::size_type, std::string > filterLabels;
463 
464  for ( size_t iF = 0; iF < sizeFilters; ++iF ) {
465  const std::string nameFilter( handleTriggerEvent->filterLabel( iF ) );
466  const trigger::Keys & keys = handleTriggerEvent->filterKeys( iF );
467  const trigger::Vids & types = handleTriggerEvent->filterIds( iF );
468  assert( types.size() == keys.size() );
469  for ( size_t iK = 0; iK < keys.size(); ++iK ) {
470  filterLabels.insert( std::pair< trigger::size_type, std::string >( keys[ iK ], nameFilter ) );
471  objectTypes.insert( std::pair< trigger::size_type, int >( keys[ iK ], types[ iK ] ) );
472  }
473  }
474 
475  // HLT objects
476 
477  triggerObjects->reserve( onlyStandAlone_ ? 0 : sizeObjects );
478  triggerObjectsStandAlone->reserve( sizeObjects );
479 
480  const trigger::Keys & collectionKeys( handleTriggerEvent->collectionKeys() );
481  std::map< trigger::size_type, trigger::size_type > newObjectKeys;
482  for ( size_t iO = 0, iC = 0, nC = handleTriggerEvent->sizeCollections(); iO < sizeObjects && iC < nC; ++iO ) {
483  const trigger::TriggerObject tobj = handleTriggerEvent->getObjects().at( iO );
484  TriggerObject triggerObject( reco::Particle::PolarLorentzVector(tobj.pt(), tobj.eta(), tobj.phi(), tobj.mass()), tobj.id() );
485  // set collection
486  while ( iO >= collectionKeys[ iC ] ) ++iC; // relies on well ordering of trigger objects with respect to the collections
487  triggerObject.setCollection( handleTriggerEvent->collectionTagEncoded( iC ) );
488  // set filter ID
489  typedef std::multimap< trigger::size_type, int >::const_iterator it_type;
490  for (std::pair<it_type,it_type> trange = objectTypes.equal_range(iO);
491  trange.first != trange.second; ++trange.first) {
492  triggerObject.addTriggerObjectType( trange.first->second );
493  }
494 
495  // stand-alone trigger object
496  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
497  // check for excluded collections
498  bool excluded( false );
499  for ( size_t iE = 0; iE < exludeCollections_.size(); ++iE ) {
500  if ( triggerObjectStandAlone.hasCollection( exludeCollections_.at( iE ) ) ) {
501  if ( ! onlyStandAlone_ ) newObjectKeys[ iO ] = trigger::size_type( sizeObjects );
502  excluded = true;
503  break;
504  }
505  }
506  if ( excluded ) continue;
507  typedef std::multimap< trigger::size_type, std::string >::const_iterator it_fl;
508  for (std::pair<it_fl,it_fl> frange = filterLabels.equal_range(iO); frange.first != frange.second; ++frange.first) {
509  triggerObjectStandAlone.addFilterLabel( frange.first->second );
510  const std::vector<ModuleLabelToPathAndFlags::PathAndFlags> & paths = moduleLabelToPathAndFlags_[frange.first->second];
511  for (std::vector<ModuleLabelToPathAndFlags::PathAndFlags>::const_iterator iP = paths.begin(); iP != paths.end(); ++iP) {
512  bool pathFired = handleTriggerResults->wasrun( iP->pathIndex ) && handleTriggerResults->accept( iP->pathIndex );
513  triggerObjectStandAlone.addPathName( iP->pathName, pathFired && iP->lastFilter, pathFired && iP->l3Filter );
514  }
515  }
516 
517  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
518  if ( ! onlyStandAlone_ ) {
519  triggerObjects->push_back( triggerObject );
520  newObjectKeys[ iO ] = trigger::size_type( triggerObjects->size() - 1 );
521  }
522  }
523 
524  // Re-iterate HLT filters and finally produce them in order to account for optionally skipped objects
525  if ( ! onlyStandAlone_ ) {
526  std::auto_ptr< TriggerFilterCollection > triggerFilters( new TriggerFilterCollection() );
527  triggerFilters->reserve( sizeFilters );
528  for ( size_t iF = 0; iF < sizeFilters; ++iF ) {
529  const std::string nameFilter( handleTriggerEvent->filterTag( iF ).label() );
530  const trigger::Keys & keys = handleTriggerEvent->filterKeys( iF ); // not cached
531  const trigger::Vids & types = handleTriggerEvent->filterIds( iF ); // not cached
532  TriggerFilter triggerFilter( nameFilter );
533  // set filter type
534  const std::string typeFilter( hltConfig_.moduleType( nameFilter ) );
535  triggerFilter.setType( typeFilter );
536  triggerFilter.setSaveTags( hltConfig_.saveTags( nameFilter ) );
537  // set keys and trigger object types of used objects
538  for ( size_t iK = 0; iK < keys.size(); ++iK ) { // identical to types.size()
539  // check, if current object is excluded
540  if ( newObjectKeys.find( keys.at( iK ) ) != newObjectKeys.end() ) {
541  if ( newObjectKeys[ keys.at( iK ) ] == sizeObjects ) continue;
542  triggerFilter.addObjectKey( newObjectKeys[ keys.at( iK ) ] );
543  triggerFilter.addTriggerObjectType( types.at( iK ) );
544  } else {
545  LogWarning( "triggerObjectKey" ) << "TriggerFilter '" << nameFilter << "' requests non-existing TriggerObject key " << keys.at( iK ) << "\n"
546  << "Skipping object assignment";
547  }
548  }
549  // set status from path info
550  std::map< std::string, int >::iterator iS( moduleStates.find( nameFilter ) );
551  if ( iS != moduleStates.end() ) {
552  if ( ! triggerFilter.setStatus( iS->second ) ) {
553  triggerFilter.setStatus( -1 ); // FIXME different code for "unvalid status determined" needed?
554  }
555  } else {
556  triggerFilter.setStatus( -1 ); // FIXME different code for "unknown" needed?
557  }
558  // store filter
559  triggerFilters->push_back( triggerFilter );
560  }
561  // put HLT filters to event
562  iEvent.put( triggerFilters );
563  }
564 
565  if (packPrescales_) {
566  packedPrescales.reset(new PackedTriggerPrescales(handleTriggerResults));
567  packedPrescalesL1min.reset(new PackedTriggerPrescales(handleTriggerResults));
568  packedPrescalesL1max.reset(new PackedTriggerPrescales(handleTriggerResults));
569  const edm::TriggerNames & names = iEvent.triggerNames(*handleTriggerResults);
570  //std::cout << "Run " << iEvent.id().run() << ", LS " << iEvent.id().luminosityBlock() << ": pset " << set << std::endl;
571  for (unsigned int i = 0, n = names.size(); i < n; ++i) {
572  auto pvdet = hltConfig_.prescaleValuesInDetail( iEvent, iSetup, names.triggerName(i) );
573  //int hltprescale = hltConfig_.prescaleValue(set, names.triggerName(i));
574  if (pvdet.first.empty()) {
575  packedPrescalesL1max->addPrescaledTrigger(i, 1);
576  packedPrescalesL1min->addPrescaledTrigger(i, 1);
577  } else {
578  int pmin = -1, pmax = -1;
579  for (const auto & p : pvdet.first) {
580  pmax = std::max(pmax, p.second);
581  if (p.second > 0 && (pmin == -1 || pmin > p.second)) pmin = p.second;
582  }
583  packedPrescalesL1max->addPrescaledTrigger(i, pmax);
584  packedPrescalesL1min->addPrescaledTrigger(i, pmin);
585  //std::cout << "\tTrigger " << names.triggerName(i) << ", L1 ps " << pmin << "-" << pmax << ", HLT ps " << hltprescale << std::endl;
586  }
587  packedPrescales->addPrescaledTrigger(i, pvdet.second);
588  //assert( hltprescale == pvdet.second );
589  }
590  iEvent.put( packedPrescales );
591  iEvent.put( packedPrescalesL1max, "l1max" );
592  iEvent.put( packedPrescalesL1min, "l1min" );
593  }
594 
595  } // if ( goodHlt )
596 
597  // L1 objects
598  // (needs to be done after HLT objects, since their x-links with filters rely on their collection keys)
599 
600  // map for assignments of objects to conditions
601  std::map< L1GtObject, std::vector< unsigned > > l1ObjectTypeMap;
602  if ( ! tagL1ExtraMu_.label().empty() ) {
604  iEvent.getByLabel( tagL1ExtraMu_, handleL1ExtraMu );
605  if ( handleL1ExtraMu.isValid() ) {
606  std::vector< unsigned > muKeys;
607  for ( size_t l1Mu = 0; l1Mu < handleL1ExtraMu->size(); ++l1Mu ) {
608  if ( mainBxOnly_ && handleL1ExtraMu->at( l1Mu ).bx() != 0 ) continue;
609  TriggerObject triggerObject;
610  if ( saveL1Refs_ ) {
611  const reco::CandidateBaseRef leafCandRef( l1extra::L1MuonParticleRef( handleL1ExtraMu, l1Mu ) );
612  triggerObject = TriggerObject( leafCandRef );
613  } else {
614  const reco::LeafCandidate leafCandidate( *( handleL1ExtraMu->at( l1Mu ).reco::LeafCandidate::clone() ) );
615  triggerObject = TriggerObject( leafCandidate );
616  }
617  triggerObject.setCollection( tagL1ExtraMu_ );
619  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
620  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
621  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
622  if ( handleL1ExtraMu->at( l1Mu ).bx() == 0 ) muKeys.push_back( triggerObjectsStandAlone->size() - 1 );
623  }
624  l1ObjectTypeMap.insert( std::make_pair( Mu, muKeys ) );
625  } else LogError( "l1ExtraValid" ) << "l1extra::L1MuonParticleCollection product with InputTag '" << tagL1ExtraMu_.encode() << "' not in event";
626  }
627  if ( ! tagL1ExtraNoIsoEG_.label().empty() ) {
628  Handle< l1extra::L1EmParticleCollection > handleL1ExtraNoIsoEG;
629  iEvent.getByLabel( tagL1ExtraNoIsoEG_, handleL1ExtraNoIsoEG );
630  if ( handleL1ExtraNoIsoEG.isValid() ) {
631  std::vector< unsigned > noIsoEGKeys;
632  for ( size_t l1NoIsoEG = 0; l1NoIsoEG < handleL1ExtraNoIsoEG->size(); ++l1NoIsoEG ) {
633  if ( mainBxOnly_ && handleL1ExtraNoIsoEG->at( l1NoIsoEG ).bx() != 0 ) continue;
634  TriggerObject triggerObject;
635  if ( saveL1Refs_ ) {
636  const reco::CandidateBaseRef leafCandRef( l1extra::L1EmParticleRef( handleL1ExtraNoIsoEG, l1NoIsoEG ) );
637  triggerObject = TriggerObject( leafCandRef );
638  } else {
639  const reco::LeafCandidate leafCandidate( *( handleL1ExtraNoIsoEG->at( l1NoIsoEG ).reco::LeafCandidate::clone() ) );
640  triggerObject = TriggerObject( leafCandidate );
641  }
642  triggerObject.setCollection( tagL1ExtraNoIsoEG_ );
644  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
645  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
646  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
647  if ( handleL1ExtraNoIsoEG->at( l1NoIsoEG ).bx() == 0 ) noIsoEGKeys.push_back( triggerObjectsStandAlone->size() - 1 );
648  }
649  l1ObjectTypeMap.insert( std::make_pair( NoIsoEG, noIsoEGKeys ) );
650  } else LogError( "l1ExtraValid" ) << "l1extra::L1EmParticleCollection product with InputTag '" << tagL1ExtraNoIsoEG_.encode() << "' not in event";
651  }
652  if ( ! tagL1ExtraIsoEG_.label().empty() ) {
654  iEvent.getByLabel( tagL1ExtraIsoEG_, handleL1ExtraIsoEG );
655  if ( handleL1ExtraIsoEG.isValid() ) {
656  std::vector< unsigned > isoEGKeys;
657  for ( size_t l1IsoEG = 0; l1IsoEG < handleL1ExtraIsoEG->size(); ++l1IsoEG ) {
658  if ( mainBxOnly_ && handleL1ExtraIsoEG->at( l1IsoEG ).bx() != 0 ) continue;
659  TriggerObject triggerObject;
660  if ( saveL1Refs_ ) {
661  const reco::CandidateBaseRef leafCandRef( l1extra::L1EmParticleRef( handleL1ExtraIsoEG, l1IsoEG ) );
662  triggerObject = TriggerObject( leafCandRef );
663  } else {
664  const reco::LeafCandidate leafCandidate( *( handleL1ExtraIsoEG->at( l1IsoEG ).reco::LeafCandidate::clone() ) );
665  triggerObject = TriggerObject( leafCandidate );
666  }
667  triggerObject.setCollection( tagL1ExtraIsoEG_ );
669  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
670  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
671  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
672  if ( handleL1ExtraIsoEG->at( l1IsoEG ).bx() == 0 ) isoEGKeys.push_back( triggerObjectsStandAlone->size() - 1 );
673  }
674  l1ObjectTypeMap.insert( std::make_pair( IsoEG, isoEGKeys ) );
675  } else LogError( "l1ExtraValid" ) << "l1extra::L1EmParticleCollection product with InputTag '" << tagL1ExtraIsoEG_.encode() << "' not in event";
676  }
677  if ( ! tagL1ExtraCenJet_.label().empty() ) {
678  Handle< l1extra::L1JetParticleCollection > handleL1ExtraCenJet;
679  iEvent.getByLabel( tagL1ExtraCenJet_, handleL1ExtraCenJet );
680  if ( handleL1ExtraCenJet.isValid() ) {
681  std::vector< unsigned > cenJetKeys;
682  for ( size_t l1CenJet = 0; l1CenJet < handleL1ExtraCenJet->size(); ++l1CenJet ) {
683  if ( mainBxOnly_ && handleL1ExtraCenJet->at( l1CenJet ).bx() != 0 ) continue;
684  TriggerObject triggerObject;
685  if ( saveL1Refs_ ) {
686  const reco::CandidateBaseRef leafCandRef( l1extra::L1JetParticleRef( handleL1ExtraCenJet, l1CenJet ) );
687  triggerObject = TriggerObject( leafCandRef );
688  } else {
689  const reco::LeafCandidate leafCandidate( *( handleL1ExtraCenJet->at( l1CenJet ).reco::LeafCandidate::clone() ) );
690  triggerObject = TriggerObject( leafCandidate );
691  }
692  triggerObject.setCollection( tagL1ExtraCenJet_ );
694  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
695  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
696  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
697  if ( handleL1ExtraCenJet->at( l1CenJet ).bx() == 0 ) cenJetKeys.push_back( triggerObjectsStandAlone->size() - 1 );
698  }
699  l1ObjectTypeMap.insert( std::make_pair( CenJet, cenJetKeys ) );
700  } else LogError( "l1ExtraValid" ) << "l1extra::L1JetParticleCollection product with InputTag '" << tagL1ExtraCenJet_.encode() << "' not in event";
701  }
702  if ( ! tagL1ExtraForJet_.label().empty() ) {
703  Handle< l1extra::L1JetParticleCollection > handleL1ExtraForJet;
704  iEvent.getByLabel( tagL1ExtraForJet_, handleL1ExtraForJet );
705  if ( handleL1ExtraForJet.isValid() ) {
706  std::vector< unsigned > forJetKeys;
707  for ( size_t l1ForJet = 0; l1ForJet < handleL1ExtraForJet->size(); ++l1ForJet ) {
708  if ( mainBxOnly_ && handleL1ExtraForJet->at( l1ForJet ).bx() != 0 ) continue;
709  TriggerObject triggerObject;
710  if ( saveL1Refs_ ) {
711  const reco::CandidateBaseRef leafCandRef( l1extra::L1JetParticleRef( handleL1ExtraForJet, l1ForJet ) );
712  triggerObject = TriggerObject( leafCandRef );
713  } else {
714  const reco::LeafCandidate leafCandidate( *( handleL1ExtraForJet->at( l1ForJet ).reco::LeafCandidate::clone() ) );
715  triggerObject = TriggerObject( leafCandidate );
716  }
717  triggerObject.setCollection( tagL1ExtraForJet_ );
719  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
720  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
721  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
722  if ( handleL1ExtraForJet->at( l1ForJet ).bx() == 0 ) forJetKeys.push_back( triggerObjectsStandAlone->size() - 1 );
723  }
724  l1ObjectTypeMap.insert( std::make_pair( ForJet, forJetKeys ) );
725  } else LogError( "l1ExtraValid" ) << "l1extra::L1JetParticleCollection product with InputTag '" << tagL1ExtraForJet_.encode() << "' not in event";
726  }
727  if ( ! tagL1ExtraTauJet_.label().empty() ) {
728  Handle< l1extra::L1JetParticleCollection > handleL1ExtraTauJet;
729  iEvent.getByLabel( tagL1ExtraTauJet_, handleL1ExtraTauJet );
730  if ( handleL1ExtraTauJet.isValid() ) {
731  std::vector< unsigned > tauJetKeys;
732  for ( size_t l1TauJet = 0; l1TauJet < handleL1ExtraTauJet->size(); ++l1TauJet ) {
733  if ( mainBxOnly_ && handleL1ExtraTauJet->at( l1TauJet ).bx() != 0 ) continue;
734  TriggerObject triggerObject;
735  if ( saveL1Refs_ ) {
736  const reco::CandidateBaseRef leafCandRef( l1extra::L1JetParticleRef( handleL1ExtraTauJet, l1TauJet ) );
737  triggerObject = TriggerObject( leafCandRef );
738  } else {
739  const reco::LeafCandidate leafCandidate( *( handleL1ExtraTauJet->at( l1TauJet ).reco::LeafCandidate::clone() ) );
740  triggerObject = TriggerObject( leafCandidate );
741  }
742  triggerObject.setCollection( tagL1ExtraTauJet_ );
744  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
745  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
746  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
747  if ( handleL1ExtraTauJet->at( l1TauJet ).bx() == 0 ) tauJetKeys.push_back( triggerObjectsStandAlone->size() - 1 );
748  }
749  l1ObjectTypeMap.insert( std::make_pair( TauJet, tauJetKeys ) );
750  } else LogError( "l1ExtraValid" ) << "l1extra::L1JetParticleCollection product with InputTag '" << tagL1ExtraTauJet_.encode() << "' not in event";
751  }
752  if ( ! tagL1ExtraETM_ .label().empty()) {
754  iEvent.getByLabel( tagL1ExtraETM_, handleL1ExtraETM );
755  if ( handleL1ExtraETM.isValid() ) {
756  std::vector< unsigned > etmKeys;
757  for ( size_t l1ETM = 0; l1ETM < handleL1ExtraETM->size(); ++l1ETM ) {
758  if ( mainBxOnly_ && handleL1ExtraETM->at( l1ETM ).bx() != 0 ) continue;
759  TriggerObject triggerObject;
760  if ( saveL1Refs_ ) {
761  const reco::CandidateBaseRef leafCandRef( l1extra::L1EtMissParticleRef( handleL1ExtraETM, l1ETM ) );
762  triggerObject = TriggerObject( leafCandRef );
763  } else {
764  const reco::LeafCandidate leafCandidate( *( handleL1ExtraETM->at( l1ETM ).reco::LeafCandidate::clone() ) );
765  triggerObject = TriggerObject( leafCandidate );
766  }
767  triggerObject.setCollection( tagL1ExtraETM_ );
769  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
770  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
771  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
772  if ( handleL1ExtraETM->at( l1ETM ).bx() == 0 ) etmKeys.push_back( triggerObjectsStandAlone->size() - 1 );
773  }
774  l1ObjectTypeMap.insert( std::make_pair( ETM, etmKeys ) );
775  } else LogError( "l1ExtraValid" ) << "l1extra::L1EtMissParticleCollection product with InputTag '" << tagL1ExtraETM_.encode() << "' not in event";
776  }
777  if ( ! tagL1ExtraHTM_.label().empty() ) {
779  iEvent.getByLabel( tagL1ExtraHTM_, handleL1ExtraHTM );
780  if ( handleL1ExtraHTM.isValid() ) {
781  std::vector< unsigned > htmKeys;
782  for ( size_t l1HTM = 0; l1HTM < handleL1ExtraHTM->size(); ++l1HTM ) {
783  if ( mainBxOnly_ && handleL1ExtraHTM->at( l1HTM ).bx() != 0 ) continue;
784  TriggerObject triggerObject;
785  if ( saveL1Refs_ ) {
786  const reco::CandidateBaseRef leafCandRef( l1extra::L1EtMissParticleRef( handleL1ExtraHTM, l1HTM ) );
787  triggerObject = TriggerObject( leafCandRef );
788  } else {
789  const reco::LeafCandidate leafCandidate( *( handleL1ExtraHTM->at( l1HTM ).reco::LeafCandidate::clone() ) );
790  triggerObject = TriggerObject( leafCandidate );
791  }
792  triggerObject.setCollection( tagL1ExtraHTM_ );
794  if ( ! onlyStandAlone_ ) triggerObjects->push_back( triggerObject );
795  TriggerObjectStandAlone triggerObjectStandAlone( triggerObject );
796  triggerObjectsStandAlone->push_back( triggerObjectStandAlone );
797  if ( handleL1ExtraHTM->at( l1HTM ).bx() == 0 ) htmKeys.push_back( triggerObjectsStandAlone->size() - 1 );
798  }
799  l1ObjectTypeMap.insert( std::make_pair( HTM, htmKeys ) );
800  } else LogError( "l1ExtraValid" ) << "l1extra::L1EtMissParticleCollection product with InputTag '" << tagL1ExtraHTM_.encode() << "' not in event";
801  }
802 
803  // Put trigger objects to event
804  if ( ! onlyStandAlone_ ) iEvent.put( triggerObjects );
805 
806  // L1 algorithms
807  if ( ! onlyStandAlone_ ) {
808  std::auto_ptr< TriggerAlgorithmCollection > triggerAlgos( new TriggerAlgorithmCollection() );
809  std::auto_ptr< TriggerConditionCollection > triggerConditions( new TriggerConditionCollection() );
810  if ( addL1Algos_ ) {
811  // create trigger object types transalation map (yes, it's ugly!)
812  std::map< L1GtObject, trigger::TriggerObjectType > mapObjectTypes;
813  mapObjectTypes.insert( std::make_pair( Mu , trigger::TriggerL1Mu ) );
814  mapObjectTypes.insert( std::make_pair( NoIsoEG, trigger::TriggerL1NoIsoEG ) );
815  mapObjectTypes.insert( std::make_pair( IsoEG , trigger::TriggerL1IsoEG ) );
816  mapObjectTypes.insert( std::make_pair( CenJet , trigger::TriggerL1CenJet ) );
817  mapObjectTypes.insert( std::make_pair( ForJet , trigger::TriggerL1ForJet ) );
818  mapObjectTypes.insert( std::make_pair( TauJet , trigger::TriggerL1TauJet ) );
819  mapObjectTypes.insert( std::make_pair( ETM , trigger::TriggerL1ETM ) );
820  mapObjectTypes.insert( std::make_pair( HTM , trigger::TriggerL1HTM ) );
821  // get and cache L1 menu
823  ESHandle< L1GtTriggerMenu > handleL1GtTriggerMenu;
824  iSetup.get< L1GtTriggerMenuRcd >().get( handleL1GtTriggerMenu );
825  auto const & l1GtAlgorithms = handleL1GtTriggerMenu->gtAlgorithmMap();
826  auto const & l1GtTechTriggers = handleL1GtTriggerMenu->gtTechnicalTriggerMap();
827  auto const & l1GtConditionsVector = handleL1GtTriggerMenu->gtConditionMap();
828  // cache conditions in one single condition map
829  ConditionMap l1GtConditions;
830  for ( size_t iCv = 0; iCv < l1GtConditionsVector.size(); ++iCv ) {
831  l1GtConditions.insert( l1GtConditionsVector.at( iCv ).begin(), l1GtConditionsVector.at( iCv ).end() );
832  }
833  triggerAlgos->reserve( l1GtAlgorithms.size() + l1GtTechTriggers.size() );
834  Handle< L1GlobalTriggerObjectMaps > handleL1GlobalTriggerObjectMaps;
835  iEvent.getByToken( l1GlobalTriggerObjectMapsToken_, handleL1GlobalTriggerObjectMaps );
836  if( ! handleL1GlobalTriggerObjectMaps.isValid() ) {
837  LogError( "l1ObjectMap" ) << "L1GlobalTriggerObjectMaps product with InputTag '" << tagL1GlobalTriggerObjectMaps_.encode() << "' not in event\n"
838  << "No L1 objects and GTL results available for physics algorithms";
839  }
840  handleL1GlobalTriggerObjectMaps->consistencyCheck();
841  if ( firstInRun_ ) {
842  l1PSet_ = ( ParameterSet* )( pset::Registry::instance()->getMapped(handleL1GlobalTriggerObjectMaps->namesParameterSetID()) );
843  if (l1PSet_ == 0) {
844  LogError( "l1ObjectMap" ) << "ParameterSet registry not available\n"
845  << "Skipping conditions for all L1 physics algorithm names in this run";
846  }
847  } else {
848  if (l1PSet_ == 0) {
849  LogInfo( "l1ObjectMap" ) << "ParameterSet registry not available\n"
850  << "Skipping conditions for all L1 physics algorithm names in this event";
851  }
852  }
853  // physics algorithms
854  for ( CItAlgo iAlgo = l1GtAlgorithms.begin(); iAlgo != l1GtAlgorithms.end(); ++iAlgo ) {
855  const std::string & algoName( iAlgo->second.algoName() );
856  if ( ! ( iAlgo->second.algoBitNumber() < int( L1GlobalTriggerReadoutSetup::NumberPhysTriggers ) ) ) {
857  LogError( "l1Algo" ) << "L1 physics algorithm '" << algoName << "' has bit number " << iAlgo->second.algoBitNumber() << " >= " << L1GlobalTriggerReadoutSetup::NumberPhysTriggers << "\n"
858  << "Skipping";
859  continue;
860  }
862  int bit;
863  if ( ! l1GtUtils_.l1AlgoTechTrigBitNumber( algoName, category, bit ) ) {
864  LogError( "l1Algo" ) << "L1 physics algorithm '" << algoName << "' not found in the L1 menu\n"
865  << "Skipping";
866  continue;
867  }
868  if ( category != L1GtUtils::AlgorithmTrigger ) {
869  LogError( "l1Algo" ) << "L1 physics algorithm '" << algoName << "' does not have category 'AlgorithmTrigger' from 'L1GtUtils'\n"
870  << "Skipping";
871  continue;
872  }
873  bool decisionBeforeMask;
874  bool decisionAfterMask;
875  int prescale;
876  int mask;
877  int error( l1GtUtils_.l1Results( iEvent, algoName, decisionBeforeMask, decisionAfterMask, prescale, mask ) );
878  if ( error ) {
879  LogError( "l1Algo" ) << "L1 physics algorithm '" << algoName << "' decision has error code " << error << " from 'L1GtUtils'\n"
880  << "Skipping";
881  continue;
882  }
883  TriggerAlgorithm triggerAlgo( algoName, iAlgo->second.algoAlias(), category == L1GtUtils::TechnicalTrigger, (unsigned)bit, (unsigned)prescale, (bool)mask, decisionBeforeMask, decisionAfterMask );
884  triggerAlgo.setLogicalExpression( iAlgo->second.algoLogicalExpression() );
885  // GTL result and used conditions in physics algorithm
886  if( ! handleL1GlobalTriggerObjectMaps.isValid() ) {
887  triggerAlgos->push_back( triggerAlgo );
888  continue; // LogWarning already earlier (before loop)
889  }
890  if ( ! handleL1GlobalTriggerObjectMaps->algorithmExists(bit)) {
891  LogError( "l1ObjectMap" ) << "L1 physics algorithm '" << algoName << "' is missing in L1GlobalTriggerObjectMaps\n"
892  << "Skipping conditions and GTL result";
893  triggerAlgos->push_back( triggerAlgo );
894  continue;
895  }
896  bool algorithmResult = handleL1GlobalTriggerObjectMaps->algorithmResult(bit);
897 // if ( ( algorithmResult != decisionBeforeMask ) && ( decisionBeforeMask == true || prescale == 1 ) ) {
898  if ( ( algorithmResult != decisionBeforeMask ) && ( decisionBeforeMask == true ) ) { // FIXME: understand the difference for un-prescaled algos 118, 119, 123
899  LogInfo( "l1ObjectMap" ) << "L1 physics algorithm '" << algoName << "' with different decisions in\n"
900  << "L1GlobalTriggerObjectMaps (GTL result) : " << algorithmResult << "\n"
901  << "L1GlobalTriggerReadoutRecord (decision before mask): " << decisionBeforeMask;
902  }
903  triggerAlgo.setGtlResult( algorithmResult );
904  // conditions in algorithm
905  L1GlobalTriggerObjectMaps::ConditionsInAlgorithm conditions = handleL1GlobalTriggerObjectMaps->getConditionsInAlgorithm(bit);
906  if (l1PSet_ == 0) {
907  triggerAlgos->push_back( triggerAlgo );
908  continue;
909  }
910  if (!l1PSet_->exists(algoName)) {
911  if ( firstInRun_ ) {
912  LogError( "l1ObjectMap" ) << "L1 physics algorithm name '" << algoName << "' not available in ParameterSet registry\n"
913  << "Skipping conditions for this algorithm in this run";
914  } else {
915  LogInfo( "l1ObjectMap" ) << "L1 physics algorithm name '" << algoName << "' not available in ParameterSet registry\n"
916  << "Skipping conditions for this algorithm in this event";
917  }
918  triggerAlgos->push_back( triggerAlgo );
919  continue;
920  }
921  std::vector<std::string> conditionNames( l1PSet_->getParameter<std::vector<std::string> >(algoName) );
922 
923  for ( unsigned iT = 0; iT < conditionNames.size(); ++iT ) {
924  size_t key( triggerConditions->size() );
925  for ( size_t iC = 0; iC < triggerConditions->size(); ++iC ) {
926  if ( conditionNames.at(iT) == triggerConditions->at( iC ).name() ) {
927  key = iC;
928  break;
929  }
930  }
931  if ( key == triggerConditions->size() ) {
932  if ( iT >= conditions.nConditions() ) {
933  LogError( "l1CondMap" ) << "More condition names from ParameterSet registry than the " << conditions.nConditions() << " conditions in L1GlobalTriggerObjectMaps\n"
934  << "Skipping condition " << conditionNames.at(iT) << " in algorithm " << algoName;
935  break;
936  }
937  TriggerCondition triggerCond( conditionNames[iT], conditions.getConditionResult(iT) );
938  if ( l1GtConditions.find( triggerCond.name() ) != l1GtConditions.end() ) {
939  triggerCond.setCategory( l1GtConditions[ triggerCond.name() ]->condCategory() );
940  triggerCond.setType( l1GtConditions[ triggerCond.name() ]->condType() );
941  const std::vector< L1GtObject > l1ObjectTypes( l1GtConditions[ triggerCond.name() ]->objectType() );
942  for ( size_t iType = 0 ; iType < l1ObjectTypes.size(); ++iType ) {
943  triggerCond.addTriggerObjectType( mapObjectTypes[ l1ObjectTypes.at( iType ) ] );
944  }
945  // objects in condition
946  L1GlobalTriggerObjectMaps::CombinationsInCondition combinations = handleL1GlobalTriggerObjectMaps->getCombinationsInCondition(bit, iT);
947  for ( size_t iVV = 0; iVV < combinations.nCombinations(); ++iVV ) {
948  for ( size_t iV = 0; iV < combinations.nObjectsPerCombination(); ++iV ) {
949 
950  unsigned objectIndex = combinations.getObjectIndex(iVV, iV);
951  if ( iV >= l1ObjectTypes.size() ) {
952  LogError( "l1CondMap" ) << "Index " << iV << " in combinations vector overshoots size " << l1ObjectTypes.size() << " of types vector in conditions map\n"
953  << "Skipping object key in condition " << triggerCond.name();
954  } else if ( l1ObjectTypeMap.find( l1ObjectTypes.at( iV ) ) != l1ObjectTypeMap.end() ) {
955  if ( objectIndex >= l1ObjectTypeMap[ l1ObjectTypes.at( iV ) ].size() ) {
956  LogError( "l1CondMap" ) << "Index " << objectIndex << " in combination overshoots number " << l1ObjectTypeMap[ l1ObjectTypes.at( iV ) ].size() << "of according trigger objects\n"
957  << "Skipping object key in condition " << triggerCond.name();
958  }
959  const unsigned objectKey( l1ObjectTypeMap[ l1ObjectTypes.at( iV ) ].at( objectIndex ) );
960  triggerCond.addObjectKey( objectKey );
961  // add current condition and algorithm also to the according stand-alone trigger object
962  triggerObjectsStandAlone->at( objectKey ).addAlgorithmName( triggerAlgo.name(), ( triggerAlgo.decision() && triggerCond.wasAccept() ) );
963  triggerObjectsStandAlone->at( objectKey ).addConditionName( triggerCond.name() );
964  }
965  }
966  }
967  } else {
968  LogWarning( "l1CondMap" ) << "L1 conditions '" << triggerCond.name() << "' not found in the L1 menu\n"
969  << "Remains incomplete";
970  }
971  triggerConditions->push_back( triggerCond );
972  }
973  triggerAlgo.addConditionKey( key );
974  }
975  triggerAlgos->push_back( triggerAlgo );
976  }
977  // technical triggers
978  for ( CItAlgo iAlgo = l1GtTechTriggers.begin(); iAlgo != l1GtTechTriggers.end(); ++iAlgo ) {
979  const std::string & algoName( iAlgo->second.algoName() );
980  if ( ! ( iAlgo->second.algoBitNumber() < int( L1GlobalTriggerReadoutSetup::NumberTechnicalTriggers ) ) ) {
981  LogError( "l1Algo" ) << "L1 technical trigger '" << algoName << "' has bit number " << iAlgo->second.algoBitNumber() << " >= " << L1GlobalTriggerReadoutSetup::NumberTechnicalTriggers << "\n"
982  << "Skipping";
983  continue;
984  }
986  int bit;
987  if ( ! l1GtUtils_.l1AlgoTechTrigBitNumber( algoName, category, bit ) ) {
988  LogError( "l1Algo" ) << "L1 technical trigger '" << algoName << "' not found in the L1 menu\n"
989  << "Skipping";
990  continue;
991  }
992  if ( category != L1GtUtils::TechnicalTrigger ) {
993  LogError( "l1Algo" ) << "L1 technical trigger '" << algoName << "' does not have category 'TechnicalTrigger' from 'L1GtUtils'\n"
994  << "Skipping";
995  continue;
996  }
997  bool decisionBeforeMask;
998  bool decisionAfterMask;
999  int prescale;
1000  int mask;
1001  int error( l1GtUtils_.l1Results( iEvent, algoName, decisionBeforeMask, decisionAfterMask, prescale, mask ) );
1002  if ( error ) {
1003  LogError( "l1Algo" ) << "L1 technical trigger '" << algoName << "' decision has error code " << error << " from 'L1GtUtils'\n"
1004  << "Skipping";
1005  continue;
1006  }
1007  TriggerAlgorithm triggerAlgo( algoName, iAlgo->second.algoAlias(), category == L1GtUtils::TechnicalTrigger, (unsigned)bit, (unsigned)prescale, (bool)mask, decisionBeforeMask, decisionAfterMask );
1008  triggerAlgo.setLogicalExpression( iAlgo->second.algoLogicalExpression() );
1009  triggerAlgos->push_back( triggerAlgo );
1010  }
1011  }
1012 
1013  // Put L1 algorithms and conditions to event
1014  iEvent.put( triggerAlgos );
1015  iEvent.put( triggerConditions );
1016  }
1017 
1018 
1019  if (packPathNames_) {
1020  const edm::TriggerNames & names = iEvent.triggerNames(*handleTriggerResults);
1021  for (pat::TriggerObjectStandAlone &obj : *triggerObjectsStandAlone) {
1022  obj.packPathNames(names);
1023  }
1024  }
1025  // Put (finally) stand-alone trigger objects to event
1026  iEvent.put( triggerObjectsStandAlone );
1027 
1028  firstInRun_ = false;
1029 
1030 }
1031 
1033  clear();
1034  const std::vector<std::string> & pathNames = hltConfig_.triggerNames();
1035  unsigned int sizePaths = pathNames.size();
1036  for ( unsigned int indexPath = 0; indexPath < sizePaths; ++indexPath ) {
1037  const std::string & namePath = pathNames[indexPath];
1038 
1039  const std::vector<std::string> & nameModules = hltConfig_.moduleLabels(indexPath);
1040  unsigned int sizeModulesPath = nameModules.size();
1041  bool lastFilter = true;
1042  unsigned int iM = sizeModulesPath;
1043  while (iM > 0) {
1044  const std::string & nameFilter = nameModules[--iM];
1045  if (hltConfig_.moduleEDMType(nameFilter) != "EDFilter") continue;
1046  if (hltConfig_.moduleType(nameFilter) == "HLTBool") continue;
1047  bool saveTags = hltConfig_.saveTags(nameFilter);
1048  insert( nameFilter, namePath, indexPath, lastFilter, saveTags );
1049  if (saveTags) lastFilter = false; // FIXME: rather always?
1050  }
1051  }
1052 }
1053 
#define LogDebug(id)
unsigned int set() const
low-level const accessors for data members
unsigned int size() const
number of trigger paths in trigger table
collection_type::const_iterator const_iterator
T getParameter(std::string const &) const
void callWhenNewProductsRegistered(std::function< void(BranchDescription const &)> const &func)
Definition: ProducerBase.h:51
edm::GetterOfProducts< l1extra::L1MuonParticleCollection > l1ExtraMuGetter_
edm::GetterOfProducts< trigger::HLTPrescaleTable > hltPrescaleTableEventGetter_
bool getByLabel(std::string const &label, Handle< PROD > &result) const
Definition: Run.h:214
unsigned char getObjectIndex(unsigned combination, unsigned object) const
int i
Definition: DBlmapReader.cc:9
bool saveTags(const std::string &module) const
Is module an L3 filter (ie, tracked saveTags=true)
virtual edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const
Definition: Event.cc:208
Analysis-level L1 trigger algorithm class.
const int l1Results(const edm::Event &iEvent, const edm::InputTag &l1GtRecordInputTag, const edm::InputTag &l1GtReadoutRecordInputTag, const std::string &nameAlgoTechTrig, bool &decisionBeforeMask, bool &decisionAfterMask, int &prescaleFactor, int &triggerMask) const
Definition: L1GtUtils.cc:1008
virtual void beginLuminosityBlock(const edm::LuminosityBlock &iLuminosityBlock, const edm::EventSetup &iSetup) override
const std::string moduleType(const std::string &module) const
C++ class name of module.
int id() const
getters
Definition: TriggerObject.h:55
Definition: L1GtObject.h:39
static const bool useL1EventSetup(true)
static const HistoName names[]
PATTriggerProducer(const edm::ParameterSet &iConfig)
HLTConfigProvider hltConfig_
bool setStatus(int status)
static PFTauRenderPlugin instance
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:449
enum start value shifted to 81 so as to avoid clashes with PDG codes
float phi() const
Definition: TriggerObject.h:58
std::map< std::string, L1GtCondition * > ConditionMap
map containing the conditions
virtual bool hasCollection(const std::string &collName) const
Checks, if a certain label of original collection is assigned (method overrides)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
Definition: L1GtObject.h:36
tuple triggerConditions
const bool l1AlgoTechTrigBitNumber(const std::string &nameAlgoTechTrig, TriggerCategory &trigCategory, int &bitNumber) const
Definition: L1GtUtils.cc:671
static const unsigned int NumberTechnicalTriggers
TriggerCategory
Definition: L1GtUtils.h:58
const std::vector< std::vector< std::pair< bool, std::string > > > & hltL1GTSeeds() const
assert(m_qm.get())
const std::vector< std::string > & triggerNames() const
names of trigger paths
The single EDProduct containing the HLT Prescale Table.
void setGtlResult(bool gtlResult)
Set L1 algorithm GTL result.
edm::GetterOfProducts< trigger::TriggerEvent > triggerEventGetter_
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::pair< std::vector< std::pair< std::string, int > >, int > prescaleValuesInDetail(const edm::Event &iEvent, const edm::EventSetup &iSetup, const std::string &trigger) const
void insert(const std::string &filter, const std::string &path, unsigned int pathIndex, bool lastFilter, bool l3Filter)
const std::string moduleEDMType(const std::string &module) const
C++ base class name of module.
processConfiguration
Definition: Schedule.cc:370
virtual void beginRun(const edm::Run &iRun, const edm::EventSetup &iSetup) override
void addTriggerObjectType(trigger::TriggerObjectType triggerObjectType)
Add a new trigger object type identifier.
Definition: TriggerFilter.h:79
Strings::size_type size() const
Definition: TriggerNames.cc:39
float eta() const
Definition: TriggerObject.h:57
std::vector< TriggerObjectStandAlone > TriggerObjectStandAloneCollection
Collection of TriggerObjectStandAlone.
void addObjectKey(unsigned objectKey)
Add a new trigger object collection index.
Definition: TriggerFilter.h:77
edm::GetterOfProducts< trigger::HLTPrescaleTable > hltPrescaleTableLumiGetter_
bool getByLabel(std::string const &label, Handle< PROD > &result) const
const std::map< std::string, std::vector< unsigned int > > & prescaleTable() const
Analysis-level trigger object class.
Definition: TriggerObject.h:47
uint16_t size_type
bool isRealData() const
Definition: EventBase.h:64
const std::map< std::string, std::vector< unsigned int > > & table() const
std::string encode() const
Definition: InputTag.cc:164
void addFilterLabel(const std::string &filterLabel)
Methods.
const std::string & moduleLabel(unsigned int trigger, unsigned int module) const
edm::GetterOfProducts< l1extra::L1JetParticleCollection > l1ExtraForJetGetter_
AlgorithmMap::const_iterator CItAlgo
iterators through map containing the algorithms
const std::vector< std::string > & saveTagsModules(unsigned int trigger) const
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:22
std::vector< TriggerAlgorithm > TriggerAlgorithmCollection
Collection of TriggerAlgorithm.
void addPathName(const std::string &pathName, bool pathLastFilterAccepted=true, bool pathL3FilterAccepted=true)
Adds a new HLT path name.
Analysis-level HLTrigger filter class.
Definition: TriggerFilter.h:35
Produces the full or stand-alone PAT trigger information collections.
unsigned int prescaleValue(unsigned int set, const std::string &trigger) const
HLT prescale value in specific prescale set for a specific trigger path.
int iEvent
Definition: GenABIO.cc:230
unsigned int moduleIndex(unsigned int trigger, const std::string &module) const
slot position of module on trigger path (0 to size-1)
void setCollection(const std::string &collName)
Methods.
Definition: TriggerObject.h:84
Analysis-level L1 trigger condition class.
Analysis-level HLTrigger path class.
Definition: TriggerPath.h:39
static const unsigned int NumberPhysTriggersExtended
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
const std::vector< std::string > & labels() const
edm::GetterOfProducts< l1extra::L1JetParticleCollection > l1ExtraTauJetGetter_
trigger::HLTPrescaleTable hltPrescaleTableLumi_
const std::string & name() const
Get L1 algorithm name.
ProcessHistory const & processHistory() const
Definition: Run.cc:103
edm::GetterOfProducts< l1extra::L1EtMissParticleCollection > l1ExtraHTMGetter_
static const unsigned int NumberPhysTriggers
void setSaveTags(bool saveTags)
Set the L3 status.
Definition: TriggerFilter.h:87
void setLogicalExpression(const std::string &expression)
Set L1 algorithm logical expression.
bool isValid() const
Definition: HandleBase.h:75
edm::EDGetTokenT< L1GlobalTriggerObjectMaps > l1GlobalTriggerObjectMapsToken_
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:405
edm::GetterOfProducts< l1extra::L1EmParticleCollection > l1ExtraNoIsoEGGetter_
edm::GetterOfProducts< l1extra::L1EtMissParticleCollection > l1ExtraETMGetter_
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
edm::GetterOfProducts< trigger::HLTPrescaleTable > hltPrescaleTableRunGetter_
edm::InputTag tagL1GlobalTriggerObjectMaps_
static const bool useL1GtTriggerMenuLite(false)
std::vector< TriggerFilter > TriggerFilterCollection
Collection of TriggerFilter.
void getL1GtRunCache(const edm::Run &, const edm::EventSetup &, const bool, const bool, const edm::InputTag &)
get all the run-constant quantities for L1 trigger and cache them
Definition: L1GtUtils.cc:312
ModuleLabelToPathAndFlags moduleLabelToPathAndFlags_
void setCategory(L1GtConditionCategory category)
Set the condition category.
int prescaleSet(const edm::Event &iEvent, const edm::EventSetup &iSetup) const
Definition: L1GtObject.h:30
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:27
std::vector< size_type > Keys
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
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:55
edm::GetterOfProducts< l1extra::L1EmParticleCollection > l1ExtraIsoEGGetter_
const std::vector< std::string > & prescaleLabels() const
low-level data member access
edm::GetterOfProducts< l1extra::L1JetParticleCollection > l1ExtraCenJetGetter_
void addConditionKey(unsigned conditionKey)
Add a new trigger condition collection index.
std::string const & label() const
Definition: InputTag.h:42
std::string const & process() const
Definition: InputTag.h:46
void setType(const std::string &type)
Set the filter module type.
Definition: TriggerFilter.h:75
edm::GetterOfProducts< edm::TriggerResults > triggerResultsGetter_
std::vector< TriggerObject > TriggerObjectCollection
Collection of TriggerObject.
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.
Definition: Particle.h:23
unsigned int prescaleSize() const
trigger::HLTPrescaleTable hltPrescaleTableRun_
std::vector< TriggerCondition > TriggerConditionCollection
Collection of TriggerCondition.
std::vector< std::string > exludeCollections_
volatile std::atomic< bool > shutdown_flag false
std::vector< L1Seed > L1SeedCollection
Collection of L1Seed.
Definition: TriggerPath.h:37
float mass() const
Definition: TriggerObject.h:59
void addTriggerObjectType(trigger::TriggerObjectType triggerObjectType)
Add a new trigger object type identifier.
Definition: TriggerObject.h:87
static std::string const triggerPaths
Definition: EdmProvDump.cc:41
std::vector< TriggerPath > TriggerPathCollection
Collection of TriggerPath.
Definition: TriggerPath.h:153
std::string const & instance() const
Definition: InputTag.h:43
edm::InputTag tagL1ExtraNoIsoEG_
std::vector< int > Vids
Definition: Run.h:41
Analysis-level trigger object class (stand-alone)
edm::ParameterSet * l1PSet_