ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/UHHAnalysis/NtupleWriter/src/NtupleWriter.cc
Revision: 1.30
Committed: Thu Jun 20 15:03:51 2013 UTC (11 years, 10 months ago) by jott
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.29: +108 -267 lines
Log Message:
cleanup of code duplication, esp. for jet variables and for pfcandidate saving

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 jott 1.30 // $Id: NtupleWriter.cc,v 1.29 2013/06/19 22:05:46 rkogler Exp $
17 peiffer 1.1 //
18     //
19    
20 eusai 1.23 #include "UHHAnalysis/NtupleWriter/interface/NtupleWriter.h"
21 rkogler 1.27 #include "UHHAnalysis/NtupleWriter/interface/JetProps.h"
22 eusai 1.23 #include "RecoBTau/JetTagComputer/interface/GenericMVAJetTagComputer.h"
23     #include "RecoBTau/JetTagComputer/interface/GenericMVAJetTagComputerWrapper.h"
24     #include "RecoBTau/JetTagComputer/interface/JetTagComputer.h"
25     #include "RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h"
26     #include "RecoBTag/SecondaryVertex/interface/CombinedSVComputer.h"
27 rkogler 1.27 #include "DataFormats/TrackReco/interface/Track.h"
28 peiffer 1.1
29 jott 1.30 namespace{
30    
31     /// Use info from pat_jet to fill info in jet
32     void fill_jet_info(const pat::Jet & pat_jet, Jet & jet)
33     {
34     jet.set_charge(pat_jet.charge());
35     jet.set_pt(pat_jet.pt());
36     jet.set_eta(pat_jet.eta());
37     jet.set_phi(pat_jet.phi());
38     jet.set_energy(pat_jet.energy());
39     jet.set_flavor(pat_jet.partonFlavour());
40     jet.set_numberOfDaughters (pat_jet.numberOfDaughters());
41     const reco::TrackRefVector& jettracks = pat_jet.associatedTracks();
42     jet.set_nTracks ( jettracks.size());
43     jet.set_jetArea(pat_jet.jetArea());
44     if(pat_jet.isPFJet()){
45     jet.set_neutralEmEnergyFraction (pat_jet.neutralEmEnergyFraction());
46     jet.set_neutralHadronEnergyFraction (pat_jet.neutralHadronEnergyFraction());
47     jet.set_chargedEmEnergyFraction (pat_jet.chargedEmEnergyFraction());
48     jet.set_chargedHadronEnergyFraction (pat_jet.chargedHadronEnergyFraction());
49     jet.set_muonEnergyFraction (pat_jet.muonEnergyFraction());
50     jet.set_photonEnergyFraction (pat_jet.photonEnergyFraction());
51     jet.set_chargedMultiplicity (pat_jet.chargedMultiplicity());
52     jet.set_neutralMultiplicity (pat_jet.neutralMultiplicity());
53     jet.set_muonMultiplicity (pat_jet.muonMultiplicity());
54     jet.set_electronMultiplicity (pat_jet.electronMultiplicity());
55     jet.set_photonMultiplicity (pat_jet.photonMultiplicity());
56     }
57     jet.set_JEC_factor_raw(pat_jet.jecFactor("Uncorrected"));
58     jet.set_btag_simpleSecondaryVertexHighEff(pat_jet.bDiscriminator("simpleSecondaryVertexHighEffBJetTags"));
59     jet.set_btag_simpleSecondaryVertexHighPur(pat_jet.bDiscriminator("simpleSecondaryVertexHighPurBJetTags"));
60     jet.set_btag_combinedSecondaryVertex(pat_jet.bDiscriminator("combinedSecondaryVertexBJetTags"));
61     jet.set_btag_combinedSecondaryVertexMVA(pat_jet.bDiscriminator("combinedSecondaryVertexMVABJetTags"));
62     jet.set_btag_jetBProbability(pat_jet.bDiscriminator("jetBProbabilityBJetTags"));
63     jet.set_btag_jetProbability(pat_jet.bDiscriminator("jetProbabilityBJetTags"));
64     }
65 peiffer 1.1
66 jott 1.30 }
67 peiffer 1.1
68     //
69     // constructors and destructor
70     //
71     NtupleWriter::NtupleWriter(const edm::ParameterSet& iConfig)
72     {
73 jott 1.30 fileName = iConfig.getParameter<std::string>("fileName");
74 peiffer 1.1 outfile = new TFile(fileName,"RECREATE");
75     outfile->cd();
76     tr = new TTree("AnalysisTree","AnalysisTree");
77    
78     doElectrons = iConfig.getParameter<bool>("doElectrons");
79     doMuons = iConfig.getParameter<bool>("doMuons");
80     doTaus = iConfig.getParameter<bool>("doTaus");
81     doJets = iConfig.getParameter<bool>("doJets");
82 peiffer 1.24 doGenJets = iConfig.getParameter<bool>("doGenJets");
83 peiffer 1.14 doGenTopJets = iConfig.getParameter<bool>("doGenTopJets");
84 peiffer 1.1 doPhotons = iConfig.getParameter<bool>("doPhotons");
85     doMET = iConfig.getParameter<bool>("doMET");
86     doGenInfo = iConfig.getParameter<bool>("doGenInfo");
87 peiffer 1.11 doAllGenParticles = iConfig.getParameter<bool>("doAllGenParticles");
88 peiffer 1.10 doLumiInfo = iConfig.getParameter<bool>("doLumiInfo");
89 peiffer 1.1 doPV = iConfig.getParameter<bool>("doPV");
90     doTopJets = iConfig.getParameter<bool>("doTopJets");
91 rkogler 1.27 doTopJetsConstituents = iConfig.getParameter<bool>("doTopJetsConstituents");
92 peiffer 1.6 doTrigger = iConfig.getParameter<bool>("doTrigger");
93 eusai 1.23 SVComputer_ = iConfig.getUntrackedParameter<edm::InputTag>("svComputer",edm::InputTag("combinedSecondaryVertex"));
94     doTagInfos = iConfig.getUntrackedParameter<bool>("doTagInfos",false);
95 rkogler 1.29 storePFsAroundLeptons = iConfig.getUntrackedParameter<bool>("storePFsAroundLeptons",false);
96 rkogler 1.27
97 peiffer 1.1 // initialization of tree variables
98    
99     tr->Branch("run",&run);
100     tr->Branch("event",&event);
101     tr->Branch("luminosityBlock",&luminosityBlock);
102     tr->Branch("isRealData",&isRealData);
103 peiffer 1.18 tr->Branch("rho",&rho);
104     rho_source = iConfig.getParameter<edm::InputTag>("rho_source");
105    
106 peiffer 1.10 if(doLumiInfo){
107     tr->Branch("intgRecLumi",&intgRecLumi);
108     tr->Branch("intgDelLumi",&intgDelLumi);
109     }
110 peiffer 1.8 if(doPV){
111     tr->Branch("beamspot_x0",&beamspot_x0);
112     tr->Branch("beamspot_y0",&beamspot_y0);
113     tr->Branch("beamspot_z0",&beamspot_z0);
114     }
115 peiffer 1.1 if(doElectrons){
116     electron_sources = iConfig.getParameter<std::vector<std::string> >("electron_sources");
117     for(size_t j=0; j< electron_sources.size(); ++j){
118     tr->Branch( electron_sources[j].c_str(), "std::vector<Electron>", &eles[j]);
119     }
120     }
121     if(doMuons){
122     muon_sources = iConfig.getParameter<std::vector<std::string> >("muon_sources");
123     for(size_t j=0; j< muon_sources.size(); ++j){
124     tr->Branch( muon_sources[j].c_str(), "std::vector<Muon>", &mus[j]);
125     }
126     }
127     if(doTaus){
128     tau_sources = iConfig.getParameter<std::vector<std::string> >("tau_sources");
129     tau_ptmin = iConfig.getParameter<double> ("tau_ptmin");
130     tau_etamax = iConfig.getParameter<double> ("tau_etamax");
131     for(size_t j=0; j< tau_sources.size(); ++j){
132     tr->Branch( tau_sources[j].c_str(), "std::vector<Tau>", &taus[j]);
133     }
134     }
135     if(doJets){
136     jet_sources = iConfig.getParameter<std::vector<std::string> >("jet_sources");
137     jet_ptmin = iConfig.getParameter<double> ("jet_ptmin");
138     jet_etamax = iConfig.getParameter<double> ("jet_etamax");
139     for(size_t j=0; j< jet_sources.size(); ++j){
140     tr->Branch( jet_sources[j].c_str(), "std::vector<Jet>", &jets[j]);
141     }
142     }
143 peiffer 1.24 if(doGenJets){
144     genjet_sources = iConfig.getParameter<std::vector<std::string> >("genjet_sources");
145     genjet_ptmin = iConfig.getParameter<double> ("genjet_ptmin");
146     genjet_etamax = iConfig.getParameter<double> ("genjet_etamax");
147     for(size_t j=0; j< genjet_sources.size(); ++j){
148     tr->Branch( genjet_sources[j].c_str(), "std::vector<Particle>", &genjets[j]);
149     }
150     }
151 peiffer 1.1 if(doTopJets){
152     topjet_sources = iConfig.getParameter<std::vector<std::string> >("topjet_sources");
153     topjet_ptmin = iConfig.getParameter<double> ("topjet_ptmin");
154     topjet_etamax = iConfig.getParameter<double> ("topjet_etamax");
155     for(size_t j=0; j< topjet_sources.size(); ++j){
156     tr->Branch( topjet_sources[j].c_str(), "std::vector<TopJet>", &topjets[j]);
157     }
158     }
159 rkogler 1.27 if(doTopJetsConstituents){
160     topjet_constituents_sources = iConfig.getParameter<std::vector<std::string> >("topjet_constituents_sources");
161     tr->Branch( "PFParticles", "std::vector<PFParticle>", &pfparticles);
162     }
163 peiffer 1.14 if(doGenTopJets){
164     gentopjet_sources = iConfig.getParameter<std::vector<std::string> >("gentopjet_sources");
165     gentopjet_ptmin = iConfig.getParameter<double> ("gentopjet_ptmin");
166     gentopjet_etamax = iConfig.getParameter<double> ("gentopjet_etamax");
167     for(size_t j=0; j< gentopjet_sources.size(); ++j){
168 rkogler 1.27 tr->Branch( gentopjet_sources[j].c_str(), "std::vector<GenTopJet>", &gentopjets[j]);
169 peiffer 1.14 }
170     }
171 peiffer 1.1 if(doPhotons){
172     photon_sources = iConfig.getParameter<std::vector<std::string> >("photon_sources");
173     for(size_t j=0; j< photon_sources.size(); ++j){
174     tr->Branch( photon_sources[j].c_str(), "std::vector<Photon>", &phs[j]);
175     }
176     }
177     if(doMET){
178     met_sources = iConfig.getParameter<std::vector<std::string> >("met_sources");
179     for(size_t j=0; j< met_sources.size(); ++j){
180     tr->Branch(met_sources[j].c_str(), "MET", &met[j]);
181     }
182     }
183     if(doPV){
184     pv_sources = iConfig.getParameter<std::vector<std::string> >("pv_sources");
185     for(size_t j=0; j< pv_sources.size(); ++j){
186     tr->Branch( pv_sources[j].c_str(), "std::vector<PrimaryVertex>", &pvs[j]);
187     }
188     }
189     if(doGenInfo){
190 peiffer 1.22 genparticle_source= iConfig.getParameter<edm::InputTag>("genparticle_source");
191 peiffer 1.1 tr->Branch("genInfo","GenInfo",&genInfo);
192     tr->Branch("GenParticles","std::vector<GenParticle>", &genps);
193     }
194 peiffer 1.6 if(doTrigger){
195     trigger_prefixes = iConfig.getParameter<std::vector<std::string> >("trigger_prefixes");
196     //tr->Branch("triggerResults","std::map<std::string, bool>",&triggerResults);
197     tr->Branch("triggerNames", "std::vector<std::string>", &triggerNames);
198     tr->Branch("triggerResults", "std::vector<bool>", &triggerResults);
199 peiffer 1.16 //tr->Branch("L1_prescale", "std::vector<int>", &L1_prescale);
200     //tr->Branch("HLT_prescale", "std::vector<int>", &HLT_prescale);
201 peiffer 1.6 }
202 rkogler 1.29 if (storePFsAroundLeptons){
203     pf_around_leptons_source = iConfig.getParameter<std::string>("pf_around_leptons_source");
204     }
205 peiffer 1.1 newrun = true;
206     }
207    
208    
209     NtupleWriter::~NtupleWriter()
210     {
211    
212     // do anything here that needs to be done at desctruction time
213     // (e.g. close files, deallocate resources etc.)
214    
215     }
216    
217    
218     //
219     // member functions
220     //
221    
222     // ------------ method called for each event ------------
223 jott 1.30 void NtupleWriter::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
224 peiffer 1.1 {
225     // ------------- common variables -------------
226    
227     run = iEvent.id().run();
228     event = iEvent.id().event();
229     luminosityBlock = iEvent.luminosityBlock();
230     isRealData = iEvent.isRealData();
231    
232 peiffer 1.18 edm::Handle<double> m_rho;
233     iEvent.getByLabel(rho_source,m_rho);
234     rho=*m_rho;
235    
236 peiffer 1.5 // ------------- primary vertices and beamspot -------------
237    
238     if(doPV){
239     for(size_t j=0; j< pv_sources.size(); ++j){
240     pvs[j].clear();
241    
242     edm::Handle< std::vector<reco::Vertex> > pv_handle;
243     iEvent.getByLabel(pv_sources[j], pv_handle);
244     const std::vector<reco::Vertex>& reco_pvs = *(pv_handle.product());
245    
246     for (unsigned int i = 0; i < reco_pvs.size(); ++i) {
247     reco::Vertex reco_pv = reco_pvs[i];
248    
249     PrimaryVertex pv;
250 peiffer 1.17 pv.set_x( reco_pv.x());
251     pv.set_y( reco_pv.y());
252     pv.set_z( reco_pv.z());
253     pv.set_nTracks( reco_pv.nTracks());
254     //pv.set_isValid( reco_pv.isValid());
255     pv.set_chi2( reco_pv.chi2());
256     pv.set_ndof( reco_pv.ndof());
257 peiffer 1.5
258     pvs[j].push_back(pv);
259     }
260     }
261 peiffer 1.8
262     edm::Handle<reco::BeamSpot> beamSpot;
263     iEvent.getByLabel(edm::InputTag("offlineBeamSpot"), beamSpot);
264     const reco::BeamSpot & bsp = *beamSpot;
265    
266     beamspot_x0 = bsp.x0();
267     beamspot_y0 = bsp.y0();
268     beamspot_z0 = bsp.z0();
269 peiffer 1.5 }
270    
271 jott 1.30 // ------------- generator info -------------
272 peiffer 1.15
273     if(doGenInfo){
274 peiffer 1.17 genInfo.clear_weights();
275     genInfo.clear_binningValues();
276 peiffer 1.15 genps.clear();
277    
278     edm::Handle<GenEventInfoProduct> genEventInfoProduct;
279     iEvent.getByLabel("generator", genEventInfoProduct);
280     const GenEventInfoProduct& genEventInfo = *(genEventInfoProduct.product());
281    
282 peiffer 1.17 for(unsigned int k=0; k<genEventInfo.binningValues().size();++k){
283     genInfo.add_binningValue(genEventInfo.binningValues().at(k));
284     }
285     for(unsigned int k=0; k<genEventInfo.weights().size();++k){
286     genInfo.add_weight(genEventInfo.weights().at(k));
287     }
288     genInfo.set_alphaQCD(genEventInfo.alphaQCD());
289     genInfo.set_alphaQED(genEventInfo.alphaQED());
290     genInfo.set_qScale(genEventInfo.qScale());
291 peiffer 1.15
292     const gen::PdfInfo* pdf = genEventInfo.pdf();
293     if(pdf){
294 peiffer 1.17 genInfo.set_pdf_id1(pdf->id.first);
295     genInfo.set_pdf_id2(pdf->id.second);
296     genInfo.set_pdf_x1(pdf->x.first);
297     genInfo.set_pdf_x2(pdf->x.second);
298     genInfo.set_pdf_scalePDF(pdf->scalePDF);
299     genInfo.set_pdf_xPDF1(pdf->xPDF.first);
300     genInfo.set_pdf_xPDF2(pdf->xPDF.second);
301 peiffer 1.15 }
302     else{
303 peiffer 1.17 genInfo.set_pdf_id1(-999);
304     genInfo.set_pdf_id2(-999);
305     genInfo.set_pdf_x1(-999);
306     genInfo.set_pdf_x2(-999);
307     genInfo.set_pdf_scalePDF(-999);
308     genInfo.set_pdf_xPDF1(-999);
309     genInfo.set_pdf_xPDF2(-999);
310 peiffer 1.15 }
311    
312     edm::Handle<std::vector<PileupSummaryInfo> > pus;
313     iEvent.getByLabel(edm::InputTag("addPileupInfo"), pus);
314 peiffer 1.17 genInfo.set_pileup_NumInteractions_intime(0);
315     genInfo.set_pileup_NumInteractions_ootbefore(0);
316     genInfo.set_pileup_NumInteractions_ootafter(0);
317 peiffer 1.15 if(pus.isValid()){
318 peiffer 1.17 genInfo.set_pileup_TrueNumInteractions ( (float) pus->at(0).getTrueNumInteractions());
319 peiffer 1.15 for(size_t i=0; i<pus->size(); ++i){
320     if(pus->at(i).getBunchCrossing() == 0) // intime pileup
321 peiffer 1.17 genInfo.set_pileup_NumInteractions_intime( genInfo.pileup_NumInteractions_intime() + pus->at(i).getPU_NumInteractions());
322 peiffer 1.15 else if(pus->at(i).getBunchCrossing() == -1){ // oot pileup before
323 peiffer 1.17 genInfo.set_pileup_NumInteractions_ootbefore( genInfo.pileup_NumInteractions_ootbefore() + pus->at(i).getPU_NumInteractions());
324 peiffer 1.15 }
325     else if(pus->at(i).getBunchCrossing() == +1){ // oot pileup before
326 peiffer 1.17 genInfo.set_pileup_NumInteractions_ootafter( genInfo.pileup_NumInteractions_ootafter() + pus->at(i).getPU_NumInteractions());
327 peiffer 1.15 }
328     }
329     }
330    
331     edm::Handle<reco::GenParticleCollection> genPartColl;
332 peiffer 1.22 iEvent.getByLabel(genparticle_source, genPartColl);
333 peiffer 1.15 int index=-1;
334     for(reco::GenParticleCollection::const_iterator iter = genPartColl->begin(); iter != genPartColl->end(); ++ iter){
335     index++;
336    
337 peiffer 1.26 //write out only top quarks,final state leptons and status 3 particles (works fine only for MadGraph)
338     bool islepton = iter->status()==1 && abs(iter->pdgId())>=11 && abs(iter->pdgId())<=16 ;
339     if(abs(iter->pdgId())==6 || iter->status()==3 || islepton || doAllGenParticles){
340 peiffer 1.15 GenParticle genp;
341 peiffer 1.17 genp.set_charge(iter->charge());
342     genp.set_pt(iter->p4().pt());
343     genp.set_eta(iter->p4().eta());
344     genp.set_phi(iter->p4().phi());
345     genp.set_energy(iter->p4().E());
346     genp.set_index(index);
347     genp.set_status( iter->status());
348     genp.set_pdgId( iter->pdgId());
349    
350     genp.set_mother1(-1);
351     genp.set_mother2(-1);
352     genp.set_daughter1(-1);
353     genp.set_daughter2(-1);
354 peiffer 1.15
355     int nm=iter->numberOfMothers();
356     int nd=iter->numberOfDaughters();
357    
358    
359 peiffer 1.17 if (nm>0) genp.set_mother1( iter->motherRef(0).key());
360     if (nm>1) genp.set_mother2( iter->motherRef(1).key());
361     if (nd>0) genp.set_daughter1( iter->daughterRef(0).key());
362     if (nd>1) genp.set_daughter2( iter->daughterRef(1).key());
363    
364 peiffer 1.15 genps.push_back(genp);
365     }
366     }
367     }
368    
369 rkogler 1.29 // ------------- full PF collection -------------
370    
371    
372 peiffer 1.1 // ------------- electrons -------------
373     if(doElectrons){
374 peiffer 1.10
375 peiffer 1.20 // edm::Handle<reco::ConversionCollection> hConversions;
376     // iEvent.getByLabel("allConversions", hConversions);
377 peiffer 1.10
378 peiffer 1.20 // edm::Handle<reco::BeamSpot> beamSpot;
379     // iEvent.getByLabel(edm::InputTag("offlineBeamSpot"), beamSpot);
380     // const reco::BeamSpot & bsp = *beamSpot;
381 peiffer 1.10
382 peiffer 1.1 for(size_t j=0; j< electron_sources.size(); ++j){
383     eles[j].clear();
384     edm::Handle< std::vector<pat::Electron> > ele_handle;
385     iEvent.getByLabel(electron_sources[j], ele_handle);
386     const std::vector<pat::Electron>& pat_electrons = *(ele_handle.product());
387    
388     for (unsigned int i = 0; i < pat_electrons.size(); ++i) {
389     pat::Electron pat_ele = pat_electrons[i];
390     Electron ele;
391    
392 peiffer 1.17 ele.set_charge( pat_ele.charge());
393     ele.set_pt( pat_ele.pt());
394     ele.set_eta( pat_ele.eta());
395     ele.set_phi( pat_ele.phi());
396     ele.set_energy( pat_ele.energy());
397     ele.set_vertex_x(pat_ele.vertex().x());
398     ele.set_vertex_y(pat_ele.vertex().y());
399     ele.set_vertex_z(pat_ele.vertex().z());
400     ele.set_supercluster_eta(pat_ele.superCluster()->eta());
401     ele.set_supercluster_phi(pat_ele.superCluster()->phi());
402     ele.set_dB(pat_ele.dB());
403     //ele.set_particleIso(pat_ele.particleIso());
404     ele.set_neutralHadronIso(pat_ele.neutralHadronIso());
405     ele.set_chargedHadronIso(pat_ele.chargedHadronIso());
406     ele.set_trackIso(pat_ele.trackIso());
407     ele.set_photonIso(pat_ele.photonIso());
408     ele.set_puChargedHadronIso(pat_ele.puChargedHadronIso());
409     ele.set_gsfTrack_trackerExpectedHitsInner_numberOfLostHits(pat_ele.gsfTrack()->trackerExpectedHitsInner().numberOfLostHits());
410     ele.set_gsfTrack_px( pat_ele.gsfTrack()->px());
411     ele.set_gsfTrack_py( pat_ele.gsfTrack()->py());
412     ele.set_gsfTrack_pz( pat_ele.gsfTrack()->pz());
413     ele.set_gsfTrack_vx( pat_ele.gsfTrack()->vx());
414     ele.set_gsfTrack_vy( pat_ele.gsfTrack()->vy());
415     ele.set_gsfTrack_vz( pat_ele.gsfTrack()->vz());
416 peiffer 1.20 //ele.set_passconversionveto(!ConversionTools::hasMatchedConversion(pat_ele,hConversions,bsp.position()));
417     ele.set_passconversionveto(pat_ele.passConversionVeto());
418 peiffer 1.17 ele.set_dEtaIn(pat_ele.deltaEtaSuperClusterTrackAtVtx());
419     ele.set_dPhiIn(pat_ele.deltaPhiSuperClusterTrackAtVtx());
420     ele.set_sigmaIEtaIEta(pat_ele.sigmaIetaIeta());
421     ele.set_HoverE(pat_ele.hadronicOverEm());
422     ele.set_fbrem(pat_ele.fbrem());
423     ele.set_EoverPIn(pat_ele.eSuperClusterOverP());
424     ele.set_EcalEnergy(pat_ele.ecalEnergy());
425 peiffer 1.19 ele.set_mvaTrigV0(pat_ele.electronID("mvaTrigV0"));
426     ele.set_mvaNonTrigV0(pat_ele.electronID("mvaNonTrigV0"));
427 peiffer 1.22 float AEff03 = 0.00;
428     if(isRealData){
429     AEff03 = ElectronEffectiveArea::GetElectronEffectiveArea(ElectronEffectiveArea::kEleGammaAndNeutralHadronIso03, pat_ele.superCluster()->eta(), ElectronEffectiveArea::kEleEAData2011);
430     }else{
431     AEff03 = ElectronEffectiveArea::GetElectronEffectiveArea(ElectronEffectiveArea::kEleGammaAndNeutralHadronIso03, pat_ele.superCluster()->eta(), ElectronEffectiveArea::kEleEAFall11MC);
432     }
433     ele.set_AEff(AEff03);
434 peiffer 1.11
435 peiffer 1.1 eles[j].push_back(ele);
436 rkogler 1.29
437     if (storePFsAroundLeptons){
438     edm::Handle< std::vector<reco::PFCandidate> > pfcand_handle;
439     iEvent.getByLabel(pf_around_leptons_source, pfcand_handle); // default: "pfNoPileUpPFlow"
440     const std::vector<reco::PFCandidate>& pf_cands = *(pfcand_handle.product());
441     StorePFCandsInCone(&ele, pf_cands, 0.4);
442     }
443    
444 peiffer 1.1 }
445     }
446     }
447    
448     // ------------- muons -------------
449     if(doMuons){
450     for(size_t j=0; j< muon_sources.size(); ++j){
451     mus[j].clear();
452    
453     edm::Handle< std::vector<pat::Muon> > mu_handle;
454     iEvent.getByLabel(muon_sources[j], mu_handle);
455     const std::vector<pat::Muon>& pat_muons = *(mu_handle.product());
456    
457     for (unsigned int i = 0; i <pat_muons.size() ; ++i) {
458     pat::Muon pat_mu = pat_muons[i];
459    
460     Muon mu;
461 peiffer 1.17 mu.set_charge( pat_mu.charge());
462     mu.set_pt( pat_mu.pt());
463     mu.set_eta( pat_mu.eta());
464     mu.set_phi( pat_mu.phi());
465     mu.set_energy( pat_mu.energy());
466     mu.set_vertex_x ( pat_mu.vertex().x());
467     mu.set_vertex_y ( pat_mu.vertex().y());
468     mu.set_vertex_z ( pat_mu.vertex().z());
469     mu.set_dB ( pat_mu.dB());
470     //mu.particleIso ( pat_mu.particleIso());
471     mu.set_neutralHadronIso ( pat_mu.neutralHadronIso());
472     mu.set_chargedHadronIso ( pat_mu.chargedHadronIso());
473     mu.set_trackIso ( pat_mu.trackIso());
474     mu.set_photonIso ( pat_mu.photonIso());
475     mu.set_puChargedHadronIso ( pat_mu.puChargedHadronIso());
476     mu.set_isGlobalMuon ( pat_mu.isGlobalMuon());
477 peiffer 1.21 mu.set_isPFMuon ( pat_mu.isPFMuon());
478 peiffer 1.17 mu.set_isStandAloneMuon ( pat_mu.isStandAloneMuon());
479     mu.set_isTrackerMuon ( pat_mu.isTrackerMuon());
480     mu.set_numberOfMatchedStations ( pat_mu.numberOfMatchedStations());
481 peiffer 1.1 reco::TrackRef globalTrack = pat_mu.globalTrack();
482     if(!globalTrack.isNull()){
483 peiffer 1.17 mu.set_globalTrack_chi2 ( globalTrack->chi2());
484     mu.set_globalTrack_ndof ( globalTrack->ndof());
485     mu.set_globalTrack_d0 ( globalTrack->d0());
486     mu.set_globalTrack_d0Error ( globalTrack->d0Error());
487     mu.set_globalTrack_numberOfValidHits ( globalTrack->numberOfValidHits());
488     mu.set_globalTrack_numberOfLostHits ( globalTrack->numberOfLostHits());
489 peiffer 1.21 mu.set_globalTrack_numberOfValidMuonHits(globalTrack->hitPattern().numberOfValidMuonHits() );
490 peiffer 1.1 }
491     else{
492 peiffer 1.17 mu.set_globalTrack_chi2 ( 0);
493     mu.set_globalTrack_ndof ( 0);
494     mu.set_globalTrack_d0 ( 0);
495     mu.set_globalTrack_d0Error ( 0);
496     mu.set_globalTrack_numberOfValidHits ( 0);
497     mu.set_globalTrack_numberOfLostHits ( 0);
498 peiffer 1.1 }
499     reco::TrackRef innerTrack = pat_mu.innerTrack();
500     if(!innerTrack.isNull()){
501 peiffer 1.17 mu.set_innerTrack_chi2 ( innerTrack->chi2());
502     mu.set_innerTrack_ndof ( innerTrack->ndof());
503     mu.set_innerTrack_d0 ( innerTrack->d0());
504     mu.set_innerTrack_d0Error ( innerTrack->d0Error());
505     mu.set_innerTrack_numberOfValidHits ( innerTrack->numberOfValidHits());
506     mu.set_innerTrack_numberOfLostHits ( innerTrack->numberOfLostHits());
507     mu.set_innerTrack_trackerLayersWithMeasurement ( innerTrack->hitPattern().trackerLayersWithMeasurement());
508     mu.set_innerTrack_numberOfValidPixelHits ( innerTrack->hitPattern().numberOfValidPixelHits());
509 peiffer 1.1 }
510     else{
511 peiffer 1.17 mu.set_innerTrack_chi2 ( 0);
512     mu.set_innerTrack_ndof ( 0);
513     mu.set_innerTrack_d0 ( 0);
514     mu.set_innerTrack_d0Error ( 0);
515     mu.set_innerTrack_numberOfValidHits ( 0);
516     mu.set_innerTrack_numberOfLostHits ( 0);
517     mu.set_innerTrack_trackerLayersWithMeasurement ( 0);
518     mu.set_innerTrack_numberOfValidPixelHits ( 0);
519 peiffer 1.1 }
520     reco::TrackRef outerTrack = pat_mu.outerTrack();
521     if(!outerTrack.isNull()){
522 peiffer 1.17 mu.set_outerTrack_chi2 ( outerTrack->chi2());
523     mu.set_outerTrack_ndof ( outerTrack->ndof());
524     mu.set_outerTrack_d0 ( outerTrack->d0());
525     mu.set_outerTrack_d0Error ( outerTrack->d0Error());
526     mu.set_outerTrack_numberOfValidHits ( outerTrack->numberOfValidHits());
527     mu.set_outerTrack_numberOfLostHits ( outerTrack->numberOfLostHits());
528 peiffer 1.1 }
529     else{
530 peiffer 1.17 mu.set_outerTrack_chi2 ( 0);
531     mu.set_outerTrack_ndof ( 0);
532     mu.set_outerTrack_d0 ( 0);
533     mu.set_outerTrack_d0Error ( 0);
534     mu.set_outerTrack_numberOfValidHits ( 0);
535     mu.set_outerTrack_numberOfLostHits ( 0);
536 peiffer 1.1 }
537    
538     mus[j].push_back(mu);
539 rkogler 1.29
540     if (storePFsAroundLeptons){
541     edm::Handle< std::vector<reco::PFCandidate> > pfcand_handle;
542     iEvent.getByLabel(pf_around_leptons_source, pfcand_handle); // default: "pfNoPileUpPFlow"
543     const std::vector<reco::PFCandidate>& pf_cands = *(pfcand_handle.product());
544     StorePFCandsInCone(&mu, pf_cands, 0.4);
545     }
546    
547 peiffer 1.1 }
548     }
549     }
550     // ------------- taus -------------
551    
552     if(doTaus){
553     for(size_t j=0; j< tau_sources.size(); ++j){
554     taus[j].clear();
555    
556    
557     edm::Handle< std::vector<pat::Tau> > tau_handle;
558     iEvent.getByLabel(tau_sources[j], tau_handle);
559     const std::vector<pat::Tau>& pat_taus = *(tau_handle.product());
560    
561     for (unsigned int i = 0; i < pat_taus.size(); ++i) {
562     pat::Tau pat_tau = pat_taus[i];
563     if(pat_tau.pt() < tau_ptmin) continue;
564     if(fabs(pat_tau.eta()) > tau_etamax) continue;
565    
566     Tau tau;
567 peiffer 1.17 tau.set_charge( pat_tau.charge());
568     tau.set_pt( pat_tau.pt());
569     tau.set_eta( pat_tau.eta());
570     tau.set_phi( pat_tau.phi());
571     tau.set_energy( pat_tau.energy());
572     tau.set_decayModeFinding ( pat_tau.tauID("decayModeFinding")>0.5);
573 peiffer 1.26 //tau.set_byVLooseCombinedIsolationDeltaBetaCorr ( pat_tau.tauID("byVLooseCombinedIsolationDeltaBetaCorr")>0.5);
574 peiffer 1.17 tau.set_byLooseCombinedIsolationDeltaBetaCorr ( pat_tau.tauID("byLooseCombinedIsolationDeltaBetaCorr")>0.5);
575     tau.set_byMediumCombinedIsolationDeltaBetaCorr ( pat_tau.tauID("byMediumCombinedIsolationDeltaBetaCorr")>0.5);
576     tau.set_byTightCombinedIsolationDeltaBetaCorr ( pat_tau.tauID("byTightCombinedIsolationDeltaBetaCorr")>0.5);
577 peiffer 1.26 tau.set_byLooseIsolationMVA( pat_tau.tauID("byLooseIsolationMVA")>0.5);
578     tau.set_byMediumIsolationMVA( pat_tau.tauID("byMediumIsolationMVA")>0.5);
579     tau.set_byTightIsolationMVA( pat_tau.tauID("byTightIsolationMVA")>0.5);
580     tau.set_byLooseIsolationMVA2( pat_tau.tauID("byLooseIsolationMVA2")>0.5);
581     tau.set_byMediumIsolationMVA2( pat_tau.tauID("byMediumIsolationMVA2")>0.5);
582     tau.set_byTightIsolationMVA2( pat_tau.tauID("byTightIsolationMVA2")>0.5);
583     tau.set_byLooseCombinedIsolationDeltaBetaCorr3Hits( pat_tau.tauID("byLooseCombinedIsolationDeltaBetaCorr3Hits")>0.5);
584     tau.set_byMediumCombinedIsolationDeltaBetaCorr3Hits ( pat_tau.tauID("byMediumCombinedIsolationDeltaBetaCorr3Hits")>0.5);
585     tau.set_byTightCombinedIsolationDeltaBetaCorr3Hits ( pat_tau.tauID("byTightCombinedIsolationDeltaBetaCorr3Hits")>0.5);
586     tau.set_againstElectronLooseMVA3 ( pat_tau.tauID("againstElectronLooseMVA3")>0.5);
587     tau.set_againstElectronMediumMVA3 ( pat_tau.tauID("againstElectronMediumMVA3")>0.5);
588     tau.set_againstElectronTightMVA3 ( pat_tau.tauID("againstElectronTightMVA3")>0.5);
589     tau.set_againstElectronVTightMVA3 ( pat_tau.tauID("againstElectronVTightMVA3")>0.5);
590     tau.set_againstMuonLoose2 ( pat_tau.tauID("againstMuonLoose2")>0.5);
591     tau.set_againstMuonMedium2 ( pat_tau.tauID("againstMuonMedium2")>0.5);
592     tau.set_againstMuonTight2 ( pat_tau.tauID("againstMuonTight2")>0.5);
593     tau.set_byIsolationMVAraw( pat_tau.tauID("byIsolationMVAraw"));
594     tau.set_byIsolationMVA2raw( pat_tau.tauID("byIsolationMVA2raw"));
595     tau.set_decayMode( pat_tau.decayMode() );
596     tau.set_byCombinedIsolationDeltaBetaCorrRaw( pat_tau.tauID("byCombinedIsolationDeltaBetaCorrRaw"));
597     tau.set_byCombinedIsolationDeltaBetaCorrRaw3Hits( pat_tau.tauID("byCombinedIsolationDeltaBetaCorrRaw3Hits"));
598 peiffer 1.10
599 peiffer 1.26 // std::cout << pat_tau.tauID("byCombinedIsolationDeltaBetaCorrRaw3Hits") << std::endl;
600    
601 peiffer 1.19 // reco::PFCandidateRef leadPFCand = pat_tau.leadPFCand();
602     // if(!leadPFCand.isNull()){
603     // tau.set_leadPFCand_px ( leadPFCand->px());
604     // tau.set_leadPFCand_py ( leadPFCand->py());
605     // tau.set_leadPFCand_pz ( leadPFCand->pz());
606     // }
607     // else{
608     // tau.set_leadPFCand_px ( 0);
609     // tau.set_leadPFCand_py ( 0);
610     // tau.set_leadPFCand_pz ( 0);
611     // }
612 peiffer 1.1 taus[j].push_back(tau);
613 rkogler 1.29
614     // store isolation info only for identified taus
615     if (pat_tau.tauID("decayModeFinding")>0.5){
616     bool storepfs = (pat_tau.tauID("byLooseCombinedIsolationDeltaBetaCorr")>0.5) || (pat_tau.tauID("byLooseIsolationMVA")>0.5);
617     if (storePFsAroundLeptons && storepfs){
618     edm::Handle< std::vector<reco::PFCandidate> > pfcand_handle;
619     iEvent.getByLabel(pf_around_leptons_source, pfcand_handle); // default: "pfNoPileUpPFlow"
620     const std::vector<reco::PFCandidate>& pf_cands = *(pfcand_handle.product());
621     StorePFCandsInCone(&tau, pf_cands, 0.4);
622     }
623     }
624 peiffer 1.1 }
625     }
626     }
627    
628 peiffer 1.25 //-------------- gen jets -------------
629    
630     if(doGenJets){
631     for(size_t j=0; j< genjet_sources.size(); ++j){
632    
633     genjets[j].clear();
634    
635     edm::Handle< std::vector<reco::GenJet> > genjet_handle;
636     iEvent.getByLabel(genjet_sources[j], genjet_handle);
637     const std::vector<reco::GenJet>& gen_jets = *(genjet_handle.product());
638    
639     for (unsigned int i = 0; i < gen_jets.size(); ++i) {
640 rkogler 1.27
641 peiffer 1.25 const reco::GenJet* gen_jet = &gen_jets[i];
642     if(gen_jet->pt() < genjet_ptmin) continue;
643     if(fabs(gen_jet->eta()) > genjet_etamax) continue;
644    
645     Particle jet;
646     jet.set_charge(gen_jet->charge());
647     jet.set_pt(gen_jet->pt());
648     jet.set_eta(gen_jet->eta());
649     jet.set_phi(gen_jet->phi());
650     jet.set_energy(gen_jet->energy());
651    
652 rkogler 1.27 // recalculate the jet charge
653     int jet_charge = 0;
654     std::vector<const reco::GenParticle * > jetgenps = gen_jet->getGenConstituents();
655     for(unsigned int l = 0; l<jetgenps.size(); ++l){
656     jet_charge += jetgenps[l]->charge();
657     }
658     jet.set_charge(jet_charge);
659    
660 peiffer 1.25 genjets[j].push_back(jet);
661     }
662     }
663     }
664    
665 peiffer 1.1 // ------------- jets -------------
666     if(doJets){
667     for(size_t j=0; j< jet_sources.size(); ++j){
668    
669     jets[j].clear();
670    
671     edm::Handle< std::vector<pat::Jet> > jet_handle;
672     iEvent.getByLabel(jet_sources[j], jet_handle);
673     const std::vector<pat::Jet>& pat_jets = *(jet_handle.product());
674    
675     for (unsigned int i = 0; i < pat_jets.size(); ++i) {
676     pat::Jet pat_jet = pat_jets[i];
677     if(pat_jet.pt() < jet_ptmin) continue;
678     if(fabs(pat_jet.eta()) > jet_etamax) continue;
679     // std::cout << "available btag discriminators: " << std::endl;
680     // const std::vector<std::pair<std::string, float> > & dis = pat_jets[i].getPairDiscri();
681     // for(size_t k=0; k<dis.size(); ++k){
682     // std::cout << dis[k].first << std::endl;
683     // }
684     Jet jet;
685 jott 1.30 fill_jet_info(pat_jet, jet);
686 peiffer 1.12 const reco::GenJet *genj = pat_jet.genJet();
687     if(genj){
688 peiffer 1.25 for(unsigned int k=0; k<genjets->size(); ++k){
689 rkogler 1.27 if(genj->pt()==genjets->at(k).pt() && genj->eta()==genjets->at(k).eta()){
690 peiffer 1.25 jet.set_genjet_index(k);
691 rkogler 1.27 }
692 peiffer 1.25 }
693     // if( jet.genjet_index()<0){
694     // std::cout<< "genjet not found for " << genj->pt() << " " << genj->eta() << std::endl;
695     // }
696 peiffer 1.12 }
697 peiffer 1.1 jets[j].push_back(jet);
698     }
699     }
700     }
701    
702 peiffer 1.24
703 peiffer 1.1 // ------------- top jets -------------
704     if(doTopJets){
705 rkogler 1.27
706 peiffer 1.1 for(size_t j=0; j< topjet_sources.size(); ++j){
707    
708     topjets[j].clear();
709    
710     edm::Handle<pat::JetCollection> pat_topjets;
711     //edm::Handle<std::vector<reco::Jet> > pat_topjets;
712     iEvent.getByLabel(topjet_sources[j], pat_topjets);
713    
714     for (unsigned int i = 0; i < pat_topjets->size(); i++) {
715 jott 1.30 const pat::Jet & pat_topjet = dynamic_cast<pat::Jet const&>(pat_topjets->at(i));
716 peiffer 1.1 if(pat_topjet.pt() < topjet_ptmin) continue;
717     if(fabs(pat_topjet.eta()) > topjet_etamax) continue;
718    
719     TopJet topjet;
720 jott 1.30 fill_jet_info(pat_topjet, topjet);
721    
722 peiffer 1.19 /*
723 peiffer 1.12 const reco::GenJet *genj = pat_topjet.genJet();
724     if(genj){
725 peiffer 1.17 topjet.set_genjet_pt ( genj->pt());
726     topjet.set_genjet_eta ( genj->eta());
727     topjet.set_genjet_phi ( genj->phi());
728     topjet.set_genjet_energy ( genj->energy());
729 peiffer 1.15 if(doAllGenParticles){
730     std::vector<const reco::GenParticle * > jetgenps = genj->getGenConstituents();
731     for(unsigned int l = 0; l<jetgenps.size(); ++l){
732     for(unsigned int k=0; k< genps.size(); ++k){
733 peiffer 1.17 if(jetgenps[l]->pt() == genps[k].pt() && jetgenps[l]->pdgId() == genps[k].pdgId()){
734     topjet.add_genparticles_index(genps[k].index());
735     break;
736 peiffer 1.15 }
737     }
738     }
739 peiffer 1.17 if(topjet.genparticles_indices().size()!= jetgenps.size())
740     std::cout << "WARNING: Found only " << topjet.genparticles_indices().size() << " from " << jetgenps.size() << " gen particles of this topjet"<<std::endl;
741 peiffer 1.15 }
742 peiffer 1.12 }
743 peiffer 1.19 */
744 peiffer 1.12
745 rkogler 1.27 // add constituents to the jet, if requested
746     if (doTopJetsConstituents){
747     if (topjet_constituents_sources.size()>j){ //only add constituents if they are defined
748     edm::Handle<pat::JetCollection> pat_topjets_with_cands;
749     iEvent.getByLabel(topjet_constituents_sources[j], pat_topjets_with_cands);
750 jott 1.30 const pat::Jet* pat_topjet_wc = NULL;
751 rkogler 1.27
752     for (unsigned int it = 0; it < pat_topjets_with_cands->size(); it++) {
753     const pat::Jet* cand = dynamic_cast<pat::Jet const *>(&pat_topjets_with_cands->at(it));
754 jott 1.30 assert(cand);
755     double dphi = deltaPhi(cand->phi(), pat_topjet.phi());
756 rkogler 1.27 if (fabs(dphi)<0.5 && fabs(cand->eta()-pat_topjet.eta())<0.5){ // be generous: filtering, pruning... can change jet axis
757 jott 1.30 pat_topjet_wc = cand;
758 rkogler 1.27 break;
759     }
760     }
761    
762     if (pat_topjet_wc){
763 jott 1.30 StoreJetConstituents(*pat_topjet_wc, topjet);
764 rkogler 1.27 // now run substructure information
765     JetProps substructure(&topjet);
766     substructure.set_pf_cands(&pfparticles);
767     double tau1 = substructure.GetNsubjettiness(1, Njettiness::onepass_kt_axes, 1., 2.0);
768     double tau2 = substructure.GetNsubjettiness(2, Njettiness::onepass_kt_axes, 1., 2.0);
769     double tau3 = substructure.GetNsubjettiness(3, Njettiness::onepass_kt_axes, 1., 2.0);
770     double qjets = substructure.GetQjetVolatility(iEvent.id().event(), 2.0);
771     topjet.set_tau1(tau1);
772     topjet.set_tau2(tau2);
773     topjet.set_tau3(tau3);
774     topjet.set_qjets_volatility(qjets);
775    
776     }
777     }
778     }
779    
780    
781    
782 peiffer 1.1 for (unsigned int k = 0; k < pat_topjet.numberOfDaughters(); k++) {
783     Particle subjet_v4;
784 eusai 1.23
785     reco::Candidate const * subjetd = pat_topjet.daughter(k);
786     pat::Jet const * patsubjetd = dynamic_cast<pat::Jet const *>(subjetd);
787     if(patsubjetd)
788     {
789     subjet_v4.set_pt(patsubjetd->correctedP4(0).pt());
790     subjet_v4.set_eta(patsubjetd->correctedP4(0).eta());
791     subjet_v4.set_phi(patsubjetd->correctedP4(0).phi());
792     subjet_v4.set_energy(patsubjetd->correctedP4(0).E());
793     topjet.add_subjet(subjet_v4);
794     //btag info
795     topjet.add_subFlavour(patsubjetd->partonFlavour());
796     topjet.add_subCSV(patsubjetd->bDiscriminator("combinedSecondaryVertexBJetTags"));
797     if (doTagInfos)
798     {
799     //ip tag info
800     reco::TaggingVariableList tvlIP=patsubjetd->tagInfoTrackIP("impactParameter")->taggingVariables();
801     topjet.add_subTrackMomentum(tvlIP.getList(reco::btau::trackMomentum,false));
802     topjet.add_subTrackEta(tvlIP.getList(reco::btau::trackEta,false));
803     topjet.add_subTrackEtaRel(tvlIP.getList(reco::btau::trackEtaRel,false));
804     topjet.add_subTrackDeltaR(tvlIP.getList(reco::btau::trackDeltaR,false));
805     topjet.add_subTrackSip3dVal(tvlIP.getList(reco::btau::trackSip3dVal,false));
806     topjet.add_subTrackSip3dSig(tvlIP.getList(reco::btau::trackSip3dSig,false));
807     topjet.add_subTrackSip2dVal(tvlIP.getList(reco::btau::trackSip2dVal,false));
808     topjet.add_subTrackSip2dSig(tvlIP.getList(reco::btau::trackSip2dSig,false));
809     topjet.add_subTrackDecayLenVal(tvlIP.getList(reco::btau::trackDecayLenVal,false));
810     topjet.add_subTrackChi2(tvlIP.getList(reco::btau::trackChi2,false));
811     topjet.add_subTrackNTotalHits(tvlIP.getList(reco::btau::trackNTotalHits,false));
812     topjet.add_subTrackNPixelHits(tvlIP.getList(reco::btau::trackNPixelHits,false));
813     topjet.add_subTrackPtRel(tvlIP.getList(reco::btau::trackPtRel,false));
814     topjet.add_subTrackPPar(tvlIP.getList(reco::btau::trackPPar,false));
815     topjet.add_subTrackPtRatio(tvlIP.getList(reco::btau::trackPtRatio,false));
816     topjet.add_subTrackPParRatio(tvlIP.getList(reco::btau::trackPParRatio,false));
817     topjet.add_subTrackJetDistVal(tvlIP.getList(reco::btau::trackJetDistVal,false));
818     topjet.add_subTrackJetDistSig(tvlIP.getList(reco::btau::trackJetDistSig,false));
819     topjet.add_subTrackGhostTrackDistVal(tvlIP.getList(reco::btau::trackGhostTrackDistVal,false));
820     topjet.add_subTrackGhostTrackDistSig(tvlIP.getList(reco::btau::trackGhostTrackDistSig,false));
821     topjet.add_subTrackGhostTrackWeight(tvlIP.getList(reco::btau::trackGhostTrackWeight,false));
822     //sv tag info
823     reco::TaggingVariableList tvlSV=patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->taggingVariables();
824     topjet.add_subFlightDistance2dVal(tvlSV.getList(reco::btau::flightDistance2dVal,false));
825     topjet.add_subFlightDistance2dSig(tvlSV.getList(reco::btau::flightDistance2dSig,false));
826     topjet.add_subFlightDistance3dVal(tvlSV.getList(reco::btau::flightDistance3dVal,false));
827     topjet.add_subFlightDistance3dSig(tvlSV.getList(reco::btau::flightDistance3dSig,false));
828     topjet.add_subVertexJetDeltaR(tvlSV.getList(reco::btau::vertexJetDeltaR,false));
829     topjet.add_subJetNSecondaryVertices(tvlSV.get(reco::btau::jetNSecondaryVertices,-9999));
830     topjet.add_subVertexNTracks(tvlSV.get(reco::btau::vertexNTracks,-9999));
831     std::vector<TLorentzVector> vp4; vp4.clear();
832     std::vector<float> vchi2; vchi2.clear();
833     std::vector<float> vndof; vndof.clear();
834     std::vector<float> vchi2ndof; vchi2ndof.clear();
835     std::vector<float> vtrsize; vtrsize.clear();
836     for(unsigned int i=0; i<patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->nVertices(); i++)
837     {
838     ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > p4 = patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->secondaryVertex(i).p4();
839     vp4.push_back(TLorentzVector(p4.px(),p4.py(),p4.pz(),p4.e()));
840     vchi2.push_back(patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->secondaryVertex(i).chi2());
841     vndof.push_back(patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->secondaryVertex(i).ndof());
842     vchi2ndof.push_back(patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->secondaryVertex(i).normalizedChi2());
843     vtrsize.push_back(patsubjetd->tagInfoSecondaryVertex("secondaryVertex")->secondaryVertex(i).tracksSize());
844     }
845     topjet.add_subSecondaryVertex(vp4);
846     topjet.add_subVertexChi2(vchi2);
847     topjet.add_subVertexNdof(vndof);
848     topjet.add_subVertexNormalizedChi2(vchi2ndof);
849     topjet.add_subVertexTracksSize(vtrsize);
850     //try computer
851     edm::ESHandle<JetTagComputer> computerHandle;
852     iSetup.get<JetTagComputerRecord>().get( SVComputer_.label(), computerHandle );
853     const GenericMVAJetTagComputer *computer = dynamic_cast<const GenericMVAJetTagComputer*>( computerHandle.product() );
854     if(computer)
855     {
856     computer->passEventSetup(iSetup);
857     std::vector<const reco::BaseTagInfo*> baseTagInfos;
858     baseTagInfos.push_back(patsubjetd->tagInfoTrackIP("impactParameter") );
859     baseTagInfos.push_back(patsubjetd->tagInfoSecondaryVertex("secondaryVertex") );
860     JetTagComputer::TagInfoHelper helper(baseTagInfos);
861     reco::TaggingVariableList vars = computer->taggingVariables(helper);
862     topjet.add_subVertexMassJTC(vars.get(reco::btau::vertexMass,-9999));
863     topjet.add_subVertexCategoryJTC(vars.get(reco::btau::vertexCategory,-9999));
864     topjet.add_subVertexEnergyRatioJTC(vars.get(reco::btau::vertexEnergyRatio,-9999));
865     topjet.add_subTrackSip3dSigAboveCharmJTC(vars.get(reco::btau::trackSip3dSigAboveCharm,-9999));
866     }
867     }
868     }
869     else
870     {
871     //filling only standard information in case the subjet has not been pat-tified during the pattuples production
872     subjet_v4.set_pt(pat_topjet.daughter(k)->p4().pt());
873     subjet_v4.set_eta(pat_topjet.daughter(k)->p4().eta());
874     subjet_v4.set_phi(pat_topjet.daughter(k)->p4().phi());
875     subjet_v4.set_energy(pat_topjet.daughter(k)->p4().E());
876     topjet.add_subjet(subjet_v4);
877     }
878    
879    
880 peiffer 1.1 }
881     topjets[j].push_back(topjet);
882     }
883     }
884     }
885 rkogler 1.27
886 eusai 1.23
887 peiffer 1.14 // ------------- generator top jets -------------
888     if(doGenTopJets){
889     for(size_t j=0; j< gentopjet_sources.size(); ++j){
890    
891     gentopjets[j].clear();
892 eusai 1.23
893 peiffer 1.14 edm::Handle<reco::BasicJetCollection> reco_gentopjets;
894     iEvent.getByLabel(gentopjet_sources[j], reco_gentopjets);
895    
896     for (unsigned int i = 0; i < reco_gentopjets->size(); i++) {
897    
898     const reco::BasicJet reco_gentopjet = reco_gentopjets->at(i);
899     if(reco_gentopjet.pt() < gentopjet_ptmin) continue;
900     if(fabs(reco_gentopjet.eta()) > gentopjet_etamax) continue;
901    
902 rkogler 1.27 GenTopJet gentopjet;
903 peiffer 1.17 gentopjet.set_charge(reco_gentopjet.charge());
904     gentopjet.set_pt(reco_gentopjet.pt());
905     gentopjet.set_eta(reco_gentopjet.eta());
906     gentopjet.set_phi(reco_gentopjet.phi());
907     gentopjet.set_energy(reco_gentopjet.energy());
908 peiffer 1.14
909     for (unsigned int k = 0; k < reco_gentopjet.numberOfDaughters(); k++) {
910     Particle subjet_v4;
911 peiffer 1.17 subjet_v4.set_pt(reco_gentopjet.daughter(k)->p4().pt());
912     subjet_v4.set_eta(reco_gentopjet.daughter(k)->p4().eta());
913     subjet_v4.set_phi(reco_gentopjet.daughter(k)->p4().phi());
914     subjet_v4.set_energy(reco_gentopjet.daughter(k)->p4().E());
915     gentopjet.add_subjet(subjet_v4);
916 peiffer 1.14 }
917     gentopjets[j].push_back(gentopjet);
918     }
919     }
920     }
921    
922 rkogler 1.27
923 peiffer 1.1 // ------------- photons -------------
924     if(doPhotons){
925     for(size_t j=0; j< photon_sources.size(); ++j){
926     phs[j].clear();
927    
928     edm::Handle< std::vector<pat::Photon> > photon_handle;
929     iEvent.getByLabel(photon_sources[j], photon_handle);
930     const std::vector<pat::Photon>& pat_photons = *(photon_handle.product());
931    
932     for (unsigned int i = 0; i < pat_photons.size(); ++i) {
933     pat::Photon pat_photon = pat_photons[i];
934     Photon ph;
935 peiffer 1.17 ph.set_charge(0);
936     ph.set_pt( pat_photon.pt());
937     ph.set_eta( pat_photon.eta());
938     ph.set_phi( pat_photon.phi());
939     ph.set_energy( pat_photon.energy());
940     ph.set_vertex_x(pat_photon.vertex().x());
941     ph.set_vertex_y(pat_photon.vertex().y());
942     ph.set_vertex_z(pat_photon.vertex().z());
943     ph.set_supercluster_eta(pat_photon.superCluster()->eta());
944     ph.set_supercluster_phi(pat_photon.superCluster()->phi());
945     // ph.set_neutralHadronIso(pat_photon.neutralHadronIso());
946     // ph.set_chargedHadronIso(pat_photon.chargedHadronIso());
947     ph.set_trackIso(pat_photon.trackIso());
948 peiffer 1.1 phs[j].push_back(ph);
949     }
950     }
951     }
952    
953     // ------------- MET -------------
954     if(doMET){
955     for(size_t j=0; j< met_sources.size(); ++j){
956    
957     edm::Handle< std::vector<pat::MET> > met_handle;
958     iEvent.getByLabel(met_sources[j], met_handle);
959     const std::vector<pat::MET>& pat_mets = *(met_handle.product());
960    
961     if(pat_mets.size()!=1){
962     std::cout<< "WARNING: number of METs = " << pat_mets.size() <<", should be 1" << std::endl;
963     }
964     else{
965     pat::MET pat_met = pat_mets[0];
966    
967 peiffer 1.17 met[j].set_pt(pat_met.pt());
968     met[j].set_phi(pat_met.phi());
969     met[j].set_mEtSig(pat_met.mEtSig());
970 peiffer 1.1 }
971    
972     }
973     }
974    
975     // ------------- trigger -------------
976 peiffer 1.6 if(doTrigger){
977     edm::InputTag triggerEvent = edm::InputTag("hltTriggerSummaryAOD");
978     edm::Handle< trigger::TriggerEvent > dummy_TriggerEvent;
979     iEvent.getByLabel( edm::InputTag(triggerEvent.label(), triggerEvent.instance()), dummy_TriggerEvent );
980    
981     const edm::Provenance *meta = dummy_TriggerEvent.provenance();
982     std::string nameProcess = meta->processName();
983     edm::InputTag triggerResultTag = edm::InputTag("TriggerResults");
984     triggerResultTag = edm::InputTag( triggerResultTag.label(), triggerResultTag.instance(), nameProcess );
985    
986     edm::Handle<edm::TriggerResults> trigger;
987     iEvent.getByLabel(triggerResultTag, trigger);
988     const edm::TriggerResults& trig = *(trigger.product());
989    
990     triggerResults.clear();
991     triggerNames.clear();
992 peiffer 1.16 // L1_prescale.clear();
993     // HLT_prescale.clear();
994 peiffer 1.6
995     edm::Service<edm::service::TriggerNamesService> tns;
996     std::vector<std::string> triggerNames_all;
997     tns->getTrigPaths(trig,triggerNames_all);
998    
999     if (trig.size()!=triggerNames_all.size()) std::cout <<"ERROR: length of names and paths not the same: "<<triggerNames_all.size()<<","<<trig.size()<< std::endl;
1000     for(unsigned int i=0; i<trig.size(); ++i){
1001     std::vector<std::string>::const_iterator it = trigger_prefixes.begin();
1002     for(; it!=trigger_prefixes.end(); ++it){
1003     if(triggerNames_all[i].substr(0, it->size()) == *it)break;
1004     }
1005     if(it==trigger_prefixes.end()) continue;
1006    
1007     //triggerResults.insert(std::pair<std::string, bool>(triggerNames[i],trig.accept(i)));
1008     triggerResults.push_back(trig.accept(i));
1009     if(newrun) triggerNames.push_back(triggerNames_all[i]);
1010 peiffer 1.16 // if(isRealData){
1011     // std::pair<int, int> pre=hlt_cfg.prescaleValues(iEvent, iSetup, triggerNames_all[i]);
1012     // L1_prescale.push_back(pre.first);
1013     // HLT_prescale.push_back(pre.second);
1014     // //std::cout << triggerNames_all[i] << " " << pre.first << " " <<pre.second << " " << hlt_cfg.prescaleValue(iEvent, iSetup, triggerNames_all[i]) << std::endl;
1015     // }
1016 peiffer 1.6 }
1017     // for(std::map<std::string, bool>::const_iterator iter = triggerResults.begin(); iter!=triggerResults.end(); iter++){
1018     // std::cout << (*iter).first << " " << (*iter).second << std::endl;
1019     // }
1020     newrun=false;
1021     }
1022 peiffer 1.1
1023    
1024     tr->Fill();
1025 peiffer 1.10 if(doLumiInfo)
1026     previouslumiblockwasfilled=true;
1027 rkogler 1.27
1028     // clean up
1029     if(doTopJetsConstituents){
1030     pfparticles.clear();
1031     }
1032 rkogler 1.29
1033     // need to do a check if necessary
1034     pfparticles.clear();
1035 rkogler 1.27
1036 peiffer 1.1 }
1037    
1038    
1039     // ------------ method called once each job just before starting event loop ------------
1040     void
1041     NtupleWriter::beginJob()
1042     {
1043 peiffer 1.10 if(doLumiInfo){
1044     totalRecLumi=0;
1045     totalDelLumi=0;
1046     previouslumiblockwasfilled=false;
1047     }
1048 peiffer 1.1 }
1049    
1050     // ------------ method called once each job just after ending the event loop ------------
1051     void
1052     NtupleWriter::endJob()
1053     {
1054     outfile->cd();
1055     tr->Write();
1056     outfile->Close();
1057     }
1058    
1059     // ------------ method called when starting to processes a run ------------
1060     void
1061     NtupleWriter::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup)
1062     {
1063 peiffer 1.7 if(doTrigger){
1064 peiffer 1.19 //bool setup_changed = false;
1065     //hlt_cfg.init(iRun, iSetup, "HLT", setup_changed);
1066 peiffer 1.7 newrun=true;
1067     }
1068 peiffer 1.5
1069 peiffer 1.1 }
1070    
1071     // ------------ method called when ending the processing of a run ------------
1072 jott 1.30 void NtupleWriter::endRun(edm::Run const&, edm::EventSetup const&)
1073 peiffer 1.1 {
1074 peiffer 1.10 if(doLumiInfo)
1075     std::cout << "total integ. luminosity: " << totalDelLumi <<"(del) " << totalRecLumi << "(rec)" << std::endl;
1076 peiffer 1.1 }
1077    
1078     // ------------ method called when starting to processes a luminosity block ------------
1079 jott 1.30 void NtupleWriter::beginLuminosityBlock(edm::LuminosityBlock const& lumi, edm::EventSetup const&)
1080 peiffer 1.1 {
1081 peiffer 1.10 if(doLumiInfo){
1082     edm::Handle<LumiSummary> l;
1083     lumi.getByLabel("lumiProducer", l);
1084    
1085     //add lumi of lumi blocks without any event to next lumiblock
1086     if(previouslumiblockwasfilled){
1087     intgRecLumi=0;
1088     intgDelLumi=0;
1089     }
1090     previouslumiblockwasfilled=false;
1091    
1092     if (l.isValid()){;
1093     intgRecLumi+=l->intgRecLumi()*6.37;
1094     intgDelLumi+=l->intgDelLumi()*6.37;
1095     totalRecLumi+=l->intgRecLumi()*6.37;
1096     totalDelLumi+=l->intgDelLumi()*6.37;
1097     }
1098     //std::cout << "this lb: " <<l->intgRecLumi()*6.37 <<" " << l->intgDelLumi()*6.37<<std::endl;
1099     //std::cout << "summed: "<< intgRecLumi << " " << intgDelLumi << std::endl;
1100     }
1101 peiffer 1.1 }
1102    
1103     // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
1104     void
1105     NtupleWriter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
1106     //The following says we do not know what parameters are allowed so do no validation
1107     // Please change this to state exactly what you do use, even if it is no parameters
1108     edm::ParameterSetDescription desc;
1109     desc.setUnknown();
1110     descriptions.addDefault(desc);
1111     }
1112    
1113 rkogler 1.27
1114 jott 1.30 namespace{
1115 rkogler 1.27
1116 jott 1.30 PFParticle PFCandidate2PFParticle(const reco::PFCandidate & pf){
1117 rkogler 1.27 PFParticle part;
1118 jott 1.30 part.set_pt(pf.pt());
1119     part.set_eta(pf.eta());
1120     part.set_phi(pf.phi());
1121     part.set_energy(pf.energy());
1122     part.set_charge(pf.charge());
1123     part.set_ecal_en(pf.ecalEnergy());
1124     part.set_hcal_en(pf.hcalEnergy());
1125     reco::TrackRef trackref = pf.trackRef();
1126 rkogler 1.27 if (!trackref.isNull()){
1127     part.set_track_mom(trackref->p());
1128     }
1129     PFParticle::EParticleID id = PFParticle::eX;
1130 jott 1.30 switch ( pf.translatePdgIdToType(pf.pdgId()) ){
1131     case reco::PFCandidate::X : id = PFParticle::eX; break;
1132     case reco::PFCandidate::h : id = PFParticle::eH; break;
1133     case reco::PFCandidate::e : id = PFParticle::eE; break;
1134     case reco::PFCandidate::mu : id = PFParticle::eMu; break;
1135     case reco::PFCandidate::gamma : id = PFParticle::eGamma; break;
1136     case reco::PFCandidate::h0 : id = PFParticle::eH0; break;
1137     case reco::PFCandidate::h_HF : id = PFParticle::eH_HF; break;
1138     case reco::PFCandidate::egamma_HF : id = PFParticle::eEgamma_HF; break;
1139 rkogler 1.27 }
1140     part.set_particleID(id);
1141 jott 1.30 return part;
1142     }
1143    
1144     // add pf to pfs, ensuring there is no duplication. Retuns the index
1145     // of pf in pfs.
1146     size_t add_pfpart(const reco::PFCandidate & pf, vector<PFParticle> & pfs){
1147     for(size_t j=0; j<pfs.size(); ++j){
1148     PFParticle spf = pfs[j];
1149     // note: static_cast to float is to ensure the comparison is done with the same precision as these quantities
1150     // have been stored in spf. Otherwise, there could be a non-zero difference just because of conversion loss
1151     // from double to float.
1152     double r = fabs(static_cast<float>(pf.eta()) - spf.eta()) + fabs(static_cast<float>(pf.phi()) - spf.phi());
1153     double dpt = fabs(static_cast<float>(pf.pt()) - spf.pt());
1154     if (r == 0.0 && dpt == 0.0){
1155     return j;
1156     }
1157     }
1158     pfs.push_back(PFCandidate2PFParticle(pf));
1159     return pfs.size()-1;
1160     }
1161 rkogler 1.27
1162    
1163 jott 1.30 }
1164    
1165    
1166     void NtupleWriter::StoreJetConstituents(const pat::Jet& pat_jet, Jet& jet)
1167     {
1168     const std::vector<reco::PFCandidatePtr> jconstits = pat_jet.getPFConstituents();
1169     for (unsigned int i=0; i<jconstits.size(); ++i){
1170     const reco::PFCandidate* pf = jconstits[i].get();
1171     size_t pfparticles_index = add_pfpart(*pf, pfparticles);
1172     jet.add_pfconstituents_index(pfparticles_index);
1173 rkogler 1.27 }
1174     }
1175    
1176 jott 1.30 void NtupleWriter::StorePFCandsInCone(Particle* inpart, const std::vector<reco::PFCandidate>& pf_cands, double R0)
1177 rkogler 1.29 {
1178     for (unsigned int i=0; i<pf_cands.size(); ++i){
1179 jott 1.30 const reco::PFCandidate & pf = pf_cands[i];
1180     double dr = deltaR(*inpart, pf);
1181     if (dr>R0) continue;
1182 rkogler 1.29
1183 jott 1.30 // don't store particle itself:
1184 rkogler 1.29 double dpt = fabs( inpart->pt() - pf.pt() );
1185 jott 1.30 if (dr<1e-10 && dpt<1e-10){
1186 rkogler 1.29 continue;
1187     }
1188 jott 1.30 add_pfpart(pf, pfparticles);
1189 rkogler 1.29 }
1190     }
1191    
1192 peiffer 1.1 //define this as a plug-in
1193     DEFINE_FWK_MODULE(NtupleWriter);