1 |
//
|
2 |
// $Id: PATTriggerEventProducer.cc,v 1.1.2.4 2009/03/27 21:31:06 vadler Exp $
|
3 |
//
|
4 |
|
5 |
|
6 |
#include "PhysicsTools/PatAlgos/plugins/PATTriggerEventProducer.h"
|
7 |
|
8 |
#include <cassert>
|
9 |
|
10 |
#include "DataFormats/Common/interface/AssociativeIterator.h"
|
11 |
|
12 |
|
13 |
using namespace pat;
|
14 |
|
15 |
PATTriggerEventProducer::PATTriggerEventProducer( const edm::ParameterSet & iConfig ) :
|
16 |
nameProcess_( iConfig.getParameter< std::string >( "processName" ) ),
|
17 |
tagTriggerResults_( iConfig.getParameter< edm::InputTag >( "triggerResults" ) ),
|
18 |
tagTriggerProducer_( iConfig.getParameter< edm::InputTag >( "patTriggerProducer" ) ),
|
19 |
tagsTriggerMatcher_( iConfig.getParameter< std::vector< edm::InputTag > >( "patTriggerMatches" ) )
|
20 |
{
|
21 |
if ( tagTriggerResults_.process().empty() ) {
|
22 |
tagTriggerResults_ = edm::InputTag( tagTriggerResults_.label(), tagTriggerResults_.instance(), nameProcess_ );
|
23 |
}
|
24 |
|
25 |
for ( size_t iMatch = 0; iMatch < tagsTriggerMatcher_.size(); ++iMatch ) {
|
26 |
produces< TriggerObjectMatch >( tagsTriggerMatcher_.at( iMatch ).label() );
|
27 |
}
|
28 |
produces< TriggerEvent >();
|
29 |
}
|
30 |
|
31 |
PATTriggerEventProducer::~PATTriggerEventProducer()
|
32 |
{
|
33 |
}
|
34 |
|
35 |
void PATTriggerEventProducer::beginRun( edm::Run & iRun, const edm::EventSetup & iSetup )
|
36 |
{
|
37 |
if ( ! hltConfig_.init( nameProcess_ ) ) {
|
38 |
edm::LogError( "hltConfigExtraction" ) << "HLT config extraction err with process name " << nameProcess_;
|
39 |
return;
|
40 |
}
|
41 |
}
|
42 |
|
43 |
void PATTriggerEventProducer::produce( edm::Event& iEvent, const edm::EventSetup& iSetup )
|
44 |
{
|
45 |
if ( hltConfig_.size() <= 0 ) {
|
46 |
edm::LogError( "hltConfigSize" ) << "HLT config size err" << "\n"
|
47 |
<< "Check for occurence of an \"errHltConfigExtraction\" from beginRun()";
|
48 |
return;
|
49 |
}
|
50 |
edm::Handle< edm::TriggerResults > handleTriggerResults;
|
51 |
iEvent.getByLabel( tagTriggerResults_, handleTriggerResults );
|
52 |
if ( ! handleTriggerResults.isValid() ) {
|
53 |
edm::LogError( "triggerResultsValid" ) << "edm::TriggerResults product with InputTag " << tagTriggerResults_.encode() << " not in event";
|
54 |
return;
|
55 |
}
|
56 |
edm::Handle< TriggerPathCollection > handleTriggerPaths;
|
57 |
iEvent.getByLabel( tagTriggerProducer_, handleTriggerPaths );
|
58 |
edm::Handle< TriggerFilterCollection > handleTriggerFilters;
|
59 |
iEvent.getByLabel( tagTriggerProducer_, handleTriggerFilters );
|
60 |
edm::Handle< TriggerObjectCollection > handleTriggerObjects;
|
61 |
iEvent.getByLabel( tagTriggerProducer_, handleTriggerObjects );
|
62 |
edm::Handle< TriggerObjectStandAloneCollection > handleTriggerObjectsStandAlone;
|
63 |
iEvent.getByLabel( tagTriggerProducer_, handleTriggerObjectsStandAlone );
|
64 |
assert( handleTriggerObjects->size() == handleTriggerObjectsStandAlone->size() );
|
65 |
|
66 |
// produce trigger event
|
67 |
|
68 |
std::auto_ptr< TriggerEvent > triggerEvent( new TriggerEvent( std::string( hltConfig_.tableName() ), handleTriggerResults->wasrun(), handleTriggerResults->accept(), handleTriggerResults->error() ) );
|
69 |
// set product references to trigger collections
|
70 |
if ( handleTriggerPaths.isValid() ) {
|
71 |
triggerEvent->setPaths( handleTriggerPaths );
|
72 |
} else {
|
73 |
edm::LogError( "triggerPathsValid" ) << "pat::TriggerPathCollection product with InputTag " << tagTriggerProducer_.encode() << " not in event";
|
74 |
}
|
75 |
if ( handleTriggerFilters.isValid() ) {
|
76 |
triggerEvent->setFilters( handleTriggerFilters );
|
77 |
} else {
|
78 |
edm::LogError( "triggerFiltersValid" ) << "pat::TriggerFilterCollection product with InputTag " << tagTriggerProducer_.encode() << " not in event";
|
79 |
}
|
80 |
if ( handleTriggerObjects.isValid() ) {
|
81 |
triggerEvent->setObjects( handleTriggerObjects );
|
82 |
} else {
|
83 |
edm::LogError( "triggerObjectsValid" ) << "pat::TriggerObjectCollection product with InputTag " << tagTriggerProducer_.encode() << " not in event";
|
84 |
}
|
85 |
|
86 |
// produce trigger match association and set references
|
87 |
if ( handleTriggerObjects.isValid() ) {
|
88 |
for ( size_t iMatch = 0; iMatch < tagsTriggerMatcher_.size(); ++iMatch ) {
|
89 |
const std::string labelTriggerObjectMatcher( tagsTriggerMatcher_.at( iMatch ).label() );
|
90 |
// copy trigger match association using TriggerObjectStandAlone to those using TriggerObject
|
91 |
// relying on the fact, that only one candidate collection is present in the association
|
92 |
edm::Handle< TriggerObjectStandAloneMatch > handleTriggerObjectStandAloneMatch;
|
93 |
iEvent.getByLabel( labelTriggerObjectMatcher, handleTriggerObjectStandAloneMatch );
|
94 |
if ( ! handleTriggerObjectStandAloneMatch.isValid() ) {
|
95 |
edm::LogError( "triggerMatchValid" ) << "pat::TriggerObjectStandAloneMatch product with InputTag " << labelTriggerObjectMatcher << " not in event";
|
96 |
continue;
|
97 |
}
|
98 |
edm::AssociativeIterator< reco::CandidateBaseRef, TriggerObjectStandAloneMatch > it( *handleTriggerObjectStandAloneMatch, edm::EdmEventItemGetter< reco::CandidateBaseRef >( iEvent ) ), itEnd( it.end() );
|
99 |
edm::Handle< reco::CandidateView > handleCands;
|
100 |
std::vector< int > indices;
|
101 |
while ( it != itEnd ) {
|
102 |
if ( indices.size() == 0 ) {
|
103 |
iEvent.get( it->first.id(), handleCands );
|
104 |
}
|
105 |
indices.push_back( it->second.key() );
|
106 |
++it;
|
107 |
}
|
108 |
std::auto_ptr< TriggerObjectMatch > triggerObjectMatch( new TriggerObjectMatch( handleTriggerObjects ) );
|
109 |
TriggerObjectMatch::Filler matchFiller( *triggerObjectMatch );
|
110 |
if ( handleCands.isValid() ) {
|
111 |
matchFiller.insert( handleCands, indices.begin(), indices.end() );
|
112 |
}
|
113 |
matchFiller.fill();
|
114 |
edm::OrphanHandle< TriggerObjectMatch > handleTriggerObjectMatch( iEvent.put( triggerObjectMatch, labelTriggerObjectMatcher ) );
|
115 |
// set product reference to trigger match association
|
116 |
if ( ! handleTriggerObjectMatch.isValid() ) {
|
117 |
edm::LogError( "triggerMatchValid" ) << "pat::TriggerObjectMatch product with InputTag " << labelTriggerObjectMatcher << " not in event";
|
118 |
continue;
|
119 |
}
|
120 |
if ( ! ( triggerEvent->addObjectMatchResult( handleTriggerObjectMatch, labelTriggerObjectMatcher ) ) ) {
|
121 |
edm::LogWarning( "triggerObjectMatchReplication" ) << "pat::TriggerEvent contains already a pat::TriggerObjectMatch from matcher module " << labelTriggerObjectMatcher;
|
122 |
}
|
123 |
}
|
124 |
}
|
125 |
|
126 |
iEvent.put( triggerEvent );
|
127 |
}
|
128 |
|
129 |
|
130 |
#include "FWCore/Framework/interface/MakerMacros.h"
|
131 |
DEFINE_FWK_MODULE( PATTriggerEventProducer );
|