ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/FitNtuple/src/FitNtuple.cc
Revision: 1.17
Committed: Wed Jan 12 04:32:05 2011 UTC (14 years, 3 months ago) by pivarski
Content type: text/plain
Branch: MAIN
Changes since 1.16: +65 -1 lines
Log Message:
massatriggerable and massbtriggerable

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