ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/UHHAnalysis/NtupleWriter/src/NtupleWriter.cc
Revision: 1.14
Committed: Mon Apr 23 14:26:23 2012 UTC (13 years ago) by peiffer
Content type: text/plain
Branch: MAIN
Changes since 1.13: +55 -6 lines
Log Message:
gentopjets

File Contents

# User Rev Content
1 peiffer 1.1 // -*- C++ -*-
2     //
3     // Package: NtupleWriter
4     // Class: NtupleWriter
5     //
6     /**\class NtupleWriter NtupleWriter.cc NtupleWriter/src/NtupleWriter.cc
7    
8     Description: [one line class summary]
9    
10     Implementation:
11     [Notes on implementation]
12     */
13     //
14     // Original Author: Thomas Peiffer,,,Uni Hamburg
15     // Created: Tue Mar 13 08:43:34 CET 2012
16 peiffer 1.14 // $Id: NtupleWriter.cc,v 1.13 2012/04/19 14:47:13 peiffer Exp $
17 peiffer 1.1 //
18     //
19    
20 peiffer 1.2 #include "UHHAnalysis//NtupleWriter/interface/NtupleWriter.h"
21 peiffer 1.1
22    
23    
24     //
25     // constants, enums and typedefs
26     //
27    
28     //
29     // static data member definitions
30     //
31    
32     //
33     // constructors and destructor
34     //
35     NtupleWriter::NtupleWriter(const edm::ParameterSet& iConfig)
36    
37     {
38     //now do what ever initialization is needed
39     //edm::Service<TFileService> fs;
40     //tr = fs->make<TTree>("AnalysisTree","AnalysisTree");
41    
42     fileName = iConfig.getParameter<std::string>("fileName");
43     outfile = new TFile(fileName,"RECREATE");
44     outfile->cd();
45     tr = new TTree("AnalysisTree","AnalysisTree");
46    
47     std::string name;
48    
49     doElectrons = iConfig.getParameter<bool>("doElectrons");
50     doMuons = iConfig.getParameter<bool>("doMuons");
51     doTaus = iConfig.getParameter<bool>("doTaus");
52     doJets = iConfig.getParameter<bool>("doJets");
53 peiffer 1.14 doGenTopJets = iConfig.getParameter<bool>("doGenTopJets");
54 peiffer 1.1 doPhotons = iConfig.getParameter<bool>("doPhotons");
55     doMET = iConfig.getParameter<bool>("doMET");
56     doGenInfo = iConfig.getParameter<bool>("doGenInfo");
57 peiffer 1.11 doAllGenParticles = iConfig.getParameter<bool>("doAllGenParticles");
58 peiffer 1.10 doLumiInfo = iConfig.getParameter<bool>("doLumiInfo");
59 peiffer 1.1 doPV = iConfig.getParameter<bool>("doPV");
60     doTopJets = iConfig.getParameter<bool>("doTopJets");
61 peiffer 1.6 doTrigger = iConfig.getParameter<bool>("doTrigger");
62 peiffer 1.1
63     // initialization of tree variables
64    
65     tr->Branch("run",&run);
66     tr->Branch("event",&event);
67     tr->Branch("luminosityBlock",&luminosityBlock);
68     tr->Branch("isRealData",&isRealData);
69     tr->Branch("HBHENoiseFilterResult",&HBHENoiseFilterResult);
70 peiffer 1.10 if(doLumiInfo){
71     tr->Branch("intgRecLumi",&intgRecLumi);
72     tr->Branch("intgDelLumi",&intgDelLumi);
73     }
74 peiffer 1.8 if(doPV){
75     tr->Branch("beamspot_x0",&beamspot_x0);
76     tr->Branch("beamspot_y0",&beamspot_y0);
77     tr->Branch("beamspot_z0",&beamspot_z0);
78     }
79 peiffer 1.1 if(doElectrons){
80     electron_sources = iConfig.getParameter<std::vector<std::string> >("electron_sources");
81     for(size_t j=0; j< electron_sources.size(); ++j){
82     tr->Branch( electron_sources[j].c_str(), "std::vector<Electron>", &eles[j]);
83     }
84     }
85     if(doMuons){
86     muon_sources = iConfig.getParameter<std::vector<std::string> >("muon_sources");
87     for(size_t j=0; j< muon_sources.size(); ++j){
88     tr->Branch( muon_sources[j].c_str(), "std::vector<Muon>", &mus[j]);
89     }
90     }
91     if(doTaus){
92     tau_sources = iConfig.getParameter<std::vector<std::string> >("tau_sources");
93     tau_ptmin = iConfig.getParameter<double> ("tau_ptmin");
94     tau_etamax = iConfig.getParameter<double> ("tau_etamax");
95     for(size_t j=0; j< tau_sources.size(); ++j){
96     tr->Branch( tau_sources[j].c_str(), "std::vector<Tau>", &taus[j]);
97     }
98     }
99     if(doJets){
100     jet_sources = iConfig.getParameter<std::vector<std::string> >("jet_sources");
101     jet_ptmin = iConfig.getParameter<double> ("jet_ptmin");
102     jet_etamax = iConfig.getParameter<double> ("jet_etamax");
103     for(size_t j=0; j< jet_sources.size(); ++j){
104     tr->Branch( jet_sources[j].c_str(), "std::vector<Jet>", &jets[j]);
105     }
106     }
107     if(doTopJets){
108     topjet_sources = iConfig.getParameter<std::vector<std::string> >("topjet_sources");
109     topjet_ptmin = iConfig.getParameter<double> ("topjet_ptmin");
110     topjet_etamax = iConfig.getParameter<double> ("topjet_etamax");
111     for(size_t j=0; j< topjet_sources.size(); ++j){
112     tr->Branch( topjet_sources[j].c_str(), "std::vector<TopJet>", &topjets[j]);
113     }
114     }
115 peiffer 1.14 if(doGenTopJets){
116     gentopjet_sources = iConfig.getParameter<std::vector<std::string> >("gentopjet_sources");
117     gentopjet_ptmin = iConfig.getParameter<double> ("gentopjet_ptmin");
118     gentopjet_etamax = iConfig.getParameter<double> ("gentopjet_etamax");
119     for(size_t j=0; j< gentopjet_sources.size(); ++j){
120     tr->Branch( gentopjet_sources[j].c_str(), "std::vector<TopJet>", &gentopjets[j]);
121     }
122     }
123 peiffer 1.1 if(doPhotons){
124     photon_sources = iConfig.getParameter<std::vector<std::string> >("photon_sources");
125     for(size_t j=0; j< photon_sources.size(); ++j){
126     tr->Branch( photon_sources[j].c_str(), "std::vector<Photon>", &phs[j]);
127     }
128     }
129     if(doMET){
130     met_sources = iConfig.getParameter<std::vector<std::string> >("met_sources");
131     for(size_t j=0; j< met_sources.size(); ++j){
132     tr->Branch(met_sources[j].c_str(), "MET", &met[j]);
133     }
134     }
135     if(doPV){
136     pv_sources = iConfig.getParameter<std::vector<std::string> >("pv_sources");
137     for(size_t j=0; j< pv_sources.size(); ++j){
138     tr->Branch( pv_sources[j].c_str(), "std::vector<PrimaryVertex>", &pvs[j]);
139     }
140     }
141     if(doGenInfo){
142     tr->Branch("genInfo","GenInfo",&genInfo);
143     tr->Branch("GenParticles","std::vector<GenParticle>", &genps);
144     }
145 peiffer 1.6 if(doTrigger){
146     trigger_prefixes = iConfig.getParameter<std::vector<std::string> >("trigger_prefixes");
147     //tr->Branch("triggerResults","std::map<std::string, bool>",&triggerResults);
148     tr->Branch("triggerNames", "std::vector<std::string>", &triggerNames);
149     tr->Branch("triggerResults", "std::vector<bool>", &triggerResults);
150     tr->Branch("L1_prescale", "std::vector<int>", &L1_prescale);
151     tr->Branch("HLT_prescale", "std::vector<int>", &HLT_prescale);
152     }
153 peiffer 1.1 newrun = true;
154     }
155    
156    
157     NtupleWriter::~NtupleWriter()
158     {
159    
160     // do anything here that needs to be done at desctruction time
161     // (e.g. close files, deallocate resources etc.)
162    
163     }
164    
165    
166     //
167     // member functions
168     //
169    
170     // ------------ method called for each event ------------
171     void
172     NtupleWriter::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
173     {
174     // using namespace edm;
175    
176    
177     // ------------- common variables -------------
178    
179     run = iEvent.id().run();
180     event = iEvent.id().event();
181     luminosityBlock = iEvent.luminosityBlock();
182     isRealData = iEvent.isRealData();
183    
184     if(isRealData){
185     edm::Handle<bool> bool_handle;
186     iEvent.getByLabel(edm::InputTag("HBHENoiseFilterResultProducer","HBHENoiseFilterResult"),bool_handle);
187     HBHENoiseFilterResult = *(bool_handle.product());
188     }
189     else HBHENoiseFilterResult = false;
190    
191 peiffer 1.5 // ------------- primary vertices and beamspot -------------
192    
193     if(doPV){
194     for(size_t j=0; j< pv_sources.size(); ++j){
195     pvs[j].clear();
196    
197     edm::Handle< std::vector<reco::Vertex> > pv_handle;
198     iEvent.getByLabel(pv_sources[j], pv_handle);
199     const std::vector<reco::Vertex>& reco_pvs = *(pv_handle.product());
200    
201     for (unsigned int i = 0; i < reco_pvs.size(); ++i) {
202     reco::Vertex reco_pv = reco_pvs[i];
203    
204     PrimaryVertex pv;
205     pv.x = reco_pv.x();
206     pv.y = reco_pv.y();
207     pv.z = reco_pv.z();
208     pv.nTracks = reco_pv.nTracks();
209     //pv.isValid = reco_pv.isValid();
210     pv.chi2 = reco_pv.chi2();
211     pv.ndof = reco_pv.ndof();
212    
213     pvs[j].push_back(pv);
214     }
215     }
216 peiffer 1.8
217     edm::Handle<reco::BeamSpot> beamSpot;
218     iEvent.getByLabel(edm::InputTag("offlineBeamSpot"), beamSpot);
219     const reco::BeamSpot & bsp = *beamSpot;
220    
221     beamspot_x0 = bsp.x0();
222     beamspot_y0 = bsp.y0();
223     beamspot_z0 = bsp.z0();
224 peiffer 1.5 }
225    
226 peiffer 1.1 // ------------- electrons -------------
227     if(doElectrons){
228 peiffer 1.10
229     edm::Handle<reco::ConversionCollection> hConversions;
230     iEvent.getByLabel("allConversions", hConversions);
231    
232     edm::Handle<reco::BeamSpot> beamSpot;
233     iEvent.getByLabel(edm::InputTag("offlineBeamSpot"), beamSpot);
234     const reco::BeamSpot & bsp = *beamSpot;
235    
236 peiffer 1.1 for(size_t j=0; j< electron_sources.size(); ++j){
237     eles[j].clear();
238     edm::Handle< std::vector<pat::Electron> > ele_handle;
239     iEvent.getByLabel(electron_sources[j], ele_handle);
240     const std::vector<pat::Electron>& pat_electrons = *(ele_handle.product());
241    
242     for (unsigned int i = 0; i < pat_electrons.size(); ++i) {
243     pat::Electron pat_ele = pat_electrons[i];
244     Electron ele;
245    
246     ele.charge = pat_ele.charge();
247     ele.pt = pat_ele.pt();
248     ele.eta = pat_ele.eta();
249     ele.phi = pat_ele.phi();
250     ele.energy = pat_ele.energy();
251     ele.vertex_x = pat_ele.vertex().x();
252     ele.vertex_y = pat_ele.vertex().y();
253     ele.vertex_z = pat_ele.vertex().z();
254     ele.supercluster_eta = pat_ele.superCluster()->eta();
255     ele.supercluster_phi = pat_ele.superCluster()->phi();
256     ele.dB = pat_ele.dB();
257     //ele.particleIso = pat_ele.particleIso();
258     ele.neutralHadronIso = pat_ele.neutralHadronIso();
259     ele.chargedHadronIso = pat_ele.chargedHadronIso();
260     ele.trackIso = pat_ele.trackIso();
261 peiffer 1.13 ele.photonIso = pat_ele.photonIso();
262 peiffer 1.1 ele.puChargedHadronIso = pat_ele.puChargedHadronIso();
263 peiffer 1.5 ele.gsfTrack_trackerExpectedHitsInner_numberOfLostHits = pat_ele.gsfTrack()->trackerExpectedHitsInner().numberOfLostHits();
264     ele.gsfTrack_px= pat_ele.gsfTrack()->px();
265     ele.gsfTrack_py= pat_ele.gsfTrack()->py();
266     ele.gsfTrack_pz= pat_ele.gsfTrack()->pz();
267     ele.gsfTrack_vx= pat_ele.gsfTrack()->vx();
268     ele.gsfTrack_vy= pat_ele.gsfTrack()->vy();
269     ele.gsfTrack_vz= pat_ele.gsfTrack()->vz();
270 peiffer 1.10 ele.passconversionveto = !ConversionTools::hasMatchedConversion(pat_ele,hConversions,bsp.position());
271 peiffer 1.11 ele.dEtaIn=pat_ele.deltaEtaSuperClusterTrackAtVtx();
272     ele.dPhiIn=pat_ele.deltaPhiSuperClusterTrackAtVtx();
273     ele.sigmaIEtaIEta=pat_ele.sigmaIetaIeta();
274     ele.HoverE=pat_ele.hadronicOverEm();
275     ele.fbrem=pat_ele.fbrem();
276     ele.EoverPIn=pat_ele.eSuperClusterOverP();
277     ele.EcalEnergy=pat_ele.ecalEnergy();
278 peiffer 1.14 //ele.mvaTrigV0=pat_ele.electronID("mvaTrigV0");
279     //ele.mvaNonTrigV0=pat_ele.electronID("mvaNonTrigV0");
280 peiffer 1.11
281 peiffer 1.1 eles[j].push_back(ele);
282     }
283     }
284     }
285    
286     // ------------- muons -------------
287     if(doMuons){
288     for(size_t j=0; j< muon_sources.size(); ++j){
289     mus[j].clear();
290    
291     edm::Handle< std::vector<pat::Muon> > mu_handle;
292     iEvent.getByLabel(muon_sources[j], mu_handle);
293     const std::vector<pat::Muon>& pat_muons = *(mu_handle.product());
294    
295     for (unsigned int i = 0; i <pat_muons.size() ; ++i) {
296     pat::Muon pat_mu = pat_muons[i];
297    
298     Muon mu;
299     mu.charge = pat_mu.charge();
300     mu.pt = pat_mu.pt();
301     mu.eta = pat_mu.eta();
302     mu.phi = pat_mu.phi();
303     mu.energy = pat_mu.energy();
304     mu.vertex_x = pat_mu.vertex().x();
305     mu.vertex_y = pat_mu.vertex().y();
306     mu.vertex_z = pat_mu.vertex().z();
307     mu.dB = pat_mu.dB();
308     //mu.particleIso = pat_mu.particleIso();
309     mu.neutralHadronIso = pat_mu.neutralHadronIso();
310     mu.chargedHadronIso = pat_mu.chargedHadronIso();
311     mu.trackIso = pat_mu.trackIso();
312 peiffer 1.13 mu.photonIso = pat_mu.photonIso();
313 peiffer 1.1 mu.puChargedHadronIso = pat_mu.puChargedHadronIso();
314     mu.isGlobalMuon = pat_mu.isGlobalMuon();
315     mu.isStandAloneMuon = pat_mu.isStandAloneMuon();
316     mu.isTrackerMuon = pat_mu.isTrackerMuon();
317     mu.numberOfMatchedStations = pat_mu.numberOfMatchedStations();
318     reco::TrackRef globalTrack = pat_mu.globalTrack();
319     if(!globalTrack.isNull()){
320     mu.globalTrack_chi2 = globalTrack->chi2();
321     mu.globalTrack_ndof = globalTrack->ndof();
322     mu.globalTrack_d0 = globalTrack->d0();
323     mu.globalTrack_d0Error = globalTrack->d0Error();
324     mu.globalTrack_numberOfValidHits = globalTrack->numberOfValidHits();
325     mu.globalTrack_numberOfLostHits = globalTrack->numberOfLostHits();
326     }
327     else{
328     mu.globalTrack_chi2 = 0;
329     mu.globalTrack_ndof = 0;
330     mu.globalTrack_d0 = 0;
331     mu.globalTrack_d0Error = 0;
332     mu.globalTrack_numberOfValidHits = 0;
333     mu.globalTrack_numberOfLostHits = 0;
334     }
335     reco::TrackRef innerTrack = pat_mu.innerTrack();
336     if(!innerTrack.isNull()){
337     mu.innerTrack_chi2 = innerTrack->chi2();
338     mu.innerTrack_ndof = innerTrack->ndof();
339     mu.innerTrack_d0 = innerTrack->d0();
340     mu.innerTrack_d0Error = innerTrack->d0Error();
341     mu.innerTrack_numberOfValidHits = innerTrack->numberOfValidHits();
342     mu.innerTrack_numberOfLostHits = innerTrack->numberOfLostHits();
343 peiffer 1.11 mu.innerTrack_trackerLayersWithMeasurement = innerTrack->hitPattern().trackerLayersWithMeasurement();
344     mu.innerTrack_numberOfValidPixelHits = innerTrack->hitPattern().numberOfValidPixelHits();
345 peiffer 1.1 }
346     else{
347     mu.innerTrack_chi2 = 0;
348     mu.innerTrack_ndof = 0;
349     mu.innerTrack_d0 = 0;
350     mu.innerTrack_d0Error = 0;
351     mu.innerTrack_numberOfValidHits = 0;
352     mu.innerTrack_numberOfLostHits = 0;
353 peiffer 1.11 mu.innerTrack_trackerLayersWithMeasurement = 0;
354     mu.innerTrack_numberOfValidPixelHits = 0;
355 peiffer 1.1 }
356     reco::TrackRef outerTrack = pat_mu.outerTrack();
357     if(!outerTrack.isNull()){
358     mu.outerTrack_chi2 = outerTrack->chi2();
359     mu.outerTrack_ndof = outerTrack->ndof();
360     mu.outerTrack_d0 = outerTrack->d0();
361     mu.outerTrack_d0Error = outerTrack->d0Error();
362     mu.outerTrack_numberOfValidHits = outerTrack->numberOfValidHits();
363     mu.outerTrack_numberOfLostHits = outerTrack->numberOfLostHits();
364     }
365     else{
366     mu.outerTrack_chi2 = 0;
367     mu.outerTrack_ndof = 0;
368     mu.outerTrack_d0 = 0;
369     mu.outerTrack_d0Error = 0;
370     mu.outerTrack_numberOfValidHits = 0;
371     mu.outerTrack_numberOfLostHits = 0;
372     }
373    
374     mus[j].push_back(mu);
375     }
376     }
377     }
378     // ------------- taus -------------
379    
380     if(doTaus){
381     for(size_t j=0; j< tau_sources.size(); ++j){
382     taus[j].clear();
383    
384    
385     edm::Handle< std::vector<pat::Tau> > tau_handle;
386     iEvent.getByLabel(tau_sources[j], tau_handle);
387     const std::vector<pat::Tau>& pat_taus = *(tau_handle.product());
388    
389     for (unsigned int i = 0; i < pat_taus.size(); ++i) {
390     pat::Tau pat_tau = pat_taus[i];
391     if(pat_tau.pt() < tau_ptmin) continue;
392     if(fabs(pat_tau.eta()) > tau_etamax) continue;
393    
394     Tau tau;
395     tau.charge = pat_tau.charge();
396     tau.pt = pat_tau.pt();
397     tau.eta = pat_tau.eta();
398     tau.phi = pat_tau.phi();
399     tau.energy = pat_tau.energy();
400 peiffer 1.9 tau.decayModeFinding = pat_tau.tauID("decayModeFinding")>0.5;
401     tau.byVLooseCombinedIsolationDeltaBetaCorr = pat_tau.tauID("byVLooseCombinedIsolationDeltaBetaCorr")>0.5;
402     tau.byLooseCombinedIsolationDeltaBetaCorr = pat_tau.tauID("byLooseCombinedIsolationDeltaBetaCorr")>0.5;
403     tau.byMediumCombinedIsolationDeltaBetaCorr = pat_tau.tauID("byMediumCombinedIsolationDeltaBetaCorr")>0.5;
404     tau.byTightCombinedIsolationDeltaBetaCorr = pat_tau.tauID("byTightCombinedIsolationDeltaBetaCorr")>0.5;
405     tau.againstElectronLoose = pat_tau.tauID("againstElectronLoose")>0.5;
406     tau.againstElectronMedium = pat_tau.tauID("againstElectronMedium")>0.5;
407     tau.againstElectronTight = pat_tau.tauID("againstElectronTight")>0.5;
408     tau.againstElectronMVA = pat_tau.tauID("againstElectronMVA")>0.5;
409     tau.againstMuonLoose = pat_tau.tauID("againstMuonLoose")>0.5;
410     tau.againstMuonMedium = pat_tau.tauID("againstMuonMedium")>0.5;
411     tau.againstMuonTight = pat_tau.tauID("againstMuonTight")>0.5;
412 peiffer 1.10
413     reco::PFCandidateRef leadPFCand = pat_tau.leadPFCand();
414     if(!leadPFCand.isNull()){
415     tau.leadPFCand_px = leadPFCand->px();
416     tau.leadPFCand_py = leadPFCand->py();
417     tau.leadPFCand_pz = leadPFCand->pz();
418     }
419     else{
420     tau.leadPFCand_px = 0;
421     tau.leadPFCand_py = 0;
422     tau.leadPFCand_pz = 0;
423     }
424 peiffer 1.1 taus[j].push_back(tau);
425     }
426     }
427     }
428    
429     // ------------- jets -------------
430     if(doJets){
431     for(size_t j=0; j< jet_sources.size(); ++j){
432    
433     jets[j].clear();
434    
435     edm::Handle< std::vector<pat::Jet> > jet_handle;
436     iEvent.getByLabel(jet_sources[j], jet_handle);
437     const std::vector<pat::Jet>& pat_jets = *(jet_handle.product());
438    
439     for (unsigned int i = 0; i < pat_jets.size(); ++i) {
440     pat::Jet pat_jet = pat_jets[i];
441     if(pat_jet.pt() < jet_ptmin) continue;
442     if(fabs(pat_jet.eta()) > jet_etamax) continue;
443     // std::cout << "available btag discriminators: " << std::endl;
444     // const std::vector<std::pair<std::string, float> > & dis = pat_jets[i].getPairDiscri();
445     // for(size_t k=0; k<dis.size(); ++k){
446     // std::cout << dis[k].first << std::endl;
447     // }
448    
449     Jet jet;
450     jet.charge = pat_jet.charge();
451     jet.pt = pat_jet.pt();
452     jet.eta = pat_jet.eta();
453     jet.phi = pat_jet.phi();
454     jet.energy = pat_jet.energy();
455     jet.numberOfDaughters =pat_jet.numberOfDaughters();
456     const reco::TrackRefVector& jettracks = pat_jet.associatedTracks();
457     jet.nTracks = jettracks.size();
458     jet.jetArea = pat_jet.jetArea();
459     jet.pileup = pat_jet.pileup();
460     if(pat_jet.isPFJet()){
461     jet.neutralEmEnergyFraction =pat_jet.neutralEmEnergyFraction();
462     jet.neutralHadronEnergyFraction =pat_jet.neutralHadronEnergyFraction();
463     jet.chargedEmEnergyFraction =pat_jet.chargedEmEnergyFraction();
464     jet.chargedHadronEnergyFraction =pat_jet.chargedHadronEnergyFraction();
465     jet.muonEnergyFraction =pat_jet.muonEnergyFraction();
466     jet.photonEnergyFraction =pat_jet.photonEnergyFraction();
467     jet.chargedMultiplicity =pat_jet.chargedMultiplicity();
468     jet.neutralMultiplicity =pat_jet.neutralMultiplicity();
469     jet.muonMultiplicity =pat_jet.muonMultiplicity();
470     jet.electronMultiplicity =pat_jet.electronMultiplicity();
471     jet.photonMultiplicity =pat_jet.photonMultiplicity();
472     }
473 peiffer 1.5
474     jecUnc->setJetEta(pat_jet.eta());
475     jecUnc->setJetPt(pat_jet.pt());
476     jet.JEC_uncertainty = jecUnc->getUncertainty(true);
477 peiffer 1.12 jet.JEC_factor_raw = pat_jet.jecFactor("Uncorrected");
478 peiffer 1.5
479 peiffer 1.1 jet.btag_simpleSecondaryVertexHighEff=pat_jet.bDiscriminator("simpleSecondaryVertexHighEffBJetTags");
480     jet.btag_simpleSecondaryVertexHighPur=pat_jet.bDiscriminator("simpleSecondaryVertexHighPurBJetTags");
481     jet.btag_combinedSecondaryVertex=pat_jet.bDiscriminator("combinedSecondaryVertexBJetTags");
482     jet.btag_combinedSecondaryVertexMVA=pat_jet.bDiscriminator("combinedSecondaryVertexMVABJetTags");
483     jet.btag_jetBProbability=pat_jet.bDiscriminator("jetBProbabilityBJetTags");
484     jet.btag_jetProbability=pat_jet.bDiscriminator("jetProbabilityBJetTags");
485    
486 peiffer 1.12 const reco::GenJet *genj = pat_jet.genJet();
487     if(genj){
488     jet.genjet_pt = genj->pt();
489     jet.genjet_eta = genj->eta();
490     jet.genjet_phi = genj->phi();
491     jet.genjet_energy = genj->energy();
492     }
493    
494 peiffer 1.1 jets[j].push_back(jet);
495     }
496     }
497     }
498    
499     // ------------- top jets -------------
500     if(doTopJets){
501     for(size_t j=0; j< topjet_sources.size(); ++j){
502    
503     topjets[j].clear();
504    
505     edm::Handle<pat::JetCollection> pat_topjets;
506     //edm::Handle<std::vector<reco::Jet> > pat_topjets;
507     iEvent.getByLabel(topjet_sources[j], pat_topjets);
508    
509     for (unsigned int i = 0; i < pat_topjets->size(); i++) {
510 peiffer 1.14
511 peiffer 1.1 const pat::Jet pat_topjet = * dynamic_cast<pat::Jet const *>(&pat_topjets->at(i));
512     if(pat_topjet.pt() < topjet_ptmin) continue;
513     if(fabs(pat_topjet.eta()) > topjet_etamax) continue;
514    
515     TopJet topjet;
516     topjet.charge = pat_topjet.charge();
517     topjet.pt = pat_topjet.pt();
518     topjet.eta = pat_topjet.eta();
519     topjet.phi = pat_topjet.phi();
520     topjet.energy = pat_topjet.energy();
521     topjet.numberOfDaughters =pat_topjet.numberOfDaughters();
522     const reco::TrackRefVector& topjettracks = pat_topjet.associatedTracks();
523     topjet.nTracks = topjettracks.size();
524     topjet.jetArea = pat_topjet.jetArea();
525     topjet.pileup = pat_topjet.pileup();
526     // topjet.neutralEmEnergyFraction =pat_topjet.neutralEmEnergyFraction();
527     // topjet.neutralHadronEnergyFraction =pat_topjet.neutralHadronEnergyFraction();
528     // topjet.chargedEmEnergyFraction =pat_topjet.chargedEmEnergyFraction();
529     // topjet.chargedHadronEnergyFraction =pat_topjet.chargedHadronEnergyFraction();
530     // topjet.muonEnergyFraction =pat_topjet.muonEnergyFraction();
531     // topjet.photonEnergyFraction =pat_topjet.photonEnergyFraction();
532     // topjet.chargedMultiplicity =pat_topjet.chargedMultiplicity();
533     // topjet.neutralMultiplicity =pat_topjet.neutralMultiplicity();
534     // topjet.muonMultiplicity =pat_topjet.muonMultiplicity();
535     // topjet.electronMultiplicity =pat_topjet.electronMultiplicity();
536     // topjet.photonMultiplicity =pat_topjet.photonMultiplicity();
537    
538 peiffer 1.5 jecUnc->setJetEta(pat_topjet.eta());
539     jecUnc->setJetPt(pat_topjet.pt());
540     topjet.JEC_uncertainty = jecUnc->getUncertainty(true);
541 peiffer 1.12 topjet.JEC_factor_raw = pat_topjet.jecFactor("Uncorrected");
542 peiffer 1.5
543 peiffer 1.1 topjet.btag_simpleSecondaryVertexHighEff=pat_topjet.bDiscriminator("simpleSecondaryVertexHighEffBJetTags");
544     topjet.btag_simpleSecondaryVertexHighPur=pat_topjet.bDiscriminator("simpleSecondaryVertexHighPurBJetTags");
545     topjet.btag_combinedSecondaryVertex=pat_topjet.bDiscriminator("combinedSecondaryVertexBJetTags");
546     topjet.btag_combinedSecondaryVertexMVA=pat_topjet.bDiscriminator("combinedSecondaryVertexMVABJetTags");
547     topjet.btag_jetBProbability=pat_topjet.bDiscriminator("jetBProbabilityBJetTags");
548     topjet.btag_jetProbability=pat_topjet.bDiscriminator("jetProbabilityBJetTags");
549    
550 peiffer 1.12 const reco::GenJet *genj = pat_topjet.genJet();
551     if(genj){
552     topjet.genjet_pt = genj->pt();
553     topjet.genjet_eta = genj->eta();
554     topjet.genjet_phi = genj->phi();
555     topjet.genjet_energy = genj->energy();
556     }
557    
558 peiffer 1.1 for (unsigned int k = 0; k < pat_topjet.numberOfDaughters(); k++) {
559     Particle subjet_v4;
560     subjet_v4.pt = pat_topjet.daughter(k)->p4().pt();
561     subjet_v4.eta = pat_topjet.daughter(k)->p4().eta();
562     subjet_v4.phi = pat_topjet.daughter(k)->p4().phi();
563     subjet_v4.energy = pat_topjet.daughter(k)->p4().E();
564     topjet.subjets.push_back(subjet_v4);
565     }
566     topjets[j].push_back(topjet);
567     }
568     }
569     }
570    
571 peiffer 1.14
572     // ------------- generator top jets -------------
573     if(doGenTopJets){
574     for(size_t j=0; j< gentopjet_sources.size(); ++j){
575    
576     gentopjets[j].clear();
577    
578     edm::Handle<reco::BasicJetCollection> reco_gentopjets;
579     //edm::Handle<std::vector<reco::Jet> > reco_gentopjets;
580     iEvent.getByLabel(gentopjet_sources[j], reco_gentopjets);
581    
582     for (unsigned int i = 0; i < reco_gentopjets->size(); i++) {
583    
584     const reco::BasicJet reco_gentopjet = reco_gentopjets->at(i);
585     if(reco_gentopjet.pt() < gentopjet_ptmin) continue;
586     if(fabs(reco_gentopjet.eta()) > gentopjet_etamax) continue;
587    
588     TopJet gentopjet;
589     gentopjet.charge = reco_gentopjet.charge();
590     gentopjet.pt = reco_gentopjet.pt();
591     gentopjet.eta = reco_gentopjet.eta();
592     gentopjet.phi = reco_gentopjet.phi();
593     gentopjet.energy = reco_gentopjet.energy();
594     gentopjet.numberOfDaughters =reco_gentopjet.numberOfDaughters();
595    
596     for (unsigned int k = 0; k < reco_gentopjet.numberOfDaughters(); k++) {
597     Particle subjet_v4;
598     subjet_v4.pt = reco_gentopjet.daughter(k)->p4().pt();
599     subjet_v4.eta = reco_gentopjet.daughter(k)->p4().eta();
600     subjet_v4.phi = reco_gentopjet.daughter(k)->p4().phi();
601     subjet_v4.energy = reco_gentopjet.daughter(k)->p4().E();
602     gentopjet.subjets.push_back(subjet_v4);
603     }
604     gentopjets[j].push_back(gentopjet);
605     }
606     }
607     }
608    
609 peiffer 1.1 // ------------- photons -------------
610     if(doPhotons){
611     for(size_t j=0; j< photon_sources.size(); ++j){
612     phs[j].clear();
613    
614     edm::Handle< std::vector<pat::Photon> > photon_handle;
615     iEvent.getByLabel(photon_sources[j], photon_handle);
616     const std::vector<pat::Photon>& pat_photons = *(photon_handle.product());
617    
618     for (unsigned int i = 0; i < pat_photons.size(); ++i) {
619     pat::Photon pat_photon = pat_photons[i];
620     Photon ph;
621     ph.charge = 0;
622     ph.pt = pat_photon.pt();
623     ph.eta = pat_photon.eta();
624     ph.phi = pat_photon.phi();
625     ph.energy = pat_photon.energy();
626     ph.vertex_x = pat_photon.vertex().x();
627     ph.vertex_y = pat_photon.vertex().y();
628     ph.vertex_z = pat_photon.vertex().z();
629     ph.supercluster_eta = pat_photon.superCluster()->eta();
630     ph.supercluster_phi = pat_photon.superCluster()->phi();
631     // ph.neutralHadronIso = pat_photon.neutralHadronIso();
632     // ph.chargedHadronIso = pat_photon.chargedHadronIso();
633     ph.trackIso = pat_photon.trackIso();
634     phs[j].push_back(ph);
635     }
636     }
637     }
638    
639     // ------------- MET -------------
640     if(doMET){
641     for(size_t j=0; j< met_sources.size(); ++j){
642    
643     edm::Handle< std::vector<pat::MET> > met_handle;
644     iEvent.getByLabel(met_sources[j], met_handle);
645     const std::vector<pat::MET>& pat_mets = *(met_handle.product());
646    
647     if(pat_mets.size()!=1){
648     std::cout<< "WARNING: number of METs = " << pat_mets.size() <<", should be 1" << std::endl;
649     }
650     else{
651     pat::MET pat_met = pat_mets[0];
652    
653     met[j].pt=pat_met.pt();
654     met[j].phi=pat_met.phi();
655     met[j].mEtSig= pat_met.mEtSig();
656     }
657    
658     }
659     }
660    
661     // ------------- trigger -------------
662 peiffer 1.6 if(doTrigger){
663     edm::InputTag triggerEvent = edm::InputTag("hltTriggerSummaryAOD");
664     edm::Handle< trigger::TriggerEvent > dummy_TriggerEvent;
665     iEvent.getByLabel( edm::InputTag(triggerEvent.label(), triggerEvent.instance()), dummy_TriggerEvent );
666    
667     const edm::Provenance *meta = dummy_TriggerEvent.provenance();
668     std::string nameProcess = meta->processName();
669     edm::InputTag triggerResultTag = edm::InputTag("TriggerResults");
670     triggerResultTag = edm::InputTag( triggerResultTag.label(), triggerResultTag.instance(), nameProcess );
671    
672     edm::Handle<edm::TriggerResults> trigger;
673     iEvent.getByLabel(triggerResultTag, trigger);
674     const edm::TriggerResults& trig = *(trigger.product());
675    
676     triggerResults.clear();
677     triggerNames.clear();
678     L1_prescale.clear();
679     HLT_prescale.clear();
680    
681     edm::Service<edm::service::TriggerNamesService> tns;
682     std::vector<std::string> triggerNames_all;
683     tns->getTrigPaths(trig,triggerNames_all);
684    
685     if (trig.size()!=triggerNames_all.size()) std::cout <<"ERROR: length of names and paths not the same: "<<triggerNames_all.size()<<","<<trig.size()<< std::endl;
686     for(unsigned int i=0; i<trig.size(); ++i){
687     std::vector<std::string>::const_iterator it = trigger_prefixes.begin();
688     for(; it!=trigger_prefixes.end(); ++it){
689     if(triggerNames_all[i].substr(0, it->size()) == *it)break;
690     }
691     if(it==trigger_prefixes.end()) continue;
692    
693     //triggerResults.insert(std::pair<std::string, bool>(triggerNames[i],trig.accept(i)));
694     triggerResults.push_back(trig.accept(i));
695     if(newrun) triggerNames.push_back(triggerNames_all[i]);
696     if(isRealData){
697     std::pair<int, int> pre=hlt_cfg.prescaleValues(iEvent, iSetup, triggerNames_all[i]);
698     L1_prescale.push_back(pre.first);
699     HLT_prescale.push_back(pre.second);
700 peiffer 1.10 //std::cout << triggerNames_all[i] << " " << pre.first << " " <<pre.second << " " << hlt_cfg.prescaleValue(iEvent, iSetup, triggerNames_all[i]) << std::endl;
701 peiffer 1.6 }
702     }
703     // for(std::map<std::string, bool>::const_iterator iter = triggerResults.begin(); iter!=triggerResults.end(); iter++){
704     // std::cout << (*iter).first << " " << (*iter).second << std::endl;
705     // }
706     newrun=false;
707     }
708 peiffer 1.1
709     // ------------- generator info -------------
710    
711     if(doGenInfo){
712     genInfo.weights.clear();
713     genInfo.binningValues.clear();
714     genps.clear();
715    
716     edm::Handle<GenEventInfoProduct> genEventInfoProduct;
717     iEvent.getByLabel("generator", genEventInfoProduct);
718     const GenEventInfoProduct& genEventInfo = *(genEventInfoProduct.product());
719    
720     genInfo.binningValues = genEventInfo.binningValues();
721     genInfo.weights = genEventInfo.weights();
722     genInfo.alphaQCD = genEventInfo.alphaQCD();
723     genInfo.alphaQED = genEventInfo.alphaQED();
724     genInfo.qScale = genEventInfo.qScale();
725    
726     const gen::PdfInfo* pdf = genEventInfo.pdf();
727     if(pdf){
728     genInfo.pdf_id1=pdf->id.first;
729     genInfo.pdf_id2=pdf->id.second;
730     genInfo.pdf_x1=pdf->x.first;
731     genInfo.pdf_x2=pdf->x.second;
732     genInfo.pdf_scalePDF=pdf->scalePDF;
733     genInfo.pdf_xPDF1=pdf->xPDF.first;
734     genInfo.pdf_xPDF2=pdf->xPDF.second;
735     }
736     else{
737     genInfo.pdf_id1=-999;
738     genInfo.pdf_id2=-999;
739     genInfo.pdf_x1=-999;
740     genInfo.pdf_x2=-999;
741     genInfo.pdf_scalePDF=-999;
742     genInfo.pdf_xPDF1=-999;
743     genInfo.pdf_xPDF2=-999;
744     }
745    
746     edm::Handle<std::vector<PileupSummaryInfo> > pus;
747     iEvent.getByLabel(edm::InputTag("addPileupInfo"), pus);
748     genInfo.pileup_NumInteractions_intime=0;
749     genInfo.pileup_NumInteractions_ootbefore=0;
750     genInfo.pileup_NumInteractions_ootafter=0;
751     if(pus.isValid()){
752     genInfo.pileup_TrueNumInteractions = (float) pus->at(0).getTrueNumInteractions();
753     for(size_t i=0; i<pus->size(); ++i){
754     if(pus->at(i).getBunchCrossing() == 0) // intime pileup
755     genInfo.pileup_NumInteractions_intime += pus->at(i).getPU_NumInteractions();
756     else if(pus->at(i).getBunchCrossing() == -1){ // oot pileup before
757     genInfo.pileup_NumInteractions_ootbefore += pus->at(i).getPU_NumInteractions();
758     }
759     else if(pus->at(i).getBunchCrossing() == +1){ // oot pileup before
760     genInfo.pileup_NumInteractions_ootafter += pus->at(i).getPU_NumInteractions();
761     }
762     }
763     }
764    
765     edm::Handle<reco::GenParticleCollection> genPartColl;
766     iEvent.getByLabel(edm::InputTag("genParticles"), genPartColl);
767     int index=-1;
768     for(reco::GenParticleCollection::const_iterator iter = genPartColl->begin(); iter != genPartColl->end(); ++ iter){
769     index++;
770    
771     //write out only top quarks and status 3 particles (works fine only for MadGraph)
772 peiffer 1.11 if(abs(iter->pdgId())==6 || iter->status()==3 || doAllGenParticles){
773 peiffer 1.1 GenParticle genp;
774     genp.charge = iter->charge();;
775     genp.pt = iter->p4().pt();
776     genp.eta = iter->p4().eta();
777     genp.phi = iter->p4().phi();
778     genp.energy = iter->p4().E();
779     genp.index =index;
780     genp.status = iter->status();
781     genp.pdgId = iter->pdgId();
782    
783     genp.mother1=-1;
784     genp.mother2=-1;
785     genp.daughter1=-1;
786     genp.daughter2=-1;
787    
788     int nm=iter->numberOfMothers();
789     int nd=iter->numberOfDaughters();
790 peiffer 1.14
791 peiffer 1.1
792     if (nm>0) genp.mother1 = iter->motherRef(0).key();
793 peiffer 1.14 if (nm>1) genp.mother2 = iter->motherRef(1).key();
794 peiffer 1.1 if (nd>0) genp.daughter1 = iter->daughterRef(0).key();
795 peiffer 1.14 if (nd>1) genp.daughter2 = iter->daughterRef(1).key();
796     //std::cout << genp.index <<" pdgId = " << genp.pdgId << " mo1 = " << genp.mother1 << " mo2 = " << genp.mother2 <<" da1 = " << genp.daughter1 << " da2 = " << genp.daughter2 <<std::endl;
797 peiffer 1.1 genps.push_back(genp);
798     }
799     }
800    
801     }
802    
803     tr->Fill();
804 peiffer 1.10 if(doLumiInfo)
805     previouslumiblockwasfilled=true;
806 peiffer 1.1 }
807    
808    
809     // ------------ method called once each job just before starting event loop ------------
810     void
811     NtupleWriter::beginJob()
812     {
813 peiffer 1.10 if(doLumiInfo){
814     totalRecLumi=0;
815     totalDelLumi=0;
816     previouslumiblockwasfilled=false;
817     }
818 peiffer 1.1 }
819    
820     // ------------ method called once each job just after ending the event loop ------------
821     void
822     NtupleWriter::endJob()
823     {
824     outfile->cd();
825     tr->Write();
826     outfile->Close();
827     }
828    
829     // ------------ method called when starting to processes a run ------------
830     void
831     NtupleWriter::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup)
832     {
833 peiffer 1.7 if(doTrigger){
834     bool setup_changed = false;
835     hlt_cfg.init(iRun, iSetup, "HLT", setup_changed);
836     newrun=true;
837     }
838 peiffer 1.5
839 peiffer 1.7 if(doJets || doTopJets){
840     edm::ESHandle<JetCorrectorParametersCollection> JetCorParColl;
841     iSetup.get<JetCorrectionsRecord>().get("AK5PF",JetCorParColl);
842     JetCorrectorParameters const & JetCorPar = (*JetCorParColl)["Uncertainty"];
843     jecUnc = new JetCorrectionUncertainty(JetCorPar);
844     }
845 peiffer 1.1 }
846    
847     // ------------ method called when ending the processing of a run ------------
848     void
849     NtupleWriter::endRun(edm::Run const&, edm::EventSetup const&)
850     {
851 peiffer 1.10 if(doLumiInfo)
852     std::cout << "total integ. luminosity: " << totalDelLumi <<"(del) " << totalRecLumi << "(rec)" << std::endl;
853 peiffer 1.1 }
854    
855     // ------------ method called when starting to processes a luminosity block ------------
856     void
857 peiffer 1.10 NtupleWriter::beginLuminosityBlock(edm::LuminosityBlock const& lumi, edm::EventSetup const&)
858 peiffer 1.1 {
859 peiffer 1.10 if(doLumiInfo){
860     edm::Handle<LumiSummary> l;
861     lumi.getByLabel("lumiProducer", l);
862    
863     //add lumi of lumi blocks without any event to next lumiblock
864     if(previouslumiblockwasfilled){
865     intgRecLumi=0;
866     intgDelLumi=0;
867     }
868     previouslumiblockwasfilled=false;
869    
870     if (l.isValid()){;
871     intgRecLumi+=l->intgRecLumi()*6.37;
872     intgDelLumi+=l->intgDelLumi()*6.37;
873     totalRecLumi+=l->intgRecLumi()*6.37;
874     totalDelLumi+=l->intgDelLumi()*6.37;
875     }
876     //std::cout << "this lb: " <<l->intgRecLumi()*6.37 <<" " << l->intgDelLumi()*6.37<<std::endl;
877     //std::cout << "summed: "<< intgRecLumi << " " << intgDelLumi << std::endl;
878     }
879 peiffer 1.1 }
880    
881     // ------------ method called when ending the processing of a luminosity block ------------
882     void
883     NtupleWriter::endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
884     {
885     }
886    
887     // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
888     void
889     NtupleWriter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
890     //The following says we do not know what parameters are allowed so do no validation
891     // Please change this to state exactly what you do use, even if it is no parameters
892     edm::ParameterSetDescription desc;
893     desc.setUnknown();
894     descriptions.addDefault(desc);
895     }
896    
897     //define this as a plug-in
898     DEFINE_FWK_MODULE(NtupleWriter);