ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MuJetAnalysis/AnalysisTools/CutFlowAnalyzer/src/CutFlowAnalyzer.cc
Revision: 1.14
Committed: Sun Aug 4 22:28:44 2013 UTC (11 years, 9 months ago) by pakhotin
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.13: +94 -28 lines
Log Message:
some cleaning and more variables

File Contents

# User Rev Content
1 pakhotin 1.1 // -*- C++ -*-
2     //
3     // Package: CutFlowAnalyzer
4     // Class: CutFlowAnalyzer
5     //
6     /**\class CutFlowAnalyzer CutFlowAnalyzer.cc AnalysisTools/CutFlowAnalyzer/src/CutFlowAnalyzer.cc
7    
8     Description: [one line class summary]
9    
10     Implementation:
11     [Notes on implementation]
12     */
13     //
14     // Original Author: Yuriy Pakhotin
15     // Created: Tue Feb 19 18:51:12 CST 2013
16 pakhotin 1.14 // $Id: CutFlowAnalyzer.cc,v 1.13 2013/06/27 09:53:31 pakhotin Exp $
17 pakhotin 1.1 //
18     //
19    
20    
21     // system include files
22     #include <memory>
23    
24 pakhotin 1.2
25 pakhotin 1.1 // user include files
26     #include "FWCore/Framework/interface/Frameworkfwd.h"
27     #include "FWCore/Framework/interface/EDAnalyzer.h"
28    
29     #include "FWCore/Framework/interface/Event.h"
30     #include "FWCore/Framework/interface/MakerMacros.h"
31    
32     #include "FWCore/ParameterSet/interface/ParameterSet.h"
33 pakhotin 1.2
34     // user include files
35     #include "TTree.h"
36     #include "TRandom3.h"
37     #include "TMath.h"
38    
39     #include "CommonTools/UtilAlgos/interface/TFileService.h"
40     #include "DataFormats/Candidate/interface/Candidate.h"
41     #include "DataFormats/DetId/interface/DetId.h"
42     #include "DataFormats/GeometrySurface/interface/Cylinder.h"
43     #include "DataFormats/GeometrySurface/interface/Plane.h"
44     #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
45     #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
46     #include "DataFormats/MuonReco/interface/MuonChamberMatch.h"
47     #include "DataFormats/MuonReco/interface/Muon.h"
48     #include "DataFormats/MuonReco/interface/MuonSegmentMatch.h"
49     #include "DataFormats/PatCandidates/interface/Muon.h"
50     #include "DataFormats/PatCandidates/interface/TriggerEvent.h"
51     #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
52     #include "DataFormats/TrackReco/interface/HitPattern.h"
53     #include "DataFormats/TrackReco/interface/TrackFwd.h"
54     #include "DataFormats/TrackReco/interface/Track.h"
55     #include "DataFormats/VertexReco/interface/VertexFwd.h"
56     #include "DataFormats/VertexReco/interface/Vertex.h"
57     #include "FWCore/Framework/interface/EDAnalyzer.h"
58     #include "FWCore/Framework/interface/ESHandle.h"
59     #include "FWCore/Framework/interface/Event.h"
60     #include "FWCore/Framework/interface/Frameworkfwd.h"
61     #include "FWCore/Framework/interface/MakerMacros.h"
62     #include "FWCore/ParameterSet/interface/ParameterSet.h"
63     #include "FWCore/ServiceRegistry/interface/Service.h"
64     #include "FWCore/Utilities/interface/InputTag.h"
65     #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
66     #include "Geometry/CommonTopologies/interface/PixelTopology.h"
67     #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
68     #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
69     #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
70     #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
71     #include "MagneticField/Engine/interface/MagneticField.h"
72     #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
73     #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
74     #include "TrackingTools/GeomPropagators/interface/Propagator.h"
75     #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
76     #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
77     #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
78     #include "TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixPropagator.h"
79    
80     #include "AnalysisDataFormats/MuJetAnalysis/interface/MultiMuon.h"
81    
82 pakhotin 1.3 //******************************************************************************
83     // Auxiliary function: Order objects by pT
84     //******************************************************************************
85     bool PtOrder (const reco::GenParticle* p1, const reco::GenParticle* p2) { return (p1->pt() > p2->pt() ); }
86    
87     //******************************************************************************
88     // Auxiliary function: Calculate difference between two angles: -PI < phi < PI
89     //******************************************************************************
90     double My_dPhi (double phi1, double phi2) {
91     double dPhi = phi1 - phi2;
92     if (dPhi > M_PI) dPhi -= 2.*M_PI;
93     if (dPhi < -M_PI) dPhi += 2.*M_PI;
94     return dPhi;
95     }
96    
97 pakhotin 1.7 // Loose Muons
98     bool isPFMuonLoose (const reco::Muon* mu) {
99     bool isMoonLoose = false;
100     if ( fabs(mu->eta()) < 2.4
101     // && mu->numberOfMatches(reco::Muon::SegmentAndTrackArbitration) >= 2
102     && ( mu->isTrackerMuon() || mu->isGlobalMuon() ) ) {
103     isMoonLoose = true;
104     }
105     return isMoonLoose;
106     }
107    
108     // Private ID Muons
109     bool isTrackerMuonPrivateID (const reco::Muon* mu) {
110     bool isTrackerMuonPrivateID = false;
111     if ( fabs(mu->eta()) < 2.4
112     && mu->isTrackerMuon()
113     && mu->numberOfMatches(reco::Muon::SegmentAndTrackArbitration) >= 2
114     && mu->innerTrack()->numberOfValidHits() >= 8
115     && mu->innerTrack()->normalizedChi2() < 4. ) {
116     isTrackerMuonPrivateID = true;
117     }
118     return isTrackerMuonPrivateID;
119     }
120    
121 pakhotin 1.3 //******************************************************************************
122     // Class declaration
123     //******************************************************************************
124 pakhotin 1.1
125     class CutFlowAnalyzer : public edm::EDAnalyzer {
126 pakhotin 1.3 public:
127     explicit CutFlowAnalyzer(const edm::ParameterSet&);
128     ~CutFlowAnalyzer();
129    
130     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
131    
132     private:
133     virtual void beginJob() ;
134     virtual void analyze(const edm::Event&, const edm::EventSetup&);
135     virtual void endJob() ;
136    
137     virtual void beginRun(edm::Run const&, edm::EventSetup const&);
138     virtual void endRun(edm::Run const&, edm::EventSetup const&);
139     virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&);
140     virtual void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&);
141 pakhotin 1.2
142 pakhotin 1.3 // ---------- Member data ----------
143 pakhotin 1.2
144 pakhotin 1.3 TTree * m_ttree; // Store some variables in this tree for later access
145    
146     Int_t m_run; // run number | these three numbers required to extract event
147     Int_t m_lumi; // lumi number | from sample (data or MC) and examine it in
148     Int_t m_event; // event number | event display
149    
150 pakhotin 1.5 Float_t b_beamSpot_x;
151     Float_t b_beamSpot_y;
152     Float_t b_beamSpot_z;
153    
154 pakhotin 1.3 Int_t m_events; // total number of events
155 pakhotin 1.4
156     Float_t m_Mu17_threshold;
157     Float_t m_Mu8_threshold;
158    
159 pakhotin 1.3 // ---------- Generator Level ----------
160    
161     edm::InputTag m_genParticles; // Label to access generator particles
162    
163     // Events counters
164     Int_t m_events4GenMu; // number of events with 4 gen muons
165     Int_t m_events1GenMu17; // n events with 1 gen muon: pT > 17 GeV, |eta| < 0.9
166     Int_t m_events2GenMu8; // n events with 2 gen muons: pT > 8 GeV, |eta| < 2.4
167     Int_t m_events3GenMu8; // n events with 3 gen muons: pT > 8 GeV, |eta| < 2.4
168     Int_t m_events4GenMu8; // n events with 4 gen muons: pT > 8 GeV, |eta| < 2.4
169    
170     // Gen branches in ROOT tree (they all start with b_)
171 pakhotin 1.5 Float_t b_genH_m;
172 pakhotin 1.3 Float_t b_genH_p;
173     Float_t b_genH_pT;
174 pakhotin 1.5 Float_t b_genH_eta;
175     Float_t b_genH_phi;
176 pakhotin 1.4 Float_t b_genH_vx;
177     Float_t b_genH_vy;
178     Float_t b_genH_vz;
179    
180 pakhotin 1.5 Float_t b_genA0_m;
181 pakhotin 1.14 Float_t b_genA0_E;
182 pakhotin 1.3 Float_t b_genA0_p;
183     Float_t b_genA0_pT;
184 pakhotin 1.14 Float_t b_genA0_px;
185     Float_t b_genA0_py;
186     Float_t b_genA0_pz;
187 pakhotin 1.3 Float_t b_genA0_eta;
188 pakhotin 1.5 Float_t b_genA0_phi;
189     Float_t b_genA0_vx;
190     Float_t b_genA0_vy;
191     Float_t b_genA0_vz;
192    
193     Float_t b_genA1_m;
194 pakhotin 1.14 Float_t b_genA1_E;
195 pakhotin 1.3 Float_t b_genA1_p;
196     Float_t b_genA1_pT;
197 pakhotin 1.14 Float_t b_genA1_px;
198     Float_t b_genA1_py;
199     Float_t b_genA1_pz;
200 pakhotin 1.3 Float_t b_genA1_eta;
201 pakhotin 1.5 Float_t b_genA1_phi;
202     Float_t b_genA1_vx;
203     Float_t b_genA1_vy;
204     Float_t b_genA1_vz;
205    
206     Float_t b_genA0Mu0_p;
207     Float_t b_genA0Mu1_p;
208     Float_t b_genA1Mu0_p;
209     Float_t b_genA1Mu1_p;
210 pakhotin 1.3
211     Float_t b_genA0Mu0_pT;
212     Float_t b_genA0Mu1_pT;
213     Float_t b_genA1Mu0_pT;
214     Float_t b_genA1Mu1_pT;
215 pakhotin 1.4
216 pakhotin 1.5 Float_t b_genA0Mu0_eta;
217     Float_t b_genA0Mu1_eta;
218     Float_t b_genA1Mu0_eta;
219     Float_t b_genA1Mu1_eta;
220    
221     Float_t b_genA0Mu0_phi;
222     Float_t b_genA0Mu1_phi;
223     Float_t b_genA1Mu0_phi;
224     Float_t b_genA1Mu1_phi;
225    
226 pakhotin 1.4 Float_t b_genA0Mu0_vx;
227     Float_t b_genA0Mu1_vx;
228     Float_t b_genA1Mu0_vx;
229     Float_t b_genA1Mu1_vx;
230    
231     Float_t b_genA0Mu0_vy;
232     Float_t b_genA0Mu1_vy;
233     Float_t b_genA1Mu0_vy;
234     Float_t b_genA1Mu1_vy;
235    
236     Float_t b_genA0Mu0_vz;
237     Float_t b_genA0Mu1_vz;
238     Float_t b_genA1Mu0_vz;
239     Float_t b_genA1Mu1_vz;
240    
241 pakhotin 1.5 Float_t b_genA0_vLT;
242     Float_t b_genA1_vLT;
243    
244     Float_t b_genA0_vL;
245     Float_t b_genA1_vL;
246    
247     Float_t b_genA0Mu_dEta;
248     Float_t b_genA1Mu_dEta;
249     Float_t b_genA0Mu_dPhi;
250     Float_t b_genA1Mu_dPhi;
251 pakhotin 1.3 Float_t b_genA0Mu_dR;
252     Float_t b_genA1Mu_dR;
253    
254     Float_t b_genMu0_pT;
255     Float_t b_genMu1_pT;
256     Float_t b_genMu2_pT;
257     Float_t b_genMu3_pT;
258    
259 pakhotin 1.6 Float_t b_genMu0_eta;
260     Float_t b_genMu1_eta;
261     Float_t b_genMu2_eta;
262     Float_t b_genMu3_eta;
263    
264     Float_t b_genMu0_phi;
265     Float_t b_genMu1_phi;
266     Float_t b_genMu2_phi;
267     Float_t b_genMu3_phi;
268    
269 pakhotin 1.3 // ---------- RECO Level ----------
270    
271     // Labels to access
272     edm::InputTag m_muons; // reconstructed muons
273     edm::InputTag m_muJets; // muon jets built from reconstructed muons
274    
275     // Events counters
276     Int_t m_events1SelMu17; // n events with 1 selected reco muon: pT > 17 GeV, |eta| < 0.9
277     Int_t m_events2SelMu8; // n events with 2 selected reco muon: pT > 8 GeV, |eta| < 2.4
278     Int_t m_events3SelMu8; // n events with 2 selected reco muon: pT > 8 GeV, |eta| < 2.4
279     Int_t m_events4SelMu8; // n events with 2 selected reco muon: pT > 8 GeV, |eta| < 2.4
280     Int_t m_events2MuJets; // n events with 2 muon jets
281     Int_t m_events2DiMuons; // n events with 2 dimuons (dimuon = muon jet with 2 muons)
282     Int_t m_eventsDz2DiMuonsOK; // n events with dz between dimuons less than 0.1
283     Int_t m_eventsDiMuonsHLTFired;// n events with dimuon HLT fired
284     Int_t m_eventsMassDiMuonsOK; // n events with both dimuons masses in diagonal
285     Int_t m_eventsIsoDiMuonsOK; // n events with both dimuons isolated
286     Int_t m_eventsVertexOK; // n events with one good vertex
287    
288     // Cuts thresholds from Python config file
289     Double_t m_maxIsoDiMuons;
290    
291     // Auxiliary variables
292     TRandom3 m_trandom3;
293    
294     // Reco branches in ROOT tree (they all start with b_)
295 pakhotin 1.6
296     Float_t b_selMu0_pT;
297     Float_t b_selMu1_pT;
298     Float_t b_selMu2_pT;
299     Float_t b_selMu3_pT;
300    
301     Float_t b_selMu0_eta;
302     Float_t b_selMu1_eta;
303     Float_t b_selMu2_eta;
304     Float_t b_selMu3_eta;
305    
306     Float_t b_selMu0_phi;
307     Float_t b_selMu1_phi;
308     Float_t b_selMu2_phi;
309     Float_t b_selMu3_phi;
310    
311 pakhotin 1.10 Float_t b_diMuonC_isoTk;
312     Float_t b_diMuonF_isoTk;
313     Float_t b_diMuonC_isoPF;
314     Float_t b_diMuonF_isoPF;
315    
316     Float_t b_dZDiMuonC;
317     Float_t b_dZDiMuonF;
318     Float_t b_dZDiMuons;
319    
320 pakhotin 1.14 Float_t b_diMuonC_Lxy;
321     Float_t b_diMuonF_Lxy;
322    
323 pakhotin 1.10 // Bool branches in ROOT tree
324    
325     Bool_t b_is1SelMu17;
326     Bool_t b_is4SelMu8;
327     Bool_t b_is2MuJets;
328     Bool_t b_is2DiMuons;
329     Bool_t b_isDzDiMuonsOK;
330     Bool_t b_isDiMuonHLTFired;
331     Bool_t b_isMassDiMuonsOK;
332     Bool_t b_isIsoDiMuonsOK;
333     Bool_t b_isVLT;
334 pakhotin 1.14 Bool_t b_isOK_diMuonsLxy;
335 pakhotin 1.10
336 pakhotin 1.1 };
337    
338     //
339     // constants, enums and typedefs
340     //
341    
342     //
343     // static data member definitions
344     //
345    
346     //
347     // constructors and destructor
348     //
349     CutFlowAnalyzer::CutFlowAnalyzer(const edm::ParameterSet& iConfig)
350    
351     {
352 pakhotin 1.5
353 pakhotin 1.3 m_events = 0;
354     m_ttree = NULL;
355    
356     // ---------- Generator Level ----------
357     m_genParticles = iConfig.getParameter<edm::InputTag>("genParticles");
358    
359     m_events4GenMu = 0;
360     m_events1GenMu17 = 0;
361     m_events2GenMu8 = 0;
362     m_events3GenMu8 = 0;
363     m_events4GenMu8 = 0;
364    
365     // ---------- RECO Level ----------
366     m_muons = iConfig.getParameter<edm::InputTag>("muons");
367     m_muJets = iConfig.getParameter<edm::InputTag>("muJets");
368    
369     m_maxIsoDiMuons = iConfig.getParameter<double>("maxIsoDiMuons");
370 pakhotin 1.5 m_Mu17_threshold = 17.0;
371     m_Mu8_threshold = 8.0;
372 pakhotin 1.3
373     m_events1SelMu17 = 0;
374     m_events2SelMu8 = 0;
375     m_events3SelMu8 = 0;
376     m_events4SelMu8 = 0;
377     m_events2MuJets = 0;
378     m_events2DiMuons = 0;
379     m_eventsDz2DiMuonsOK = 0;
380     m_eventsDiMuonsHLTFired = 0;
381     m_eventsMassDiMuonsOK = 0;
382     m_eventsIsoDiMuonsOK = 0;
383     m_eventsVertexOK = 0;
384 pakhotin 1.1 }
385    
386    
387     CutFlowAnalyzer::~CutFlowAnalyzer()
388     {
389    
390     // do anything here that needs to be done at desctruction time
391     // (e.g. close files, deallocate resources etc.)
392    
393     }
394    
395     //
396     // member functions
397     //
398    
399     // ------------ method called for each event ------------
400     void
401     CutFlowAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
402     {
403     using namespace edm;
404 pakhotin 1.3
405 pakhotin 1.14 double eq = 0.000001;
406    
407 pakhotin 1.3 // get the run, lumi and event number
408     m_run = iEvent.id().run();
409     m_lumi = iEvent.id().luminosityBlock();
410 pakhotin 1.2 m_event = iEvent.id().event();
411    
412 pakhotin 1.5 edm::Handle<reco::BeamSpot> beamSpot;
413     iEvent.getByLabel("offlineBeamSpot",beamSpot);
414     b_beamSpot_x = beamSpot->position().x();
415     b_beamSpot_y = beamSpot->position().y();
416     b_beamSpot_z = beamSpot->position().z();
417    
418     // std::cout << "Beam spot x: " << m_beamSpot_x << " y: " << m_beamSpot_y << " z: " << m_beamSpot_z << std::endl;
419    
420 pakhotin 1.3 // count events
421     m_events++;
422     if ( !(m_events%1000) ) std::cout << "Event " << m_events << std::endl;
423    
424     //****************************************************************************
425     // GEN LEVEL
426     //****************************************************************************
427 pakhotin 1.2
428     edm::Handle<reco::GenParticleCollection> genParticles;
429 pakhotin 1.3 iEvent.getByLabel(m_genParticles, genParticles);
430 pakhotin 1.2
431 pakhotin 1.3 // Loop over all genParticles and save prompt muons from particles with codes 36 (a1) or 3000022 (gammaD) in vector genMuons
432     std::vector<const reco::GenParticle*> genH;
433 pakhotin 1.14 std::vector<const reco::GenParticle*> genA_unsorted;
434 pakhotin 1.3 std::vector<const reco::GenParticle*> genA;
435 pakhotin 1.2 std::vector<const reco::GenParticle*> genMuons;
436 pakhotin 1.3 std::vector<const reco::Candidate*> genMuonMothers;
437     // Loop over all gen particles
438 pakhotin 1.4 int counterGenParticle = 0;
439 pakhotin 1.2 for(reco::GenParticleCollection::const_iterator iGenParticle = genParticles->begin(); iGenParticle != genParticles->end(); ++iGenParticle) {
440 pakhotin 1.4 counterGenParticle++;
441     // std::cout << counterGenParticle << " " << iGenParticle->status() << " " << iGenParticle->pdgId() << " " << iGenParticle->vx() << " " << iGenParticle->vy() << " " << iGenParticle->vz() << std::endl;
442 pakhotin 1.3 // Check if gen particle is muon (pdgId = +/-13) and stable (status = 1)
443     if ( fabs( iGenParticle->pdgId() ) == 13 && iGenParticle->status() == 1 ) {
444     // Mother of the muon can be muon. Find the last muon in this chain: genMuonCand
445     // Example: a1 -> mu+ (status = 3) mu- (status = 3)
446     // mu- (status = 3) -> mu- (status = 2) -> mu- (status = 1)
447 pakhotin 1.2 const reco::Candidate *genMuonCand = &(*iGenParticle);
448     bool isMuonMother = true;
449     while(isMuonMother) {
450     isMuonMother = false;
451     for ( size_t iMother = 0; iMother < genMuonCand->numberOfMothers(); iMother++ ) {
452     if ( fabs( genMuonCand->mother(iMother)->pdgId() ) == 13 ) {
453     isMuonMother = true;
454     genMuonCand = genMuonCand->mother(iMother);
455     }
456     }
457     }
458 pakhotin 1.3 // Loop over all real (non-muon) mothers of the muon (here we use genMuonCand)
459 pakhotin 1.2 for ( size_t iMother = 0; iMother < genMuonCand->numberOfMothers(); iMother++ ) {
460 pakhotin 1.3 // Check if mother is CP-odd Higgs (PdgId = 36) or gamma_Dark (PdgId = 3000022)
461 pakhotin 1.5 // if ( genMuonCand->mother(iMother)->pdgId() == 36 || genMuonCand->mother(iMother)->pdgId() == 3000022 || genMuonCand->mother(iMother)->pdgId() == 443 ) {
462     if ( genMuonCand->mother(iMother)->pdgId() == 36 || genMuonCand->mother(iMother)->pdgId() == 3000022 ) {
463 pakhotin 1.3 // Store the muon (stable, first in chain) into vector
464 pakhotin 1.2 genMuons.push_back(&(*iGenParticle));
465 pakhotin 1.3 // Store mother of the muon into vector. We need this to group muons into dimuons later
466     genMuonMothers.push_back(genMuonCand->mother(iMother));
467 pakhotin 1.2 }
468     }
469     }
470 pakhotin 1.5 // Check if gen particle is
471 pakhotin 1.14 if ( ( iGenParticle->status() == 3 && iGenParticle->pdgId() == 25 ) // decaying (status = 3) SM Higgs (pdgId = 25)
472     || ( iGenParticle->status() == 3 && iGenParticle->pdgId() == 35 ) // decaying (status = 3) CP-even Higgs (pdgId = 35)
473     ) {
474 pakhotin 1.3 genH.push_back(&(*iGenParticle)); // Store the Higgs into vector
475     }
476 pakhotin 1.4 // Check if gen particle is
477 pakhotin 1.14 if ( ( iGenParticle->status() == 3 && iGenParticle->pdgId() == 36 ) // decaying (status = 3) CP-odd Higgs (pdgId = 36)
478     || ( iGenParticle->status() == 3 && iGenParticle->pdgId() == 3000022 ) // decaying (status = 3) gamma_Dark (pdgId = 3000022)
479     // || ( iGenParticle->status() == 2 && iGenParticle->pdgId() == 443 ) // decaying (status = 2) J/psi (pdgId = 443)
480     ) {
481     genA_unsorted.push_back(&(*iGenParticle));
482 pakhotin 1.3 }
483     }
484    
485     if ( genH.size() == 1 ) {
486 pakhotin 1.5 b_genH_m = genH[0]->mass();
487 pakhotin 1.3 b_genH_p = genH[0]->p();
488     b_genH_pT = genH[0]->pt();
489     b_genH_eta = genH[0]->eta();
490 pakhotin 1.5 b_genH_phi = genH[0]->phi();
491     b_genH_vx = genH[0]->vx() - b_beamSpot_x;
492     b_genH_vy = genH[0]->vy() - b_beamSpot_y;
493     b_genH_vz = genH[0]->vz() - b_beamSpot_z;
494 pakhotin 1.3 } else {
495 pakhotin 1.4 // std::cout << "WARNING! genH.size() != 1" << std::endl;
496 pakhotin 1.3 }
497    
498 pakhotin 1.14 if ( genA_unsorted.size() >= 2 ) {
499     // Sort genA by pT (leading pT first)
500     std::sort (genA_unsorted.begin(), genA_unsorted.end(), PtOrder);
501     // Remove duplicates from genA
502     Float_t A_pT = genA_unsorted[0];
503     for ( unsigned int i = 1; i < genA_unsorted.size(); i++ ) {
504     if ( fabs( genA_unsorted[i].pT() - A_pT) > eq ) {
505     A_pT = genA_unsorted[i].pT();
506     genA.push_back( genA_unsorted[i] );
507     }
508     }
509     }
510    
511 pakhotin 1.3 if ( genA.size() >= 2 ) {
512 pakhotin 1.5 b_genA0_m = genA[0]->mass();
513 pakhotin 1.14 b_genA0_E = genA[0]->energy();
514 pakhotin 1.3 b_genA0_p = genA[0]->p();
515     b_genA0_pT = genA[0]->pt();
516 pakhotin 1.14 b_genA0_px = genA[0]->px();
517     b_genA0_py = genA[0]->py();
518     b_genA0_pz = genA[0]->pz();
519 pakhotin 1.3 b_genA0_eta = genA[0]->eta();
520 pakhotin 1.5 b_genA0_phi = genA[0]->phi();
521     b_genA0_vx = genA[0]->vx() - b_beamSpot_x;
522     b_genA0_vy = genA[0]->vy() - b_beamSpot_y;
523     b_genA0_vz = genA[0]->vz() - b_beamSpot_z;
524    
525     b_genA1_m = genA[1]->mass();
526 pakhotin 1.14 b_genA1_E = genA[1]->energy();
527 pakhotin 1.3 b_genA1_p = genA[1]->p();
528     b_genA1_pT = genA[1]->pt();
529 pakhotin 1.14 b_genA1_px = genA[1]->px();
530     b_genA1_py = genA[1]->py();
531     b_genA1_pz = genA[1]->pz();
532 pakhotin 1.3 b_genA1_eta = genA[1]->eta();
533 pakhotin 1.5 b_genA1_phi = genA[1]->phi();
534     b_genA1_vx = genA[1]->vx() - b_beamSpot_x;
535     b_genA1_vy = genA[1]->vy() - b_beamSpot_y;
536     b_genA1_vz = genA[1]->vz() - b_beamSpot_z;
537 pakhotin 1.3 } else {
538     std::cout << "WARNING! genA.size() < 2" << std::endl;
539     }
540    
541 pakhotin 1.5 // Group muons with the same mother
542     std::vector< std::vector<const reco::GenParticle*> > genMuonGroupsUnsorted;
543     std::vector<const reco::Candidate*> genMuonGroupsUnsortedMothers;
544 pakhotin 1.3 std::vector<const reco::GenParticle*> genMuonsTMP1 = genMuons;
545     std::vector<const reco::Candidate*> genMuonMothersTMP1 = genMuonMothers;
546     unsigned int nMuonGroup = 0;
547     while ( genMuonsTMP1.size() > 0 ) {
548     std::vector<const reco::GenParticle*> genMuonsTMP2;
549     std::vector<const reco::Candidate*> genMuonMothersTMP2;
550     std::vector<const reco::GenParticle*> genMuonsSameMother;
551 pakhotin 1.5 std::vector<const reco::Candidate*> genMuonMothersSame;
552 pakhotin 1.3 for ( unsigned int j = 0; j < genMuonsTMP1.size(); j++ ) {
553     // Check if mothers are the same particle
554 pakhotin 1.14 if ( fabs( genMuonMothersTMP1[0]->pt() - genMuonMothersTMP1[j]->pt() ) < eq ) {
555 pakhotin 1.3 genMuonsSameMother.push_back( genMuonsTMP1[j] );
556     } else {
557     genMuonsTMP2.push_back( genMuonsTMP1[j] );
558     genMuonMothersTMP2.push_back( genMuonMothersTMP1[j] );
559     }
560     }
561 pakhotin 1.5 genMuonGroupsUnsorted.push_back(genMuonsSameMother);
562     genMuonGroupsUnsortedMothers.push_back(genMuonMothersTMP1[0]);
563 pakhotin 1.3 genMuonsTMP1 = genMuonsTMP2;
564     genMuonMothersTMP1 = genMuonMothersTMP2;
565     nMuonGroup++;
566 pakhotin 1.2 }
567    
568 pakhotin 1.5 // Sort muon groups to match order of genA vector
569     std::vector< std::vector<const reco::GenParticle*> > genMuonGroups;
570     std::vector<const reco::Candidate*> genMuonGroupsMothers;
571     for (unsigned int iA = 0; iA < genA.size(); iA++ ) {
572     bool isMuGroupMatchedToA = false;
573     int nMuGroup = -1;
574     for ( unsigned int iMuGroup = 0; iMuGroup < genMuonGroupsUnsortedMothers.size(); iMuGroup++ ) {
575     if ( fabs ( genA[iA]->pt() - genMuonGroupsUnsortedMothers[iMuGroup]->pt() ) < 0.000001 ) {
576     isMuGroupMatchedToA = true;
577     nMuGroup = iMuGroup;
578     break;
579     }
580     }
581     if ( isMuGroupMatchedToA && nMuGroup >= 0 ) {
582     genMuonGroups.push_back( genMuonGroupsUnsorted[nMuGroup] );
583     genMuonGroupsMothers.push_back( genMuonGroupsUnsortedMothers[nMuGroup] );
584     } else {
585     std::cout << "Error! Muon group has no matched boson A" << std::endl;
586     }
587     }
588    
589 pakhotin 1.10 bool b_isVLT = true;
590 pakhotin 1.3 if ( genMuonGroups.size() == 2 && genMuonGroups[0].size() == 2 && genMuonGroups[1].size() == 2 ) {
591     std::sort( genMuonGroups[0].begin(), genMuonGroups[0].end(), PtOrder );
592     std::sort( genMuonGroups[1].begin(), genMuonGroups[1].end(), PtOrder );
593 pakhotin 1.5
594     b_genA0Mu0_p = genMuonGroups[0][0]->p();
595     b_genA0Mu1_p = genMuonGroups[0][1]->p();
596     b_genA1Mu0_p = genMuonGroups[1][0]->p();
597     b_genA1Mu1_p = genMuonGroups[1][1]->p();
598    
599 pakhotin 1.3 b_genA0Mu0_pT = genMuonGroups[0][0]->pt();
600     b_genA0Mu1_pT = genMuonGroups[0][1]->pt();
601     b_genA1Mu0_pT = genMuonGroups[1][0]->pt();
602     b_genA1Mu1_pT = genMuonGroups[1][1]->pt();
603    
604 pakhotin 1.5 b_genA0Mu0_eta = genMuonGroups[0][0]->eta();
605     b_genA0Mu1_eta = genMuonGroups[0][1]->eta();
606     b_genA1Mu0_eta = genMuonGroups[1][0]->eta();
607     b_genA1Mu1_eta = genMuonGroups[1][1]->eta();
608    
609     b_genA0Mu0_phi = genMuonGroups[0][0]->phi();
610     b_genA0Mu1_phi = genMuonGroups[0][1]->phi();
611     b_genA1Mu0_phi = genMuonGroups[1][0]->phi();
612     b_genA1Mu1_phi = genMuonGroups[1][1]->phi();
613    
614     b_genA0Mu0_vx = genMuonGroups[0][0]->vx() - b_beamSpot_x;
615     b_genA0Mu1_vx = genMuonGroups[0][1]->vx() - b_beamSpot_x;
616     b_genA1Mu0_vx = genMuonGroups[1][0]->vx() - b_beamSpot_x;
617     b_genA1Mu1_vx = genMuonGroups[1][1]->vx() - b_beamSpot_x;
618    
619     b_genA0Mu0_vy = genMuonGroups[0][0]->vy() - b_beamSpot_y;
620     b_genA0Mu1_vy = genMuonGroups[0][1]->vy() - b_beamSpot_y;
621     b_genA1Mu0_vy = genMuonGroups[1][0]->vy() - b_beamSpot_y;
622     b_genA1Mu1_vy = genMuonGroups[1][1]->vy() - b_beamSpot_y;
623    
624     b_genA0Mu0_vz = genMuonGroups[0][0]->vz() - b_beamSpot_z;
625     b_genA0Mu1_vz = genMuonGroups[0][1]->vz() - b_beamSpot_z;
626     b_genA1Mu0_vz = genMuonGroups[1][0]->vz() - b_beamSpot_z;
627     b_genA1Mu1_vz = genMuonGroups[1][1]->vz() - b_beamSpot_z;
628    
629     if ( fabs(b_genA0Mu0_vx - b_genA0Mu1_vx) < eq
630     && fabs(b_genA1Mu0_vx - b_genA1Mu1_vx) < eq
631     && fabs(b_genA0Mu0_vy - b_genA0Mu1_vy) < eq
632     && fabs(b_genA1Mu0_vy - b_genA1Mu1_vy) < eq
633     && fabs(b_genA0Mu0_vz - b_genA0Mu1_vz) < eq
634     && fabs(b_genA1Mu0_vz - b_genA1Mu1_vz) < eq
635     ) {
636     Float_t genA0_vLx = b_genA0Mu0_vx - b_genA0_vx;
637     Float_t genA1_vLx = b_genA1Mu0_vx - b_genA1_vx;
638    
639     Float_t genA0_vLy = b_genA0Mu0_vy - b_genA0_vy;
640     Float_t genA1_vLy = b_genA1Mu0_vy - b_genA1_vy;
641    
642     Float_t genA0_vLz = b_genA0Mu0_vz - b_genA0_vz;
643     Float_t genA1_vLz = b_genA1Mu0_vz - b_genA1_vz;
644    
645     b_genA0_vLT = sqrt( genA0_vLx * genA0_vLx + genA0_vLy * genA0_vLy );
646     b_genA1_vLT = sqrt( genA1_vLx * genA1_vLx + genA1_vLy * genA1_vLy );
647    
648 pakhotin 1.10 if ( b_genA0_vLT < 4. && b_genA0_vLT < 4. ) b_isVLT = true;
649 pakhotin 1.5
650     b_genA0_vL = sqrt( genA0_vLx * genA0_vLx + genA0_vLy * genA0_vLy + genA0_vLz * genA0_vLz );
651     b_genA1_vL = sqrt( genA1_vLx * genA1_vLx + genA1_vLy * genA1_vLy + genA1_vLz * genA1_vLz );
652     } else {
653     std::cout << "WARNING! Muon vertexes are different" << std::endl;
654     }
655    
656     b_genA0Mu_dEta = genMuonGroups[0][0]->eta() - genMuonGroups[0][1]->eta();
657     b_genA1Mu_dEta = genMuonGroups[1][0]->eta() - genMuonGroups[1][1]->eta();
658     b_genA0Mu_dPhi = My_dPhi( genMuonGroups[0][0]->phi(), genMuonGroups[0][1]->phi() );
659     b_genA1Mu_dPhi = My_dPhi( genMuonGroups[1][0]->phi(), genMuonGroups[1][1]->phi() );
660     b_genA0Mu_dR = sqrt(b_genA0Mu_dEta*b_genA0Mu_dEta + b_genA0Mu_dPhi*b_genA0Mu_dPhi);
661     b_genA1Mu_dR = sqrt(b_genA1Mu_dEta*b_genA1Mu_dEta + b_genA1Mu_dPhi*b_genA1Mu_dPhi);
662 pakhotin 1.3 }
663    
664     // Sort genMuons by pT (leading pT first)
665     if ( genMuons.size() > 1 ) std::sort( genMuons.begin(), genMuons.end(), PtOrder );
666    
667     if ( genMuons.size() == 4 ) m_events4GenMu++;
668    
669 pakhotin 1.6 if ( genMuons.size() > 0 ) {
670     b_genMu0_pT = genMuons[0]->pt();
671     b_genMu0_eta = genMuons[0]->eta();
672     b_genMu0_phi = genMuons[0]->phi();
673     } else {
674     b_genMu0_pT = -100.0;
675     b_genMu0_eta = -100.0;
676     b_genMu0_phi = -100.0;
677     }
678     if ( genMuons.size() > 1 ) {
679     b_genMu1_pT = genMuons[1]->pt();
680     b_genMu1_eta = genMuons[1]->eta();
681     b_genMu1_phi = genMuons[1]->phi();
682     } else {
683     b_genMu1_pT = -100.0;
684     b_genMu1_eta = -100.0;
685     b_genMu1_phi = -100.0;
686 pakhotin 1.2 }
687 pakhotin 1.6 if ( genMuons.size() > 2 ) {
688     b_genMu2_pT = genMuons[2]->pt();
689     b_genMu2_eta = genMuons[2]->eta();
690     b_genMu2_phi = genMuons[2]->phi();
691     } else {
692     b_genMu2_pT = -100.0;
693     b_genMu2_eta = -100.0;
694     b_genMu2_phi = -100.0;
695     }
696     if ( genMuons.size() > 3 ) {
697     b_genMu3_pT = genMuons[3]->pt();
698     b_genMu3_eta = genMuons[3]->eta();
699     b_genMu3_phi = genMuons[3]->phi();
700     } else {
701     b_genMu3_pT = -100.0;
702     b_genMu3_eta = -100.0;
703     b_genMu3_phi = -100.0;
704     }
705    
706 pakhotin 1.2
707     std::vector<const reco::GenParticle*> genMuons17;
708     std::vector<const reco::GenParticle*> genMuons8;
709    
710     for ( unsigned int i = 0; i < genMuons.size(); i++ ) {
711 pakhotin 1.4 if ( genMuons[i]->pt() > m_Mu17_threshold && fabs( genMuons[i]->eta() ) < 0.9 ) {
712 pakhotin 1.2 genMuons17.push_back(genMuons[i]);
713     }
714 pakhotin 1.4 if ( genMuons[i]->pt() > m_Mu8_threshold && fabs( genMuons[i]->eta() ) < 2.4 ) {
715 pakhotin 1.2 genMuons8.push_back(genMuons[i]);
716     }
717     }
718    
719 pakhotin 1.10 // std::cout << " b_isVLT: " << b_isVLT << std::endl;
720     if ( genMuons17.size() >=1 && b_isVLT) {
721 pakhotin 1.3 m_events1GenMu17++;
722 pakhotin 1.2 if ( genMuons8.size() >=2 ) {
723 pakhotin 1.3 m_events2GenMu8++;
724 pakhotin 1.2 }
725     if ( genMuons8.size() >=3 ) {
726 pakhotin 1.3 m_events3GenMu8++;
727 pakhotin 1.2 }
728     if ( genMuons8.size() >=4 ) {
729 pakhotin 1.3 m_events4GenMu8++;
730     }
731     }
732    
733     //****************************************************************************
734     // RECO LEVEL
735     //****************************************************************************
736    
737     edm::Handle<pat::MuonCollection> muons;
738     iEvent.getByLabel(m_muons, muons);
739    
740     std::vector<const reco::Muon*> selMuons;
741     std::vector<const reco::Muon*> selMuons8;
742     std::vector<const reco::Muon*> selMuons17;
743    
744     for (pat::MuonCollection::const_iterator iMuon = muons->begin(); iMuon != muons->end(); ++iMuon) {
745 pakhotin 1.7 if ( isPFMuonLoose( &(*iMuon) ) ) {
746     // if ( isTrackerMuonPrivateID( &(*iMuon) ) ) {
747 pakhotin 1.3 selMuons.push_back( &(*iMuon) );
748 pakhotin 1.4 if ( iMuon->pt() > m_Mu8_threshold ) {
749 pakhotin 1.3 selMuons8.push_back( &(*iMuon) );
750     }
751 pakhotin 1.4 if ( iMuon->pt() > m_Mu17_threshold && fabs(iMuon->eta()) < 0.9 ) {
752 pakhotin 1.3 selMuons17.push_back( &(*iMuon) );
753     }
754     }
755     }
756    
757 pakhotin 1.6 if ( selMuons.size() > 0 ) {
758     b_selMu0_pT = selMuons[0]->pt();
759     b_selMu0_eta = selMuons[0]->eta();
760     b_selMu0_phi = selMuons[0]->phi();
761     } else {
762     b_selMu0_pT = -100.0;
763     b_selMu0_eta = -100.0;
764     b_selMu0_phi = -100.0;
765     }
766     if ( selMuons.size() > 1 ) {
767     b_selMu1_pT = selMuons[1]->pt();
768     b_selMu1_eta = selMuons[1]->eta();
769     b_selMu1_phi = selMuons[1]->phi();
770     } else {
771     b_selMu1_pT = -100.0;
772     b_selMu1_eta = -100.0;
773     b_selMu1_phi = -100.0;
774     }
775     if ( selMuons.size() > 2 ) {
776     b_selMu2_pT = selMuons[2]->pt();
777     b_selMu2_eta = selMuons[2]->eta();
778     b_selMu2_phi = selMuons[2]->phi();
779     } else {
780     b_selMu2_pT = -100.0;
781     b_selMu2_eta = -100.0;
782     b_selMu2_phi = -100.0;
783     }
784     if ( selMuons.size() > 3 ) {
785     b_selMu3_pT = selMuons[3]->pt();
786     b_selMu3_eta = selMuons[3]->eta();
787     b_selMu3_phi = selMuons[3]->phi();
788     } else {
789     b_selMu3_pT = -100.0;
790     b_selMu3_eta = -100.0;
791     b_selMu3_phi = -100.0;
792     }
793    
794    
795 pakhotin 1.10 b_is1SelMu17 = false;
796     b_is4SelMu8 = false;
797 pakhotin 1.3 if ( selMuons17.size() >=1 ) {
798     m_events1SelMu17++;
799 pakhotin 1.10 b_is1SelMu17 = true;
800 pakhotin 1.3 if ( selMuons8.size() >=2 ) {
801     m_events2SelMu8++;
802     }
803     if ( selMuons8.size() >=3 ) {
804     m_events3SelMu8++;
805 pakhotin 1.2 }
806 pakhotin 1.3 if ( selMuons8.size() >=4 ) {
807     m_events4SelMu8++;
808 pakhotin 1.10 b_is4SelMu8 = true;
809 pakhotin 1.3 }
810     }
811    
812     edm::Handle<pat::MultiMuonCollection> muJets;
813     iEvent.getByLabel(m_muJets, muJets);
814     const pat::MultiMuon *muJetC = NULL;
815     const pat::MultiMuon *muJetF = NULL;
816     int nMuJetsContainMu17 = 0;
817     unsigned int nMuJets = muJets->size();
818 pakhotin 1.10 b_is2MuJets = false;
819 pakhotin 1.3 if ( nMuJets == 2) {
820     for ( unsigned int j = 0; j < nMuJets; j++ ) {
821     bool isMuJetContainMu17 = false;
822     for ( unsigned int m = 0; m < (*muJets)[j].numberOfDaughters(); m++ ) {
823 pakhotin 1.4 if ( (*muJets)[j].muon(m)->pt() > m_Mu17_threshold && fabs( (*muJets)[j].muon(m)->eta() ) < 0.9 ) {
824 pakhotin 1.3 isMuJetContainMu17 = true;
825     nMuJetsContainMu17++;
826     break;
827     }
828     }
829     if ( isMuJetContainMu17 ) {
830     muJetC = &((*muJets)[j]);
831     } else {
832     muJetF = &((*muJets)[j]);
833     }
834     }
835     if ( nMuJetsContainMu17 == 2 ) {
836     if (m_trandom3.Integer(2) == 0) {
837     muJetC = &((*muJets)[0]);
838     muJetF = &((*muJets)[1]);
839     } else {
840     muJetC = &((*muJets)[1]);
841     muJetF = &((*muJets)[0]);
842     }
843     }
844 pakhotin 1.10 if ( nMuJetsContainMu17 > 0 ) b_is2MuJets = true;
845 pakhotin 1.3 }
846    
847 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_isVLT) m_events2MuJets++;
848 pakhotin 1.3
849 pakhotin 1.10 b_is2DiMuons = false;
850 pakhotin 1.3 const pat::MultiMuon *diMuonC = NULL;
851     const pat::MultiMuon *diMuonF = NULL;
852     if ( muJetC != NULL && muJetF != NULL ) {
853     if ( muJetC->numberOfDaughters() == 2 && muJetF->numberOfDaughters() == 2 ) {
854     diMuonC = muJetC;
855     diMuonF = muJetF;
856 pakhotin 1.10 b_is2DiMuons = true;
857 pakhotin 1.3 }
858     }
859    
860 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_is2DiMuons && b_isVLT) m_events2DiMuons++;
861 pakhotin 1.3
862 pakhotin 1.10 b_isDzDiMuonsOK = false;
863     b_dZDiMuonC = -1000.0;
864     b_dZDiMuonF = -1000.0;
865     b_dZDiMuons = -1000.0;
866 pakhotin 1.3 if ( diMuonC != NULL && diMuonF != NULL ) {
867 pakhotin 1.10 b_dZDiMuonC = diMuonC->dz(beamSpot->position());
868     b_dZDiMuonF = diMuonF->dz(beamSpot->position());
869     b_dZDiMuons = b_dZDiMuonC - b_dZDiMuonF;
870     if ( fabs( b_dZDiMuons ) < 0.1 ) b_isDzDiMuonsOK = true;
871 pakhotin 1.3 }
872    
873 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_is2DiMuons && b_isDzDiMuonsOK && b_isVLT ) m_eventsDz2DiMuonsOK++;
874 pakhotin 1.3
875     edm::Handle<pat::TriggerEvent> triggerEvent;
876     iEvent.getByLabel("patTriggerEvent", triggerEvent);
877    
878 pakhotin 1.10 b_isDiMuonHLTFired = false;
879 pakhotin 1.3 if ( ( triggerEvent->path("HLT_Mu17_Mu8_v22") && triggerEvent->path("HLT_Mu17_Mu8_v22")->wasAccept() )
880     || ( triggerEvent->path("HLT_Mu17_Mu8_v21") && triggerEvent->path("HLT_Mu17_Mu8_v21")->wasAccept() )
881     || ( triggerEvent->path("HLT_Mu17_Mu8_v19") && triggerEvent->path("HLT_Mu17_Mu8_v19")->wasAccept() )
882     || ( triggerEvent->path("HLT_Mu17_Mu8_v18") && triggerEvent->path("HLT_Mu17_Mu8_v18")->wasAccept() )
883     || ( triggerEvent->path("HLT_Mu17_Mu8_v17") && triggerEvent->path("HLT_Mu17_Mu8_v17")->wasAccept() )
884     || ( triggerEvent->path("HLT_Mu17_Mu8_v16") && triggerEvent->path("HLT_Mu17_Mu8_v16")->wasAccept() ) ) {
885 pakhotin 1.10 b_isDiMuonHLTFired = true;
886 pakhotin 1.2 }
887    
888 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_is2DiMuons && b_isDzDiMuonsOK && b_isDiMuonHLTFired && b_isVLT ) m_eventsDiMuonsHLTFired++;
889 pakhotin 1.3
890 pakhotin 1.10 b_isMassDiMuonsOK = false;
891 pakhotin 1.3 if ( diMuonC != NULL && diMuonF != NULL ) {
892     double massC = diMuonC->mass();
893     double massF = diMuonF->mass();
894 pakhotin 1.10 if ( fabs(massC-massF) < (0.13 + 0.065*(massC+massF)/2.0) ) b_isMassDiMuonsOK = true;
895 pakhotin 1.3 }
896    
897 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_is2DiMuons && b_isDzDiMuonsOK && b_isDiMuonHLTFired && b_isMassDiMuonsOK && b_isVLT ) m_eventsMassDiMuonsOK++;
898 pakhotin 1.3
899 pakhotin 1.10 edm::Handle<reco::TrackCollection> tracks;
900     iEvent.getByLabel("generalTracks", tracks);
901 pakhotin 1.9
902 pakhotin 1.14 // edm::Handle<reco::PFCandidateCollection> pfCandidates;
903     // iEvent.getByLabel("particleFlow", pfCandidates);
904 pakhotin 1.9
905 pakhotin 1.10 b_isIsoDiMuonsOK = false;
906     b_diMuonC_isoTk = -1.;
907     b_diMuonF_isoTk = -1.;
908     b_diMuonC_isoPF = -1.;
909     b_diMuonF_isoPF = -1.;
910 pakhotin 1.3 if ( diMuonC != NULL && diMuonF != NULL ) {
911 pakhotin 1.10 double diMuonC_isoTk = 0.0;
912     double diMuonF_isoTk = 0.0;
913     double diMuonC_isoPF = 0.0;
914     double diMuonF_isoPF = 0.0;
915 pakhotin 1.3 const pat::MultiMuon *diMuonTmp = NULL;
916     for ( unsigned int i = 1; i <= 2; i++ ) {
917 pakhotin 1.10 double diMuonTmp_isoTk = 0.0;
918     double diMuonTmp_isoPF = 0.0;
919 pakhotin 1.3 if ( i == 1 ) diMuonTmp = diMuonC;
920     if ( i == 2 ) diMuonTmp = diMuonF;
921     for (reco::TrackCollection::const_iterator track = tracks->begin(); track != tracks->end(); ++track) {
922     bool trackIsMuon = false;
923     if ( diMuonTmp->sameTrack( &*track, &*(diMuonTmp->muon(0)->innerTrack()) ) || diMuonTmp->sameTrack( &*track, &*(diMuonTmp->muon(1)->innerTrack()) ) ) trackIsMuon = true;
924 pakhotin 1.10 if ( trackIsMuon == false ) {
925 pakhotin 1.3 double dPhi = My_dPhi( diMuonTmp->phi(), track->phi() );
926     double dEta = diMuonTmp->eta() - track->eta();
927 pakhotin 1.10 double dR = sqrt( dPhi*dPhi + dEta*dEta );
928 pakhotin 1.3 if ( dR < 0.4 && track->pt() > 0.5 ) {
929     double dz = fabs( track->dz(beamSpot->position()) - diMuonTmp->dz(beamSpot->position()) );
930 pakhotin 1.10 if ( dz < 0.1 ) diMuonTmp_isoTk += track->pt();
931 pakhotin 1.3 }
932     }
933     }
934 pakhotin 1.14 // for (reco::PFCandidateCollection::const_iterator pfCand = pfCandidates->begin(); pfCand != pfCandidates->end(); ++pfCand) {
935     // if ( pfCand->particleId() == reco::PFCandidate::h ) {
936     // double dPhi = My_dPhi( diMuonTmp->phi(), pfCand->phi() );
937     // double dEta = diMuonTmp->eta() - pfCand->eta();
938     // double dR = sqrt( dPhi*dPhi + dEta*dEta );
939     //// if ( dR < 0.4 && pfCand->pt() > 0.5 ) {
940     // if ( dR < 0.4 ) {
941     // double dz = fabs( pfCand->vertex().z() - beamSpot->position().z() - diMuonTmp->dz(beamSpot->position()) );
942     // if ( dz < 0.1 ) diMuonTmp_isoPF += pfCand->pt();
943     // }
944     // }
945     // }
946 pakhotin 1.10 if ( i == 1 ) {
947     diMuonC_isoTk = diMuonTmp_isoTk;
948     diMuonC_isoPF = diMuonTmp_isoPF;
949     }
950     if ( i == 2 ) {
951     diMuonF_isoTk = diMuonTmp_isoTk;
952     diMuonF_isoPF = diMuonTmp_isoPF;
953     }
954 pakhotin 1.3 }
955 pakhotin 1.10 b_diMuonC_isoTk = diMuonC_isoTk;
956     b_diMuonF_isoTk = diMuonF_isoTk;
957     b_diMuonC_isoPF = diMuonC_isoPF;
958     b_diMuonF_isoPF = diMuonF_isoPF;
959 pakhotin 1.14 // std::cout << "diMuonC_isoTk: " << diMuonC_isoTk << " diMuonC_isoPF: " << diMuonC_isoPF << " diMuonF_isoTk: " << diMuonF_isoTk << " diMuonF_isoPF: " << diMuonF_isoPF << std::endl;
960     if ( diMuonC_isoTk < m_maxIsoDiMuons && diMuonF_isoTk < m_maxIsoDiMuons ) b_isIsoDiMuonsOK = true;
961     // if ( diMuonC_isoPF < m_maxIsoDiMuons && diMuonF_isoPF < m_maxIsoDiMuons ) b_isIsoDiMuonsOK = true;
962 pakhotin 1.3 }
963    
964 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_is2DiMuons && b_isDzDiMuonsOK && b_isDiMuonHLTFired && b_isMassDiMuonsOK && b_isIsoDiMuonsOK && b_isVLT ) m_eventsIsoDiMuonsOK++;
965 pakhotin 1.3
966     edm::Handle<reco::VertexCollection> primaryVertices;
967     iEvent.getByLabel("offlinePrimaryVertices", primaryVertices);
968    
969     bool isVertexOK = false;
970     for (reco::VertexCollection::const_iterator vertex = primaryVertices->begin(); vertex != primaryVertices->end(); ++vertex) {
971 pakhotin 1.10 if (vertex->isValid() && !vertex->isFake() && vertex->tracksSize() >= 4 && fabs(vertex->z()) < 24.) isVertexOK = true;
972 pakhotin 1.3 }
973    
974 pakhotin 1.10 if ( b_is1SelMu17 && b_is4SelMu8 && b_is2MuJets && b_is2DiMuons && b_isDzDiMuonsOK && b_isDiMuonHLTFired && b_isMassDiMuonsOK && b_isIsoDiMuonsOK && isVertexOK && b_isVLT ) m_eventsVertexOK++;
975 pakhotin 1.3
976 pakhotin 1.14 // Add dimuons' Lxy to ntuple
977     reco::VertexCollection::const_iterator closestPrimaryVertex = primaryVertices->end();
978     for (reco::VertexCollection::const_iterator vertex = primaryVertices->begin(); vertex != primaryVertices->end(); ++vertex) {
979     if (vertex->isValid() && !vertex->isFake() && vertex->tracksSize() >= 4 && fabs(vertex->z()) < 24.) {
980     if ( closestPrimaryVertex == primaryVertices->end()
981     || fabs(vertex->z() - muJet0->vertexPoint().z()) < fabs(closestPrimaryVertex->z() - muJet0->vertexPoint().z())
982     ) {
983     closestPrimaryVertex = vertex;
984     }
985     }
986     }
987     b_isOK_diMuonsLxy = false;
988     b_diMuonC_Lxy = -1000.0;
989     b_diMuonF_Lxy = -1000.0;
990     if ( diMuonC != NULL && diMuonF != NULL ) {
991     b_diMuonC_Lxy = diMuonC->lxy(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z());
992     b_diMuonF_Lxy = diMuonF->lxy(closestPrimaryVertex->x(), closestPrimaryVertex->y(), closestPrimaryVertex->z());
993     if ( b_diMuonC_Lxy < 4.0 && b_diMuonF_Lxy < 4.0 ) b_isOK_diMuonsLxy = true;
994     }
995    
996 pakhotin 1.3 m_ttree->Fill();
997    
998 pakhotin 1.1 }
999    
1000    
1001     // ------------ method called once each job just before starting event loop ------------
1002     void
1003     CutFlowAnalyzer::beginJob()
1004     {
1005 pakhotin 1.2 std::cout << "BEGIN JOB" << std::endl;
1006 pakhotin 1.3
1007     edm::Service<TFileService> tFileService;
1008     m_ttree = tFileService->make<TTree>("Events", "Events");
1009 pakhotin 1.5 // Beam spot
1010     m_ttree->Branch("beamSpot_x", &b_beamSpot_x, "beamSpot_x/F");
1011     m_ttree->Branch("beamSpot_y", &b_beamSpot_y, "beamSpot_y/F");
1012     m_ttree->Branch("beamSpot_z", &b_beamSpot_z, "beamSpot_z/F");
1013 pakhotin 1.3 // Bosons
1014 pakhotin 1.5 m_ttree->Branch("genH_m", &b_genH_m, "genH_m/F");
1015 pakhotin 1.3 m_ttree->Branch("genH_p", &b_genH_p, "genH_p/F");
1016     m_ttree->Branch("genH_pT", &b_genH_pT, "genH_pT/F");
1017 pakhotin 1.5 m_ttree->Branch("genH_eta", &b_genH_eta, "genH_eta/F");
1018     m_ttree->Branch("genH_phi", &b_genH_phi, "genH_phi/F");
1019 pakhotin 1.4 m_ttree->Branch("genH_vx", &b_genH_vx, "genH_vx/F");
1020     m_ttree->Branch("genH_vy", &b_genH_vy, "genH_vy/F");
1021     m_ttree->Branch("genH_vz", &b_genH_vz, "genH_vz/F");
1022    
1023 pakhotin 1.5 m_ttree->Branch("genA0_m", &b_genA0_m, "genA0_m/F");
1024 pakhotin 1.14 m_ttree->Branch("genA0_E", &b_genA0_E, "genA0_E/F");
1025 pakhotin 1.3 m_ttree->Branch("genA0_p", &b_genA0_p, "genA0_p/F");
1026     m_ttree->Branch("genA0_pT", &b_genA0_pT, "genA0_pT/F");
1027 pakhotin 1.14 m_ttree->Branch("genA0_px", &b_genA0_px, "genA0_px/F");
1028     m_ttree->Branch("genA0_py", &b_genA0_py, "genA0_py/F");
1029     m_ttree->Branch("genA0_pz", &b_genA0_pz, "genA0_pz/F");
1030 pakhotin 1.3 m_ttree->Branch("genA0_eta", &b_genA0_eta, "genA0_eta/F");
1031 pakhotin 1.5 m_ttree->Branch("genA0_phi", &b_genA0_phi, "genA0_phi/F");
1032     m_ttree->Branch("genA0_vx", &b_genA0_vx, "genA0_vx/F");
1033     m_ttree->Branch("genA0_vy", &b_genA0_vy, "genA0_vy/F");
1034     m_ttree->Branch("genA0_vz", &b_genA0_vz, "genA0_vz/F");
1035    
1036     m_ttree->Branch("genA1_m", &b_genA1_m, "genA1_m/F");
1037 pakhotin 1.14 m_ttree->Branch("genA1_E", &b_genA1_E, "genA1_E/F");
1038 pakhotin 1.3 m_ttree->Branch("genA1_p", &b_genA1_p, "genA1_p/F");
1039     m_ttree->Branch("genA1_pT", &b_genA1_pT, "genA1_pT/F");
1040 pakhotin 1.14 m_ttree->Branch("genA1_px", &b_genA1_px, "genA1_px/F");
1041     m_ttree->Branch("genA1_py", &b_genA1_py, "genA1_py/F");
1042     m_ttree->Branch("genA1_pz", &b_genA1_pz, "genA1_pz/F");
1043 pakhotin 1.3 m_ttree->Branch("genA1_eta", &b_genA1_eta, "genA1_eta/F");
1044 pakhotin 1.5 m_ttree->Branch("genA1_phi", &b_genA1_phi, "genA1_phi/F");
1045     m_ttree->Branch("genA1_vx", &b_genA1_vx, "genA1_vx/F");
1046     m_ttree->Branch("genA1_vy", &b_genA1_vy, "genA1_vy/F");
1047     m_ttree->Branch("genA1_vz", &b_genA1_vz, "genA1_vz/F");
1048    
1049 pakhotin 1.3 // Dimuons
1050 pakhotin 1.5 m_ttree->Branch("genA0Mu0_p", &b_genA0Mu0_p, "genA0Mu0_p/F");
1051     m_ttree->Branch("genA0Mu1_p", &b_genA0Mu1_p, "genA0Mu1_p/F");
1052     m_ttree->Branch("genA1Mu0_p", &b_genA1Mu0_p, "genA1Mu0_p/F");
1053     m_ttree->Branch("genA1Mu1_p", &b_genA1Mu1_p, "genA1Mu1_p/F");
1054    
1055 pakhotin 1.3 m_ttree->Branch("genA0Mu0_pT", &b_genA0Mu0_pT, "genA0Mu0_pT/F");
1056     m_ttree->Branch("genA0Mu1_pT", &b_genA0Mu1_pT, "genA0Mu1_pT/F");
1057     m_ttree->Branch("genA1Mu0_pT", &b_genA1Mu0_pT, "genA1Mu0_pT/F");
1058     m_ttree->Branch("genA1Mu1_pT", &b_genA1Mu1_pT, "genA1Mu1_pT/F");
1059 pakhotin 1.4
1060 pakhotin 1.5 m_ttree->Branch("genA0Mu0_eta", &b_genA0Mu0_eta, "genA0Mu0_eta/F");
1061     m_ttree->Branch("genA0Mu1_eta", &b_genA0Mu1_eta, "genA0Mu1_eta/F");
1062     m_ttree->Branch("genA1Mu0_eta", &b_genA1Mu0_eta, "genA1Mu0_eta/F");
1063     m_ttree->Branch("genA1Mu1_eta", &b_genA1Mu1_eta, "genA1Mu1_eta/F");
1064    
1065     m_ttree->Branch("genA0Mu0_phi", &b_genA0Mu0_phi, "genA0Mu0_phi/F");
1066     m_ttree->Branch("genA0Mu1_phi", &b_genA0Mu1_phi, "genA0Mu1_phi/F");
1067     m_ttree->Branch("genA1Mu0_phi", &b_genA1Mu0_phi, "genA1Mu0_phi/F");
1068     m_ttree->Branch("genA1Mu1_phi", &b_genA1Mu1_phi, "genA1Mu1_phi/F");
1069    
1070 pakhotin 1.4 m_ttree->Branch("genA0Mu0_vx", &b_genA0Mu0_vx, "genA0Mu0_vx/F");
1071     m_ttree->Branch("genA0Mu1_vx", &b_genA0Mu1_vx, "genA0Mu1_vx/F");
1072     m_ttree->Branch("genA1Mu0_vx", &b_genA1Mu0_vx, "genA1Mu0_vx/F");
1073     m_ttree->Branch("genA1Mu1_vx", &b_genA1Mu1_vx, "genA1Mu1_vx/F");
1074    
1075     m_ttree->Branch("genA0Mu0_vy", &b_genA0Mu0_vy, "genA0Mu0_vy/F");
1076     m_ttree->Branch("genA0Mu1_vy", &b_genA0Mu1_vy, "genA0Mu1_vy/F");
1077     m_ttree->Branch("genA1Mu0_vy", &b_genA1Mu0_vy, "genA1Mu0_vy/F");
1078     m_ttree->Branch("genA1Mu1_vy", &b_genA1Mu1_vy, "genA1Mu1_vy/F");
1079    
1080     m_ttree->Branch("genA0Mu0_vz", &b_genA0Mu0_vz, "genA0Mu0_vz/F");
1081     m_ttree->Branch("genA0Mu1_vz", &b_genA0Mu1_vz, "genA0Mu1_vz/F");
1082     m_ttree->Branch("genA1Mu0_vz", &b_genA1Mu0_vz, "genA1Mu0_vz/F");
1083     m_ttree->Branch("genA1Mu1_vz", &b_genA1Mu1_vz, "genA1Mu1_vz/F");
1084    
1085 pakhotin 1.5 m_ttree->Branch("genA0_vLT", &b_genA0_vLT, "genA0_vLT/F");
1086     m_ttree->Branch("genA1_vLT", &b_genA1_vLT, "genA1_vLT/F");
1087     m_ttree->Branch("genA0_vL", &b_genA0_vL, "genA0_vL/F");
1088     m_ttree->Branch("genA1_vL", &b_genA1_vL, "genA1_vL/F");
1089    
1090     m_ttree->Branch("genA0Mu_dEta", &b_genA0Mu_dEta, "genA0Mu_dEta/F");
1091     m_ttree->Branch("genA1Mu_dEta", &b_genA1Mu_dEta, "genA1Mu_dEta/F");
1092     m_ttree->Branch("genA0Mu_dPhi", &b_genA0Mu_dPhi, "genA0Mu_dPhi/F");
1093     m_ttree->Branch("genA1Mu_dPhi", &b_genA1Mu_dPhi, "genA1Mu_dPhi/F");
1094     m_ttree->Branch("genA0Mu_dR", &b_genA0Mu_dR, "genA0Mu_dR/F");
1095     m_ttree->Branch("genA1Mu_dR", &b_genA1Mu_dR, "genA1Mu_dR/F");
1096 pakhotin 1.3
1097     // Generator Muons
1098 pakhotin 1.6 m_ttree->Branch("genMu0_pT", &b_genMu0_pT, "genMu0_pT/F");
1099     m_ttree->Branch("genMu1_pT", &b_genMu1_pT, "genMu1_pT/F");
1100     m_ttree->Branch("genMu2_pT", &b_genMu2_pT, "genMu2_pT/F");
1101     m_ttree->Branch("genMu3_pT", &b_genMu3_pT, "genMu3_pT/F");
1102     m_ttree->Branch("genMu0_eta", &b_genMu0_eta, "genMu0_eta/F");
1103     m_ttree->Branch("genMu1_eta", &b_genMu1_eta, "genMu1_eta/F");
1104     m_ttree->Branch("genMu2_eta", &b_genMu2_eta, "genMu2_eta/F");
1105     m_ttree->Branch("genMu3_eta", &b_genMu3_eta, "genMu3_eta/F");
1106     m_ttree->Branch("genMu0_phi", &b_genMu0_phi, "genMu0_phi/F");
1107     m_ttree->Branch("genMu1_phi", &b_genMu1_phi, "genMu1_phi/F");
1108     m_ttree->Branch("genMu2_phi", &b_genMu2_phi, "genMu2_phi/F");
1109     m_ttree->Branch("genMu3_phi", &b_genMu3_phi, "genMu3_phi/F");
1110    
1111     // Reco Muons
1112     m_ttree->Branch("selMu0_pT", &b_selMu0_pT, "selMu0_pT/F");
1113     m_ttree->Branch("selMu1_pT", &b_selMu1_pT, "selMu1_pT/F");
1114     m_ttree->Branch("selMu2_pT", &b_selMu2_pT, "selMu2_pT/F");
1115     m_ttree->Branch("selMu3_pT", &b_selMu3_pT, "selMu3_pT/F");
1116     m_ttree->Branch("selMu0_eta", &b_selMu0_eta, "selMu0_eta/F");
1117     m_ttree->Branch("selMu1_eta", &b_selMu1_eta, "selMu1_eta/F");
1118     m_ttree->Branch("selMu2_eta", &b_selMu2_eta, "selMu2_eta/F");
1119     m_ttree->Branch("selMu3_eta", &b_selMu3_eta, "selMu3_eta/F");
1120     m_ttree->Branch("selMu0_phi", &b_selMu0_phi, "selMu0_phi/F");
1121     m_ttree->Branch("selMu1_phi", &b_selMu1_phi, "selMu1_phi/F");
1122     m_ttree->Branch("selMu2_phi", &b_selMu2_phi, "selMu2_phi/F");
1123     m_ttree->Branch("selMu3_phi", &b_selMu3_phi, "selMu3_phi/F");
1124 pakhotin 1.3
1125 pakhotin 1.10 m_ttree->Branch("dZDiMuonC", &b_dZDiMuonC, "dZDiMuonC/F");
1126     m_ttree->Branch("dZDiMuonF", &b_dZDiMuonF, "dZDiMuonF/F");
1127     m_ttree->Branch("dZDiMuons", &b_dZDiMuons, "dZDiMuons/F");
1128    
1129     m_ttree->Branch("diMuonC_isoTk", &b_diMuonC_isoTk, "diMuonC_isoTk/F");
1130     m_ttree->Branch("diMuonF_isoTk", &b_diMuonF_isoTk, "diMuonF_isoTk/F");
1131     m_ttree->Branch("diMuonC_isoPF", &b_diMuonC_isoPF, "diMuonC_isoPF/F");
1132     m_ttree->Branch("diMuonF_isoPF", &b_diMuonF_isoPF, "diMuonF_isoPF/F");
1133    
1134 pakhotin 1.14 m_ttree->Branch("diMuonC_Lxy", &b_diMuonC_Lxy, "diMuonC_Lxy/F");
1135     m_ttree->Branch("diMuonF_Lxy", &b_diMuonF_Lxy, "diMuonF_Lxy/F");
1136    
1137 pakhotin 1.10 m_ttree->Branch("is1SelMu17", &b_is1SelMu17, "is1SelMu17/O");
1138     m_ttree->Branch("is4SelMu8", &b_is4SelMu8, "is4SelMu8/O");
1139     m_ttree->Branch("is2MuJets", &b_is2MuJets, "is2MuJets/O");
1140     m_ttree->Branch("is2DiMuons", &b_is2DiMuons, "is2DiMuons/O");
1141     m_ttree->Branch("isDzDiMuonsOK", &b_isDzDiMuonsOK, "isDzDiMuonsOK/O");
1142     m_ttree->Branch("isDiMuonHLTFired", &b_isDiMuonHLTFired, "isDiMuonHLTFired/O");
1143     m_ttree->Branch("isMassDiMuonsOK", &b_isMassDiMuonsOK, "isMassDiMuonsOK/O");
1144     m_ttree->Branch("isIsoDiMuonsOK", &b_isIsoDiMuonsOK, "isIsoDiMuonsOK/O");
1145     m_ttree->Branch("isVLT", &b_isVLT, "isVLT/O");
1146    
1147 pakhotin 1.1 }
1148    
1149     // ------------ method called once each job just after ending the event loop ------------
1150     void
1151     CutFlowAnalyzer::endJob()
1152     {
1153 pakhotin 1.2 std::cout << "END JOB" << std::endl;
1154    
1155 pakhotin 1.3 std:: cout << "Total number of events: " << m_events << std::endl;
1156     std:: cout << "Total number of events with 4mu: " << m_events4GenMu << " fraction: " << m_events4GenMu/m_events << std::endl;
1157    
1158     std:: cout << "********** GEN **********" << std::endl;
1159     std:: cout << "Selection " << "nEv" << " \t RelEff" << " \t Eff" << std::endl;
1160     std:: cout << "pT1>17 |eta1|<0.9: " << m_events1GenMu17 << " \t" << (float)m_events1GenMu17/(float)m_events << " \t" << (float)m_events1GenMu17/(float)m_events << std::endl;
1161     std:: cout << "pT2>8 |eta2|<2.4: " << m_events2GenMu8 << " \t" << (float)m_events2GenMu8/(float)m_events1GenMu17 << " \t" << (float)m_events2GenMu8/(float)m_events << std::endl;
1162     std:: cout << "pT3>8 |eta2|<2.4: " << m_events3GenMu8 << " \t" << (float)m_events3GenMu8/(float)m_events2GenMu8 << " \t" << (float)m_events3GenMu8/(float)m_events << std::endl;
1163     std:: cout << "pT4>8 |eta2|<2.4: " << m_events4GenMu8 << " \t" << (float)m_events4GenMu8/(float)m_events3GenMu8 << " \t" << (float)m_events4GenMu8/(float)m_events << std::endl;
1164     std:: cout << "Basic MC Acceptance: " << (float)m_events4GenMu8/(float)m_events << std::endl;
1165    
1166     std:: cout << "********** RECO **********" << std::endl;
1167     std:: cout << "Selection " << "nEv" << " \t RelEff" << " \t Eff" << std::endl;
1168     std:: cout << "m_events1SelMu17: " << m_events1SelMu17 << " \t" << (float)m_events1SelMu17/(float)m_events << " \t" << (float)m_events1SelMu17/(float)m_events << std::endl;
1169     std:: cout << "m_events2SelMu8: " << m_events2SelMu8 << " \t" << (float)m_events2SelMu8/(float)m_events1SelMu17 << " \t" << (float)m_events2SelMu8/(float)m_events << std::endl;
1170     std:: cout << "m_events3SelMu8: " << m_events3SelMu8 << " \t" << (float)m_events3SelMu8/(float)m_events2SelMu8 << " \t" << (float)m_events3SelMu8/(float)m_events << std::endl;
1171     std:: cout << "m_events4SelMu8: " << m_events4SelMu8 << " \t" << (float)m_events4SelMu8/(float)m_events3SelMu8 << " \t" << (float)m_events4SelMu8/(float)m_events << std::endl;
1172    
1173     std:: cout << "Basic Acceptance: " << (float)m_events4SelMu8/(float)m_events << std::endl;
1174     std:: cout << "Basic MC Accept. a_gen: " << (float)m_events4GenMu8/(float)m_events << std::endl;
1175    
1176     std:: cout << "m_events2MuJets: " << m_events2MuJets << " \t" << (float)m_events2MuJets/(float)m_events4SelMu8 << " \t" << (float)m_events2MuJets/(float)m_events << std::endl;
1177     std:: cout << "m_events2DiMuons: " << m_events2DiMuons << " \t" << (float)m_events2DiMuons/(float)m_events2MuJets << " \t" << (float)m_events2DiMuons/(float)m_events << std::endl;
1178     std:: cout << "m_eventsDz2DiMuonsOK: " << m_eventsDz2DiMuonsOK << " \t" << (float)m_eventsDz2DiMuonsOK/(float)m_events2DiMuons << " \t" << (float)m_eventsDz2DiMuonsOK/(float)m_events << std::endl;
1179     std:: cout << "m_eventsDiMuonsHLTFired: " << m_eventsDiMuonsHLTFired << " \t" << (float)m_eventsDiMuonsHLTFired/(float)m_eventsDz2DiMuonsOK << " \t" << (float)m_eventsDiMuonsHLTFired/(float)m_events << std::endl;
1180     std:: cout << "m_eventsMassDiMuonsOK: " << m_eventsMassDiMuonsOK << " \t" << (float)m_eventsMassDiMuonsOK/(float)m_eventsDiMuonsHLTFired << " \t" << (float)m_eventsMassDiMuonsOK/(float)m_events << std::endl;
1181     std:: cout << "m_eventsIsoDiMuonsOK: " << m_eventsIsoDiMuonsOK << " \t" << (float)m_eventsIsoDiMuonsOK/(float)m_eventsMassDiMuonsOK << " \t" << (float)m_eventsIsoDiMuonsOK/(float)m_events << std::endl;
1182     std:: cout << "m_eventsVertexOK: " << m_eventsVertexOK << " \t" << (float)m_eventsVertexOK/(float)m_eventsIsoDiMuonsOK << " \t" << (float)m_eventsVertexOK/(float)m_events << std::endl;
1183    
1184     std:: cout << "Further selections: " << (float)m_eventsVertexOK/(float)m_events4SelMu8 << std::endl;
1185     std:: cout << "Full sel eff e_full: " << (float)m_eventsVertexOK/(float)m_events << std::endl;
1186     std:: cout << "e_full/a_gen: " << (float)m_eventsVertexOK/(float)m_events4GenMu8 << std::endl;
1187    
1188     std::cout << m_events << std::endl;
1189     std::cout << m_events1GenMu17 << std::endl;
1190     std::cout << m_events2GenMu8 << std::endl;
1191     std::cout << m_events3GenMu8 << std::endl;
1192     std::cout << m_events4GenMu8 << std::endl;
1193     std::cout << m_events1SelMu17 << std::endl;
1194     std::cout << m_events2SelMu8 << std::endl;
1195     std::cout << m_events3SelMu8 << std::endl;
1196     std::cout << m_events4SelMu8 << std::endl;
1197     std::cout << m_events2MuJets << std::endl;
1198     std::cout << m_events2DiMuons << std::endl;
1199     std::cout << m_eventsDz2DiMuonsOK << std::endl;
1200     std::cout << m_eventsDiMuonsHLTFired << std::endl;
1201     std::cout << m_eventsMassDiMuonsOK << std::endl;
1202     std::cout << m_eventsIsoDiMuonsOK << std::endl;
1203     std::cout << m_eventsVertexOK << std::endl;
1204    
1205    
1206 pakhotin 1.1 }
1207    
1208     // ------------ method called when starting to processes a run ------------
1209     void
1210     CutFlowAnalyzer::beginRun(edm::Run const&, edm::EventSetup const&)
1211     {
1212     }
1213    
1214     // ------------ method called when ending the processing of a run ------------
1215     void
1216     CutFlowAnalyzer::endRun(edm::Run const&, edm::EventSetup const&)
1217     {
1218     }
1219    
1220     // ------------ method called when starting to processes a luminosity block ------------
1221     void
1222     CutFlowAnalyzer::beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
1223     {
1224     }
1225    
1226     // ------------ method called when ending the processing of a luminosity block ------------
1227     void
1228     CutFlowAnalyzer::endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
1229     {
1230     }
1231    
1232     // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
1233     void
1234     CutFlowAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
1235     //The following says we do not know what parameters are allowed so do no validation
1236     // Please change this to state exactly what you do use, even if it is no parameters
1237     edm::ParameterSetDescription desc;
1238     desc.setUnknown();
1239     descriptions.addDefault(desc);
1240     }
1241    
1242     //define this as a plug-in
1243     DEFINE_FWK_MODULE(CutFlowAnalyzer);