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

# Content
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 // $Id: NtupleWriter.cc,v 1.13 2012/04/19 14:47:13 peiffer Exp $
17 //
18 //
19
20 #include "UHHAnalysis//NtupleWriter/interface/NtupleWriter.h"
21
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 doGenTopJets = iConfig.getParameter<bool>("doGenTopJets");
54 doPhotons = iConfig.getParameter<bool>("doPhotons");
55 doMET = iConfig.getParameter<bool>("doMET");
56 doGenInfo = iConfig.getParameter<bool>("doGenInfo");
57 doAllGenParticles = iConfig.getParameter<bool>("doAllGenParticles");
58 doLumiInfo = iConfig.getParameter<bool>("doLumiInfo");
59 doPV = iConfig.getParameter<bool>("doPV");
60 doTopJets = iConfig.getParameter<bool>("doTopJets");
61 doTrigger = iConfig.getParameter<bool>("doTrigger");
62
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 if(doLumiInfo){
71 tr->Branch("intgRecLumi",&intgRecLumi);
72 tr->Branch("intgDelLumi",&intgDelLumi);
73 }
74 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 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 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 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 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 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 // ------------- 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
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 }
225
226 // ------------- electrons -------------
227 if(doElectrons){
228
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 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 ele.photonIso = pat_ele.photonIso();
262 ele.puChargedHadronIso = pat_ele.puChargedHadronIso();
263 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 ele.passconversionveto = !ConversionTools::hasMatchedConversion(pat_ele,hConversions,bsp.position());
271 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 //ele.mvaTrigV0=pat_ele.electronID("mvaTrigV0");
279 //ele.mvaNonTrigV0=pat_ele.electronID("mvaNonTrigV0");
280
281 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 mu.photonIso = pat_mu.photonIso();
313 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 mu.innerTrack_trackerLayersWithMeasurement = innerTrack->hitPattern().trackerLayersWithMeasurement();
344 mu.innerTrack_numberOfValidPixelHits = innerTrack->hitPattern().numberOfValidPixelHits();
345 }
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 mu.innerTrack_trackerLayersWithMeasurement = 0;
354 mu.innerTrack_numberOfValidPixelHits = 0;
355 }
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 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
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 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
474 jecUnc->setJetEta(pat_jet.eta());
475 jecUnc->setJetPt(pat_jet.pt());
476 jet.JEC_uncertainty = jecUnc->getUncertainty(true);
477 jet.JEC_factor_raw = pat_jet.jecFactor("Uncorrected");
478
479 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 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 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
511 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 jecUnc->setJetEta(pat_topjet.eta());
539 jecUnc->setJetPt(pat_topjet.pt());
540 topjet.JEC_uncertainty = jecUnc->getUncertainty(true);
541 topjet.JEC_factor_raw = pat_topjet.jecFactor("Uncorrected");
542
543 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 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 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
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 // ------------- 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 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 //std::cout << triggerNames_all[i] << " " << pre.first << " " <<pre.second << " " << hlt_cfg.prescaleValue(iEvent, iSetup, triggerNames_all[i]) << std::endl;
701 }
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
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 if(abs(iter->pdgId())==6 || iter->status()==3 || doAllGenParticles){
773 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
791
792 if (nm>0) genp.mother1 = iter->motherRef(0).key();
793 if (nm>1) genp.mother2 = iter->motherRef(1).key();
794 if (nd>0) genp.daughter1 = iter->daughterRef(0).key();
795 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 genps.push_back(genp);
798 }
799 }
800
801 }
802
803 tr->Fill();
804 if(doLumiInfo)
805 previouslumiblockwasfilled=true;
806 }
807
808
809 // ------------ method called once each job just before starting event loop ------------
810 void
811 NtupleWriter::beginJob()
812 {
813 if(doLumiInfo){
814 totalRecLumi=0;
815 totalDelLumi=0;
816 previouslumiblockwasfilled=false;
817 }
818 }
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 if(doTrigger){
834 bool setup_changed = false;
835 hlt_cfg.init(iRun, iSetup, "HLT", setup_changed);
836 newrun=true;
837 }
838
839 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 }
846
847 // ------------ method called when ending the processing of a run ------------
848 void
849 NtupleWriter::endRun(edm::Run const&, edm::EventSetup const&)
850 {
851 if(doLumiInfo)
852 std::cout << "total integ. luminosity: " << totalDelLumi <<"(del) " << totalRecLumi << "(rec)" << std::endl;
853 }
854
855 // ------------ method called when starting to processes a luminosity block ------------
856 void
857 NtupleWriter::beginLuminosityBlock(edm::LuminosityBlock const& lumi, edm::EventSetup const&)
858 {
859 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 }
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);