Go to the documentation of this file.00001 #ifndef PhysicsTools_TagAndProbe_MatchedProbeMaker_H
00002 #define PhysicsTools_TagAndProbe_MatchedProbeMaker_H
00003
00004
00005 #include <memory>
00006 #include <vector>
00007
00008
00009 #include "DataFormats/Common/interface/Handle.h"
00010 #include "DataFormats/Candidate/interface/Candidate.h"
00011 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00012 #include "DataFormats/Candidate/interface/OverlapChecker.h"
00013 #include "DataFormats/Math/interface/deltaR.h"
00014 #include "DataFormats/Common/interface/Ref.h"
00015 #include "DataFormats/Common/interface/RefVector.h"
00016 #include "DataFormats/Candidate/interface/Candidate.h"
00017 #include "DataFormats/Candidate/interface/CandMatchMap.h"
00018 #include "FWCore/Framework/interface/Frameworkfwd.h"
00019 #include "FWCore/Framework/interface/EDProducer.h"
00020 #include "FWCore/Framework/interface/Event.h"
00021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00022 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00023 #include "FWCore/Utilities/interface/InputTag.h"
00024
00025
00026
00027
00028
00029 template< typename T >
00030 class MatchedProbeMaker : public edm::EDProducer
00031 {
00032 public:
00033 typedef std::vector< T > collection;
00034
00035 explicit MatchedProbeMaker(const edm::ParameterSet& iConfig);
00036
00037 ~MatchedProbeMaker();
00038
00039 private:
00040 virtual void beginJob() ;
00041 virtual void produce(edm::Event&, const edm::EventSetup&);
00042 virtual void endJob() ;
00043
00044
00045 edm::InputTag m_candidateSource;
00046 edm::InputTag m_referenceSource;
00047 edm::InputTag m_resMatchMapSource;
00048
00049 bool matched_;
00050
00051 };
00052
00053 template< typename T >
00054 MatchedProbeMaker<T>::MatchedProbeMaker(const edm::ParameterSet& iConfig) :
00055 m_candidateSource(iConfig.getUntrackedParameter<edm::InputTag>("CandidateSource")),
00056 m_referenceSource(iConfig.getUntrackedParameter<edm::InputTag>("ReferenceSource")),
00057 m_resMatchMapSource(iConfig.getUntrackedParameter<edm::InputTag>("ResMatchMapSource",edm::InputTag("Dummy"))),
00058 matched_(iConfig.getUntrackedParameter< bool >("Matched",true))
00059 {
00060
00061 produces< edm::RefVector< collection > >();
00062 }
00063
00064
00065 template< typename T >
00066 MatchedProbeMaker<T>::~MatchedProbeMaker(){}
00067
00068
00069 template< typename T >
00070 void MatchedProbeMaker<T>::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00071 {
00072 LogDebug("MatchedProbeMaker");
00073
00074 using namespace edm;
00075 using namespace reco;
00076
00077 std::auto_ptr< edm::RefVector< collection > > outputCollection_matched( new edm::RefVector< collection > );
00078 std::auto_ptr< edm::RefVector< collection > > outputCollection_unmatched(new edm::RefVector< collection > );
00079
00080
00081 edm::Handle< edm::RefVector< collection > > Cands;
00082 iEvent.getByLabel(m_candidateSource,Cands);
00083
00084 edm::Handle< reco::CandidateView > Refs;
00085 iEvent.getByLabel(m_referenceSource,Refs);
00086
00087
00088 edm::Handle<reco::CandViewMatchMap> ResMatchMap;
00089
00090 if(iEvent.getByLabel(m_resMatchMapSource,ResMatchMap)){
00091
00092 for (unsigned i=0; i<Cands->size(); i++) {
00093 const edm::Ref< collection > CandRef = (*Cands)[i];
00094 reco::CandidateBaseRef candBaseRef( CandRef );
00095
00096
00097 reco::CandViewMatchMap::const_iterator f = ResMatchMap->find( candBaseRef );
00098 if( f!=ResMatchMap->end() ) {
00099 outputCollection_matched->push_back(CandRef);
00100 } else {
00101 outputCollection_unmatched->push_back(CandRef);
00102 }
00103 }
00104 } else {
00105 OverlapChecker overlap;
00106
00107
00108 for (unsigned i=0; i<Cands->size(); i++) {
00109 const edm::Ref< collection > CandRef = (*Cands)[i];
00110
00111 reco::CandidateBaseRef candBaseRef( CandRef );
00112
00113 bool ppass = false;
00114
00115 for (unsigned j=0; j<Refs->size(); j++) {
00116
00117 RefToBase<Candidate> RefRef(Refs, j);
00118 reco::CandidateBaseRef refBaseRef( RefRef );
00119
00120 if(overlap(*CandRef,*RefRef)) {
00121 ppass = true;
00122 }
00123 }
00124
00125 if( ppass ) outputCollection_matched->push_back(CandRef);
00126 else outputCollection_unmatched->push_back(CandRef);
00127 }
00128 }
00129
00130 if( matched_ ) iEvent.put( outputCollection_matched );
00131 else iEvent.put( outputCollection_unmatched );
00132
00133 }
00134
00135
00136 template< typename T >
00137 void MatchedProbeMaker<T>::beginJob()
00138 {
00139 }
00140
00141
00142 template< typename T >
00143 void MatchedProbeMaker<T>::endJob()
00144 {
00145 }
00146
00147 #endif
00148
00149