ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/FitNtuple/src/FitNtuple.cc
Revision: 1.18
Committed: Wed Jan 12 05:04:38 2011 UTC (14 years, 3 months ago) by pivarski
Content type: text/plain
Branch: MAIN
CVS Tags: JP-2011-01-11-a
Changes since 1.17: +329 -15 lines
Log Message:
new squark samples

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