ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/FitNtuple/src/FitNtuple.cc
Revision: 1.22
Committed: Thu Jun 9 04:33:04 2011 UTC (13 years, 11 months ago) by aysen
Content type: text/plain
Branch: MAIN
CVS Tags: V_2012_01_29_01
Changes since 1.21: +44 -13 lines
Log Message:
New variables: bbbarlike, dimuoncontainstrig; trigger pt > 30

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