ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/FitNtuple/src/FitNtuple.cc
Revision: 1.7
Committed: Mon Nov 29 22:25:29 2010 UTC (14 years, 5 months ago) by pivarski
Content type: text/plain
Branch: MAIN
CVS Tags: JP-2010-11-29-a
Changes since 1.6: +149 -4 lines
Log Message:
more ntuples for FitNtuple

File Contents

# User Rev Content
1 pivarski 1.1 // -*- C++ -*-
2     //
3     // Package: FitNtuple
4     // Class: FitNtuple
5     //
6     /**\class FitNtuple FitNtuple.cc AnalysisTools/FitNtuple/src/FitNtuple.cc
7    
8     Description: [one line class summary]
9    
10     Implementation:
11     [Notes on implementation]
12     */
13     //
14     // Original Author: James Pivarski
15     // Created: Fri Nov 19 17:04:33 CST 2010
16 pivarski 1.7 // $Id: FitNtuple.cc,v 1.6 2010/11/25 16:42:05 pivarski Exp $
17 pivarski 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/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 "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
33     #include "DataFormats/Candidate/interface/Candidate.h"
34     #include "AnalysisDataFormats/MuJetAnalysis/interface/MultiMuon.h"
35     #include "DataFormats/PatCandidates/interface/Muon.h"
36     #include "DataFormats/PatCandidates/interface/TriggerEvent.h"
37     #include "DataFormats/TrackReco/interface/Track.h"
38     #include "DataFormats/TrackReco/interface/TrackFwd.h"
39     #include "DataFormats/VertexReco/interface/Vertex.h"
40     #include "DataFormats/VertexReco/interface/VertexFwd.h"
41     #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
42     #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
43 pivarski 1.6 #include "DataFormats/MuonReco/interface/Muon.h"
44     #include "DataFormats/MuonReco/interface/MuonChamberMatch.h"
45     #include "DataFormats/MuonReco/interface/MuonSegmentMatch.h"
46 pivarski 1.1
47     #include "CommonTools/UtilAlgos/interface/TFileService.h"
48     #include "FWCore/ServiceRegistry/interface/Service.h"
49     #include "TTree.h"
50 pivarski 1.7 #include "TRandom3.h"
51 pivarski 1.1
52     //
53     // class declaration
54     //
55    
56     class FitNtuple : public edm::EDAnalyzer {
57     public:
58     explicit FitNtuple(const edm::ParameterSet&);
59     ~FitNtuple();
60    
61    
62     private:
63     virtual void beginJob() ;
64     virtual void analyze(const edm::Event&, const edm::EventSetup&);
65     virtual void endJob() ;
66    
67     // ----------member data ---------------------------
68    
69     // input parameters
70     edm::InputTag m_src;
71     bool m_getQscale;
72     bool m_getAlternating;
73    
74 pivarski 1.7 TRandom3 m_trandom3;
75    
76 pivarski 1.1 // all ntuples need these variables
77     Float_t m_qscale; // also known as "pt-hat" ($\hat{p}_T$)
78     Int_t m_run; // run and event number so that we can look at
79     Int_t m_event; // interesting cases in the event display
80     Int_t m_trigger; // satisfied trigger? 0 = failed all
81     // 1 = passed HLT_Mu5
82     // 2 = passed HLT_Mu9
83     // 4 = passed HLT_Mu11
84 pivarski 1.3 Float_t m_muon1pt;
85     Float_t m_muon1eta;
86     Float_t m_muon2pt;
87     Float_t m_muon2eta;
88     Float_t m_muon3pt;
89     Float_t m_muon3eta;
90     Float_t m_muon4pt;
91     Float_t m_muon4eta;
92     Float_t m_muontrigpt;
93     Float_t m_muontrigeta;
94 pivarski 1.1
95 pivarski 1.7 // for scaling to the Z peak
96     TTree *m_alldimuons;
97     Float_t m_alldimuons_mass;
98     Float_t m_alldimuons_iso;
99    
100 pivarski 1.1 // control sample "lowdimuon" (single mu-jet with two muons)
101     TTree *m_lowdimuon;
102     Float_t m_lowdimuon_genmass;
103     Float_t m_lowdimuon_mass;
104     Float_t m_lowdimuon_pt;
105     Float_t m_lowdimuon_eta;
106     Float_t m_lowdimuon_phi;
107     Float_t m_lowdimuon_dr;
108     Float_t m_lowdimuon_pluspx;
109     Float_t m_lowdimuon_pluspy;
110     Float_t m_lowdimuon_pluspz;
111     Float_t m_lowdimuon_minuspx;
112     Float_t m_lowdimuon_minuspy;
113     Float_t m_lowdimuon_minuspz;
114     Float_t m_lowdimuon_vprob;
115     Float_t m_lowdimuon_vx;
116     Float_t m_lowdimuon_vy;
117     Float_t m_lowdimuon_vz;
118     Float_t m_lowdimuon_iso;
119 pivarski 1.2 Float_t m_lowdimuon_compluspx;
120     Float_t m_lowdimuon_compluspy;
121     Float_t m_lowdimuon_compluspz;
122 pivarski 1.6 Float_t m_lowdimuon_comrotpluspx;
123     Float_t m_lowdimuon_comrotpluspy;
124     Float_t m_lowdimuon_comrotpluspz;
125     Int_t m_lowdimuon_plusmatches;
126     Float_t m_lowdimuon_plusst1x;
127     Float_t m_lowdimuon_plusst1xsig;
128     Float_t m_lowdimuon_plusst1dxdz;
129     Float_t m_lowdimuon_plusst1dxdzsig;
130     Int_t m_lowdimuon_plushits;
131     Float_t m_lowdimuon_plusnormchi2;
132     Int_t m_lowdimuon_minusmatches;
133     Float_t m_lowdimuon_minusst1x;
134     Float_t m_lowdimuon_minusst1xsig;
135     Float_t m_lowdimuon_minusst1dxdz;
136     Float_t m_lowdimuon_minusst1dxdzsig;
137     Int_t m_lowdimuon_minushits;
138     Float_t m_lowdimuon_minusnormchi2;
139    
140 pivarski 1.1 // signal region "highdimuon" (single mu-jet with two muons)
141     TTree *m_highdimuon;
142    
143     // control sample "muplustrack" (single mu-jet with three muons and the closest track)
144     TTree *m_muplustrack;
145    
146     // signal region "quadmuon" (single mu-jet with four muons)
147     TTree *m_quadmuon;
148    
149     // signal region "dimudimu" (two mu-jets with two muons each)
150     TTree *m_dimudimu;
151 pivarski 1.7 Float_t m_dimudimu_wholemass;
152     Float_t m_dimudimu_wholept;
153     Float_t m_dimudimu_deltaphi;
154     Float_t m_dimudimu_mass1;
155     Float_t m_dimudimu_pt1;
156     Float_t m_dimudimu_eta1;
157     Float_t m_dimudimu_phi1;
158     Float_t m_dimudimu_dr1;
159     Float_t m_dimudimu_vprob1;
160     Float_t m_dimudimu_lxy1;
161     Float_t m_dimudimu_lxyz1;
162     Float_t m_dimudimu_iso1;
163     Float_t m_dimudimu_mass2;
164     Float_t m_dimudimu_pt2;
165     Float_t m_dimudimu_eta2;
166     Float_t m_dimudimu_phi2;
167     Float_t m_dimudimu_dr2;
168     Float_t m_dimudimu_vprob2;
169     Float_t m_dimudimu_lxy2;
170     Float_t m_dimudimu_lxyz2;
171     Float_t m_dimudimu_iso2;
172 pivarski 1.1
173     // signal region "dimuquadmu" (one two-muon jet and one four-muon jet)
174     TTree *m_dimuquadmu;
175    
176     // signal region "quadmuquadmu" (two mu-jets with four muons each)
177     TTree *m_quadmuquadmu;
178    
179     };
180    
181     //
182     // constants, enums and typedefs
183     //
184    
185     //
186     // static data member definitions
187     //
188    
189     //
190     // constructors and destructor
191     //
192     FitNtuple::FitNtuple(const edm::ParameterSet& iConfig)
193     : m_src(iConfig.getParameter<edm::InputTag>("src"))
194     , m_getQscale(iConfig.getParameter<bool>("getQscale"))
195     , m_getAlternating(iConfig.getParameter<bool>("getAlternating"))
196     {
197     //now do what ever initialization is needed
198     edm::Service<TFileService> tFile;
199    
200 pivarski 1.7 m_alldimuons = tFile->make<TTree>("alldimuons", "alldimuons");
201     m_alldimuons->Branch("trigger", &m_trigger, "trigger/I");
202     m_alldimuons->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
203     m_alldimuons->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
204     m_alldimuons->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
205     m_alldimuons->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
206     m_alldimuons->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
207     m_alldimuons->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
208     m_alldimuons->Branch("mass", &m_alldimuons_mass, "mass/F");
209     m_alldimuons->Branch("iso", &m_alldimuons_iso, "iso/F");
210    
211     m_lowdimuon = tFile->make<TTree>("lowdimuon", "lowdimuon");
212 pivarski 1.1 m_lowdimuon->Branch("qscale", &m_qscale, "qscale/F");
213     m_lowdimuon->Branch("run", &m_run, "run/I");
214     m_lowdimuon->Branch("event", &m_event, "event/I");
215     m_lowdimuon->Branch("trigger", &m_trigger, "trigger/I");
216 pivarski 1.3 m_lowdimuon->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
217     m_lowdimuon->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
218     m_lowdimuon->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
219     m_lowdimuon->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
220     m_lowdimuon->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
221     m_lowdimuon->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
222 pivarski 1.1 m_lowdimuon->Branch("genmass", &m_lowdimuon_genmass, "genmass/F");
223     m_lowdimuon->Branch("mass", &m_lowdimuon_mass, "mass/F");
224     m_lowdimuon->Branch("pt", &m_lowdimuon_pt, "pt/F");
225     m_lowdimuon->Branch("eta", &m_lowdimuon_eta, "eta/F");
226     m_lowdimuon->Branch("phi", &m_lowdimuon_phi, "phi/F");
227     m_lowdimuon->Branch("dr", &m_lowdimuon_dr, "dr/F");
228     m_lowdimuon->Branch("pluspx", &m_lowdimuon_pluspx, "pluspx/F");
229     m_lowdimuon->Branch("pluspy", &m_lowdimuon_pluspy, "pluspy/F");
230     m_lowdimuon->Branch("pluspz", &m_lowdimuon_pluspz, "pluspz/F");
231     m_lowdimuon->Branch("minuspx", &m_lowdimuon_minuspx, "minuspx/F");
232     m_lowdimuon->Branch("minuspy", &m_lowdimuon_minuspy, "minuspy/F");
233     m_lowdimuon->Branch("minuspz", &m_lowdimuon_minuspz, "minuspz/F");
234     m_lowdimuon->Branch("vprob", &m_lowdimuon_vprob, "vprob/F");
235     m_lowdimuon->Branch("vx", &m_lowdimuon_vx, "vx/F");
236     m_lowdimuon->Branch("vy", &m_lowdimuon_vy, "vy/F");
237     m_lowdimuon->Branch("vz", &m_lowdimuon_vz, "vz/F");
238     m_lowdimuon->Branch("iso", &m_lowdimuon_iso, "iso/F");
239 pivarski 1.2 m_lowdimuon->Branch("compluspx", &m_lowdimuon_compluspx, "compluspx/F");
240     m_lowdimuon->Branch("compluspy", &m_lowdimuon_compluspy, "compluspy/F");
241     m_lowdimuon->Branch("compluspz", &m_lowdimuon_compluspz, "compluspz/F");
242 pivarski 1.6 m_lowdimuon->Branch("comrotpluspx", &m_lowdimuon_comrotpluspx, "comrotpluspx/F");
243     m_lowdimuon->Branch("comrotpluspy", &m_lowdimuon_comrotpluspy, "comrotpluspy/F");
244     m_lowdimuon->Branch("comrotpluspz", &m_lowdimuon_comrotpluspz, "comrotpluspz/F");
245     m_lowdimuon->Branch("plusmatches", &m_lowdimuon_plusmatches, "plusmatches/I");
246     m_lowdimuon->Branch("plusst1x", &m_lowdimuon_plusst1x, "plusst1x/F");
247     m_lowdimuon->Branch("plusst1xsig", &m_lowdimuon_plusst1xsig, "plusst1xsig/F");
248     m_lowdimuon->Branch("plusst1dxdz", &m_lowdimuon_plusst1dxdz, "plusst1dxdz/F");
249     m_lowdimuon->Branch("plusst1dxdzsig", &m_lowdimuon_plusst1dxdzsig, "plusst1dxdzsig/F");
250     m_lowdimuon->Branch("plushits", &m_lowdimuon_plushits, "plushits/I");
251     m_lowdimuon->Branch("plusnormchi2", &m_lowdimuon_plusnormchi2, "plusnormchi2/F");
252     m_lowdimuon->Branch("minusmatches", &m_lowdimuon_minusmatches, "minusmatches/I");
253     m_lowdimuon->Branch("minusst1x", &m_lowdimuon_minusst1x, "minusst1x/F");
254     m_lowdimuon->Branch("minusst1xsig", &m_lowdimuon_minusst1xsig, "minusst1xsig/F");
255     m_lowdimuon->Branch("minusst1dxdz", &m_lowdimuon_minusst1dxdz, "minusst1dxdz/F");
256     m_lowdimuon->Branch("minusst1dxdzsig", &m_lowdimuon_minusst1dxdzsig, "minusst1dxdzsig/F");
257     m_lowdimuon->Branch("minushits", &m_lowdimuon_minushits, "minushits/I");
258     m_lowdimuon->Branch("minusnormchi2", &m_lowdimuon_minusnormchi2, "minusnormchi2/F");
259 pivarski 1.1
260     m_highdimuon = tFile->make<TTree>("highdimuon", "highdimuon");;
261     m_highdimuon->Branch("qscale", &m_qscale, "qscale/F");
262     m_highdimuon->Branch("run", &m_run, "run/I");
263     m_highdimuon->Branch("event", &m_event, "event/I");
264     m_highdimuon->Branch("trigger", &m_trigger, "trigger/I");
265 pivarski 1.3 m_highdimuon->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
266     m_highdimuon->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
267     m_highdimuon->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
268     m_highdimuon->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
269     m_highdimuon->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
270     m_highdimuon->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
271 pivarski 1.1
272     m_muplustrack = tFile->make<TTree>("muplustrack", "muplustrack");;
273     m_muplustrack->Branch("qscale", &m_qscale, "qscale/F");
274     m_muplustrack->Branch("run", &m_run, "run/I");
275     m_muplustrack->Branch("event", &m_event, "event/I");
276     m_muplustrack->Branch("trigger", &m_trigger, "trigger/I");
277 pivarski 1.3 m_muplustrack->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
278     m_muplustrack->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
279     m_muplustrack->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
280     m_muplustrack->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
281     m_muplustrack->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
282     m_muplustrack->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
283     m_muplustrack->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
284     m_muplustrack->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
285     m_muplustrack->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
286     m_muplustrack->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
287 pivarski 1.1
288     m_quadmuon = tFile->make<TTree>("quadmuon", "quadmuon");;
289     m_quadmuon->Branch("qscale", &m_qscale, "qscale/F");
290     m_quadmuon->Branch("run", &m_run, "run/I");
291     m_quadmuon->Branch("event", &m_event, "event/I");
292     m_quadmuon->Branch("trigger", &m_trigger, "trigger/I");
293 pivarski 1.3 m_quadmuon->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
294     m_quadmuon->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
295     m_quadmuon->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
296     m_quadmuon->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
297     m_quadmuon->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
298     m_quadmuon->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
299     m_quadmuon->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
300     m_quadmuon->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
301     m_quadmuon->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
302     m_quadmuon->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
303 pivarski 1.1
304     m_dimudimu = tFile->make<TTree>("dimudimu", "dimudimu");;
305     m_dimudimu->Branch("qscale", &m_qscale, "qscale/F");
306     m_dimudimu->Branch("run", &m_run, "run/I");
307     m_dimudimu->Branch("event", &m_event, "event/I");
308     m_dimudimu->Branch("trigger", &m_trigger, "trigger/I");
309 pivarski 1.3 m_dimudimu->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
310     m_dimudimu->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
311     m_dimudimu->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
312     m_dimudimu->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
313     m_dimudimu->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
314     m_dimudimu->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
315     m_dimudimu->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
316     m_dimudimu->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
317     m_dimudimu->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
318     m_dimudimu->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
319 pivarski 1.7 m_dimudimu->Branch("wholemass", &m_dimudimu_wholemass, "wholemass/F");
320     m_dimudimu->Branch("wholept", &m_dimudimu_wholept, "wholept/F");
321     m_dimudimu->Branch("deltaphi", &m_dimudimu_deltaphi, "deltaphi/F");
322     m_dimudimu->Branch("mass1", &m_dimudimu_mass1, "mass1/F");
323     m_dimudimu->Branch("pt1", &m_dimudimu_pt1, "pt1/F");
324     m_dimudimu->Branch("eta1", &m_dimudimu_eta1, "eta1/F");
325     m_dimudimu->Branch("phi1", &m_dimudimu_phi1, "phi1/F");
326     m_dimudimu->Branch("dr1", &m_dimudimu_dr1, "dr1/F");
327     m_dimudimu->Branch("vprob1", &m_dimudimu_vprob1, "vprob1/F");
328     m_dimudimu->Branch("lxy1", &m_dimudimu_lxy1, "lxy1/F");
329     m_dimudimu->Branch("lxyz1", &m_dimudimu_lxyz1, "lxyz1/F");
330     m_dimudimu->Branch("iso1", &m_dimudimu_iso1, "iso1/F");
331     m_dimudimu->Branch("mass2", &m_dimudimu_mass2, "mass2/F");
332     m_dimudimu->Branch("pt2", &m_dimudimu_pt2, "pt2/F");
333     m_dimudimu->Branch("eta2", &m_dimudimu_eta2, "eta2/F");
334     m_dimudimu->Branch("phi2", &m_dimudimu_phi2, "phi2/F");
335     m_dimudimu->Branch("dr2", &m_dimudimu_dr2, "dr2/F");
336     m_dimudimu->Branch("vprob2", &m_dimudimu_vprob2, "vprob2/F");
337     m_dimudimu->Branch("lxy2", &m_dimudimu_lxy2, "lxy2/F");
338     m_dimudimu->Branch("lxyz2", &m_dimudimu_lxyz2, "lxyz2/F");
339     m_dimudimu->Branch("iso2", &m_dimudimu_iso2, "iso2/F");
340 pivarski 1.1
341     m_dimuquadmu = tFile->make<TTree>("dimuquadmu", "dimuquadmu");;
342     m_dimuquadmu->Branch("qscale", &m_qscale, "qscale/F");
343     m_dimuquadmu->Branch("run", &m_run, "run/I");
344     m_dimuquadmu->Branch("event", &m_event, "event/I");
345     m_dimuquadmu->Branch("trigger", &m_trigger, "trigger/I");
346 pivarski 1.3 m_dimuquadmu->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
347     m_dimuquadmu->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
348     m_dimuquadmu->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
349     m_dimuquadmu->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
350     m_dimuquadmu->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
351     m_dimuquadmu->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
352     m_dimuquadmu->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
353     m_dimuquadmu->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
354     m_dimuquadmu->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
355     m_dimuquadmu->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
356 pivarski 1.1
357     m_quadmuquadmu = tFile->make<TTree>("quadmuquadmu", "quadmuquadmu");;
358     m_quadmuquadmu->Branch("qscale", &m_qscale, "qscale/F");
359     m_quadmuquadmu->Branch("run", &m_run, "run/I");
360     m_quadmuquadmu->Branch("event", &m_event, "event/I");
361     m_quadmuquadmu->Branch("trigger", &m_trigger, "trigger/I");
362 pivarski 1.3 m_quadmuquadmu->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
363     m_quadmuquadmu->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
364     m_quadmuquadmu->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
365     m_quadmuquadmu->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
366     m_quadmuquadmu->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
367     m_quadmuquadmu->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
368     m_quadmuquadmu->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
369     m_quadmuquadmu->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
370     m_quadmuquadmu->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
371     m_quadmuquadmu->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
372 pivarski 1.1 }
373    
374    
375     FitNtuple::~FitNtuple()
376     {
377    
378     // do anything here that needs to be done at desctruction time
379     // (e.g. close files, deallocate resources etc.)
380    
381     }
382    
383    
384     //
385     // member functions
386     //
387    
388     // ------------ method called to for each event ------------
389     void
390     FitNtuple::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
391     {
392     // the QCD scale only exists for certain kinds of Monte Carlo, but if it's available, get it
393     m_qscale = 0.;
394     if (m_getQscale) {
395     edm::Handle<GenEventInfoProduct> genEventInfoProduct;
396     iEvent.getByLabel("generator", genEventInfoProduct);
397     m_qscale = genEventInfoProduct->qScale();
398     }
399    
400     // the pair-gun Monte Carlos have a (never used) feature called
401     // alteration; the real events are the ones in which particleNumber == 0
402     bool alternating = true;
403     if (m_getAlternating) {
404     edm::Handle<unsigned int> particleNumber;
405     iEvent.getByLabel("generator", "particleNumber", particleNumber);
406     alternating = (*particleNumber == 0);
407     }
408     if (!alternating) return;
409    
410     // get the run and event number
411     m_run = iEvent.id().run();
412     m_event = iEvent.id().event();
413    
414     // mu-jets (muons grouped by mass and vertex compatibility)
415     edm::Handle<pat::MultiMuonCollection> muJets;
416     iEvent.getByLabel(m_src, muJets);
417    
418     // // orphans (muons not found in any group)
419     // edm::Handle<pat::MuonCollection> orphans;
420     // iEvent.getByLabel(m_src, "Orphans", orphans);
421    
422 pivarski 1.3 // find the top four muons in the event (-1000. if not found)
423     edm::Handle<pat::MuonCollection> muons;
424     iEvent.getByLabel("cleanPatMuons", muons);
425     m_muon1pt = -1000.; m_muon1eta = -1000.;
426     m_muon2pt = -1000.; m_muon2eta = -1000.;
427     m_muon3pt = -1000.; m_muon3eta = -1000.;
428     m_muon4pt = -1000.; m_muon4eta = -1000.;
429     m_muontrigpt = -1000.; m_muontrigeta = -1000.;
430     for (pat::MuonCollection::const_iterator muon = muons->begin(); muon != muons->end(); ++muon) {
431     if (fabs(muon->eta()) < 2.4 && muon->isTrackerMuon() && muon->numberOfMatches(reco::Muon::SegmentAndTrackArbitration) >= 2 && muon->innerTrack()->numberOfValidHits() >= 8 && muon->innerTrack()->normalizedChi2() < 4.) {
432     if (muon->pt() > m_muon1pt) {
433     m_muon4pt = m_muon3pt; m_muon4eta = m_muon3eta;
434     m_muon3pt = m_muon2pt; m_muon3eta = m_muon2eta;
435     m_muon2pt = m_muon1pt; m_muon2eta = m_muon1eta;
436     m_muon1pt = muon->pt(); m_muon1eta = muon->eta();
437     }
438     else if (muon->pt() > m_muon2pt) {
439     m_muon4pt = m_muon3pt; m_muon4eta = m_muon3eta;
440     m_muon3pt = m_muon2pt; m_muon3eta = m_muon2eta;
441     m_muon2pt = muon->pt(); m_muon2eta = muon->eta();
442     }
443     else if (muon->pt() > m_muon3pt) {
444     m_muon4pt = m_muon3pt; m_muon4eta = m_muon3eta;
445     m_muon3pt = muon->pt(); m_muon3eta = muon->eta();
446     }
447     else if (muon->pt() > m_muon4pt) {
448     m_muon4pt = muon->pt(); m_muon4eta = muon->eta();
449     }
450    
451     // special muon within a more limited |eta| range, to guarantee the trigger
452     if (fabs(muon->eta()) < 1.0) {
453     if (muon->pt() > m_muontrigpt) {
454     m_muontrigpt = muon->pt(); m_muontrigeta = muon->eta();
455     }
456     }
457     }
458     }
459 pivarski 1.1
460     // // all tracker-tracks
461     // edm::Handle<reco::TrackCollection> tracks;
462     // iEvent.getByLabel("generalTracks", tracks);
463    
464     // // generator-level 4-vectors
465     // edm::Handle<reco::GenParticleCollection> genParticles;
466     // iEvent.getByLabel("genParticles", genParticles);
467    
468     // find the closest primary vertex (in Z) to the first muJet with a valid vertex
469     edm::Handle<reco::VertexCollection> primaryVertices;
470     iEvent.getByLabel("offlinePrimaryVertices", primaryVertices);
471     reco::VertexCollection::const_iterator closestPrimaryVertex = primaryVertices->end();
472     if (muJets->size() > 0) {
473     pat::MultiMuonCollection::const_iterator muJet0 = muJets->end();
474     for (pat::MultiMuonCollection::const_iterator muJet = muJets->begin(); muJet != muJets->end(); ++muJet) {
475     if (muJet->vertexValid()) {
476     muJet0 = muJet;
477     break;
478     }
479     }
480    
481     if (muJet0 != muJets->end()) {
482     for (reco::VertexCollection::const_iterator vertex = primaryVertices->begin(); vertex != primaryVertices->end(); ++vertex) {
483     if (vertex->isValid() && !vertex->isFake() && vertex->tracksSize() > 3 && fabs(vertex->z()) < 24.) {
484     if (closestPrimaryVertex == primaryVertices->end() || fabs(vertex->z() - muJet0->vertexPoint().z()) < fabs(closestPrimaryVertex->z() - muJet0->vertexPoint().z())) {
485     closestPrimaryVertex = vertex;
486     }
487     } // end vertex quality cuts
488     } // end loop over primary vertices
489     } // end if muJet0 exists
490     } // end if muJets->size > 0
491    
492     // find out which trigger bits were fired
493     edm::Handle<pat::TriggerEvent> triggerEvent;
494     iEvent.getByLabel("patTriggerEvent", triggerEvent);
495     m_trigger = 0;
496     if (triggerEvent->path("HLT_Mu5") && triggerEvent->path("HLT_Mu5")->wasAccept()) m_trigger += 1;
497     if (triggerEvent->path("HLT_Mu9") && triggerEvent->path("HLT_Mu9")->wasAccept()) m_trigger += 2;
498     if (triggerEvent->path("HLT_Mu11") && triggerEvent->path("HLT_Mu11")->wasAccept()) m_trigger += 4;
499    
500 pivarski 1.7 ////////////////////////////////////////////////////////// alldimuons (special case for scaling to the Z)
501     if (muons->size() == 2) {
502     double total_energy = (*muons)[0].energy() + (*muons)[1].energy();
503     double total_px = (*muons)[0].px() + (*muons)[1].px();
504     double total_py = (*muons)[0].py() + (*muons)[1].py();
505     double total_pz = (*muons)[0].pz() + (*muons)[1].pz();
506     m_alldimuons_mass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
507     if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 2) {
508     m_alldimuons_iso = (*muJets)[0].centralTrackIsolation();
509     }
510     else {
511     m_alldimuons_iso = -1.;
512     }
513     m_alldimuons->Fill();
514     }
515    
516 pivarski 1.1 ////////////////////////////////////////////////////////// lowdimuon:
517     if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 2 && (*muJets)[0].pt() < 80.) {
518     pat::MultiMuonCollection::const_iterator muJet = muJets->begin();
519    
520     // generator-level mass using matched genParticles (for resolution of fit peak)
521     m_lowdimuon_genmass = -1000.;
522 pivarski 1.5 if (muJet->muon(0)->genParticlesSize() == 1 && muJet->muon(1)->genParticlesSize() == 1) {
523 pivarski 1.4 const reco::GenParticle *mu0 = muJet->muon(0)->genParticle();
524     const reco::GenParticle *mu1 = muJet->muon(1)->genParticle();
525 pivarski 1.1
526     double total_energy = mu0->energy() + mu1->energy();
527     double total_px = mu0->px() + mu1->px();
528     double total_py = mu0->py() + mu1->py();
529     double total_pz = mu0->pz() + mu1->pz();
530     m_lowdimuon_genmass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
531     }
532    
533     m_lowdimuon_mass = muJet->mass();
534     m_lowdimuon_pt = muJet->pt();
535     m_lowdimuon_eta = muJet->eta();
536     m_lowdimuon_phi = muJet->phi();
537     m_lowdimuon_dr = muJet->dRmax();
538 pivarski 1.3 if (muJet->daughter(0)->charge() > 0) {
539     m_lowdimuon_pluspx = muJet->daughter(0)->px();
540     m_lowdimuon_pluspy = muJet->daughter(0)->py();
541     m_lowdimuon_pluspz = muJet->daughter(0)->pz();
542     m_lowdimuon_minuspx = muJet->daughter(1)->px();
543     m_lowdimuon_minuspy = muJet->daughter(1)->py();
544     m_lowdimuon_minuspz = muJet->daughter(1)->pz();
545     }
546     else {
547     m_lowdimuon_pluspx = muJet->daughter(1)->px();
548     m_lowdimuon_pluspy = muJet->daughter(1)->py();
549     m_lowdimuon_pluspz = muJet->daughter(1)->pz();
550     m_lowdimuon_minuspx = muJet->daughter(0)->px();
551     m_lowdimuon_minuspy = muJet->daughter(0)->py();
552     m_lowdimuon_minuspz = muJet->daughter(0)->pz();
553     }
554 pivarski 1.1 m_lowdimuon_vprob = -1000.;
555     m_lowdimuon_vx = -1000.;
556     m_lowdimuon_vy = -1000.;
557     m_lowdimuon_vz = -1000.;
558    
559 pivarski 1.2 GlobalVector complus;
560 pivarski 1.6 if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOM(0);
561     else complus = muJet->daughterCOM(1);
562 pivarski 1.2 m_lowdimuon_compluspx = complus.x();
563     m_lowdimuon_compluspy = complus.y();
564     m_lowdimuon_compluspz = complus.z();
565    
566 pivarski 1.6 if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOMrot(0);
567     else complus = muJet->daughterCOMrot(1);
568     m_lowdimuon_comrotpluspx = complus.x();
569     m_lowdimuon_comrotpluspy = complus.y();
570     m_lowdimuon_comrotpluspz = complus.z();
571    
572 pivarski 1.2 // replace all values with vertex-updated values if vertex fitting succeeded
573 pivarski 1.1 if (muJet->vertexValid()) {
574     m_lowdimuon_mass = muJet->vertexMass();
575     m_lowdimuon_pt = muJet->vertexMomentum().perp();
576     m_lowdimuon_eta = muJet->vertexMomentum().eta();
577     m_lowdimuon_phi = muJet->vertexMomentum().phi();
578     m_lowdimuon_dr = muJet->dRmax(true);
579 pivarski 1.3 if (muJet->daughter(0)->charge() > 0) {
580     m_lowdimuon_pluspx = muJet->vertexMomentum(0).x();
581     m_lowdimuon_pluspy = muJet->vertexMomentum(0).y();
582     m_lowdimuon_pluspz = muJet->vertexMomentum(0).z();
583     m_lowdimuon_minuspx = muJet->vertexMomentum(1).x();
584     m_lowdimuon_minuspy = muJet->vertexMomentum(1).y();
585     m_lowdimuon_minuspz = muJet->vertexMomentum(1).z();
586     }
587     else {
588     m_lowdimuon_pluspx = muJet->vertexMomentum(1).x();
589     m_lowdimuon_pluspy = muJet->vertexMomentum(1).y();
590     m_lowdimuon_pluspz = muJet->vertexMomentum(1).z();
591     m_lowdimuon_minuspx = muJet->vertexMomentum(0).x();
592     m_lowdimuon_minuspy = muJet->vertexMomentum(0).y();
593     m_lowdimuon_minuspz = muJet->vertexMomentum(0).z();
594     }
595 pivarski 1.1 m_lowdimuon_vprob = muJet->vertexProb();
596    
597     if (closestPrimaryVertex != primaryVertices->end()) {
598     m_lowdimuon_vx = muJet->vertexPoint().x() - closestPrimaryVertex->x();
599     m_lowdimuon_vy = muJet->vertexPoint().y() - closestPrimaryVertex->y();
600     m_lowdimuon_vz = muJet->vertexPoint().z() - closestPrimaryVertex->z();
601     }
602    
603 pivarski 1.2 GlobalVector complus;
604 pivarski 1.6 if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOM(0, true);
605     else complus = muJet->daughterCOM(1, true);
606 pivarski 1.2 m_lowdimuon_compluspx = complus.x();
607     m_lowdimuon_compluspy = complus.y();
608     m_lowdimuon_compluspz = complus.z();
609 pivarski 1.6
610     if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOMrot(0, true);
611     else complus = muJet->daughterCOMrot(1, true);
612     m_lowdimuon_comrotpluspx = complus.x();
613     m_lowdimuon_comrotpluspy = complus.y();
614     m_lowdimuon_comrotpluspz = complus.z();
615    
616 pivarski 1.1 } // end of replacements with quantities measured at the vertex
617    
618     m_lowdimuon_iso = muJet->centralTrackIsolation();
619    
620 pivarski 1.6 std::vector<reco::MuonChamberMatch> plusmatches, minusmatches;
621     if (muJet->daughter(0)->charge() > 0) {
622     m_lowdimuon_plusmatches = muJet->muon(0)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
623     m_lowdimuon_minusmatches = muJet->muon(1)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
624     plusmatches = muJet->muon(0)->matches();
625     minusmatches = muJet->muon(1)->matches();
626     m_lowdimuon_plushits = muJet->muon(0)->innerTrack()->numberOfValidHits();
627     m_lowdimuon_minushits = muJet->muon(1)->innerTrack()->numberOfValidHits();
628     m_lowdimuon_plusnormchi2 = muJet->muon(0)->innerTrack()->normalizedChi2();
629     m_lowdimuon_minusnormchi2 = muJet->muon(1)->innerTrack()->normalizedChi2();
630     }
631     else {
632     m_lowdimuon_plusmatches = muJet->muon(1)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
633     m_lowdimuon_minusmatches = muJet->muon(0)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
634     plusmatches = muJet->muon(1)->matches();
635     minusmatches = muJet->muon(0)->matches();
636     m_lowdimuon_plushits = muJet->muon(1)->innerTrack()->numberOfValidHits();
637     m_lowdimuon_minushits = muJet->muon(0)->innerTrack()->numberOfValidHits();
638     m_lowdimuon_plusnormchi2 = muJet->muon(1)->innerTrack()->normalizedChi2();
639     m_lowdimuon_minusnormchi2 = muJet->muon(0)->innerTrack()->normalizedChi2();
640     }
641    
642     m_lowdimuon_plusst1x = -1000.;
643     m_lowdimuon_plusst1xsig = -1000.;
644     m_lowdimuon_plusst1dxdz = -1000.;
645     m_lowdimuon_plusst1dxdzsig = -1000.;
646     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = plusmatches.begin(); chamberMatch != plusmatches.end(); ++chamberMatch) {
647     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
648     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
649     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
650     if (chamberMatch->station() == 1) {
651     m_lowdimuon_plusst1x = (segmentMatch->x - chamberMatch->x);
652     m_lowdimuon_plusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
653     m_lowdimuon_plusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
654     m_lowdimuon_plusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
655     }
656     }
657     }
658     }
659    
660     m_lowdimuon_minusst1x = -1000.;
661     m_lowdimuon_minusst1xsig = -1000.;
662     m_lowdimuon_minusst1dxdz = -1000.;
663     m_lowdimuon_minusst1dxdzsig = -1000.;
664     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = minusmatches.begin(); chamberMatch != minusmatches.end(); ++chamberMatch) {
665     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
666     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
667     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
668     if (chamberMatch->station() == 1) {
669     m_lowdimuon_minusst1x = (segmentMatch->x - chamberMatch->x);
670     m_lowdimuon_minusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
671     m_lowdimuon_minusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
672     m_lowdimuon_minusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
673     }
674     }
675     }
676     }
677    
678 pivarski 1.1 m_lowdimuon->Fill();
679     }
680    
681     ////////////////////////////////////////////////////////// highdimuon
682     else if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 2 && (*muJets)[0].pt() > 80.) {
683     // ...
684     // m_highdimuon->Fill();
685     }
686    
687     ////////////////////////////////////////////////////////// muplustrack
688     else if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 3) {
689     // ...
690     // m_muplustrack->Fill();
691     }
692    
693     ////////////////////////////////////////////////////////// quadmuon
694     else if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 4) {
695     // ...
696     // m_quadmuon->Fill();
697     }
698    
699     ////////////////////////////////////////////////////////// dimudimu
700     else if (muJets->size() == 2 && (*muJets)[0].numberOfDaughters() == 2 && (*muJets)[1].numberOfDaughters() == 2) {
701 pivarski 1.7 pat::MultiMuonCollection::const_iterator muJet1 = muJets->begin();
702     pat::MultiMuonCollection::const_iterator muJet2 = muJets->begin();
703     if (m_trandom3.Integer(2) == 0) ++muJet1;
704     else ++muJet2;
705    
706     double total_energy = muJet1->energy() + muJet2->energy();
707     double total_px = muJet1->px() + muJet2->px();
708     double total_py = muJet1->py() + muJet2->py();
709     double total_pz = muJet1->pz() + muJet2->pz();
710    
711     m_dimudimu_wholemass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
712     m_dimudimu_wholept = sqrt(total_px*total_px + total_py*total_py);
713    
714     m_dimudimu_deltaphi = muJet1->phi() - muJet2->phi();
715     while (m_dimudimu_deltaphi > M_PI) m_dimudimu_deltaphi -= 2.*M_PI;
716     while (m_dimudimu_deltaphi < -M_PI) m_dimudimu_deltaphi += 2.*M_PI;
717    
718     m_dimudimu_mass1 = muJet1->mass();
719     m_dimudimu_pt1 = muJet1->pt();
720     m_dimudimu_eta1 = muJet1->eta();
721     m_dimudimu_phi1 = muJet1->phi();
722     m_dimudimu_dr1 = muJet1->dRmax();
723     m_dimudimu_vprob1 = -1.;
724     m_dimudimu_lxy1 = -1000.;
725     m_dimudimu_lxyz1 = -1000.;
726     m_dimudimu_iso1 = muJet1->centralTrackIsolation();
727    
728     m_dimudimu_mass2 = muJet2->mass();
729     m_dimudimu_pt2 = muJet2->pt();
730     m_dimudimu_eta2 = muJet2->eta();
731     m_dimudimu_phi2 = muJet2->phi();
732     m_dimudimu_dr2 = muJet2->dRmax();
733     m_dimudimu_vprob2 = -1.;
734     m_dimudimu_lxy2 = -1000.;
735     m_dimudimu_lxyz2 = -1000.;
736     m_dimudimu_iso2 = muJet2->centralTrackIsolation();
737    
738     if (muJet1->vertexValid() && muJet2->vertexValid()) {
739     total_energy = muJet1->vertexP4().energy() + muJet2->vertexP4().energy();
740     total_px = muJet1->vertexMomentum().x() + muJet2->vertexMomentum().x();
741     total_py = muJet1->vertexMomentum().y() + muJet2->vertexMomentum().y();
742     total_pz = muJet1->vertexMomentum().z() + muJet2->vertexMomentum().z();
743    
744     m_dimudimu_wholemass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
745     m_dimudimu_wholept = sqrt(total_px*total_px + total_py*total_py);
746    
747     m_dimudimu_deltaphi = muJet1->vertexMomentum().phi() - muJet2->vertexMomentum().phi();
748     while (m_dimudimu_deltaphi > M_PI) m_dimudimu_deltaphi -= 2.*M_PI;
749     while (m_dimudimu_deltaphi < -M_PI) m_dimudimu_deltaphi += 2.*M_PI;
750    
751     m_dimudimu_mass1 = muJet1->vertexMass();
752     m_dimudimu_pt1 = muJet1->vertexMomentum().perp();
753     m_dimudimu_eta1 = muJet1->vertexMomentum().eta();
754     m_dimudimu_phi1 = muJet1->vertexMomentum().phi();
755     m_dimudimu_dr1 = muJet1->dRmax(true);
756     m_dimudimu_vprob1 = muJet1->vertexProb();
757     m_dimudimu_lxy1 = muJet1->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
758     m_dimudimu_lxyz1 = muJet1->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
759    
760     m_dimudimu_mass2 = muJet2->vertexMass();
761     m_dimudimu_pt2 = muJet2->vertexMomentum().perp();
762     m_dimudimu_eta2 = muJet2->vertexMomentum().eta();
763     m_dimudimu_phi2 = muJet2->vertexMomentum().phi();
764     m_dimudimu_dr2 = muJet2->dRmax(true);
765     m_dimudimu_vprob2 = muJet2->vertexProb();
766     m_dimudimu_lxy2 = muJet2->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
767     m_dimudimu_lxyz2 = muJet2->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
768     }
769    
770     m_dimudimu->Fill();
771 pivarski 1.1 }
772    
773     ////////////////////////////////////////////////////////// dimuquadmu
774     else if (muJets->size() == 2 && (
775     ((*muJets)[0].numberOfDaughters() == 2 && (*muJets)[1].numberOfDaughters() == 4) ||
776     ((*muJets)[0].numberOfDaughters() == 4 && (*muJets)[1].numberOfDaughters() == 2)
777     )) {
778     // ...
779     // m_dimuquadmu->Fill();
780     }
781    
782     ////////////////////////////////////////////////////////// quadmuquadmu
783     else if (muJets->size() == 2 && (*muJets)[0].numberOfDaughters() == 4 && (*muJets)[1].numberOfDaughters() == 4) {
784     // ...
785     // m_quadmuquadmu->Fill();
786     }
787     }
788    
789    
790     // ------------ method called once each job just before starting event loop ------------
791     void
792     FitNtuple::beginJob()
793     {
794     }
795    
796     // ------------ method called once each job just after ending the event loop ------------
797     void
798     FitNtuple::endJob() {
799     }
800    
801     //define this as a plug-in
802     DEFINE_FWK_MODULE(FitNtuple);