ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/UHHAnalysis/NtupleWriter/src/NtupleWriter.cc
Revision: 1.10
Committed: Wed Apr 18 12:53:46 2012 UTC (13 years ago) by peiffer
Content type: text/plain
Branch: MAIN
Changes since 1.9: +58 -5 lines
Log Message:
lumi tools and taus

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