ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/UHHAnalysis/NtupleWriter/src/NtupleWriter.cc
Revision: 1.8
Committed: Wed Apr 11 15:37:04 2012 UTC (13 years, 1 month ago) by peiffer
Content type: text/plain
Branch: MAIN
Changes since 1.7: +14 -13 lines
Log Message:
beamspot switch

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