ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/FitNtuple/src/FitNtuple.cc
Revision: 1.20
Committed: Sun Jan 16 22:22:36 2011 UTC (14 years, 3 months ago) by pivarski
Content type: text/plain
Branch: MAIN
Changes since 1.19: +5 -5 lines
Log Message:
changed else ifs to just ifs

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