1 |
// -*- C++ -*-
|
2 |
//
|
3 |
// Package: MuJetMergingOverlap
|
4 |
// Class: MuJetMergingOverlap
|
5 |
//
|
6 |
/**\class MuJetMergingOverlap MuJetMergingOverlap.cc AnalysisTools/MuJetMergingOverlap/src/MuJetMergingOverlap.cc
|
7 |
|
8 |
Description: [one line class summary]
|
9 |
|
10 |
Implementation:
|
11 |
[Notes on implementation]
|
12 |
*/
|
13 |
//
|
14 |
// Original Author: James Pivarski
|
15 |
// Created: Tue Nov 16 17:27:21 CST 2010
|
16 |
// $Id$
|
17 |
//
|
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/EDAnalyzer.h"
|
27 |
#include "FWCore/Framework/interface/Event.h"
|
28 |
#include "FWCore/Framework/interface/MakerMacros.h"
|
29 |
#include "FWCore/ParameterSet/interface/ParameterSet.h"
|
30 |
#include "FWCore/Utilities/interface/InputTag.h"
|
31 |
|
32 |
#include "AnalysisDataFormats/MuJetAnalysis/interface/MultiMuon.h"
|
33 |
#include "CommonTools/UtilAlgos/interface/TFileService.h"
|
34 |
#include "DataFormats/MuonReco/interface/Muon.h"
|
35 |
#include "DataFormats/PatCandidates/interface/Muon.h"
|
36 |
#include "DataFormats/TrackReco/interface/TrackFwd.h"
|
37 |
#include "FWCore/ServiceRegistry/interface/Service.h"
|
38 |
#include "DataFormats/Candidate/interface/Candidate.h"
|
39 |
#include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
|
40 |
#include "TTree.h"
|
41 |
|
42 |
//
|
43 |
// class declaration
|
44 |
//
|
45 |
|
46 |
class MuJetMergingOverlap : public edm::EDAnalyzer {
|
47 |
public:
|
48 |
explicit MuJetMergingOverlap(const edm::ParameterSet&);
|
49 |
~MuJetMergingOverlap();
|
50 |
|
51 |
|
52 |
private:
|
53 |
virtual void beginJob() ;
|
54 |
virtual void analyze(const edm::Event&, const edm::EventSetup&);
|
55 |
virtual void endJob() ;
|
56 |
|
57 |
// ----------member data ---------------------------
|
58 |
edm::InputTag m_src;
|
59 |
bool m_getQscale;
|
60 |
bool m_getAlternating;
|
61 |
|
62 |
TTree *m_ttree;
|
63 |
Float_t m_qscale;
|
64 |
Int_t m_num_mujets;
|
65 |
Int_t m_num1;
|
66 |
Int_t m_num2;
|
67 |
Float_t m_pt1;
|
68 |
Float_t m_pt2;
|
69 |
Float_t m_mass1;
|
70 |
Float_t m_mass2;
|
71 |
Float_t m_drmax1;
|
72 |
Float_t m_drmax2;
|
73 |
Float_t m_vprob1;
|
74 |
Float_t m_vprob2;
|
75 |
Float_t m_eta1;
|
76 |
Float_t m_eta2;
|
77 |
Float_t m_iso1;
|
78 |
Float_t m_iso2;
|
79 |
Int_t m_pdgid1;
|
80 |
Int_t m_pdgid2;
|
81 |
Float_t m_dphi;
|
82 |
Float_t m_deta;
|
83 |
Float_t m_dr;
|
84 |
};
|
85 |
|
86 |
//
|
87 |
// constants, enums and typedefs
|
88 |
//
|
89 |
|
90 |
//
|
91 |
// static data member definitions
|
92 |
//
|
93 |
|
94 |
//
|
95 |
// constructors and destructor
|
96 |
//
|
97 |
MuJetMergingOverlap::MuJetMergingOverlap(const edm::ParameterSet& iConfig)
|
98 |
: m_src(iConfig.getParameter<edm::InputTag>("src"))
|
99 |
, m_getQscale(iConfig.getParameter<bool>("getQscale"))
|
100 |
, m_getAlternating(iConfig.getParameter<bool>("getAlternating"))
|
101 |
{
|
102 |
//now do what ever initialization is needed
|
103 |
edm::Service<TFileService> tFile;
|
104 |
m_ttree = tFile->make<TTree>("ttree", "ttree");
|
105 |
m_ttree->Branch("qscale", &m_qscale, "qscale/F");
|
106 |
m_ttree->Branch("num_mujets", &m_num_mujets, "num_mujets/I");
|
107 |
m_ttree->Branch("num1", &m_num1, "num1/I");
|
108 |
m_ttree->Branch("num2", &m_num2, "num2/I");
|
109 |
m_ttree->Branch("pt1", &m_pt1, "pt1/F");
|
110 |
m_ttree->Branch("pt2", &m_pt2, "pt2/F");
|
111 |
m_ttree->Branch("mass1", &m_mass1, "mass1/F");
|
112 |
m_ttree->Branch("mass2", &m_mass2, "mass2/F");
|
113 |
m_ttree->Branch("drmax1", &m_drmax1, "drmax1/F");
|
114 |
m_ttree->Branch("drmax2", &m_drmax2, "drmax2/F");
|
115 |
m_ttree->Branch("vprob1", &m_vprob1, "vprob1/F");
|
116 |
m_ttree->Branch("vprob2", &m_vprob2, "vprob2/F");
|
117 |
m_ttree->Branch("eta1", &m_eta1, "eta1/F");
|
118 |
m_ttree->Branch("eta2", &m_eta2, "eta2/F");
|
119 |
m_ttree->Branch("iso1", &m_iso1, "iso1/F");
|
120 |
m_ttree->Branch("iso2", &m_iso2, "iso2/F");
|
121 |
m_ttree->Branch("pdgid1", &m_pdgid1, "pdgid1/I");
|
122 |
m_ttree->Branch("pdgid2", &m_pdgid2, "pdgid2/I");
|
123 |
m_ttree->Branch("dphi", &m_dphi, "dphi/F");
|
124 |
m_ttree->Branch("deta", &m_deta, "deta/F");
|
125 |
m_ttree->Branch("dr", &m_dr, "dr/F");
|
126 |
}
|
127 |
|
128 |
|
129 |
MuJetMergingOverlap::~MuJetMergingOverlap()
|
130 |
{
|
131 |
|
132 |
// do anything here that needs to be done at desctruction time
|
133 |
// (e.g. close files, deallocate resources etc.)
|
134 |
|
135 |
}
|
136 |
|
137 |
|
138 |
//
|
139 |
// member functions
|
140 |
//
|
141 |
|
142 |
// ------------ method called to for each event ------------
|
143 |
void
|
144 |
MuJetMergingOverlap::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
|
145 |
{
|
146 |
edm::Handle<pat::MultiMuonCollection> muJets;
|
147 |
iEvent.getByLabel(m_src, muJets);
|
148 |
|
149 |
m_qscale = -1000.;
|
150 |
m_num_mujets = -1000;
|
151 |
m_num1 = -1000;
|
152 |
m_num2 = -1000;
|
153 |
m_pt1 = -1000.;
|
154 |
m_pt2 = -1000.;
|
155 |
m_mass1 = -1000.;
|
156 |
m_mass2 = -1000.;
|
157 |
m_drmax1 = -1000.;
|
158 |
m_drmax2 = -1000.;
|
159 |
m_vprob1 = -1000.;
|
160 |
m_vprob2 = -1000.;
|
161 |
m_eta1 = -1000.;
|
162 |
m_eta2 = -1000.;
|
163 |
m_iso1 = -1000.;
|
164 |
m_iso2 = -1000.;
|
165 |
m_pdgid1 = -1000;
|
166 |
m_pdgid2 = -1000;
|
167 |
m_dphi = -1000.;
|
168 |
m_deta = -1000.;
|
169 |
m_dr = -1000.;
|
170 |
|
171 |
m_qscale = 0.;
|
172 |
if (m_getQscale) {
|
173 |
edm::Handle<GenEventInfoProduct> genEventInfoProduct;
|
174 |
iEvent.getByLabel("generator", genEventInfoProduct);
|
175 |
m_qscale = genEventInfoProduct->qScale();
|
176 |
}
|
177 |
|
178 |
bool alternating = true;
|
179 |
if (m_getAlternating) {
|
180 |
edm::Handle<unsigned int> particleNumber;
|
181 |
iEvent.getByLabel("generator", "particleNumber", particleNumber);
|
182 |
alternating = (*particleNumber == 0);
|
183 |
}
|
184 |
|
185 |
if (!alternating) return;
|
186 |
|
187 |
pat::MultiMuonCollection::const_iterator muJet1 = muJets->end();
|
188 |
pat::MultiMuonCollection::const_iterator muJet2 = muJets->end();
|
189 |
for (pat::MultiMuonCollection::const_iterator muJet = muJets->begin(); muJet != muJets->end(); ++muJet) {
|
190 |
if (muJet1 == muJets->end() || muJet1->pt() < muJet->pt()) {
|
191 |
muJet2 = muJet1;
|
192 |
muJet1 = muJet;
|
193 |
}
|
194 |
else if (muJet2 == muJets->end() || muJet2->pt() < muJet->pt()) {
|
195 |
muJet2 = muJet;
|
196 |
}
|
197 |
}
|
198 |
|
199 |
m_num_mujets = muJets->size();
|
200 |
|
201 |
if (muJet1 != muJets->end()) {
|
202 |
m_num1 = muJet1->numberOfDaughters();
|
203 |
m_pt1 = muJet1->pt();
|
204 |
m_mass1 = muJet1->mass();
|
205 |
m_drmax1 = muJet1->dRmax();
|
206 |
if (muJet1->vertexValid()) m_vprob1 = muJet1->vertexProb();
|
207 |
else m_vprob1 = -1.;
|
208 |
m_eta1 = muJet1->eta();
|
209 |
m_iso1 = muJet1->centralTrackIsolation();
|
210 |
if (muJet1->genParticlesSize() == 1) m_pdgid1 = muJet1->genParticle(0)->pdgId();
|
211 |
else m_pdgid1 = 0;
|
212 |
|
213 |
if (muJet2 != muJets->end()) {
|
214 |
m_num2 = muJet2->numberOfDaughters();
|
215 |
m_pt2 = muJet2->pt();
|
216 |
m_mass2 = muJet2->mass();
|
217 |
m_drmax2 = muJet2->dRmax();
|
218 |
if (muJet2->vertexValid()) m_vprob2 = muJet2->vertexProb();
|
219 |
else m_vprob2 = -1.;
|
220 |
m_eta2 = muJet2->eta();
|
221 |
m_iso2 = muJet2->centralTrackIsolation();
|
222 |
if (muJet2->genParticlesSize() == 1) m_pdgid2 = muJet2->genParticle(0)->pdgId();
|
223 |
else m_pdgid2 = 0;
|
224 |
|
225 |
m_dphi = muJet1->phi() - muJet2->phi();
|
226 |
while (m_dphi > M_PI) m_dphi -= 2.*M_PI;
|
227 |
while (m_dphi < -M_PI) m_dphi += 2.*M_PI;
|
228 |
m_deta = muJet1->eta() - muJet2->eta();
|
229 |
m_dr = sqrt(m_dphi*m_dphi + m_deta*m_deta);
|
230 |
}
|
231 |
}
|
232 |
|
233 |
m_ttree->Fill();
|
234 |
}
|
235 |
|
236 |
|
237 |
// ------------ method called once each job just before starting event loop ------------
|
238 |
void
|
239 |
MuJetMergingOverlap::beginJob()
|
240 |
{
|
241 |
}
|
242 |
|
243 |
// ------------ method called once each job just after ending the event loop ------------
|
244 |
void
|
245 |
MuJetMergingOverlap::endJob() {
|
246 |
}
|
247 |
|
248 |
//define this as a plug-in
|
249 |
DEFINE_FWK_MODULE(MuJetMergingOverlap);
|