ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/GPetrucc/plugins/CompositeCandidateCleaner.cc
Revision: 1.1
Committed: Thu May 28 17:33:10 2009 UTC (15 years, 11 months ago) by gpetrucc
Content type: text/plain
Branch: MAIN
CVS Tags: V03-00-00, V02-00-00, Before34X, V01-00-00, Checkpoint_2_2_10_v1, HEAD
Error occurred while calculating annotation data.
Log Message:
Tag & Probe from composite candidates

File Contents

# Content
1 //
2 // $Id: CompositeCandidateCleaner.cc,v 1.1 2009/04/14 13:58:52 gpetrucc Exp $
3 //
4
5 /**
6 \class pat::CompositeCandidateCleaner CompositeCandidateCleaner.h "PhysicsTools/PatAlgos/interface/CompositeCandidateCleaner.h"
7 \brief Matcher of reconstructed objects to L1 Muons
8
9 \author Giovanni Petrucciani
10 \version $Id: CompositeCandidateCleaner.cc,v 1.1 2009/04/14 13:58:52 gpetrucc Exp $
11 */
12
13
14 #include "FWCore/Framework/interface/EDProducer.h"
15 #include "FWCore/Framework/interface/Event.h"
16 #include "FWCore/ParameterSet/interface/ParameterSet.h"
17 #include "FWCore/ParameterSet/interface/InputTag.h"
18
19 #include <DataFormats/Candidate/interface/CompositeCandidate.h>
20 #include <functional>
21
22 namespace pat {
23 namespace helper {
24 struct ShallowClonePtrOverlap {
25 typedef reco::CandidatePtr value_type;
26 value_type operator()(const reco::Candidate &c) const { return c.masterClonePtr(); }
27 bool operator()(const value_type &v1, const value_type &v2) const { return v1 == v2; }
28 };
29 struct ShallowCloneOverlap {
30 typedef reco::CandidateBaseRef value_type;
31 value_type operator()(const reco::Candidate &c) const { return c.masterClone(); }
32 bool operator()(const value_type &v1, const value_type &v2) const { return v1 == v2; }
33 };
34 }
35
36 template<typename CompositeCandidateT, typename OverlapT>
37 class CompositeCandidateCleanerT : public edm::EDProducer {
38 public:
39 explicit CompositeCandidateCleanerT(const edm::ParameterSet & iConfig);
40 virtual ~CompositeCandidateCleanerT() { }
41
42 virtual void produce(edm::Event & iEvent, const edm::EventSetup & iSetup);
43
44 private:
45 edm::InputTag src_;
46
47 enum Mode { NoCleaning, OneProbe, BestMass };
48 Mode mode_;
49 double mass_;
50
51 };
52
53 typedef CompositeCandidateCleanerT<reco::CompositeCandidate,helper::ShallowClonePtrOverlap> CompositeShallowClonePtrCandidateCleaner;
54 typedef CompositeCandidateCleanerT<reco::CompositeCandidate,helper::ShallowCloneOverlap> CompositeShallowCloneCandidateCleaner;
55 } // namespace
56
57 template<typename CompositeCandidateT, typename OverlapT>
58 pat::CompositeCandidateCleanerT<CompositeCandidateT,OverlapT>::CompositeCandidateCleanerT(const edm::ParameterSet & iConfig) :
59 src_(iConfig.getParameter<edm::InputTag>("src")), mass_(0)
60 {
61 std::string mode = iConfig.getParameter<std::string>("mode");
62 if (mode == "NoCleaning") { // Pass all
63 mode_ = NoCleaning;
64 } else if (mode == "OneProbe") { // One probe only
65 mode_ = OneProbe;
66 } else if (mode == "BestMass") {
67 mode_ = BestMass;
68 mass_ = iConfig.getParameter<double>("mass");
69 }
70 produces<typename std::vector<CompositeCandidateT> >();
71 }
72
73 template<typename CompositeCandidateT, typename OverlapT>
74 void
75 pat::CompositeCandidateCleanerT<CompositeCandidateT,OverlapT>::produce(edm::Event & iEvent, const edm::EventSetup & iSetup) {
76 using namespace edm;
77 using namespace std;
78
79 Handle<View<CompositeCandidateT> > src;
80 iEvent.getByLabel(src_, src);
81
82 // boolean work area. use ints
83 vector<int> good(src->size(), 1);
84
85 // Overlap
86 OverlapT overlap;
87
88 // loop variables
89 typename View<CompositeCandidateT>::const_iterator it, jt, be = src->begin(), ed = src->end(), ed1 = ed - 1;
90 size_t i, j;
91 if (src->size() > 1) {
92 for (it = be, i = 0; it != ed1; ++it, ++i) {
93 const CompositeCandidateT & ci = *it;
94 assert(ci.daughter(0) != 0);
95 typename OverlapT::value_type vt1 = overlap(*ci.daughter(0)); // tag
96 for (jt = it+1, j = i+1; jt != ed; ++jt, ++j) {
97 const CompositeCandidateT & cj = *jt;
98 assert(cj.daughter(0) != 0);
99 typename OverlapT::value_type vt2 = overlap(*cj.daughter(0));
100 if (overlap(vt1, vt2)) { // same tag
101 if (mode_ == OneProbe) {
102 good[i] = 0; good[j] = 0;
103 } else if (mode_ == BestMass) {
104 int worse = fabs(ci.mass() - mass_) > fabs(cj.mass() - mass_) ? i : j;
105 good[worse] = 0;
106 }
107 }
108 }
109 }
110 }
111
112 // room for output
113 auto_ptr<vector<CompositeCandidateT> > out(new vector<CompositeCandidateT>());
114 out->reserve(src->size());
115 for (it = be, i = 0; it != ed; ++it, ++i) {
116 if (good[i]) out->push_back(*it);
117 }
118
119 iEvent.put(out);
120 }
121
122 #include "FWCore/Framework/interface/MakerMacros.h"
123 using namespace pat;
124 DEFINE_FWK_MODULE(CompositeShallowClonePtrCandidateCleaner);
125 DEFINE_FWK_MODULE(CompositeShallowCloneCandidateCleaner);