CMS 3D CMS Logo

PATTriggerEventProducer.cc

Go to the documentation of this file.
00001 //
00002 // $Id: PATTriggerEventProducer.cc,v 1.1.2.4 2009/03/27 21:31:06 vadler Exp $
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   // produce trigger event
00067   
00068   std::auto_ptr< TriggerEvent > triggerEvent( new TriggerEvent( std::string( hltConfig_.tableName() ), handleTriggerResults->wasrun(), handleTriggerResults->accept(), handleTriggerResults->error() ) );
00069   // set product references to trigger collections
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   // produce trigger match association and set references
00087   if ( handleTriggerObjects.isValid() ) {
00088     for ( size_t iMatch = 0; iMatch < tagsTriggerMatcher_.size(); ++iMatch ) {
00089       const std::string labelTriggerObjectMatcher( tagsTriggerMatcher_.at( iMatch ).label() );
00090       // copy trigger match association using TriggerObjectStandAlone to those using TriggerObject
00091       // relying on the fact, that only one candidate collection is present in the association
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       // set product reference to trigger match association
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 );

Generated on Tue Jun 9 17:41:44 2009 for CMSSW by  doxygen 1.5.4