ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/GPetrucc/plugins/HadronicVariableComputer.cc
Revision: 1.2
Committed: Wed Sep 30 14:03:35 2009 UTC (15 years, 7 months ago) by gpetrucc
Content type: text/plain
Branch: MAIN
CVS Tags: V03-00-00, V02-00-00, Before34X, V01-00-00, HEAD
Changes since 1.1: +2 -2 lines
Log Message:
Port to 3_1_X

File Contents

# User Rev Content
1 gpetrucc 1.1 // -*- C++ -*-
2     //
3     // Package: HadronicVariableComputer
4     // Class: HadronicVariableComputer
5     //
6     /**\class HadronicVariableComputer HadronicVariableComputer.cc Gio/HadronicVariableComputer/src/HadronicVariableComputer.cc
7    
8     Description: <one line class summary>
9    
10     Implementation:
11     <Notes on implementation>
12     */
13     //
14     // Original Author: Jun 20 11:36 (85-18-136-104.fastres.net)
15     // Created: Fri Jun 20 11:41:35 CEST 2008
16 gpetrucc 1.2 // $Id: HadronicVariableComputer.cc,v 1.1 2009/09/05 17:14:35 gpetrucc Exp $
17 gpetrucc 1.1 //
18     //
19    
20    
21     // system include files
22     #include <memory>
23    
24     // user include files
25     #include "FWCore/Framework/interface/Frameworkfwd.h"
26     #include "FWCore/Framework/interface/EDProducer.h"
27    
28     #include "FWCore/Framework/interface/Event.h"
29     #include "FWCore/Framework/interface/MakerMacros.h"
30    
31     #include "FWCore/ParameterSet/interface/ParameterSet.h"
32     #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
33     #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
34     #include "DataFormats/Common/interface/View.h"
35     #include "DataFormats/Common/interface/ValueMap.h"
36     #include "DataFormats/Math/interface/deltaR.h"
37     #include "DataFormats/MuonReco/interface/MuonFwd.h"
38     #include "DataFormats/MuonReco/interface/Muon.h"
39     //#include "DataFormats/JetReco/interface/Jet.h"
40     #include "DataFormats/PatCandidates/interface/Jet.h"
41 gpetrucc 1.2 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
42 gpetrucc 1.1 //
43     // class decleration
44     //
45    
46     class HadronicVariableComputer : public edm::EDProducer {
47     public:
48     explicit HadronicVariableComputer(const edm::ParameterSet&);
49     ~HadronicVariableComputer();
50    
51    
52     private:
53     virtual void beginJob(const edm::EventSetup&) ;
54     virtual void produce(edm::Event&, const edm::EventSetup&);
55     virtual void endJob() ;
56    
57     // ----------member data ---------------------------
58     edm::InputTag muons_;
59     edm::InputTag jets_;
60     StringCutObjectSelector<pat::Jet> cut_;
61     double deltaR_;
62    
63     const pat::Jet *findNear(const reco::Candidate &muon, const edm::View<pat::Jet> &jets, bool nearest) const ;
64     std::pair<float,int> findInPhi(const edm::View<pat::Jet> &jets, double phi, double phiRange) const ;
65    
66     /// Write a ValueMap<int> in the event
67     template<typename T>
68     void writeValueMap(edm::Event &iEvent,
69     const edm::Handle<edm::View<reco::Candidate> > & handle,
70     const std::vector<T> & values,
71     const std::string & label) const ;
72    
73    
74     };
75    
76     //
77     // constructors and destructor
78     //
79     HadronicVariableComputer::HadronicVariableComputer(const edm::ParameterSet& iConfig) :
80     muons_(iConfig.getParameter<edm::InputTag>("muons")),
81     jets_(iConfig.getParameter<edm::InputTag>("jets")),
82     cut_(iConfig.getParameter<std::string>("cut")),
83     deltaR_(iConfig.getParameter<double>("deltaR"))
84     {
85     produces<edm::ValueMap<float> >("ptrelNearest");
86     produces<edm::ValueMap<float> >("ptrelHardest");
87     produces<edm::ValueMap<float> >("ptjetNearest");
88     produces<edm::ValueMap<float> >("ptjetHardest");
89     produces<edm::ValueMap<float> >("drNearest");
90     produces<edm::ValueMap<float> >("drHardest");
91     produces<edm::ValueMap<float> >("hardestSame");
92     produces<edm::ValueMap<float> >("hardestOppo");
93     produces<edm::ValueMap<int> >("countSame");
94     produces<edm::ValueMap<int> >("countOppo");
95    
96     produces<edm::ValueMap<float> >("btagTCPNearest");
97     produces<edm::ValueMap<float> >("btagTCENearest");
98     produces<edm::ValueMap<float> >("btagJPNearest");
99     produces<edm::ValueMap<float> >("btagJPBNearest");
100     produces<edm::ValueMap<float> >("btagSSVNearest");
101     produces<edm::ValueMap<int> >("mcFlavNearest");
102     }
103    
104    
105     HadronicVariableComputer::~HadronicVariableComputer()
106     {
107     }
108    
109     //
110     // member functions
111     //
112     const pat::Jet *
113     HadronicVariableComputer::findNear(const reco::Candidate &muon, const edm::View<pat::Jet> &jets, bool nearest) const {
114     const pat::Jet *match = 0;
115     double val = (nearest ? deltaR_ : nearest);
116     for (edm::View<pat::Jet>::const_iterator jet = jets.begin(), end = jets.end(); jet != end; ++jet) {
117     if (!cut_(*jet)) continue;
118     double dr = ::deltaR(muon, *jet);
119     if (dr > deltaR_) continue;
120     if (nearest) {
121     if (dr < val) { match = &*jet; val = dr; }
122     } else {
123     if (jet->pt() > val) { match = &*jet; val = jet->pt(); }
124     }
125     }
126     return match;
127     }
128    
129     std::pair<float,int>
130     HadronicVariableComputer::findInPhi(const edm::View<pat::Jet> &jets, double phi, double phiRange) const {
131     std::pair<float,int> ret(0,0);
132     for (edm::View<pat::Jet>::const_iterator jet = jets.begin(), end = jets.end(); jet != end; ++jet) {
133     if (!cut_(*jet)) continue;
134     if (std::abs(deltaPhi(phi, jet->phi())) > phiRange) continue;
135     if (jet->pt() > ret.first) ret.first = jet->pt();
136     ret.second++;
137     }
138     return ret;
139     }
140    
141     // ------------ method called to for each event ------------
142     void
143     HadronicVariableComputer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
144     {
145     using namespace edm;
146     using namespace std;
147     Handle<View<reco::Candidate> > muons;
148     iEvent.getByLabel(muons_, muons);
149     Handle<View<pat::Jet> > jets;
150     iEvent.getByLabel(jets_, jets);
151    
152     const char *rankings[2] = { "Hardest", "Nearest" };
153     for (int nearest = 0; nearest <= 1; ++nearest) {
154     vector<float> ptjet(muons->size(), 0);
155     vector<float> ptrel(muons->size(), 0);
156     vector<float> dr(muons->size(), 0);
157     vector<float> btagTCP(muons->size(), -999);
158     vector<float> btagTCE(muons->size(), -999);
159     vector<float> btagJP(muons->size(), -999);
160     vector<float> btagJPB(muons->size(), -999);
161     vector<float> btagSSV(muons->size(), -999);
162     vector<int> mcFlav(muons->size(), -1);
163     for (size_t i = 0; i < muons->size(); ++i) {
164     const reco::Candidate &mu = (*muons)[i];
165     const pat::Jet *jet = findNear(mu, *jets, nearest);
166     if (jet != 0) {
167     dr[i] = ::deltaR(mu,*jet);
168     ptjet[i] = jet->pt();
169     ptrel[i] = mu.momentum().Cross(jet->momentum().Unit()).R();
170     btagTCP[i] = jet->bDiscriminator("trackCountingHighPurBJetTags");
171     btagTCE[i] = jet->bDiscriminator("trackCountingHighEffBJetTags");
172     btagJP[i] = jet->bDiscriminator("jetProbabilityBJetTags");
173     btagJPB[i] = jet->bDiscriminator("jetBProbabilityBJetTags");
174     btagSSV[i] = jet->bDiscriminator("simpleSecondaryVertexBJetTags");
175     mcFlav[i] = jet->partonFlavour();
176     }
177     }
178     writeValueMap<float>(iEvent, muons, dr, std::string("dr")+rankings[nearest]);
179     writeValueMap<float>(iEvent, muons, ptjet, std::string("ptjet")+rankings[nearest]);
180     writeValueMap<float>(iEvent, muons, ptrel, std::string("ptrel")+rankings[nearest]);
181     if (nearest) {
182     writeValueMap<float>(iEvent, muons, btagTCP, std::string("btagTCP")+rankings[nearest]);
183     writeValueMap<float>(iEvent, muons, btagTCE, std::string("btagTCE")+rankings[nearest]);
184     writeValueMap<float>(iEvent, muons, btagJP, std::string("btagJP")+rankings[nearest]);
185     writeValueMap<float>(iEvent, muons, btagJPB, std::string("btagJPB")+rankings[nearest]);
186     writeValueMap<float>(iEvent, muons, btagSSV, std::string("btagSSV")+rankings[nearest]);
187     writeValueMap<int>(iEvent, muons, mcFlav, std::string("mcFlav")+rankings[nearest]);
188     }
189    
190     }
191    
192     const char *sides[2] = { "Same", "Oppo" };
193     for (int side = 0; side <= 1; ++side) {
194     vector<float> pt(muons->size(), 0);
195     vector<int> count(muons->size(), 0);
196     for (size_t i = 0; i < muons->size(); ++i) {
197     const reco::Candidate &mu = (*muons)[i];
198     pair<float,int> result = findInPhi(*jets, mu.phi()+side*M_PI, 0.5*M_PI);
199     pt[i] = result.first;
200     count[i] = result.second;
201     }
202    
203     writeValueMap<float>(iEvent, muons, pt, std::string("hardest")+sides[side]);
204     writeValueMap<int>(iEvent, muons, count, std::string("count")+sides[side]);
205     }
206     }
207    
208    
209     // ------------ method called once each job just before starting event loop ------------
210     void
211     HadronicVariableComputer::beginJob(const edm::EventSetup&)
212     {
213     }
214    
215     // ------------ method called once each job just after ending the event loop ------------
216     void
217     HadronicVariableComputer::endJob() {
218     }
219    
220     template<typename T>
221     void
222     HadronicVariableComputer::writeValueMap(edm::Event &iEvent,
223     const edm::Handle<edm::View<reco::Candidate> > & handle,
224     const std::vector<T> & values,
225     const std::string & label) const
226     {
227     using namespace edm;
228     using namespace std;
229     auto_ptr<ValueMap<T> > valMap(new ValueMap<T>());
230     typename edm::ValueMap<T>::Filler filler(*valMap);
231     filler.insert(handle, values.begin(), values.end());
232     filler.fill();
233     iEvent.put(valMap, label);
234     }
235    
236    
237     //define this as a plug-in
238     DEFINE_FWK_MODULE(HadronicVariableComputer);
239