00001
00002
00003
00004
00005
00006 #include "PhysicsTools/PatAlgos/plugins/PATTriggerEventProducer.h"
00007
00008 #include <cassert>
00009
00010 #include "DataFormats/Common/interface/AssociativeIterator.h"
00011
00012
00013 using namespace pat;
00014
00015 PATTriggerEventProducer::PATTriggerEventProducer( const edm::ParameterSet & iConfig ) :
00016 nameProcess_( iConfig.getParameter< std::string >( "processName" ) ),
00017 tagTriggerResults_( iConfig.getParameter< edm::InputTag >( "triggerResults" ) ),
00018 tagTriggerProducer_( iConfig.getParameter< edm::InputTag >( "patTriggerProducer" ) ),
00019 tagsTriggerMatcher_( iConfig.getParameter< std::vector< edm::InputTag > >( "patTriggerMatches" ) )
00020 {
00021 if ( tagTriggerResults_.process().empty() ) {
00022 tagTriggerResults_ = edm::InputTag( tagTriggerResults_.label(), tagTriggerResults_.instance(), nameProcess_ );
00023 }
00024
00025 for ( size_t iMatch = 0; iMatch < tagsTriggerMatcher_.size(); ++iMatch ) {
00026 produces< TriggerObjectMatch >( tagsTriggerMatcher_.at( iMatch ).label() );
00027 }
00028 produces< TriggerEvent >();
00029 }
00030
00031 PATTriggerEventProducer::~PATTriggerEventProducer()
00032 {
00033 }
00034
00035 void PATTriggerEventProducer::beginRun( edm::Run & iRun, const edm::EventSetup & iSetup )
00036 {
00037 if ( ! hltConfig_.init( nameProcess_ ) ) {
00038 edm::LogError( "hltConfigExtraction" ) << "HLT config extraction err with process name " << nameProcess_;
00039 return;
00040 }
00041 }
00042
00043 void PATTriggerEventProducer::produce( edm::Event& iEvent, const edm::EventSetup& iSetup )
00044 {
00045 if ( hltConfig_.size() <= 0 ) {
00046 edm::LogError( "hltConfigSize" ) << "HLT config size err" << "\n"
00047 << "Check for occurence of an \"errHltConfigExtraction\" from beginRun()";
00048 return;
00049 }
00050 edm::Handle< edm::TriggerResults > handleTriggerResults;
00051 iEvent.getByLabel( tagTriggerResults_, handleTriggerResults );
00052 if ( ! handleTriggerResults.isValid() ) {
00053 edm::LogError( "triggerResultsValid" ) << "edm::TriggerResults product with InputTag " << tagTriggerResults_.encode() << " not in event";
00054 return;
00055 }
00056 edm::Handle< TriggerPathCollection > handleTriggerPaths;
00057 iEvent.getByLabel( tagTriggerProducer_, handleTriggerPaths );
00058 edm::Handle< TriggerFilterCollection > handleTriggerFilters;
00059 iEvent.getByLabel( tagTriggerProducer_, handleTriggerFilters );
00060 edm::Handle< TriggerObjectCollection > handleTriggerObjects;
00061 iEvent.getByLabel( tagTriggerProducer_, handleTriggerObjects );
00062 edm::Handle< TriggerObjectStandAloneCollection > handleTriggerObjectsStandAlone;
00063 iEvent.getByLabel( tagTriggerProducer_, handleTriggerObjectsStandAlone );
00064 assert( handleTriggerObjects->size() == handleTriggerObjectsStandAlone->size() );
00065
00066
00067
00068 std::auto_ptr< TriggerEvent > triggerEvent( new TriggerEvent( std::string( hltConfig_.tableName() ), handleTriggerResults->wasrun(), handleTriggerResults->accept(), handleTriggerResults->error() ) );
00069
00070 if ( handleTriggerPaths.isValid() ) {
00071 triggerEvent->setPaths( handleTriggerPaths );
00072 } else {
00073 edm::LogError( "triggerPathsValid" ) << "pat::TriggerPathCollection product with InputTag " << tagTriggerProducer_.encode() << " not in event";
00074 }
00075 if ( handleTriggerFilters.isValid() ) {
00076 triggerEvent->setFilters( handleTriggerFilters );
00077 } else {
00078 edm::LogError( "triggerFiltersValid" ) << "pat::TriggerFilterCollection product with InputTag " << tagTriggerProducer_.encode() << " not in event";
00079 }
00080 if ( handleTriggerObjects.isValid() ) {
00081 triggerEvent->setObjects( handleTriggerObjects );
00082 } else {
00083 edm::LogError( "triggerObjectsValid" ) << "pat::TriggerObjectCollection product with InputTag " << tagTriggerProducer_.encode() << " not in event";
00084 }
00085
00086
00087 if ( handleTriggerObjects.isValid() ) {
00088 for ( size_t iMatch = 0; iMatch < tagsTriggerMatcher_.size(); ++iMatch ) {
00089 const std::string labelTriggerObjectMatcher( tagsTriggerMatcher_.at( iMatch ).label() );
00090
00091
00092 edm::Handle< TriggerObjectStandAloneMatch > handleTriggerObjectStandAloneMatch;
00093 iEvent.getByLabel( labelTriggerObjectMatcher, handleTriggerObjectStandAloneMatch );
00094 if ( ! handleTriggerObjectStandAloneMatch.isValid() ) {
00095 edm::LogError( "triggerMatchValid" ) << "pat::TriggerObjectStandAloneMatch product with InputTag " << labelTriggerObjectMatcher << " not in event";
00096 continue;
00097 }
00098 edm::AssociativeIterator< reco::CandidateBaseRef, TriggerObjectStandAloneMatch > it( *handleTriggerObjectStandAloneMatch, edm::EdmEventItemGetter< reco::CandidateBaseRef >( iEvent ) ), itEnd( it.end() );
00099 edm::Handle< reco::CandidateView > handleCands;
00100 std::vector< int > indices;
00101 while ( it != itEnd ) {
00102 if ( indices.size() == 0 ) {
00103 iEvent.get( it->first.id(), handleCands );
00104 }
00105 indices.push_back( it->second.key() );
00106 ++it;
00107 }
00108 std::auto_ptr< TriggerObjectMatch > triggerObjectMatch( new TriggerObjectMatch( handleTriggerObjects ) );
00109 TriggerObjectMatch::Filler matchFiller( *triggerObjectMatch );
00110 if ( handleCands.isValid() ) {
00111 matchFiller.insert( handleCands, indices.begin(), indices.end() );
00112 }
00113 matchFiller.fill();
00114 edm::OrphanHandle< TriggerObjectMatch > handleTriggerObjectMatch( iEvent.put( triggerObjectMatch, labelTriggerObjectMatcher ) );
00115
00116 if ( ! handleTriggerObjectMatch.isValid() ) {
00117 edm::LogError( "triggerMatchValid" ) << "pat::TriggerObjectMatch product with InputTag " << labelTriggerObjectMatcher << " not in event";
00118 continue;
00119 }
00120 if ( ! ( triggerEvent->addObjectMatchResult( handleTriggerObjectMatch, labelTriggerObjectMatcher ) ) ) {
00121 edm::LogWarning( "triggerObjectMatchReplication" ) << "pat::TriggerEvent contains already a pat::TriggerObjectMatch from matcher module " << labelTriggerObjectMatcher;
00122 }
00123 }
00124 }
00125
00126 iEvent.put( triggerEvent );
00127 }
00128
00129
00130 #include "FWCore/Framework/interface/MakerMacros.h"
00131 DEFINE_FWK_MODULE( PATTriggerEventProducer );