ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/FitNtuple/src/FitNtuple.cc
Revision: 1.14
Committed: Tue Dec 21 01:16:31 2010 UTC (14 years, 4 months ago) by pivarski
Content type: text/plain
Branch: MAIN
CVS Tags: JP-2010-12-20-a
Changes since 1.13: +419 -2 lines
Log Message:
add TTrees of displaced mu-jets

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.14 // $Id: FitNtuple.cc,v 1.13 2010/12/15 20:55:09 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     bool m_getQscale;
71     bool m_getAlternating;
72 pivarski 1.10 bool m_fillGenLevel;
73 pivarski 1.1
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 pivarski 1.10 Int_t m_genLevel; // gen-level information about all mu-jets
79     // 1 = b-jets
80     // 2 = resonances
81     // 4 = any decays-in-flight
82     // 8 = any non-muons
83 pivarski 1.1 Int_t m_run; // run and event number so that we can look at
84     Int_t m_event; // interesting cases in the event display
85     Int_t m_trigger; // satisfied trigger? 0 = failed all
86     // 1 = passed HLT_Mu5
87     // 2 = passed HLT_Mu9
88     // 4 = passed HLT_Mu11
89 pivarski 1.12 // 8 = passed HLT_Mu15_v1
90 pivarski 1.14 // 16 = passed HLT_Mu20_NoVertex
91 pivarski 1.3 Float_t m_muon1pt;
92     Float_t m_muon1eta;
93     Float_t m_muon2pt;
94     Float_t m_muon2eta;
95     Float_t m_muon3pt;
96     Float_t m_muon3eta;
97     Float_t m_muon4pt;
98     Float_t m_muon4eta;
99     Float_t m_muontrigpt;
100     Float_t m_muontrigeta;
101 pivarski 1.1
102 pivarski 1.7 // for scaling to the Z peak
103     TTree *m_alldimuons;
104     Float_t m_alldimuons_mass;
105     Float_t m_alldimuons_iso;
106    
107 pivarski 1.13 // control sample "lowdimuon" (single mu-jet with two muons and low pT)
108 pivarski 1.1 TTree *m_lowdimuon;
109 pivarski 1.10 Int_t m_lowdimuon_containstrig;
110 pivarski 1.1 Float_t m_lowdimuon_genmass;
111     Float_t m_lowdimuon_mass;
112     Float_t m_lowdimuon_pt;
113     Float_t m_lowdimuon_eta;
114     Float_t m_lowdimuon_phi;
115     Float_t m_lowdimuon_dr;
116     Float_t m_lowdimuon_pluspx;
117     Float_t m_lowdimuon_pluspy;
118     Float_t m_lowdimuon_pluspz;
119     Float_t m_lowdimuon_minuspx;
120     Float_t m_lowdimuon_minuspy;
121     Float_t m_lowdimuon_minuspz;
122     Float_t m_lowdimuon_vprob;
123     Float_t m_lowdimuon_vx;
124     Float_t m_lowdimuon_vy;
125     Float_t m_lowdimuon_vz;
126     Float_t m_lowdimuon_iso;
127 pivarski 1.2 Float_t m_lowdimuon_compluspx;
128     Float_t m_lowdimuon_compluspy;
129     Float_t m_lowdimuon_compluspz;
130 pivarski 1.6 Float_t m_lowdimuon_comrotpluspx;
131     Float_t m_lowdimuon_comrotpluspy;
132     Float_t m_lowdimuon_comrotpluspz;
133     Int_t m_lowdimuon_plusmatches;
134     Float_t m_lowdimuon_plusst1x;
135     Float_t m_lowdimuon_plusst1xsig;
136     Float_t m_lowdimuon_plusst1dxdz;
137     Float_t m_lowdimuon_plusst1dxdzsig;
138     Int_t m_lowdimuon_plushits;
139     Float_t m_lowdimuon_plusnormchi2;
140     Int_t m_lowdimuon_minusmatches;
141     Float_t m_lowdimuon_minusst1x;
142     Float_t m_lowdimuon_minusst1xsig;
143     Float_t m_lowdimuon_minusst1dxdz;
144     Float_t m_lowdimuon_minusst1dxdzsig;
145     Int_t m_lowdimuon_minushits;
146     Float_t m_lowdimuon_minusnormchi2;
147    
148 pivarski 1.13 // signal region "highdimuon" (single mu-jet with two muons and high pT)
149 pivarski 1.1 TTree *m_highdimuon;
150    
151 pivarski 1.10 // control sample "mujetplustracks" (single mu-jet with 2-3 muons and 1-2 random, nearby tracks)
152     TTree *m_mujetplustracks;
153     Int_t m_mujetplustracks_containstrig;
154     Int_t m_mujetplustracks_muons;
155     Int_t m_mujetplustracks_fakes;
156 pivarski 1.11 Int_t m_mujetplustracks_charge;
157 pivarski 1.10 Float_t m_mujetplustracks_mass;
158 pivarski 1.11 Float_t m_mujetplustracks_massa;
159     Float_t m_mujetplustracks_massb;
160 pivarski 1.10 Float_t m_mujetplustracks_pt;
161     Float_t m_mujetplustracks_eta;
162     Float_t m_mujetplustracks_phi;
163     Float_t m_mujetplustracks_dr;
164     Float_t m_mujetplustracks_vprob;
165     Float_t m_mujetplustracks_lxy;
166     Float_t m_mujetplustracks_lxyz;
167     Float_t m_mujetplustracks_iso;
168     Float_t m_mujetplustracks_mupt1;
169     Float_t m_mujetplustracks_mupt2;
170     Float_t m_mujetplustracks_mupt3;
171     Float_t m_mujetplustracks_fakept1;
172     Float_t m_mujetplustracks_fakept2;
173 pivarski 1.1
174 pivarski 1.13 // signal region "quadmuon" (single mu-jet with four or more muons)
175 pivarski 1.1 TTree *m_quadmuon;
176 pivarski 1.13 Int_t m_quadmuon_containstrig;
177     Int_t m_quadmuon_muons;
178     Int_t m_quadmuon_orphans;
179     Int_t m_quadmuon_charge;
180     Float_t m_quadmuon_mass;
181     Float_t m_quadmuon_massa;
182     Float_t m_quadmuon_massb;
183     Float_t m_quadmuon_massc;
184     Float_t m_quadmuon_massd;
185     Float_t m_quadmuon_masse;
186     Float_t m_quadmuon_massf;
187     Float_t m_quadmuon_pt;
188     Float_t m_quadmuon_eta;
189     Float_t m_quadmuon_phi;
190     Float_t m_quadmuon_dr;
191     Float_t m_quadmuon_vchi2;
192     Int_t m_quadmuon_vndof;
193     Float_t m_quadmuon_vprob;
194     Float_t m_quadmuon_lxy;
195     Float_t m_quadmuon_lxyz;
196     Float_t m_quadmuon_iso;
197 pivarski 1.1
198 pivarski 1.8 // control sample "dimuorphan" (single, two-muon mu-jet and a single muon)
199     TTree *m_dimuorphan;
200     Float_t m_dimuorphan_deltaphi;
201     Float_t m_dimuorphan_orphanpt;
202     Float_t m_dimuorphan_orphaneta;
203     Float_t m_dimuorphan_orphanphi;
204 pivarski 1.9 Int_t m_dimuorphan_orphanisglobal;
205     Int_t m_dimuorphan_orphanmatches;
206     Int_t m_dimuorphan_orphanhits;
207     Float_t m_dimuorphan_orphanchi2;
208     Float_t m_dimuorphan_orphanst1x;
209     Float_t m_dimuorphan_orphanst1xsig;
210     Float_t m_dimuorphan_orphanst1dxdz;
211     Float_t m_dimuorphan_orphanst1dxdzsig;
212 pivarski 1.8 Int_t m_dimuorphan_containstrig;
213     Float_t m_dimuorphan_mass;
214     Float_t m_dimuorphan_pt;
215     Float_t m_dimuorphan_eta;
216     Float_t m_dimuorphan_phi;
217     Float_t m_dimuorphan_dr;
218     Float_t m_dimuorphan_vprob;
219     Float_t m_dimuorphan_lxy;
220     Float_t m_dimuorphan_lxyz;
221     Float_t m_dimuorphan_iso;
222    
223 pivarski 1.1 // signal region "dimudimu" (two mu-jets with two muons each)
224     TTree *m_dimudimu;
225 pivarski 1.13 Int_t m_dimudimu_orphans;
226 pivarski 1.7 Float_t m_dimudimu_wholemass;
227     Float_t m_dimudimu_wholept;
228     Float_t m_dimudimu_deltaphi;
229 pivarski 1.8 Int_t m_dimudimu_containstrig;
230     Float_t m_dimudimu_massC;
231     Float_t m_dimudimu_ptC;
232     Float_t m_dimudimu_etaC;
233     Float_t m_dimudimu_phiC;
234     Float_t m_dimudimu_drC;
235     Float_t m_dimudimu_vprobC;
236     Float_t m_dimudimu_lxyC;
237     Float_t m_dimudimu_lxyzC;
238     Float_t m_dimudimu_isoC;
239     Float_t m_dimudimu_massF;
240     Float_t m_dimudimu_ptF;
241     Float_t m_dimudimu_etaF;
242     Float_t m_dimudimu_phiF;
243     Float_t m_dimudimu_drF;
244     Float_t m_dimudimu_vprobF;
245     Float_t m_dimudimu_lxyF;
246     Float_t m_dimudimu_lxyzF;
247     Float_t m_dimudimu_isoF;
248 pivarski 1.1
249 pivarski 1.13 // signal region "twomujets"
250     TTree *m_twomujets;
251     Int_t m_twomujets_muonsC;
252     Int_t m_twomujets_muonsF;
253     Float_t m_twomujets_massCa;
254     Float_t m_twomujets_massCb;
255     Float_t m_twomujets_massCc;
256     Float_t m_twomujets_massFa;
257     Float_t m_twomujets_massFb;
258     Float_t m_twomujets_massFc;
259    
260     // signal region "moremujets"
261     TTree *m_moremujets;
262     Int_t m_moremujets_mujets;
263     Int_t m_moremujets_orphans;
264     Float_t m_moremujets_wholemass;
265     Float_t m_moremujets_wholept;
266     Float_t m_moremujets_massa;
267     Float_t m_moremujets_massb;
268     Float_t m_moremujets_massc;
269     Float_t m_moremujets_massd;
270     Float_t m_moremujets_masse;
271     Float_t m_moremujets_massf;
272     Int_t m_moremujets_muons1;
273     Int_t m_moremujets_containstrig1;
274     Float_t m_moremujets_mass1;
275     Float_t m_moremujets_pt1;
276     Float_t m_moremujets_iso1;
277     Int_t m_moremujets_muons2;
278     Int_t m_moremujets_containstrig2;
279     Float_t m_moremujets_mass2;
280     Float_t m_moremujets_pt2;
281     Float_t m_moremujets_iso2;
282     Int_t m_moremujets_muons3;
283     Int_t m_moremujets_containstrig3;
284     Float_t m_moremujets_mass3;
285     Float_t m_moremujets_pt3;
286     Float_t m_moremujets_iso3;
287     Int_t m_moremujets_muons4;
288     Int_t m_moremujets_containstrig4;
289     Float_t m_moremujets_mass4;
290     Float_t m_moremujets_pt4;
291     Float_t m_moremujets_iso4;
292     Int_t m_moremujets_muons5;
293     Int_t m_moremujets_containstrig5;
294     Float_t m_moremujets_mass5;
295     Float_t m_moremujets_pt5;
296     Float_t m_moremujets_iso5;
297     Int_t m_moremujets_muons6;
298     Int_t m_moremujets_containstrig6;
299     Float_t m_moremujets_mass6;
300     Float_t m_moremujets_pt6;
301     Float_t m_moremujets_iso6;
302 pivarski 1.14
303     // background-enriched and signal for displaced muons
304     TTree *m_displacedFake;
305     TTree *m_displaced;
306     Int_t m_displaced_mujets;
307     Int_t m_displaced_orphans;
308     Int_t m_displaced_muons;
309     Float_t m_displaced_mass;
310     Float_t m_displaced_pt;
311     Float_t m_displaced_eta;
312     Float_t m_displaced_phi;
313     Float_t m_displaced_vx;
314     Float_t m_displaced_vy;
315     Float_t m_displaced_vz;
316     Float_t m_displaced_zclosest;
317     Float_t m_displaced_zcloseness;
318     Float_t m_displaced_lxy;
319     Float_t m_displaced_lxyz;
320     Float_t m_displaced_iso;
321     Float_t m_displaced_vprob;
322     Float_t m_displaced_mupt1;
323     Float_t m_displaced_mupt2;
324     Int_t m_displaced_plusmatches;
325     Float_t m_displaced_plusst1x;
326     Float_t m_displaced_plusst1xsig;
327     Float_t m_displaced_plusst1dxdz;
328     Float_t m_displaced_plusst1dxdzsig;
329     Int_t m_displaced_plushits;
330     Float_t m_displaced_plusnormchi2;
331     Int_t m_displaced_minusmatches;
332     Float_t m_displaced_minusst1x;
333     Float_t m_displaced_minusst1xsig;
334     Float_t m_displaced_minusst1dxdz;
335     Float_t m_displaced_minusst1dxdzsig;
336     Int_t m_displaced_minushits;
337     Float_t m_displaced_minusnormchi2;
338     Int_t m_displacedFake_fakes;
339 pivarski 1.1 };
340    
341     //
342     // constants, enums and typedefs
343     //
344    
345     //
346     // static data member definitions
347     //
348    
349     //
350     // constructors and destructor
351     //
352     FitNtuple::FitNtuple(const edm::ParameterSet& iConfig)
353 pivarski 1.10 : m_getQscale(iConfig.getParameter<bool>("getQscale"))
354 pivarski 1.1 , m_getAlternating(iConfig.getParameter<bool>("getAlternating"))
355 pivarski 1.10 , m_fillGenLevel(iConfig.getParameter<bool>("fillGenLevel"))
356 pivarski 1.1 {
357     //now do what ever initialization is needed
358     edm::Service<TFileService> tFile;
359    
360 pivarski 1.7 m_alldimuons = tFile->make<TTree>("alldimuons", "alldimuons");
361     m_alldimuons->Branch("trigger", &m_trigger, "trigger/I");
362     m_alldimuons->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
363     m_alldimuons->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
364     m_alldimuons->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
365     m_alldimuons->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
366     m_alldimuons->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
367     m_alldimuons->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
368     m_alldimuons->Branch("mass", &m_alldimuons_mass, "mass/F");
369     m_alldimuons->Branch("iso", &m_alldimuons_iso, "iso/F");
370    
371     m_lowdimuon = tFile->make<TTree>("lowdimuon", "lowdimuon");
372 pivarski 1.1 m_lowdimuon->Branch("qscale", &m_qscale, "qscale/F");
373 pivarski 1.10 m_lowdimuon->Branch("genLevel", &m_genLevel, "genLevel/I");
374 pivarski 1.1 m_lowdimuon->Branch("run", &m_run, "run/I");
375     m_lowdimuon->Branch("event", &m_event, "event/I");
376     m_lowdimuon->Branch("trigger", &m_trigger, "trigger/I");
377 pivarski 1.3 m_lowdimuon->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
378     m_lowdimuon->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
379     m_lowdimuon->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
380     m_lowdimuon->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
381     m_lowdimuon->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
382     m_lowdimuon->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
383 pivarski 1.10 m_lowdimuon->Branch("containstrig", &m_lowdimuon_containstrig, "containstrig/I");
384 pivarski 1.1 m_lowdimuon->Branch("genmass", &m_lowdimuon_genmass, "genmass/F");
385     m_lowdimuon->Branch("mass", &m_lowdimuon_mass, "mass/F");
386     m_lowdimuon->Branch("pt", &m_lowdimuon_pt, "pt/F");
387     m_lowdimuon->Branch("eta", &m_lowdimuon_eta, "eta/F");
388     m_lowdimuon->Branch("phi", &m_lowdimuon_phi, "phi/F");
389     m_lowdimuon->Branch("dr", &m_lowdimuon_dr, "dr/F");
390     m_lowdimuon->Branch("pluspx", &m_lowdimuon_pluspx, "pluspx/F");
391     m_lowdimuon->Branch("pluspy", &m_lowdimuon_pluspy, "pluspy/F");
392     m_lowdimuon->Branch("pluspz", &m_lowdimuon_pluspz, "pluspz/F");
393     m_lowdimuon->Branch("minuspx", &m_lowdimuon_minuspx, "minuspx/F");
394     m_lowdimuon->Branch("minuspy", &m_lowdimuon_minuspy, "minuspy/F");
395     m_lowdimuon->Branch("minuspz", &m_lowdimuon_minuspz, "minuspz/F");
396     m_lowdimuon->Branch("vprob", &m_lowdimuon_vprob, "vprob/F");
397     m_lowdimuon->Branch("vx", &m_lowdimuon_vx, "vx/F");
398     m_lowdimuon->Branch("vy", &m_lowdimuon_vy, "vy/F");
399     m_lowdimuon->Branch("vz", &m_lowdimuon_vz, "vz/F");
400     m_lowdimuon->Branch("iso", &m_lowdimuon_iso, "iso/F");
401 pivarski 1.2 m_lowdimuon->Branch("compluspx", &m_lowdimuon_compluspx, "compluspx/F");
402     m_lowdimuon->Branch("compluspy", &m_lowdimuon_compluspy, "compluspy/F");
403     m_lowdimuon->Branch("compluspz", &m_lowdimuon_compluspz, "compluspz/F");
404 pivarski 1.6 m_lowdimuon->Branch("comrotpluspx", &m_lowdimuon_comrotpluspx, "comrotpluspx/F");
405     m_lowdimuon->Branch("comrotpluspy", &m_lowdimuon_comrotpluspy, "comrotpluspy/F");
406     m_lowdimuon->Branch("comrotpluspz", &m_lowdimuon_comrotpluspz, "comrotpluspz/F");
407     m_lowdimuon->Branch("plusmatches", &m_lowdimuon_plusmatches, "plusmatches/I");
408     m_lowdimuon->Branch("plusst1x", &m_lowdimuon_plusst1x, "plusst1x/F");
409     m_lowdimuon->Branch("plusst1xsig", &m_lowdimuon_plusst1xsig, "plusst1xsig/F");
410     m_lowdimuon->Branch("plusst1dxdz", &m_lowdimuon_plusst1dxdz, "plusst1dxdz/F");
411     m_lowdimuon->Branch("plusst1dxdzsig", &m_lowdimuon_plusst1dxdzsig, "plusst1dxdzsig/F");
412     m_lowdimuon->Branch("plushits", &m_lowdimuon_plushits, "plushits/I");
413     m_lowdimuon->Branch("plusnormchi2", &m_lowdimuon_plusnormchi2, "plusnormchi2/F");
414     m_lowdimuon->Branch("minusmatches", &m_lowdimuon_minusmatches, "minusmatches/I");
415     m_lowdimuon->Branch("minusst1x", &m_lowdimuon_minusst1x, "minusst1x/F");
416     m_lowdimuon->Branch("minusst1xsig", &m_lowdimuon_minusst1xsig, "minusst1xsig/F");
417     m_lowdimuon->Branch("minusst1dxdz", &m_lowdimuon_minusst1dxdz, "minusst1dxdz/F");
418     m_lowdimuon->Branch("minusst1dxdzsig", &m_lowdimuon_minusst1dxdzsig, "minusst1dxdzsig/F");
419     m_lowdimuon->Branch("minushits", &m_lowdimuon_minushits, "minushits/I");
420     m_lowdimuon->Branch("minusnormchi2", &m_lowdimuon_minusnormchi2, "minusnormchi2/F");
421 pivarski 1.1
422 pivarski 1.10 m_highdimuon = tFile->make<TTree>("highdimuon", "highdimuon");
423 pivarski 1.1 m_highdimuon->Branch("qscale", &m_qscale, "qscale/F");
424 pivarski 1.10 m_highdimuon->Branch("genLevel", &m_genLevel, "genLevel/I");
425 pivarski 1.1 m_highdimuon->Branch("run", &m_run, "run/I");
426     m_highdimuon->Branch("event", &m_event, "event/I");
427     m_highdimuon->Branch("trigger", &m_trigger, "trigger/I");
428 pivarski 1.3 m_highdimuon->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
429     m_highdimuon->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
430     m_highdimuon->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
431     m_highdimuon->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
432     m_highdimuon->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
433     m_highdimuon->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
434 pivarski 1.13 m_highdimuon->Branch("containstrig", &m_lowdimuon_containstrig, "containstrig/I");
435     m_highdimuon->Branch("genmass", &m_lowdimuon_genmass, "genmass/F");
436     m_highdimuon->Branch("mass", &m_lowdimuon_mass, "mass/F");
437     m_highdimuon->Branch("pt", &m_lowdimuon_pt, "pt/F");
438     m_highdimuon->Branch("eta", &m_lowdimuon_eta, "eta/F");
439     m_highdimuon->Branch("phi", &m_lowdimuon_phi, "phi/F");
440     m_highdimuon->Branch("dr", &m_lowdimuon_dr, "dr/F");
441     m_highdimuon->Branch("pluspx", &m_lowdimuon_pluspx, "pluspx/F");
442     m_highdimuon->Branch("pluspy", &m_lowdimuon_pluspy, "pluspy/F");
443     m_highdimuon->Branch("pluspz", &m_lowdimuon_pluspz, "pluspz/F");
444     m_highdimuon->Branch("minuspx", &m_lowdimuon_minuspx, "minuspx/F");
445     m_highdimuon->Branch("minuspy", &m_lowdimuon_minuspy, "minuspy/F");
446     m_highdimuon->Branch("minuspz", &m_lowdimuon_minuspz, "minuspz/F");
447     m_highdimuon->Branch("vprob", &m_lowdimuon_vprob, "vprob/F");
448     m_highdimuon->Branch("vx", &m_lowdimuon_vx, "vx/F");
449     m_highdimuon->Branch("vy", &m_lowdimuon_vy, "vy/F");
450     m_highdimuon->Branch("vz", &m_lowdimuon_vz, "vz/F");
451     m_highdimuon->Branch("iso", &m_lowdimuon_iso, "iso/F");
452     m_highdimuon->Branch("compluspx", &m_lowdimuon_compluspx, "compluspx/F");
453     m_highdimuon->Branch("compluspy", &m_lowdimuon_compluspy, "compluspy/F");
454     m_highdimuon->Branch("compluspz", &m_lowdimuon_compluspz, "compluspz/F");
455     m_highdimuon->Branch("comrotpluspx", &m_lowdimuon_comrotpluspx, "comrotpluspx/F");
456     m_highdimuon->Branch("comrotpluspy", &m_lowdimuon_comrotpluspy, "comrotpluspy/F");
457     m_highdimuon->Branch("comrotpluspz", &m_lowdimuon_comrotpluspz, "comrotpluspz/F");
458     m_highdimuon->Branch("plusmatches", &m_lowdimuon_plusmatches, "plusmatches/I");
459     m_highdimuon->Branch("plusst1x", &m_lowdimuon_plusst1x, "plusst1x/F");
460     m_highdimuon->Branch("plusst1xsig", &m_lowdimuon_plusst1xsig, "plusst1xsig/F");
461     m_highdimuon->Branch("plusst1dxdz", &m_lowdimuon_plusst1dxdz, "plusst1dxdz/F");
462     m_highdimuon->Branch("plusst1dxdzsig", &m_lowdimuon_plusst1dxdzsig, "plusst1dxdzsig/F");
463     m_highdimuon->Branch("plushits", &m_lowdimuon_plushits, "plushits/I");
464     m_highdimuon->Branch("plusnormchi2", &m_lowdimuon_plusnormchi2, "plusnormchi2/F");
465     m_highdimuon->Branch("minusmatches", &m_lowdimuon_minusmatches, "minusmatches/I");
466     m_highdimuon->Branch("minusst1x", &m_lowdimuon_minusst1x, "minusst1x/F");
467     m_highdimuon->Branch("minusst1xsig", &m_lowdimuon_minusst1xsig, "minusst1xsig/F");
468     m_highdimuon->Branch("minusst1dxdz", &m_lowdimuon_minusst1dxdz, "minusst1dxdz/F");
469     m_highdimuon->Branch("minusst1dxdzsig", &m_lowdimuon_minusst1dxdzsig, "minusst1dxdzsig/F");
470     m_highdimuon->Branch("minushits", &m_lowdimuon_minushits, "minushits/I");
471     m_highdimuon->Branch("minusnormchi2", &m_lowdimuon_minusnormchi2, "minusnormchi2/F");
472 pivarski 1.1
473 pivarski 1.10 m_mujetplustracks = tFile->make<TTree>("mujetplustracks", "mujetplustracks");
474     m_mujetplustracks->Branch("qscale", &m_qscale, "qscale/F");
475     m_mujetplustracks->Branch("run", &m_run, "run/I");
476     m_mujetplustracks->Branch("event", &m_event, "event/I");
477     m_mujetplustracks->Branch("trigger", &m_trigger, "trigger/I");
478     m_mujetplustracks->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
479     m_mujetplustracks->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
480     m_mujetplustracks->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
481     m_mujetplustracks->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
482     m_mujetplustracks->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
483     m_mujetplustracks->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
484     m_mujetplustracks->Branch("containstrig", &m_mujetplustracks_containstrig, "containstrig/I");
485     m_mujetplustracks->Branch("muons", &m_mujetplustracks_muons, "muons/I");
486     m_mujetplustracks->Branch("fakes", &m_mujetplustracks_fakes, "fakes/I");
487 pivarski 1.11 m_mujetplustracks->Branch("charge", &m_mujetplustracks_charge, "charge/I");
488 pivarski 1.10 m_mujetplustracks->Branch("mass", &m_mujetplustracks_mass, "mass/F");
489 pivarski 1.11 m_mujetplustracks->Branch("massa", &m_mujetplustracks_massa, "massa/F");
490     m_mujetplustracks->Branch("massb", &m_mujetplustracks_massb, "massb/F");
491 pivarski 1.10 m_mujetplustracks->Branch("pt", &m_mujetplustracks_pt, "pt/F");
492     m_mujetplustracks->Branch("eta", &m_mujetplustracks_eta, "eta/F");
493     m_mujetplustracks->Branch("phi", &m_mujetplustracks_phi, "phi/F");
494     m_mujetplustracks->Branch("dr", &m_mujetplustracks_dr, "dr/F");
495     m_mujetplustracks->Branch("vprob", &m_mujetplustracks_vprob, "vprob/F");
496     m_mujetplustracks->Branch("lxy", &m_mujetplustracks_lxy, "lxy/F");
497     m_mujetplustracks->Branch("lxyz", &m_mujetplustracks_lxyz, "lxyz/F");
498     m_mujetplustracks->Branch("iso", &m_mujetplustracks_iso, "iso/F");
499     m_mujetplustracks->Branch("mupt1", &m_mujetplustracks_mupt1, "mupt1/F");
500     m_mujetplustracks->Branch("mupt2", &m_mujetplustracks_mupt2, "mupt2/F");
501     m_mujetplustracks->Branch("mupt3", &m_mujetplustracks_mupt3, "mupt3/F");
502     m_mujetplustracks->Branch("fakept1", &m_mujetplustracks_fakept1, "fakept1/F");
503     m_mujetplustracks->Branch("fakept2", &m_mujetplustracks_fakept2, "fakept2/F");
504 pivarski 1.1
505 pivarski 1.10 m_quadmuon = tFile->make<TTree>("quadmuon", "quadmuon");
506 pivarski 1.1 m_quadmuon->Branch("qscale", &m_qscale, "qscale/F");
507 pivarski 1.10 m_quadmuon->Branch("genLevel", &m_genLevel, "genLevel/I");
508 pivarski 1.1 m_quadmuon->Branch("run", &m_run, "run/I");
509     m_quadmuon->Branch("event", &m_event, "event/I");
510     m_quadmuon->Branch("trigger", &m_trigger, "trigger/I");
511 pivarski 1.3 m_quadmuon->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
512     m_quadmuon->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
513     m_quadmuon->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
514     m_quadmuon->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
515     m_quadmuon->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
516     m_quadmuon->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
517     m_quadmuon->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
518     m_quadmuon->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
519     m_quadmuon->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
520     m_quadmuon->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
521 pivarski 1.13 m_quadmuon->Branch("containstrig", &m_quadmuon_containstrig, "containstrig/I");
522     m_quadmuon->Branch("muons", &m_quadmuon_muons, "muons/I");
523     m_quadmuon->Branch("orphans", &m_quadmuon_orphans, "orphans/I");
524     m_quadmuon->Branch("charge", &m_quadmuon_charge, "charge/I");
525     m_quadmuon->Branch("mass", &m_quadmuon_mass, "mass/F");
526     m_quadmuon->Branch("massa", &m_quadmuon_massa, "massa/F");
527     m_quadmuon->Branch("massb", &m_quadmuon_massb, "massb/F");
528     m_quadmuon->Branch("massc", &m_quadmuon_massc, "massc/F");
529     m_quadmuon->Branch("massd", &m_quadmuon_massd, "massd/F");
530     m_quadmuon->Branch("masse", &m_quadmuon_masse, "masse/F");
531     m_quadmuon->Branch("massf", &m_quadmuon_massf, "massf/F");
532     m_quadmuon->Branch("pt", &m_quadmuon_pt, "pt/F");
533     m_quadmuon->Branch("eta", &m_quadmuon_eta, "eta/F");
534     m_quadmuon->Branch("phi", &m_quadmuon_phi, "phi/F");
535     m_quadmuon->Branch("dr", &m_quadmuon_dr, "dr/F");
536     m_quadmuon->Branch("vchi2", &m_quadmuon_vchi2, "vchi2/F");
537     m_quadmuon->Branch("vndof", &m_quadmuon_vndof, "vndof/I");
538     m_quadmuon->Branch("vprob", &m_quadmuon_vprob, "vprob/F");
539     m_quadmuon->Branch("lxy", &m_quadmuon_lxy, "lxy/F");
540     m_quadmuon->Branch("lxyz", &m_quadmuon_lxyz, "lxyz/F");
541     m_quadmuon->Branch("iso", &m_quadmuon_iso, "iso/F");
542 pivarski 1.1
543 pivarski 1.10 m_dimuorphan = tFile->make<TTree>("dimuorphan", "dimuorphan");
544 pivarski 1.8 m_dimuorphan->Branch("qscale", &m_qscale, "qscale/F");
545 pivarski 1.10 m_dimuorphan->Branch("genLevel", &m_genLevel, "genLevel/I");
546 pivarski 1.8 m_dimuorphan->Branch("run", &m_run, "run/I");
547     m_dimuorphan->Branch("event", &m_event, "event/I");
548     m_dimuorphan->Branch("trigger", &m_trigger, "trigger/I");
549     m_dimuorphan->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
550     m_dimuorphan->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
551     m_dimuorphan->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
552     m_dimuorphan->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
553     m_dimuorphan->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
554     m_dimuorphan->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
555     m_dimuorphan->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
556     m_dimuorphan->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
557     m_dimuorphan->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
558     m_dimuorphan->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
559     m_dimuorphan->Branch("deltaphi", &m_dimuorphan_deltaphi, "deltaphi/F");
560     m_dimuorphan->Branch("orphanpt", &m_dimuorphan_orphanpt, "orphanpt/F");
561     m_dimuorphan->Branch("orphaneta", &m_dimuorphan_orphaneta, "orphaneta/F");
562     m_dimuorphan->Branch("orphanphi", &m_dimuorphan_orphanphi, "orphanphi/F");
563 pivarski 1.9 m_dimuorphan->Branch("orphanisglobal", &m_dimuorphan_orphanisglobal, "orphanisglobal/I");
564     m_dimuorphan->Branch("orphanmatches", &m_dimuorphan_orphanmatches, "orphan/I");
565     m_dimuorphan->Branch("orphanhits", &m_dimuorphan_orphanhits, "orphanhits/I");
566     m_dimuorphan->Branch("orphanchi2", &m_dimuorphan_orphanchi2, "orphanchi2/F");
567     m_dimuorphan->Branch("orphanst1x", &m_dimuorphan_orphanst1x, "orphanst1x/F");
568     m_dimuorphan->Branch("orphanst1xsig", &m_dimuorphan_orphanst1xsig, "orphanst1xsig/F");
569     m_dimuorphan->Branch("orphanst1dxdz", &m_dimuorphan_orphanst1dxdz, "orphanst1dxdz/F");
570     m_dimuorphan->Branch("orphanst1dxdzsig", &m_dimuorphan_orphanst1dxdzsig, "orphanst1dxdzsig/F");
571 pivarski 1.8 m_dimuorphan->Branch("containstrig", &m_dimuorphan_containstrig, "containstrig/I");
572     m_dimuorphan->Branch("mass", &m_dimuorphan_mass, "mass/F");
573     m_dimuorphan->Branch("pt", &m_dimuorphan_pt, "pt/F");
574     m_dimuorphan->Branch("eta", &m_dimuorphan_eta, "eta/F");
575     m_dimuorphan->Branch("phi", &m_dimuorphan_phi, "phi/F");
576     m_dimuorphan->Branch("dr", &m_dimuorphan_dr, "dr/F");
577     m_dimuorphan->Branch("vprob", &m_dimuorphan_vprob, "vprob/F");
578     m_dimuorphan->Branch("lxy", &m_dimuorphan_lxy, "lxy/F");
579     m_dimuorphan->Branch("lxyz", &m_dimuorphan_lxyz, "lxyz/F");
580     m_dimuorphan->Branch("iso", &m_dimuorphan_iso, "iso/F");
581    
582 pivarski 1.10 m_dimudimu = tFile->make<TTree>("dimudimu", "dimudimu");
583 pivarski 1.1 m_dimudimu->Branch("qscale", &m_qscale, "qscale/F");
584 pivarski 1.10 m_dimudimu->Branch("genLevel", &m_genLevel, "genLevel/I");
585 pivarski 1.1 m_dimudimu->Branch("run", &m_run, "run/I");
586     m_dimudimu->Branch("event", &m_event, "event/I");
587     m_dimudimu->Branch("trigger", &m_trigger, "trigger/I");
588 pivarski 1.3 m_dimudimu->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
589     m_dimudimu->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
590     m_dimudimu->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
591     m_dimudimu->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
592     m_dimudimu->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
593     m_dimudimu->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
594     m_dimudimu->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
595     m_dimudimu->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
596     m_dimudimu->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
597     m_dimudimu->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
598 pivarski 1.13 m_dimudimu->Branch("orphans", &m_dimudimu_orphans, "orphans/I");
599 pivarski 1.7 m_dimudimu->Branch("wholemass", &m_dimudimu_wholemass, "wholemass/F");
600     m_dimudimu->Branch("wholept", &m_dimudimu_wholept, "wholept/F");
601     m_dimudimu->Branch("deltaphi", &m_dimudimu_deltaphi, "deltaphi/F");
602 pivarski 1.8 m_dimudimu->Branch("containstrig", &m_dimudimu_containstrig, "containstrig/I");
603     m_dimudimu->Branch("massC", &m_dimudimu_massC, "massC/F");
604     m_dimudimu->Branch("ptC", &m_dimudimu_ptC, "ptC/F");
605     m_dimudimu->Branch("etaC", &m_dimudimu_etaC, "etaC/F");
606     m_dimudimu->Branch("phiC", &m_dimudimu_phiC, "phiC/F");
607     m_dimudimu->Branch("drC", &m_dimudimu_drC, "drC/F");
608     m_dimudimu->Branch("vprobC", &m_dimudimu_vprobC, "vprobC/F");
609     m_dimudimu->Branch("lxyC", &m_dimudimu_lxyC, "lxyC/F");
610     m_dimudimu->Branch("lxyzC", &m_dimudimu_lxyzC, "lxyzC/F");
611     m_dimudimu->Branch("isoC", &m_dimudimu_isoC, "isoC/F");
612     m_dimudimu->Branch("massF", &m_dimudimu_massF, "massF/F");
613     m_dimudimu->Branch("ptF", &m_dimudimu_ptF, "ptF/F");
614     m_dimudimu->Branch("etaF", &m_dimudimu_etaF, "etaF/F");
615     m_dimudimu->Branch("phiF", &m_dimudimu_phiF, "phiF/F");
616     m_dimudimu->Branch("drF", &m_dimudimu_drF, "drF/F");
617     m_dimudimu->Branch("vprobF", &m_dimudimu_vprobF, "vprobF/F");
618     m_dimudimu->Branch("lxyF", &m_dimudimu_lxyF, "lxyF/F");
619     m_dimudimu->Branch("lxyzF", &m_dimudimu_lxyzF, "lxyzF/F");
620     m_dimudimu->Branch("isoF", &m_dimudimu_isoF, "isoF/F");
621 pivarski 1.1
622 pivarski 1.13 m_twomujets = tFile->make<TTree>("twomujets", "twomujets");
623     m_twomujets->Branch("qscale", &m_qscale, "qscale/F");
624     m_twomujets->Branch("genLevel", &m_genLevel, "genLevel/I");
625     m_twomujets->Branch("run", &m_run, "run/I");
626     m_twomujets->Branch("event", &m_event, "event/I");
627     m_twomujets->Branch("trigger", &m_trigger, "trigger/I");
628     m_twomujets->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
629     m_twomujets->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
630     m_twomujets->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
631     m_twomujets->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
632     m_twomujets->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
633     m_twomujets->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
634     m_twomujets->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
635     m_twomujets->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
636     m_twomujets->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
637     m_twomujets->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
638     m_twomujets->Branch("orphans", &m_dimudimu_orphans, "orphans/I");
639     m_twomujets->Branch("wholemass", &m_dimudimu_wholemass, "wholemass/F");
640     m_twomujets->Branch("wholept", &m_dimudimu_wholept, "wholept/F");
641     m_twomujets->Branch("deltaphi", &m_dimudimu_deltaphi, "deltaphi/F");
642     m_twomujets->Branch("containstrig", &m_dimudimu_containstrig, "containstrig/I");
643     m_twomujets->Branch("massC", &m_dimudimu_massC, "massC/F");
644     m_twomujets->Branch("ptC", &m_dimudimu_ptC, "ptC/F");
645     m_twomujets->Branch("etaC", &m_dimudimu_etaC, "etaC/F");
646     m_twomujets->Branch("phiC", &m_dimudimu_phiC, "phiC/F");
647     m_twomujets->Branch("drC", &m_dimudimu_drC, "drC/F");
648     m_twomujets->Branch("vprobC", &m_dimudimu_vprobC, "vprobC/F");
649     m_twomujets->Branch("lxyC", &m_dimudimu_lxyC, "lxyC/F");
650     m_twomujets->Branch("lxyzC", &m_dimudimu_lxyzC, "lxyzC/F");
651     m_twomujets->Branch("isoC", &m_dimudimu_isoC, "isoC/F");
652     m_twomujets->Branch("massF", &m_dimudimu_massF, "massF/F");
653     m_twomujets->Branch("ptF", &m_dimudimu_ptF, "ptF/F");
654     m_twomujets->Branch("etaF", &m_dimudimu_etaF, "etaF/F");
655     m_twomujets->Branch("phiF", &m_dimudimu_phiF, "phiF/F");
656     m_twomujets->Branch("drF", &m_dimudimu_drF, "drF/F");
657     m_twomujets->Branch("vprobF", &m_dimudimu_vprobF, "vprobF/F");
658     m_twomujets->Branch("lxyF", &m_dimudimu_lxyF, "lxyF/F");
659     m_twomujets->Branch("lxyzF", &m_dimudimu_lxyzF, "lxyzF/F");
660     m_twomujets->Branch("isoF", &m_dimudimu_isoF, "isoF/F");
661     m_twomujets->Branch("muonsC", &m_twomujets_muonsC, "muonsC/I");
662     m_twomujets->Branch("muonsF", &m_twomujets_muonsF, "muonsF/I");
663     m_twomujets->Branch("massCa", &m_twomujets_massCa, "massCa/F");
664     m_twomujets->Branch("massCb", &m_twomujets_massCb, "massCb/F");
665     m_twomujets->Branch("massCc", &m_twomujets_massCc, "massCc/F");
666     m_twomujets->Branch("massFa", &m_twomujets_massFa, "massFa/F");
667     m_twomujets->Branch("massFb", &m_twomujets_massFb, "massFb/F");
668     m_twomujets->Branch("massFc", &m_twomujets_massFc, "massFc/F");
669    
670     m_moremujets = tFile->make<TTree>("moremujets", "moremujets");
671     m_moremujets->Branch("qscale", &m_qscale, "qscale/F");
672     m_moremujets->Branch("genLevel", &m_genLevel, "genLevel/I");
673     m_moremujets->Branch("run", &m_run, "run/I");
674     m_moremujets->Branch("event", &m_event, "event/I");
675     m_moremujets->Branch("trigger", &m_trigger, "trigger/I");
676     m_moremujets->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
677     m_moremujets->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
678     m_moremujets->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
679     m_moremujets->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
680     m_moremujets->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
681     m_moremujets->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
682     m_moremujets->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
683     m_moremujets->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
684     m_moremujets->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
685     m_moremujets->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
686     m_moremujets->Branch("mujets", &m_moremujets_mujets, "mujets/I");
687     m_moremujets->Branch("orphans", &m_moremujets_orphans, "orphans/I");
688     m_moremujets->Branch("wholemass", &m_moremujets_wholemass, "wholemass/F");
689     m_moremujets->Branch("wholept", &m_moremujets_wholept, "wholept/F");
690     m_moremujets->Branch("massa", &m_moremujets_massa, "massa/F");
691     m_moremujets->Branch("massb", &m_moremujets_massb, "massb/F");
692     m_moremujets->Branch("massc", &m_moremujets_massc, "massc/F");
693     m_moremujets->Branch("massd", &m_moremujets_massd, "massd/F");
694     m_moremujets->Branch("masse", &m_moremujets_masse, "masse/F");
695     m_moremujets->Branch("massf", &m_moremujets_massf, "massf/F");
696     m_moremujets->Branch("muons1", &m_moremujets_muons1, "muons1/I");
697     m_moremujets->Branch("containstrig1", &m_moremujets_containstrig1, "containstrig1/I");
698     m_moremujets->Branch("mass1", &m_moremujets_mass1, "mass1/F");
699     m_moremujets->Branch("pt1", &m_moremujets_pt1, "pt1/F");
700     m_moremujets->Branch("iso1", &m_moremujets_iso1, "iso1/F");
701     m_moremujets->Branch("muons2", &m_moremujets_muons2, "muons2/I");
702     m_moremujets->Branch("containstrig2", &m_moremujets_containstrig2, "containstrig2/I");
703     m_moremujets->Branch("mass2", &m_moremujets_mass2, "mass2/F");
704     m_moremujets->Branch("pt2", &m_moremujets_pt2, "pt2/F");
705     m_moremujets->Branch("iso2", &m_moremujets_iso2, "iso2/F");
706     m_moremujets->Branch("muons3", &m_moremujets_muons3, "muons3/I");
707     m_moremujets->Branch("containstrig3", &m_moremujets_containstrig3, "containstrig3/I");
708     m_moremujets->Branch("mass3", &m_moremujets_mass3, "mass3/F");
709     m_moremujets->Branch("pt3", &m_moremujets_pt3, "pt3/F");
710     m_moremujets->Branch("iso3", &m_moremujets_iso3, "iso3/F");
711     m_moremujets->Branch("muons4", &m_moremujets_muons4, "muons4/I");
712     m_moremujets->Branch("containstrig4", &m_moremujets_containstrig4, "containstrig4/I");
713     m_moremujets->Branch("mass4", &m_moremujets_mass4, "mass4/F");
714     m_moremujets->Branch("pt4", &m_moremujets_pt4, "pt4/F");
715     m_moremujets->Branch("iso4", &m_moremujets_iso4, "iso4/F");
716     m_moremujets->Branch("muons5", &m_moremujets_muons5, "muons5/I");
717     m_moremujets->Branch("containstrig5", &m_moremujets_containstrig5, "containstrig5/I");
718     m_moremujets->Branch("mass5", &m_moremujets_mass5, "mass5/F");
719     m_moremujets->Branch("pt5", &m_moremujets_pt5, "pt5/F");
720     m_moremujets->Branch("iso5", &m_moremujets_iso5, "iso5/F");
721     m_moremujets->Branch("muons6", &m_moremujets_muons6, "muons6/I");
722     m_moremujets->Branch("containstrig6", &m_moremujets_containstrig6, "containstrig6/I");
723     m_moremujets->Branch("mass6", &m_moremujets_mass6, "mass6/F");
724     m_moremujets->Branch("pt6", &m_moremujets_pt6, "pt6/F");
725     m_moremujets->Branch("iso6", &m_moremujets_iso6, "iso6/F");
726 pivarski 1.14
727     m_displaced = tFile->make<TTree>("displaced", "displaced");
728     m_displaced->Branch("qscale", &m_qscale, "qscale/F");
729     m_displaced->Branch("genLevel", &m_genLevel, "genLevel/I");
730     m_displaced->Branch("run", &m_run, "run/I");
731     m_displaced->Branch("event", &m_event, "event/I");
732     m_displaced->Branch("trigger", &m_trigger, "trigger/I");
733     m_displaced->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
734     m_displaced->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
735     m_displaced->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
736     m_displaced->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
737     m_displaced->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
738     m_displaced->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
739     m_displaced->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
740     m_displaced->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
741     m_displaced->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
742     m_displaced->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
743     m_displaced->Branch("mujets", &m_displaced_mujets, "mujets/I");
744     m_displaced->Branch("orphans", &m_displaced_orphans, "orphans/I");
745     m_displaced->Branch("muons", &m_displaced_muons, "muons/I");
746     m_displaced->Branch("mass", &m_displaced_mass, "mass/F");
747     m_displaced->Branch("pt", &m_displaced_pt, "pt/F");
748     m_displaced->Branch("eta", &m_displaced_eta, "eta/F");
749     m_displaced->Branch("phi", &m_displaced_phi, "phi/F");
750     m_displaced->Branch("vx", &m_displaced_vx, "vx/F");
751     m_displaced->Branch("vy", &m_displaced_vy, "vy/F");
752     m_displaced->Branch("vz", &m_displaced_vz, "vz/F");
753     m_displaced->Branch("zclosest", &m_displaced_zclosest, "zclosest/F");
754     m_displaced->Branch("zcloseness", &m_displaced_zcloseness, "zcloseness/F");
755     m_displaced->Branch("lxy", &m_displaced_lxy, "lxy/F");
756     m_displaced->Branch("lxyz", &m_displaced_lxyz, "lxyz/F");
757     m_displaced->Branch("iso", &m_displaced_iso, "iso/F");
758     m_displaced->Branch("vprob", &m_displaced_vprob, "vprob/F");
759     m_displaced->Branch("mupt1", &m_displaced_mupt1, "mupt1/F");
760     m_displaced->Branch("mupt2", &m_displaced_mupt2, "mupt2/F");
761     m_displaced->Branch("plusmatches", &m_displaced_plusmatches, "plusmatches/I");
762     m_displaced->Branch("plusst1x", &m_displaced_plusst1x, "plusst1x/F");
763     m_displaced->Branch("plusst1xsig", &m_displaced_plusst1xsig, "plusst1xsig/F");
764     m_displaced->Branch("plusst1dxdz", &m_displaced_plusst1dxdz, "plusst1dxdz/F");
765     m_displaced->Branch("plusst1dxdzsig", &m_displaced_plusst1dxdzsig, "plusst1dxdzsig/F");
766     m_displaced->Branch("plushits", &m_displaced_plushits, "plushits/I");
767     m_displaced->Branch("plusnormchi2", &m_displaced_plusnormchi2, "plusnormchi2/F");
768     m_displaced->Branch("minusmatches", &m_displaced_minusmatches, "minusmatches/I");
769     m_displaced->Branch("minusst1x", &m_displaced_minusst1x, "minusst1x/F");
770     m_displaced->Branch("minusst1xsig", &m_displaced_minusst1xsig, "minusst1xsig/F");
771     m_displaced->Branch("minusst1dxdz", &m_displaced_minusst1dxdz, "minusst1dxdz/F");
772     m_displaced->Branch("minusst1dxdzsig", &m_displaced_minusst1dxdzsig, "minusst1dxdzsig/F");
773     m_displaced->Branch("minushits", &m_displaced_minushits, "minushits/I");
774     m_displaced->Branch("minusnormchi2", &m_displaced_minusnormchi2, "minusnormchi2/F");
775    
776     m_displacedFake = tFile->make<TTree>("displacedFake", "displacedFake");
777     m_displacedFake->Branch("qscale", &m_qscale, "qscale/F");
778     m_displacedFake->Branch("genLevel", &m_genLevel, "genLevel/I");
779     m_displacedFake->Branch("run", &m_run, "run/I");
780     m_displacedFake->Branch("event", &m_event, "event/I");
781     m_displacedFake->Branch("trigger", &m_trigger, "trigger/I");
782     m_displacedFake->Branch("muon1pt", &m_muon1pt, "muon1pt/F");
783     m_displacedFake->Branch("muon1eta", &m_muon1eta, "muon1eta/F");
784     m_displacedFake->Branch("muon2pt", &m_muon2pt, "muon2pt/F");
785     m_displacedFake->Branch("muon2eta", &m_muon2eta, "muon2eta/F");
786     m_displacedFake->Branch("muon3pt", &m_muon3pt, "muon3pt/F");
787     m_displacedFake->Branch("muon3eta", &m_muon3eta, "muon3eta/F");
788     m_displacedFake->Branch("muon4pt", &m_muon4pt, "muon4pt/F");
789     m_displacedFake->Branch("muon4eta", &m_muon4eta, "muon4eta/F");
790     m_displacedFake->Branch("muontrigpt", &m_muontrigpt, "muontrigpt/F");
791     m_displacedFake->Branch("muontrigeta", &m_muontrigeta, "muontrigeta/F");
792     m_displacedFake->Branch("mujets", &m_displaced_mujets, "mujets/I");
793     m_displacedFake->Branch("orphans", &m_displaced_orphans, "orphans/I");
794     m_displacedFake->Branch("muons", &m_displaced_muons, "muons/I");
795     m_displacedFake->Branch("mass", &m_displaced_mass, "mass/F");
796     m_displacedFake->Branch("pt", &m_displaced_pt, "pt/F");
797     m_displacedFake->Branch("eta", &m_displaced_eta, "eta/F");
798     m_displacedFake->Branch("phi", &m_displaced_phi, "phi/F");
799     m_displacedFake->Branch("vx", &m_displaced_vx, "vx/F");
800     m_displacedFake->Branch("vy", &m_displaced_vy, "vy/F");
801     m_displacedFake->Branch("vz", &m_displaced_vz, "vz/F");
802     m_displacedFake->Branch("zclosest", &m_displaced_zclosest, "zclosest/F");
803     m_displacedFake->Branch("zcloseness", &m_displaced_zcloseness, "zcloseness/F");
804     m_displacedFake->Branch("lxy", &m_displaced_lxy, "lxy/F");
805     m_displacedFake->Branch("lxyz", &m_displaced_lxyz, "lxyz/F");
806     m_displacedFake->Branch("iso", &m_displaced_iso, "iso/F");
807     m_displacedFake->Branch("vprob", &m_displaced_vprob, "vprob/F");
808     m_displacedFake->Branch("mupt1", &m_displaced_mupt1, "mupt1/F");
809     m_displacedFake->Branch("mupt2", &m_displaced_mupt2, "mupt2/F");
810     m_displacedFake->Branch("plusmatches", &m_displaced_plusmatches, "plusmatches/I");
811     m_displacedFake->Branch("plusst1x", &m_displaced_plusst1x, "plusst1x/F");
812     m_displacedFake->Branch("plusst1xsig", &m_displaced_plusst1xsig, "plusst1xsig/F");
813     m_displacedFake->Branch("plusst1dxdz", &m_displaced_plusst1dxdz, "plusst1dxdz/F");
814     m_displacedFake->Branch("plusst1dxdzsig", &m_displaced_plusst1dxdzsig, "plusst1dxdzsig/F");
815     m_displacedFake->Branch("plushits", &m_displaced_plushits, "plushits/I");
816     m_displacedFake->Branch("plusnormchi2", &m_displaced_plusnormchi2, "plusnormchi2/F");
817     m_displacedFake->Branch("minusmatches", &m_displaced_minusmatches, "minusmatches/I");
818     m_displacedFake->Branch("minusst1x", &m_displaced_minusst1x, "minusst1x/F");
819     m_displacedFake->Branch("minusst1xsig", &m_displaced_minusst1xsig, "minusst1xsig/F");
820     m_displacedFake->Branch("minusst1dxdz", &m_displaced_minusst1dxdz, "minusst1dxdz/F");
821     m_displacedFake->Branch("minusst1dxdzsig", &m_displaced_minusst1dxdzsig, "minusst1dxdzsig/F");
822     m_displacedFake->Branch("minushits", &m_displaced_minushits, "minushits/I");
823     m_displacedFake->Branch("minusnormchi2", &m_displaced_minusnormchi2, "minusnormchi2/F");
824     m_displacedFake->Branch("fakes", &m_displacedFake_fakes, "fakes/I");
825 pivarski 1.1 }
826    
827    
828     FitNtuple::~FitNtuple()
829     {
830    
831     // do anything here that needs to be done at desctruction time
832     // (e.g. close files, deallocate resources etc.)
833    
834     }
835    
836    
837     //
838     // member functions
839     //
840    
841     // ------------ method called to for each event ------------
842     void
843     FitNtuple::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
844     {
845     // the QCD scale only exists for certain kinds of Monte Carlo, but if it's available, get it
846     m_qscale = 0.;
847     if (m_getQscale) {
848     edm::Handle<GenEventInfoProduct> genEventInfoProduct;
849     iEvent.getByLabel("generator", genEventInfoProduct);
850     m_qscale = genEventInfoProduct->qScale();
851     }
852    
853     // the pair-gun Monte Carlos have a (never used) feature called
854     // alteration; the real events are the ones in which particleNumber == 0
855     bool alternating = true;
856     if (m_getAlternating) {
857     edm::Handle<unsigned int> particleNumber;
858     iEvent.getByLabel("generator", "particleNumber", particleNumber);
859     alternating = (*particleNumber == 0);
860     }
861     if (!alternating) return;
862    
863     // get the run and event number
864     m_run = iEvent.id().run();
865     m_event = iEvent.id().event();
866    
867     // mu-jets (muons grouped by mass and vertex compatibility)
868     edm::Handle<pat::MultiMuonCollection> muJets;
869 pivarski 1.10 iEvent.getByLabel("MuJetProducer", muJets);
870 pivarski 1.1
871 pivarski 1.8 // orphans (muons not found in any group)
872     edm::Handle<pat::MuonCollection> orphans;
873 pivarski 1.10 iEvent.getByLabel("MuJetProducer", "Orphans", orphans);
874    
875     // mu-jets plus at most two tracks as fake muons
876     edm::Handle<pat::MultiMuonCollection> muJetPlusTracks;
877     iEvent.getByLabel("MuJetPlusTracks", muJetPlusTracks);
878 pivarski 1.1
879 pivarski 1.14 edm::Handle<pat::MultiMuonCollection> displacedMuJet;
880     iEvent.getByLabel("DisplacedMuJet", displacedMuJet);
881    
882     edm::Handle<pat::MultiMuonCollection> displacedMuJetFake;
883     iEvent.getByLabel("DisplacedMuJetFake", displacedMuJetFake);
884    
885 pivarski 1.3 // find the top four muons in the event (-1000. if not found)
886     edm::Handle<pat::MuonCollection> muons;
887 pivarski 1.10 iEvent.getByLabel("cleanPatMuonsTriggerMatch", muons);
888 pivarski 1.3 m_muon1pt = -1000.; m_muon1eta = -1000.;
889     m_muon2pt = -1000.; m_muon2eta = -1000.;
890     m_muon3pt = -1000.; m_muon3eta = -1000.;
891     m_muon4pt = -1000.; m_muon4eta = -1000.;
892     m_muontrigpt = -1000.; m_muontrigeta = -1000.;
893 pivarski 1.10 std::vector<pat::MuonCollection::const_iterator> muontrig;
894    
895 pivarski 1.3 for (pat::MuonCollection::const_iterator muon = muons->begin(); muon != muons->end(); ++muon) {
896     if (fabs(muon->eta()) < 2.4 && muon->isTrackerMuon() && muon->numberOfMatches(reco::Muon::SegmentAndTrackArbitration) >= 2 && muon->innerTrack()->numberOfValidHits() >= 8 && muon->innerTrack()->normalizedChi2() < 4.) {
897     if (muon->pt() > m_muon1pt) {
898     m_muon4pt = m_muon3pt; m_muon4eta = m_muon3eta;
899     m_muon3pt = m_muon2pt; m_muon3eta = m_muon2eta;
900     m_muon2pt = m_muon1pt; m_muon2eta = m_muon1eta;
901     m_muon1pt = muon->pt(); m_muon1eta = muon->eta();
902     }
903     else if (muon->pt() > m_muon2pt) {
904     m_muon4pt = m_muon3pt; m_muon4eta = m_muon3eta;
905     m_muon3pt = m_muon2pt; m_muon3eta = m_muon2eta;
906     m_muon2pt = muon->pt(); m_muon2eta = muon->eta();
907     }
908     else if (muon->pt() > m_muon3pt) {
909     m_muon4pt = m_muon3pt; m_muon4eta = m_muon3eta;
910     m_muon3pt = muon->pt(); m_muon3eta = muon->eta();
911     }
912     else if (muon->pt() > m_muon4pt) {
913     m_muon4pt = muon->pt(); m_muon4eta = muon->eta();
914     }
915    
916     // special muon within a more limited |eta| range, to guarantee the trigger
917 pivarski 1.8 if (fabs(muon->eta()) < 0.9) {
918 pivarski 1.3 if (muon->pt() > m_muontrigpt) {
919     m_muontrigpt = muon->pt(); m_muontrigeta = muon->eta();
920     }
921     }
922 pivarski 1.8
923 pivarski 1.10 // all muons with pT > 15 GeV/c and |eta| < 0.9, matched to a trigger object
924     if (muon->pt() > 15. && fabs(muon->eta()) < 0.9) {
925     const pat::TriggerObjectStandAlone *mu3 = muon->triggerObjectMatchByPath("HLT_Mu3");
926     const pat::TriggerObjectStandAlone *mu5 = muon->triggerObjectMatchByPath("HLT_Mu5");
927     const pat::TriggerObjectStandAlone *mu9 = muon->triggerObjectMatchByPath("HLT_Mu9");
928     const pat::TriggerObjectStandAlone *mu11 = muon->triggerObjectMatchByPath("HLT_Mu11");
929 pivarski 1.12 const pat::TriggerObjectStandAlone *mu15 = muon->triggerObjectMatchByPath("HLT_Mu15_v1");
930 pivarski 1.10
931     if ((mu3 != NULL && mu3->collection() == std::string("hltL3MuonCandidates::HLT") && mu3->pt() > 15.) ||
932     (mu5 != NULL && mu5->collection() == std::string("hltL3MuonCandidates::HLT") && mu5->pt() > 15.) ||
933     (mu9 != NULL && mu9->collection() == std::string("hltL3MuonCandidates::HLT") && mu9->pt() > 15.) ||
934     (mu11 != NULL && mu11->collection() == std::string("hltL3MuonCandidates::HLT") && mu11->pt() > 15.) ||
935     (mu15 != NULL && mu15->collection() == std::string("hltL3MuonCandidates::HLT") && mu15->pt() > 15.)) {
936     muontrig.push_back(muon);
937 pivarski 1.8 }
938     }
939 pivarski 1.3 }
940     }
941 pivarski 1.1
942     // // all tracker-tracks
943     // edm::Handle<reco::TrackCollection> tracks;
944     // iEvent.getByLabel("generalTracks", tracks);
945    
946     // // generator-level 4-vectors
947     // edm::Handle<reco::GenParticleCollection> genParticles;
948     // iEvent.getByLabel("genParticles", genParticles);
949    
950     // find the closest primary vertex (in Z) to the first muJet with a valid vertex
951     edm::Handle<reco::VertexCollection> primaryVertices;
952     iEvent.getByLabel("offlinePrimaryVertices", primaryVertices);
953     reco::VertexCollection::const_iterator closestPrimaryVertex = primaryVertices->end();
954     if (muJets->size() > 0) {
955     pat::MultiMuonCollection::const_iterator muJet0 = muJets->end();
956     for (pat::MultiMuonCollection::const_iterator muJet = muJets->begin(); muJet != muJets->end(); ++muJet) {
957     if (muJet->vertexValid()) {
958     muJet0 = muJet;
959     break;
960     }
961     }
962    
963     if (muJet0 != muJets->end()) {
964     for (reco::VertexCollection::const_iterator vertex = primaryVertices->begin(); vertex != primaryVertices->end(); ++vertex) {
965     if (vertex->isValid() && !vertex->isFake() && vertex->tracksSize() > 3 && fabs(vertex->z()) < 24.) {
966     if (closestPrimaryVertex == primaryVertices->end() || fabs(vertex->z() - muJet0->vertexPoint().z()) < fabs(closestPrimaryVertex->z() - muJet0->vertexPoint().z())) {
967     closestPrimaryVertex = vertex;
968     }
969     } // end vertex quality cuts
970     } // end loop over primary vertices
971     } // end if muJet0 exists
972     } // end if muJets->size > 0
973    
974     // find out which trigger bits were fired
975     edm::Handle<pat::TriggerEvent> triggerEvent;
976     iEvent.getByLabel("patTriggerEvent", triggerEvent);
977     m_trigger = 0;
978     if (triggerEvent->path("HLT_Mu5") && triggerEvent->path("HLT_Mu5")->wasAccept()) m_trigger += 1;
979     if (triggerEvent->path("HLT_Mu9") && triggerEvent->path("HLT_Mu9")->wasAccept()) m_trigger += 2;
980     if (triggerEvent->path("HLT_Mu11") && triggerEvent->path("HLT_Mu11")->wasAccept()) m_trigger += 4;
981 pivarski 1.12 if (triggerEvent->path("HLT_Mu15_v1") && triggerEvent->path("HLT_Mu15_v1")->wasAccept()) m_trigger += 8;
982 pivarski 1.14 if (triggerEvent->path("HLT_Mu20_NoVertex") && triggerEvent->path("HLT_Mu20_NoVertex")->wasAccept()) m_trigger += 16;
983 pivarski 1.10
984     // get some gen-level information
985     m_genLevel = -1;
986     if (m_fillGenLevel) {
987     bool any_missing_mcmatch = false;
988     bool any_decays_in_flight = false;
989     unsigned int bjets = 0;
990     unsigned int resonances = 0;
991     for (pat::MultiMuonCollection::const_iterator muJet = muJets->begin(); muJet != muJets->end(); ++muJet) {
992     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
993     const pat::Muon *muon = dynamic_cast<const pat::Muon*>(muJet->daughter(i));
994    
995     if (muon->genParticlesSize() == 0) any_missing_mcmatch = true;
996    
997     else if (muon->genParticle()->mother()) {
998     int mother = muon->genParticle()->mother()->pdgId();
999     if (abs(mother) == 13 && muon->genParticle()->mother()->mother()) muon->genParticle()->mother()->mother()->pdgId(); // don't let muons be their own mothers
1000    
1001     if (abs(mother) == 211 /* charged pion */ ||
1002     abs(mother) == 321 /* charged kaon */ ||
1003     (3000 <= abs(mother) && abs(mother) < 4000) /* strange baryon */ ) any_decays_in_flight = true;
1004     }
1005     }
1006    
1007     if (muJet->genParticlesSize() == 1) {
1008     for (const reco::Candidate *particle = muJet->genParticle(); particle != NULL; particle = particle->mother()) {
1009     int pdgId = particle->pdgId();
1010     if (abs(pdgId) == 511 ||
1011     abs(pdgId) == 521 ||
1012     abs(pdgId) == 513 ||
1013     abs(pdgId) == 523 ||
1014     abs(pdgId) == 515 ||
1015     abs(pdgId) == 525 ||
1016     abs(pdgId) == 531 ||
1017     abs(pdgId) == 533 ||
1018     abs(pdgId) == 535 ||
1019     abs(pdgId) == 541 ||
1020     abs(pdgId) == 543 ||
1021     abs(pdgId) == 545 ||
1022     (5000 <= abs(pdgId) && abs(pdgId) < 6000)) {
1023     bjets++;
1024     break;
1025     }
1026     }
1027    
1028     if (muJet->genParticle()->pdgId() == 113 /* rho */ ||
1029     muJet->genParticle()->pdgId() == 221 /* eta */ ||
1030     muJet->genParticle()->pdgId() == 223 /* omega(782) */ ||
1031     muJet->genParticle()->pdgId() == 333 /* phi(1020) */ ||
1032     muJet->genParticle()->pdgId() == 443 /* J/psi */ ||
1033     muJet->genParticle()->pdgId() == 100443 /* psi(2S) */ ) {
1034     resonances++;
1035     }
1036     }
1037     }
1038    
1039     m_genLevel = 0;
1040     if (bjets > 0 && bjets == muJets->size()) m_genLevel += 1;
1041     if (resonances > 0 && resonances == muJets->size()) m_genLevel += 2;
1042     if (any_decays_in_flight) m_genLevel += 4;
1043     if (any_missing_mcmatch) m_genLevel += 8;
1044     }
1045 pivarski 1.1
1046 pivarski 1.7 ////////////////////////////////////////////////////////// alldimuons (special case for scaling to the Z)
1047     if (muons->size() == 2) {
1048     double total_energy = (*muons)[0].energy() + (*muons)[1].energy();
1049     double total_px = (*muons)[0].px() + (*muons)[1].px();
1050     double total_py = (*muons)[0].py() + (*muons)[1].py();
1051     double total_pz = (*muons)[0].pz() + (*muons)[1].pz();
1052     m_alldimuons_mass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
1053     if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 2) {
1054     m_alldimuons_iso = (*muJets)[0].centralTrackIsolation();
1055     }
1056     else {
1057     m_alldimuons_iso = -1.;
1058     }
1059     m_alldimuons->Fill();
1060     }
1061    
1062 pivarski 1.13 ////////////////////////////////////////////////////////// lowdimuon and highdimuon:
1063     if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 2 && orphans->size() == 0) {
1064 pivarski 1.1 pat::MultiMuonCollection::const_iterator muJet = muJets->begin();
1065    
1066 pivarski 1.10 m_lowdimuon_containstrig = 0;
1067     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1068     if (muJet->muon(0)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1069     muJet->sameTrack(&*(muJet->muon(0)->innerTrack()), &*((*iter)->innerTrack()))) {
1070     m_lowdimuon_containstrig = 1;
1071     }
1072     if (muJet->muon(1)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1073     muJet->sameTrack(&*(muJet->muon(1)->innerTrack()), &*((*iter)->innerTrack()))) {
1074     m_lowdimuon_containstrig = 1;
1075     }
1076     }
1077    
1078 pivarski 1.1 // generator-level mass using matched genParticles (for resolution of fit peak)
1079     m_lowdimuon_genmass = -1000.;
1080 pivarski 1.5 if (muJet->muon(0)->genParticlesSize() == 1 && muJet->muon(1)->genParticlesSize() == 1) {
1081 pivarski 1.4 const reco::GenParticle *mu0 = muJet->muon(0)->genParticle();
1082     const reco::GenParticle *mu1 = muJet->muon(1)->genParticle();
1083 pivarski 1.1
1084     double total_energy = mu0->energy() + mu1->energy();
1085     double total_px = mu0->px() + mu1->px();
1086     double total_py = mu0->py() + mu1->py();
1087     double total_pz = mu0->pz() + mu1->pz();
1088     m_lowdimuon_genmass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
1089     }
1090    
1091     m_lowdimuon_mass = muJet->mass();
1092     m_lowdimuon_pt = muJet->pt();
1093     m_lowdimuon_eta = muJet->eta();
1094     m_lowdimuon_phi = muJet->phi();
1095     m_lowdimuon_dr = muJet->dRmax();
1096 pivarski 1.3 if (muJet->daughter(0)->charge() > 0) {
1097     m_lowdimuon_pluspx = muJet->daughter(0)->px();
1098     m_lowdimuon_pluspy = muJet->daughter(0)->py();
1099     m_lowdimuon_pluspz = muJet->daughter(0)->pz();
1100     m_lowdimuon_minuspx = muJet->daughter(1)->px();
1101     m_lowdimuon_minuspy = muJet->daughter(1)->py();
1102     m_lowdimuon_minuspz = muJet->daughter(1)->pz();
1103     }
1104     else {
1105     m_lowdimuon_pluspx = muJet->daughter(1)->px();
1106     m_lowdimuon_pluspy = muJet->daughter(1)->py();
1107     m_lowdimuon_pluspz = muJet->daughter(1)->pz();
1108     m_lowdimuon_minuspx = muJet->daughter(0)->px();
1109     m_lowdimuon_minuspy = muJet->daughter(0)->py();
1110     m_lowdimuon_minuspz = muJet->daughter(0)->pz();
1111     }
1112 pivarski 1.1 m_lowdimuon_vprob = -1000.;
1113     m_lowdimuon_vx = -1000.;
1114     m_lowdimuon_vy = -1000.;
1115     m_lowdimuon_vz = -1000.;
1116    
1117 pivarski 1.2 GlobalVector complus;
1118 pivarski 1.6 if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOM(0);
1119     else complus = muJet->daughterCOM(1);
1120 pivarski 1.2 m_lowdimuon_compluspx = complus.x();
1121     m_lowdimuon_compluspy = complus.y();
1122     m_lowdimuon_compluspz = complus.z();
1123    
1124 pivarski 1.6 if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOMrot(0);
1125     else complus = muJet->daughterCOMrot(1);
1126     m_lowdimuon_comrotpluspx = complus.x();
1127     m_lowdimuon_comrotpluspy = complus.y();
1128     m_lowdimuon_comrotpluspz = complus.z();
1129    
1130 pivarski 1.2 // replace all values with vertex-updated values if vertex fitting succeeded
1131 pivarski 1.1 if (muJet->vertexValid()) {
1132     m_lowdimuon_mass = muJet->vertexMass();
1133     m_lowdimuon_pt = muJet->vertexMomentum().perp();
1134     m_lowdimuon_eta = muJet->vertexMomentum().eta();
1135     m_lowdimuon_phi = muJet->vertexMomentum().phi();
1136     m_lowdimuon_dr = muJet->dRmax(true);
1137 pivarski 1.3 if (muJet->daughter(0)->charge() > 0) {
1138     m_lowdimuon_pluspx = muJet->vertexMomentum(0).x();
1139     m_lowdimuon_pluspy = muJet->vertexMomentum(0).y();
1140     m_lowdimuon_pluspz = muJet->vertexMomentum(0).z();
1141     m_lowdimuon_minuspx = muJet->vertexMomentum(1).x();
1142     m_lowdimuon_minuspy = muJet->vertexMomentum(1).y();
1143     m_lowdimuon_minuspz = muJet->vertexMomentum(1).z();
1144     }
1145     else {
1146     m_lowdimuon_pluspx = muJet->vertexMomentum(1).x();
1147     m_lowdimuon_pluspy = muJet->vertexMomentum(1).y();
1148     m_lowdimuon_pluspz = muJet->vertexMomentum(1).z();
1149     m_lowdimuon_minuspx = muJet->vertexMomentum(0).x();
1150     m_lowdimuon_minuspy = muJet->vertexMomentum(0).y();
1151     m_lowdimuon_minuspz = muJet->vertexMomentum(0).z();
1152     }
1153 pivarski 1.1 m_lowdimuon_vprob = muJet->vertexProb();
1154    
1155     if (closestPrimaryVertex != primaryVertices->end()) {
1156     m_lowdimuon_vx = muJet->vertexPoint().x() - closestPrimaryVertex->x();
1157     m_lowdimuon_vy = muJet->vertexPoint().y() - closestPrimaryVertex->y();
1158     m_lowdimuon_vz = muJet->vertexPoint().z() - closestPrimaryVertex->z();
1159     }
1160    
1161 pivarski 1.2 GlobalVector complus;
1162 pivarski 1.6 if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOM(0, true);
1163     else complus = muJet->daughterCOM(1, true);
1164 pivarski 1.2 m_lowdimuon_compluspx = complus.x();
1165     m_lowdimuon_compluspy = complus.y();
1166     m_lowdimuon_compluspz = complus.z();
1167 pivarski 1.6
1168     if (muJet->daughter(0)->charge() > 0) complus = muJet->daughterCOMrot(0, true);
1169     else complus = muJet->daughterCOMrot(1, true);
1170     m_lowdimuon_comrotpluspx = complus.x();
1171     m_lowdimuon_comrotpluspy = complus.y();
1172     m_lowdimuon_comrotpluspz = complus.z();
1173    
1174 pivarski 1.1 } // end of replacements with quantities measured at the vertex
1175    
1176     m_lowdimuon_iso = muJet->centralTrackIsolation();
1177    
1178 pivarski 1.6 std::vector<reco::MuonChamberMatch> plusmatches, minusmatches;
1179     if (muJet->daughter(0)->charge() > 0) {
1180     m_lowdimuon_plusmatches = muJet->muon(0)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1181     m_lowdimuon_minusmatches = muJet->muon(1)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1182     plusmatches = muJet->muon(0)->matches();
1183     minusmatches = muJet->muon(1)->matches();
1184     m_lowdimuon_plushits = muJet->muon(0)->innerTrack()->numberOfValidHits();
1185     m_lowdimuon_minushits = muJet->muon(1)->innerTrack()->numberOfValidHits();
1186     m_lowdimuon_plusnormchi2 = muJet->muon(0)->innerTrack()->normalizedChi2();
1187     m_lowdimuon_minusnormchi2 = muJet->muon(1)->innerTrack()->normalizedChi2();
1188     }
1189     else {
1190     m_lowdimuon_plusmatches = muJet->muon(1)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1191     m_lowdimuon_minusmatches = muJet->muon(0)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1192     plusmatches = muJet->muon(1)->matches();
1193     minusmatches = muJet->muon(0)->matches();
1194     m_lowdimuon_plushits = muJet->muon(1)->innerTrack()->numberOfValidHits();
1195     m_lowdimuon_minushits = muJet->muon(0)->innerTrack()->numberOfValidHits();
1196     m_lowdimuon_plusnormchi2 = muJet->muon(1)->innerTrack()->normalizedChi2();
1197     m_lowdimuon_minusnormchi2 = muJet->muon(0)->innerTrack()->normalizedChi2();
1198     }
1199    
1200     m_lowdimuon_plusst1x = -1000.;
1201     m_lowdimuon_plusst1xsig = -1000.;
1202     m_lowdimuon_plusst1dxdz = -1000.;
1203     m_lowdimuon_plusst1dxdzsig = -1000.;
1204     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = plusmatches.begin(); chamberMatch != plusmatches.end(); ++chamberMatch) {
1205     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
1206     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
1207     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
1208     if (chamberMatch->station() == 1) {
1209     m_lowdimuon_plusst1x = (segmentMatch->x - chamberMatch->x);
1210     m_lowdimuon_plusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
1211     m_lowdimuon_plusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
1212     m_lowdimuon_plusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
1213     }
1214     }
1215     }
1216     }
1217    
1218     m_lowdimuon_minusst1x = -1000.;
1219     m_lowdimuon_minusst1xsig = -1000.;
1220     m_lowdimuon_minusst1dxdz = -1000.;
1221     m_lowdimuon_minusst1dxdzsig = -1000.;
1222     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = minusmatches.begin(); chamberMatch != minusmatches.end(); ++chamberMatch) {
1223     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
1224     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
1225     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
1226     if (chamberMatch->station() == 1) {
1227     m_lowdimuon_minusst1x = (segmentMatch->x - chamberMatch->x);
1228     m_lowdimuon_minusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
1229     m_lowdimuon_minusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
1230     m_lowdimuon_minusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
1231     }
1232     }
1233     }
1234     }
1235    
1236 pivarski 1.13 if (m_lowdimuon_pt > 80.) m_highdimuon->Fill();
1237     else m_lowdimuon->Fill();
1238 pivarski 1.1 }
1239    
1240     ////////////////////////////////////////////////////////// quadmuon
1241 pivarski 1.13 else if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() >= 4) {
1242     pat::MultiMuonCollection::const_iterator muJet = muJets->begin();
1243    
1244     m_quadmuon_containstrig = 0;
1245     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1246     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1247     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1248     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1249     m_quadmuon_containstrig = 1;
1250     }
1251     }
1252     }
1253    
1254     m_quadmuon_muons = muJet->numberOfDaughters();
1255     m_quadmuon_orphans = orphans->size();
1256     m_quadmuon_charge = muJet->charge();
1257     m_quadmuon_mass = muJet->mass();
1258     m_quadmuon_massa = -1.;
1259     m_quadmuon_massb = -1.;
1260     m_quadmuon_massc = -1.;
1261     m_quadmuon_massd = -1.;
1262     m_quadmuon_masse = -1.;
1263     m_quadmuon_massf = -1.;
1264     std::vector<double> masses = muJet->consistentPairMasses();
1265 pivarski 1.14 std::random_shuffle(masses.begin(), masses.end());
1266 pivarski 1.13 if (masses.size() >= 1) m_quadmuon_massa = masses[0];
1267     if (masses.size() >= 2) m_quadmuon_massb = masses[1];
1268     if (masses.size() >= 3) m_quadmuon_massc = masses[2];
1269     if (masses.size() >= 4) m_quadmuon_massd = masses[3];
1270     if (masses.size() >= 5) m_quadmuon_masse = masses[4];
1271     if (masses.size() >= 6) m_quadmuon_massf = masses[5];
1272     m_quadmuon_pt = muJet->pt();
1273     m_quadmuon_eta = muJet->eta();
1274     m_quadmuon_phi = muJet->phi();
1275     m_quadmuon_dr = muJet->dRmax();
1276     m_quadmuon_vchi2 = -1.;
1277     m_quadmuon_vndof = -1;
1278     m_quadmuon_vprob = -1.;
1279     m_quadmuon_lxy = -1000.;
1280     m_quadmuon_lxyz = -1000.;
1281     m_quadmuon_iso = muJet->centralTrackIsolation();
1282    
1283     if (muJet->vertexValid()) {
1284     m_quadmuon_mass = muJet->vertexMass();
1285     m_quadmuon_massa = -1.;
1286     m_quadmuon_massb = -1.;
1287     m_quadmuon_massc = -1.;
1288     m_quadmuon_massd = -1.;
1289     m_quadmuon_masse = -1.;
1290     m_quadmuon_massf = -1.;
1291     std::vector<double> masses = muJet->consistentPairMasses(true);
1292 pivarski 1.14 std::random_shuffle(masses.begin(), masses.end());
1293 pivarski 1.13 if (masses.size() >= 1) m_quadmuon_massa = masses[0];
1294     if (masses.size() >= 2) m_quadmuon_massb = masses[1];
1295     if (masses.size() >= 3) m_quadmuon_massc = masses[2];
1296     if (masses.size() >= 4) m_quadmuon_massd = masses[3];
1297     if (masses.size() >= 5) m_quadmuon_masse = masses[4];
1298     if (masses.size() >= 6) m_quadmuon_massf = masses[5];
1299     m_quadmuon_pt = muJet->vertexMomentum().perp();
1300     m_quadmuon_eta = muJet->vertexMomentum().eta();
1301     m_quadmuon_phi = muJet->vertexMomentum().phi();
1302     m_quadmuon_dr = muJet->dRmax(true);
1303     m_quadmuon_vchi2 = muJet->vertexChi2();
1304     m_quadmuon_vndof = muJet->vertexNdof();
1305     m_quadmuon_vprob = muJet->vertexProb();
1306     if (closestPrimaryVertex != primaryVertices->end()) {
1307     m_quadmuon_lxy = muJet->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1308     m_quadmuon_lxyz = muJet->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1309     }
1310     }
1311    
1312     m_quadmuon->Fill();
1313 pivarski 1.1 }
1314    
1315 pivarski 1.8 ////////////////////////////////////////////////////////// dimuorphan
1316     else if (muJets->size() == 1 && (*muJets)[0].numberOfDaughters() == 2 && orphans->size() == 1) {
1317     pat::MultiMuonCollection::const_iterator muJet = muJets->begin();
1318     pat::MuonCollection::const_iterator orphan = orphans->begin();
1319    
1320     m_dimuorphan_deltaphi = muJet->phi() - orphan->phi();
1321     while (m_dimuorphan_deltaphi > M_PI) m_dimuorphan_deltaphi -= 2.*M_PI;
1322     while (m_dimuorphan_deltaphi < -M_PI) m_dimuorphan_deltaphi += 2.*M_PI;
1323    
1324     m_dimuorphan_orphanpt = orphan->pt();
1325     m_dimuorphan_orphaneta = orphan->eta();
1326     m_dimuorphan_orphanphi = orphan->phi();
1327 pivarski 1.9 m_dimuorphan_orphanisglobal = (orphan->isGlobalMuon() ? 1 : 0);
1328     m_dimuorphan_orphanmatches = orphan->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1329     m_dimuorphan_orphanhits = (orphan->innerTrack().isAvailable() ? orphan->innerTrack()->numberOfValidHits(): -1);
1330     m_dimuorphan_orphanchi2 = (orphan->innerTrack().isAvailable() ? orphan->innerTrack()->normalizedChi2(): -1.);
1331     m_dimuorphan_orphanst1x = -1000.;
1332     m_dimuorphan_orphanst1xsig = -1000.;
1333     m_dimuorphan_orphanst1dxdz = -1000.;
1334     m_dimuorphan_orphanst1dxdzsig = -1000.;
1335     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = orphan->matches().begin(); chamberMatch != orphan->matches().end(); ++chamberMatch) {
1336     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
1337     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
1338     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
1339     if (chamberMatch->station() == 1) {
1340     m_dimuorphan_orphanst1x = (segmentMatch->x - chamberMatch->x);
1341     m_dimuorphan_orphanst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
1342     m_dimuorphan_orphanst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
1343     m_dimuorphan_orphanst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
1344     }
1345     }
1346     }
1347     }
1348 pivarski 1.8
1349 pivarski 1.10 m_dimuorphan_containstrig = 0;
1350     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1351     if (orphan->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1352     muJet->sameTrack(&*(orphan->innerTrack()), &*((*iter)->innerTrack()))) {
1353     m_dimuorphan_containstrig = 1;
1354     }
1355 pivarski 1.8 }
1356 pivarski 1.10
1357 pivarski 1.8 m_dimuorphan_mass = muJet->mass();
1358     m_dimuorphan_pt = muJet->pt();
1359     m_dimuorphan_eta = muJet->eta();
1360     m_dimuorphan_phi = muJet->phi();
1361     m_dimuorphan_dr = muJet->dRmax();
1362     m_dimuorphan_vprob = -1.;
1363     m_dimuorphan_lxy = -1000.;
1364     m_dimuorphan_lxyz = -1000.;
1365     m_dimuorphan_iso = muJet->centralTrackIsolation();
1366    
1367     if (muJet->vertexValid()) {
1368     m_dimuorphan_deltaphi = muJet->vertexMomentum().phi() - orphan->phi();
1369     while (m_dimuorphan_deltaphi > M_PI) m_dimuorphan_deltaphi -= 2.*M_PI;
1370     while (m_dimuorphan_deltaphi < -M_PI) m_dimuorphan_deltaphi += 2.*M_PI;
1371    
1372     m_dimuorphan_mass = muJet->vertexMass();
1373     m_dimuorphan_pt = muJet->vertexMomentum().perp();
1374     m_dimuorphan_eta = muJet->vertexMomentum().eta();
1375     m_dimuorphan_phi = muJet->vertexMomentum().phi();
1376     m_dimuorphan_dr = muJet->dRmax(true);
1377     m_dimuorphan_vprob = muJet->vertexProb();
1378 pivarski 1.10 if (closestPrimaryVertex != primaryVertices->end()) {
1379     m_dimuorphan_lxy = muJet->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1380     m_dimuorphan_lxyz = muJet->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1381     }
1382 pivarski 1.8 }
1383    
1384     m_dimuorphan->Fill();
1385     }
1386    
1387 pivarski 1.1 ////////////////////////////////////////////////////////// dimudimu
1388 pivarski 1.13 else if (muJets->size() == 2) {
1389 pivarski 1.10 const pat::MultiMuon *muJet0 = &((*muJets)[0]);
1390     const pat::MultiMuon *muJet1 = &((*muJets)[1]);
1391    
1392     bool muJet0_canBeC = false;
1393     bool muJet1_canBeC = false;
1394     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1395     if (muJet0->muon(0)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1396     muJet0->sameTrack(&*(muJet0->muon(0)->innerTrack()), &*((*iter)->innerTrack()))) {
1397     muJet0_canBeC = true;
1398     }
1399     if (muJet0->muon(1)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1400     muJet0->sameTrack(&*(muJet0->muon(1)->innerTrack()), &*((*iter)->innerTrack()))) {
1401     muJet0_canBeC = true;
1402     }
1403    
1404     if (muJet1->muon(0)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1405     muJet1->sameTrack(&*(muJet1->muon(0)->innerTrack()), &*((*iter)->innerTrack()))) {
1406     muJet1_canBeC = true;
1407 pivarski 1.8 }
1408 pivarski 1.10 if (muJet1->muon(1)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1409     muJet1->sameTrack(&*(muJet1->muon(1)->innerTrack()), &*((*iter)->innerTrack()))) {
1410     muJet1_canBeC = true;
1411 pivarski 1.8 }
1412     }
1413 pivarski 1.10
1414     const pat::MultiMuon *muJetC = NULL;
1415     const pat::MultiMuon *muJetF = NULL;
1416     if (muJet0_canBeC && muJet1_canBeC) {
1417     if (m_trandom3.Integer(2) == 0) {
1418 pivarski 1.8 muJetC = muJet0;
1419     muJetF = muJet1;
1420     }
1421     else {
1422     muJetC = muJet1;
1423     muJetF = muJet0;
1424     }
1425     }
1426 pivarski 1.10 else if (muJet0_canBeC) {
1427     muJetC = muJet0;
1428     muJetF = muJet1;
1429     }
1430     else if (muJet1_canBeC) {
1431     muJetC = muJet1;
1432     muJetF = muJet0;
1433     }
1434 pivarski 1.8
1435 pivarski 1.10 if (muJetC != NULL && muJetF != NULL) {
1436 pivarski 1.13 m_dimudimu_orphans = orphans->size();
1437    
1438 pivarski 1.10 double total_energy = muJetC->energy() + muJetF->energy();
1439     double total_px = muJetC->px() + muJetF->px();
1440     double total_py = muJetC->py() + muJetF->py();
1441     double total_pz = muJetC->pz() + muJetF->pz();
1442 pivarski 1.7
1443     m_dimudimu_wholemass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
1444     m_dimudimu_wholept = sqrt(total_px*total_px + total_py*total_py);
1445    
1446 pivarski 1.10 m_dimudimu_deltaphi = muJetC->phi() - muJetF->phi();
1447 pivarski 1.7 while (m_dimudimu_deltaphi > M_PI) m_dimudimu_deltaphi -= 2.*M_PI;
1448     while (m_dimudimu_deltaphi < -M_PI) m_dimudimu_deltaphi += 2.*M_PI;
1449    
1450 pivarski 1.10 m_dimudimu_massC = muJetC->mass();
1451     m_dimudimu_ptC = muJetC->pt();
1452     m_dimudimu_etaC = muJetC->eta();
1453     m_dimudimu_phiC = muJetC->phi();
1454     m_dimudimu_drC = muJetC->dRmax();
1455     m_dimudimu_vprobC = -1.;
1456     m_dimudimu_lxyC = -1000.;
1457     m_dimudimu_lxyzC = -1000.;
1458     m_dimudimu_isoC = muJetC->centralTrackIsolation();
1459    
1460     m_dimudimu_massF = muJetF->mass();
1461     m_dimudimu_ptF = muJetF->pt();
1462     m_dimudimu_etaF = muJetF->eta();
1463     m_dimudimu_phiF = muJetF->phi();
1464     m_dimudimu_drF = muJetF->dRmax();
1465     m_dimudimu_vprobF = -1.;
1466     m_dimudimu_lxyF = -1000.;
1467     m_dimudimu_lxyzF = -1000.;
1468     m_dimudimu_isoF = muJetF->centralTrackIsolation();
1469    
1470     if (muJetC->vertexValid() && muJetF->vertexValid()) {
1471     total_energy = muJetC->vertexP4().energy() + muJetF->vertexP4().energy();
1472     total_px = muJetC->vertexMomentum().x() + muJetF->vertexMomentum().x();
1473     total_py = muJetC->vertexMomentum().y() + muJetF->vertexMomentum().y();
1474     total_pz = muJetC->vertexMomentum().z() + muJetF->vertexMomentum().z();
1475    
1476     m_dimudimu_wholemass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
1477     m_dimudimu_wholept = sqrt(total_px*total_px + total_py*total_py);
1478    
1479     m_dimudimu_deltaphi = muJetC->vertexMomentum().phi() - muJetF->vertexMomentum().phi();
1480     while (m_dimudimu_deltaphi > M_PI) m_dimudimu_deltaphi -= 2.*M_PI;
1481     while (m_dimudimu_deltaphi < -M_PI) m_dimudimu_deltaphi += 2.*M_PI;
1482    
1483     m_dimudimu_massC = muJetC->vertexMass();
1484     m_dimudimu_ptC = muJetC->vertexMomentum().perp();
1485     m_dimudimu_etaC = muJetC->vertexMomentum().eta();
1486     m_dimudimu_phiC = muJetC->vertexMomentum().phi();
1487     m_dimudimu_drC = muJetC->dRmax(true);
1488     m_dimudimu_vprobC = muJetC->vertexProb();
1489     if (closestPrimaryVertex != primaryVertices->end()) {
1490     m_dimudimu_lxyC = muJetC->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1491     m_dimudimu_lxyzC = muJetC->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1492     }
1493    
1494     m_dimudimu_massF = muJetF->vertexMass();
1495     m_dimudimu_ptF = muJetF->vertexMomentum().perp();
1496     m_dimudimu_etaF = muJetF->vertexMomentum().eta();
1497     m_dimudimu_phiF = muJetF->vertexMomentum().phi();
1498     m_dimudimu_drF = muJetF->dRmax(true);
1499     m_dimudimu_vprobF = muJetF->vertexProb();
1500     if (closestPrimaryVertex != primaryVertices->end()) {
1501     m_dimudimu_lxyF = muJetF->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1502     m_dimudimu_lxyzF = muJetF->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1503     }
1504     }
1505    
1506 pivarski 1.13 if (muJetC->numberOfDaughters() == 2 && muJetF->numberOfDaughters() == 2) {
1507     m_dimudimu->Fill();
1508     }
1509     else {
1510     m_twomujets_muonsC = muJetC->numberOfDaughters();
1511     m_twomujets_muonsF = muJetF->numberOfDaughters();
1512    
1513     m_twomujets_massCa = -1.;
1514     m_twomujets_massCb = -1.;
1515     m_twomujets_massCc = -1.;
1516     m_twomujets_massFa = -1.;
1517     m_twomujets_massFb = -1.;
1518     m_twomujets_massFc = -1.;
1519     std::vector<double> massesC = muJetC->consistentPairMasses(muJetC->vertexValid() && muJetF->vertexValid());
1520 pivarski 1.14 std::random_shuffle(massesC.begin(), massesC.end());
1521 pivarski 1.13 if (massesC.size() >= 1) m_twomujets_massCa = massesC[0];
1522     if (massesC.size() >= 2) m_twomujets_massCb = massesC[1];
1523     if (massesC.size() >= 3) m_twomujets_massCc = massesC[2];
1524     std::vector<double> massesF = muJetF->consistentPairMasses(muJetC->vertexValid() && muJetF->vertexValid());
1525 pivarski 1.14 std::random_shuffle(massesF.begin(), massesF.end());
1526 pivarski 1.13 if (massesF.size() >= 1) m_twomujets_massFa = massesF[0];
1527     if (massesF.size() >= 2) m_twomujets_massFb = massesF[1];
1528     if (massesF.size() >= 3) m_twomujets_massFc = massesF[2];
1529    
1530     m_twomujets->Fill();
1531     }
1532 pivarski 1.7 }
1533 pivarski 1.1 }
1534    
1535 pivarski 1.13 ////////////////////////////////////////////////////////// moremujets
1536 pivarski 1.14
1537 pivarski 1.13 else if (muJets->size() > 2) {
1538     m_moremujets_mujets = muJets->size();
1539     m_moremujets_orphans = orphans->size();
1540    
1541     double total_energy = 0.;
1542     double total_px = 0.;
1543     double total_py = 0.;
1544     double total_pz = 0.;
1545     for (pat::MultiMuonCollection::const_iterator muJet = muJets->begin(); muJet != muJets->end(); ++muJet) {
1546     total_energy += muJet->energy();
1547     total_px += muJet->px();
1548     total_py += muJet->py();
1549     total_pz += muJet->pz();
1550     }
1551     m_moremujets_wholemass = sqrt(total_energy*total_energy - total_px*total_px - total_py*total_py - total_pz*total_pz);
1552     m_moremujets_wholept = sqrt(total_px*total_px + total_py*total_py);
1553    
1554     m_moremujets_massa = -1.;
1555     m_moremujets_massb = -1.;
1556     m_moremujets_massc = -1.;
1557     m_moremujets_massd = -1.;
1558     m_moremujets_masse = -1.;
1559     m_moremujets_massf = -1.;
1560     std::vector<double> all_masses;
1561     for (pat::MultiMuonCollection::const_iterator muJet = muJets->begin(); muJet != muJets->end(); ++muJet) {
1562     std::vector<double> masses = muJet->consistentPairMasses();
1563 pivarski 1.14 std::random_shuffle(masses.begin(), masses.end());
1564 pivarski 1.13 for (std::vector<double>::const_iterator mass = masses.begin(); mass != masses.end(); ++mass) {
1565     all_masses.push_back(*mass);
1566     }
1567     }
1568     if (all_masses.size() >= 1) m_moremujets_massa = all_masses[0];
1569     if (all_masses.size() >= 2) m_moremujets_massb = all_masses[1];
1570     if (all_masses.size() >= 3) m_moremujets_massc = all_masses[2];
1571     if (all_masses.size() >= 4) m_moremujets_massd = all_masses[3];
1572     if (all_masses.size() >= 5) m_moremujets_masse = all_masses[4];
1573     if (all_masses.size() >= 6) m_moremujets_massf = all_masses[5];
1574    
1575     m_moremujets_muons1 = -1;
1576     m_moremujets_containstrig1 = -1;
1577     m_moremujets_mass1 = -1.;
1578     m_moremujets_pt1 = -1.;
1579     m_moremujets_iso1 = -1.;
1580     m_moremujets_muons2 = -1;
1581     m_moremujets_containstrig2 = -1;
1582     m_moremujets_mass2 = -1.;
1583     m_moremujets_pt2 = -1.;
1584     m_moremujets_iso2 = -1.;
1585     m_moremujets_muons3 = -1;
1586     m_moremujets_containstrig3 = -1;
1587     m_moremujets_mass3 = -1.;
1588     m_moremujets_pt3 = -1.;
1589     m_moremujets_iso3 = -1.;
1590     m_moremujets_muons4 = -1;
1591     m_moremujets_containstrig4 = -1;
1592     m_moremujets_mass4 = -1.;
1593     m_moremujets_pt4 = -1.;
1594     m_moremujets_iso4 = -1.;
1595     m_moremujets_muons5 = -1;
1596     m_moremujets_containstrig5 = -1;
1597     m_moremujets_mass5 = -1.;
1598     m_moremujets_pt5 = -1.;
1599     m_moremujets_iso5 = -1.;
1600     m_moremujets_muons6 = -1;
1601     m_moremujets_containstrig6 = -1;
1602     m_moremujets_mass6 = -1.;
1603     m_moremujets_pt6 = -1.;
1604     m_moremujets_iso6 = -1.;
1605    
1606     if (muJets->size() >= 1) {
1607     const pat::MultiMuon *muJet = &((*muJets)[0]);
1608     m_moremujets_muons1 = muJet->numberOfDaughters();
1609     m_moremujets_containstrig1 = 0;
1610     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1611     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1612     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1613     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1614     m_moremujets_containstrig1 = 1;
1615     }
1616     }
1617     }
1618     m_moremujets_mass1 = muJet->mass();
1619     m_moremujets_pt1 = muJet->pt();
1620     m_moremujets_iso1 = muJet->centralTrackIsolation();
1621     }
1622    
1623     if (muJets->size() >= 2) {
1624     const pat::MultiMuon *muJet = &((*muJets)[1]);
1625     m_moremujets_muons2 = muJet->numberOfDaughters();
1626     m_moremujets_containstrig2 = 0;
1627     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1628     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1629     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1630     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1631     m_moremujets_containstrig2 = 1;
1632     }
1633     }
1634     }
1635     m_moremujets_mass2 = muJet->mass();
1636     m_moremujets_pt2 = muJet->pt();
1637     m_moremujets_iso2 = muJet->centralTrackIsolation();
1638     }
1639    
1640     if (muJets->size() >= 3) {
1641     const pat::MultiMuon *muJet = &((*muJets)[2]);
1642     m_moremujets_muons3 = muJet->numberOfDaughters();
1643     m_moremujets_containstrig3 = 0;
1644     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1645     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1646     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1647     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1648     m_moremujets_containstrig3 = 1;
1649     }
1650     }
1651     }
1652     m_moremujets_mass3 = muJet->mass();
1653     m_moremujets_pt3 = muJet->pt();
1654     m_moremujets_iso3 = muJet->centralTrackIsolation();
1655     }
1656    
1657     if (muJets->size() >= 4) {
1658     const pat::MultiMuon *muJet = &((*muJets)[3]);
1659     m_moremujets_muons4 = muJet->numberOfDaughters();
1660     m_moremujets_containstrig4 = 0;
1661     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1662     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1663     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1664     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1665     m_moremujets_containstrig4 = 1;
1666     }
1667     }
1668     }
1669     m_moremujets_mass4 = muJet->mass();
1670     m_moremujets_pt4 = muJet->pt();
1671     m_moremujets_iso4 = muJet->centralTrackIsolation();
1672     }
1673    
1674     if (muJets->size() >= 5) {
1675     const pat::MultiMuon *muJet = &((*muJets)[4]);
1676     m_moremujets_muons5 = muJet->numberOfDaughters();
1677     m_moremujets_containstrig5 = 0;
1678     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1679     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1680     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1681     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1682     m_moremujets_containstrig5 = 1;
1683     }
1684     }
1685     }
1686     m_moremujets_mass5 = muJet->mass();
1687     m_moremujets_pt5 = muJet->pt();
1688     m_moremujets_iso5 = muJet->centralTrackIsolation();
1689     }
1690    
1691     if (muJets->size() >= 6) {
1692     const pat::MultiMuon *muJet = &((*muJets)[5]);
1693     m_moremujets_muons6 = muJet->numberOfDaughters();
1694     m_moremujets_containstrig6 = 0;
1695     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1696     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1697     if (muJet->muon(i)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1698     muJet->sameTrack(&*(muJet->muon(i)->innerTrack()), &*((*iter)->innerTrack()))) {
1699     m_moremujets_containstrig6 = 1;
1700     }
1701     }
1702     }
1703     m_moremujets_mass6 = muJet->mass();
1704     m_moremujets_pt6 = muJet->pt();
1705     m_moremujets_iso6 = muJet->centralTrackIsolation();
1706     }
1707 pivarski 1.1
1708 pivarski 1.13 m_moremujets->Fill();
1709 pivarski 1.1 }
1710 pivarski 1.10
1711     ////////////////////////////////////////////////////////// mujetplustracks
1712     if (muJetPlusTracks->size() == 1 && ((*muJetPlusTracks)[0].userInt("numReal") == 2 || (*muJetPlusTracks)[0].userInt("numReal") == 3) && (*muJetPlusTracks)[0].userInt("numFakes") > 0) {
1713     const pat::MultiMuon *muJet = &((*muJetPlusTracks)[0]);
1714    
1715     m_mujetplustracks_containstrig = 0;
1716     for (std::vector<pat::MuonCollection::const_iterator>::const_iterator iter = muontrig.begin(); iter != muontrig.end(); ++iter) {
1717     if (muJet->muon(0)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1718     muJet->sameTrack(&*(muJet->muon(0)->innerTrack()), &*((*iter)->innerTrack()))) {
1719     m_mujetplustracks_containstrig = 1;
1720     }
1721     if (muJet->muon(1)->innerTrack().isAvailable() && (*iter)->innerTrack().isAvailable() &&
1722     muJet->sameTrack(&*(muJet->muon(1)->innerTrack()), &*((*iter)->innerTrack()))) {
1723     m_mujetplustracks_containstrig = 1;
1724     }
1725     }
1726    
1727     m_mujetplustracks_muons = muJet->userInt("numReal");
1728     m_mujetplustracks_fakes = muJet->userInt("numFakes");
1729     m_mujetplustracks_mass = muJet->mass();
1730 pivarski 1.11 m_mujetplustracks_charge = muJet->charge();
1731     m_mujetplustracks_massa = -1.;
1732     m_mujetplustracks_massb = -1.;
1733     std::vector<double> masses = muJet->consistentPairMasses();
1734 pivarski 1.14 std::random_shuffle(masses.begin(), masses.end());
1735 pivarski 1.11 if (masses.size() >= 1) m_mujetplustracks_massa = masses[0];
1736     if (masses.size() >= 2) m_mujetplustracks_massb = masses[1];
1737    
1738 pivarski 1.10 m_mujetplustracks_pt = muJet->pt();
1739     m_mujetplustracks_eta = muJet->eta();
1740     m_mujetplustracks_phi = muJet->phi();
1741     m_mujetplustracks_dr = muJet->dRmax();
1742     m_mujetplustracks_vprob = -1.;
1743     m_mujetplustracks_lxy = -1000.;
1744     m_mujetplustracks_lxyz = -1000.;
1745     m_mujetplustracks_iso = muJet->centralTrackIsolation();
1746    
1747     m_mujetplustracks_mupt1 = -1.;
1748     m_mujetplustracks_mupt2 = -1.;
1749     m_mujetplustracks_mupt3 = -1.;
1750     m_mujetplustracks_fakept1 = -1.;
1751     m_mujetplustracks_fakept2 = -1.;
1752     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1753     if (muJet->muon(i)->matches().size() > 0) {
1754     if (muJet->muon(i)->pt() > m_mujetplustracks_mupt1) {
1755     m_mujetplustracks_mupt3 = m_mujetplustracks_mupt2;
1756     m_mujetplustracks_mupt2 = m_mujetplustracks_mupt1;
1757     m_mujetplustracks_mupt1 = muJet->muon(i)->pt();
1758     }
1759     else if (muJet->muon(i)->pt() > m_mujetplustracks_mupt2) {
1760     m_mujetplustracks_mupt3 = m_mujetplustracks_mupt2;
1761     m_mujetplustracks_mupt2 = muJet->muon(i)->pt();
1762     }
1763     else if (muJet->muon(i)->pt() > m_mujetplustracks_mupt3) {
1764     m_mujetplustracks_mupt3 = muJet->muon(i)->pt();
1765     }
1766     }
1767     else {
1768     if (muJet->muon(i)->pt() > m_mujetplustracks_fakept1) {
1769     m_mujetplustracks_fakept2 = m_mujetplustracks_fakept1;
1770     m_mujetplustracks_fakept1 = muJet->muon(i)->pt();
1771     }
1772     else if (muJet->muon(i)->pt() > m_mujetplustracks_fakept1) {
1773     m_mujetplustracks_fakept2 = muJet->muon(i)->pt();
1774     }
1775     }
1776     }
1777    
1778     if (muJet->vertexValid()) {
1779     m_mujetplustracks_mass = muJet->vertexMass();
1780 pivarski 1.11 m_mujetplustracks_massa = -1.;
1781     m_mujetplustracks_massb = -1.;
1782     std::vector<double> masses = muJet->consistentPairMasses(true);
1783 pivarski 1.14 std::random_shuffle(masses.begin(), masses.end());
1784 pivarski 1.11 if (masses.size() >= 1) m_mujetplustracks_massa = masses[0];
1785     if (masses.size() >= 2) m_mujetplustracks_massb = masses[1];
1786    
1787 pivarski 1.10 m_mujetplustracks_pt = muJet->vertexMomentum().perp();
1788     m_mujetplustracks_eta = muJet->vertexMomentum().eta();
1789     m_mujetplustracks_phi = muJet->vertexMomentum().phi();
1790     m_mujetplustracks_dr = muJet->dRmax(true);
1791     m_mujetplustracks_vprob = muJet->vertexProb();
1792     if (closestPrimaryVertex != primaryVertices->end()) {
1793     m_mujetplustracks_lxy = muJet->lxy(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1794     m_mujetplustracks_lxyz = muJet->lxyz(GlobalPoint(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z()));
1795     }
1796    
1797     m_mujetplustracks_mupt1 = -1.;
1798     m_mujetplustracks_mupt2 = -1.;
1799     m_mujetplustracks_mupt3 = -1.;
1800     m_mujetplustracks_fakept1 = -1.;
1801     m_mujetplustracks_fakept2 = -1.;
1802     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1803     if (muJet->muon(i)->matches().size() > 0) {
1804     if (muJet->vertexMomentum(i).perp() > m_mujetplustracks_mupt1) {
1805     m_mujetplustracks_mupt3 = m_mujetplustracks_mupt2;
1806     m_mujetplustracks_mupt2 = m_mujetplustracks_mupt1;
1807     m_mujetplustracks_mupt1 = muJet->vertexMomentum(i).perp();
1808     }
1809     else if (muJet->vertexMomentum(i).perp() > m_mujetplustracks_mupt2) {
1810     m_mujetplustracks_mupt3 = m_mujetplustracks_mupt2;
1811     m_mujetplustracks_mupt2 = muJet->vertexMomentum(i).perp();
1812     }
1813     else if (muJet->vertexMomentum(i).perp() > m_mujetplustracks_mupt3) {
1814     m_mujetplustracks_mupt3 = muJet->vertexMomentum(i).perp();
1815     }
1816     }
1817     else {
1818     if (muJet->vertexMomentum(i).perp() > m_mujetplustracks_fakept1) {
1819     m_mujetplustracks_fakept2 = m_mujetplustracks_fakept1;
1820     m_mujetplustracks_fakept1 = muJet->vertexMomentum(i).perp();
1821     }
1822     else if (muJet->vertexMomentum(i).perp() > m_mujetplustracks_fakept1) {
1823     m_mujetplustracks_fakept2 = muJet->vertexMomentum(i).perp();
1824     }
1825     }
1826     }
1827     }
1828    
1829     m_mujetplustracks->Fill();
1830     }
1831 pivarski 1.14
1832     ////////////////////////////////////////////////////////// displaced
1833     if (displacedMuJet->size() > 0) {
1834     m_displaced_mujets = displacedMuJet->size();
1835     m_displaced_orphans = orphans->size();
1836    
1837     pat::MultiMuonCollection::const_iterator muJet = displacedMuJet->begin();
1838     if (muJet->vertexValid()) {
1839     m_displaced_muons = muJet->numberOfDaughters();
1840     m_displaced_mass = muJet->mass();
1841     m_displaced_pt = muJet->pt();
1842     m_displaced_eta = muJet->eta();
1843     m_displaced_phi = muJet->phi();
1844     m_displaced_vx = muJet->vertexPoint().x();
1845     m_displaced_vy = muJet->vertexPoint().y();
1846     m_displaced_vz = muJet->vertexPoint().z();
1847    
1848     double px = muJet->vertexMomentum().x();
1849     double py = muJet->vertexMomentum().y();
1850     double pz = muJet->vertexMomentum().z();
1851     m_displaced_zclosest = m_displaced_vz - pz * (px*m_displaced_vx + py*m_displaced_vy) / pow(px + py, 2);
1852    
1853     reco::VertexCollection::const_iterator closest = primaryVertices->end();
1854     for (reco::VertexCollection::const_iterator vertex = primaryVertices->begin(); vertex != primaryVertices->end(); ++vertex) {
1855     if (vertex->isValid() && !vertex->isFake() && vertex->tracksSize() > 3 && fabs(vertex->z()) < 24.) {
1856     if (closest == primaryVertices->end() || fabs(vertex->z() - m_displaced_zclosest) < fabs(closest->z() - m_displaced_zclosest)) {
1857     closest = vertex;
1858     }
1859     } // end vertex quality cuts
1860     } // end loop over primary vertices
1861    
1862     m_displaced_zcloseness = -1000.;
1863     m_displaced_lxy = -1000.;
1864     m_displaced_lxyz = -1000.;
1865     if (closest != primaryVertices->end()) {
1866     m_displaced_zcloseness = m_displaced_zclosest - closest->z();
1867     m_displaced_lxy = muJet->lxy(GlobalPoint(closest->x(), closest->y(), closest->z()));
1868     m_displaced_lxyz = muJet->lxyz(GlobalPoint(closest->x(), closest->y(), closest->z()));
1869     }
1870     else if (m_getAlternating) {
1871     m_displaced_zcloseness = m_displaced_zclosest - 0.;
1872     m_displaced_lxy = muJet->lxy(GlobalPoint(0., 0., 0.));
1873     m_displaced_lxyz = muJet->lxyz(GlobalPoint(0., 0., 0.));
1874     }
1875    
1876     m_displaced_iso = muJet->centralTrackIsolation();
1877     m_displaced_vprob = muJet->vertexProb();
1878    
1879     const pat::Muon *plus = NULL;
1880     const pat::Muon *minus = NULL;
1881     m_displaced_mupt1 = 0.;
1882     m_displaced_mupt2 = 0.;
1883     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
1884     const pat::Muon *muon = muJet->muon(i);
1885     if (muon->pt() > m_displaced_mupt1) {
1886     m_displaced_mupt2 = m_displaced_mupt1;
1887     m_displaced_mupt1 = muon->pt();
1888     }
1889     else if (muon->pt() > m_displaced_mupt2) {
1890     m_displaced_mupt2 = muon->pt();
1891     }
1892    
1893     if (muon->charge() > 0 && muon->innerTrack().isAvailable() && (plus == NULL || muon->pt() > plus->pt())) {
1894     plus = muon;
1895     }
1896     if (muon->charge() < 0 && muon->innerTrack().isAvailable() && (minus == NULL || muon->pt() > minus->pt())) {
1897     minus = muon;
1898     }
1899     }
1900    
1901     m_displaced_plusmatches = -1;
1902     m_displaced_plusst1x = -1000.;
1903     m_displaced_plusst1xsig = -1000.;
1904     m_displaced_plusst1dxdz = -1000.;
1905     m_displaced_plusst1dxdzsig = -1000.;
1906     m_displaced_plushits = -1;
1907     m_displaced_plusnormchi2 = -1.;
1908     m_displaced_minusmatches = -1;
1909     m_displaced_minusst1x = -1000.;
1910     m_displaced_minusst1xsig = -1000.;
1911     m_displaced_minusst1dxdz = -1000.;
1912     m_displaced_minusst1dxdzsig = -1000.;
1913     m_displaced_minushits = -1;
1914     m_displaced_minusnormchi2 = -1.;
1915    
1916     if (plus != NULL && minus != NULL) {
1917     m_displaced_plusmatches = plus->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1918     m_displaced_plushits = plus->innerTrack()->numberOfValidHits();
1919     m_displaced_plusnormchi2 = plus->innerTrack()->normalizedChi2();
1920    
1921     std::vector<reco::MuonChamberMatch> plusmatches = plus->matches();
1922     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = plusmatches.begin(); chamberMatch != plusmatches.end(); ++chamberMatch) {
1923     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
1924     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
1925     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
1926     if (chamberMatch->station() == 1) {
1927     m_displaced_plusst1x = (segmentMatch->x - chamberMatch->x);
1928     m_displaced_plusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
1929     m_displaced_plusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
1930     m_displaced_plusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
1931     }
1932     }
1933     }
1934     }
1935    
1936     m_displaced_minusmatches = minus->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
1937     m_displaced_minushits = minus->innerTrack()->numberOfValidHits();
1938     m_displaced_minusnormchi2 = minus->innerTrack()->normalizedChi2();
1939    
1940     std::vector<reco::MuonChamberMatch> minusmatches = minus->matches();
1941     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = minusmatches.begin(); chamberMatch != minusmatches.end(); ++chamberMatch) {
1942     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
1943     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
1944     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
1945     if (chamberMatch->station() == 1) {
1946     m_displaced_minusst1x = (segmentMatch->x - chamberMatch->x);
1947     m_displaced_minusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
1948     m_displaced_minusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
1949     m_displaced_minusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
1950     }
1951     }
1952     }
1953     }
1954     }
1955    
1956     if (sqrt(pow(m_displaced_vx, 2) + pow(m_displaced_vy, 2)) > 0.2) {
1957     m_displaced->Fill();
1958     }
1959     }
1960     }
1961    
1962     ////////////////////////////////////////////////////////// displacedFake
1963     if (displacedMuJetFake->size() > 0) {
1964     m_displaced_mujets = displacedMuJetFake->size();
1965     m_displaced_orphans = orphans->size();
1966    
1967     pat::MultiMuonCollection::const_iterator muJet = displacedMuJetFake->begin();
1968     if (muJet->vertexValid()) {
1969     m_displaced_muons = muJet->numberOfDaughters();
1970     m_displaced_mass = muJet->mass();
1971     m_displaced_pt = muJet->pt();
1972     m_displaced_eta = muJet->eta();
1973     m_displaced_phi = muJet->phi();
1974     m_displaced_vx = muJet->vertexPoint().x();
1975     m_displaced_vy = muJet->vertexPoint().y();
1976     m_displaced_vz = muJet->vertexPoint().z();
1977    
1978     double px = muJet->vertexMomentum().x();
1979     double py = muJet->vertexMomentum().y();
1980     double pz = muJet->vertexMomentum().z();
1981     m_displaced_zclosest = m_displaced_vz - pz * (px*m_displaced_vx + py*m_displaced_vy) / pow(px + py, 2);
1982     reco::VertexCollection::const_iterator closest = primaryVertices->end();
1983     for (reco::VertexCollection::const_iterator vertex = primaryVertices->begin(); vertex != primaryVertices->end(); ++vertex) {
1984     if (vertex->isValid() && !vertex->isFake() && vertex->tracksSize() > 3 && fabs(vertex->z()) < 24.) {
1985     if (closest == primaryVertices->end() || fabs(vertex->z() - m_displaced_zclosest) < fabs(closest->z() - m_displaced_zclosest)) {
1986     closest = vertex;
1987     }
1988     } // end vertex quality cuts
1989     } // end loop over primary vertices
1990    
1991     m_displaced_zcloseness = -1000.;
1992     m_displaced_lxy = -1000.;
1993     m_displaced_lxyz = -1000.;
1994     if (closest != primaryVertices->end()) {
1995     m_displaced_zcloseness = m_displaced_zclosest - closest->z();
1996     m_displaced_lxy = muJet->lxy(GlobalPoint(closest->x(), closest->y(), closest->z()));
1997     m_displaced_lxyz = muJet->lxyz(GlobalPoint(closest->x(), closest->y(), closest->z()));
1998     }
1999     else if (m_getAlternating) {
2000     m_displaced_zcloseness = m_displaced_zclosest - 0.;
2001     m_displaced_lxy = muJet->lxy(GlobalPoint(0., 0., 0.));
2002     m_displaced_lxyz = muJet->lxyz(GlobalPoint(0., 0., 0.));
2003     }
2004    
2005     m_displaced_iso = muJet->centralTrackIsolation();
2006     m_displaced_vprob = muJet->vertexProb();
2007    
2008     const pat::Muon *plus = NULL;
2009     const pat::Muon *minus = NULL;
2010     m_displaced_mupt1 = 0.;
2011     m_displaced_mupt2 = 0.;
2012     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
2013     const pat::Muon *muon = muJet->muon(i);
2014     if (muon->pt() > m_displaced_mupt1) {
2015     m_displaced_mupt2 = m_displaced_mupt1;
2016     m_displaced_mupt1 = muon->pt();
2017     }
2018     else if (muon->pt() > m_displaced_mupt2) {
2019     m_displaced_mupt2 = muon->pt();
2020     }
2021    
2022     if (muon->charge() > 0 && muon->innerTrack().isAvailable() && (plus == NULL || muon->pt() > plus->pt())) {
2023     plus = muon;
2024     }
2025     if (muon->charge() < 0 && muon->innerTrack().isAvailable() && (minus == NULL || muon->pt() > minus->pt())) {
2026     minus = muon;
2027     }
2028     }
2029    
2030     m_displaced_plusmatches = -1;
2031     m_displaced_plusst1x = -1000.;
2032     m_displaced_plusst1xsig = -1000.;
2033     m_displaced_plusst1dxdz = -1000.;
2034     m_displaced_plusst1dxdzsig = -1000.;
2035     m_displaced_plushits = -1;
2036     m_displaced_plusnormchi2 = -1.;
2037     m_displaced_minusmatches = -1;
2038     m_displaced_minusst1x = -1000.;
2039     m_displaced_minusst1xsig = -1000.;
2040     m_displaced_minusst1dxdz = -1000.;
2041     m_displaced_minusst1dxdzsig = -1000.;
2042     m_displaced_minushits = -1;
2043     m_displaced_minusnormchi2 = -1.;
2044    
2045     if (plus != NULL && minus != NULL) {
2046     m_displaced_plusmatches = plus->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
2047     m_displaced_plushits = plus->innerTrack()->numberOfValidHits();
2048     m_displaced_plusnormchi2 = plus->innerTrack()->normalizedChi2();
2049    
2050     std::vector<reco::MuonChamberMatch> plusmatches = plus->matches();
2051     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = plusmatches.begin(); chamberMatch != plusmatches.end(); ++chamberMatch) {
2052     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
2053     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
2054     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
2055     if (chamberMatch->station() == 1) {
2056     m_displaced_plusst1x = (segmentMatch->x - chamberMatch->x);
2057     m_displaced_plusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
2058     m_displaced_plusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
2059     m_displaced_plusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
2060     }
2061     }
2062     }
2063     }
2064    
2065     m_displaced_minusmatches = minus->numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
2066     m_displaced_minushits = minus->innerTrack()->numberOfValidHits();
2067     m_displaced_minusnormchi2 = minus->innerTrack()->normalizedChi2();
2068    
2069     std::vector<reco::MuonChamberMatch> minusmatches = minus->matches();
2070     for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = minusmatches.begin(); chamberMatch != minusmatches.end(); ++chamberMatch) {
2071     for (std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin(); segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
2072     if (segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
2073     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
2074     if (chamberMatch->station() == 1) {
2075     m_displaced_minusst1x = (segmentMatch->x - chamberMatch->x);
2076     m_displaced_minusst1xsig = (segmentMatch->x - chamberMatch->x)/sqrt(pow(segmentMatch->xErr, 2) + pow(chamberMatch->xErr, 2));
2077     m_displaced_minusst1dxdz = (segmentMatch->dXdZ - chamberMatch->dXdZ);
2078     m_displaced_minusst1dxdzsig = (segmentMatch->dXdZ - chamberMatch->dXdZ)/sqrt(pow(segmentMatch->dXdZErr, 2) + pow(chamberMatch->dXdZErr, 2));
2079     }
2080     }
2081     }
2082     }
2083     }
2084    
2085     m_displacedFake_fakes = 0;
2086     for (unsigned int i = 0; i < muJet->numberOfDaughters(); i++) {
2087     if (muJet->muon(i)->numberOfMatches(reco::Muon::SegmentAndTrackArbitration) == 0) {
2088     m_displacedFake_fakes++;
2089     }
2090     }
2091    
2092     if (m_displacedFake_fakes > 0 && sqrt(pow(m_displaced_vx, 2) + pow(m_displaced_vy, 2)) > 0.2) {
2093     m_displacedFake->Fill();
2094     }
2095     }
2096     }
2097 pivarski 1.1 }
2098    
2099    
2100     // ------------ method called once each job just before starting event loop ------------
2101     void
2102     FitNtuple::beginJob()
2103     {
2104     }
2105    
2106     // ------------ method called once each job just after ending the event loop ------------
2107     void
2108     FitNtuple::endJob() {
2109     }
2110    
2111     //define this as a plug-in
2112     DEFINE_FWK_MODULE(FitNtuple);