ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbbAnalysis/HbbAnalyzer/plugins/HbbAnalyzerNew.cc
Revision: 1.32
Committed: Mon Sep 12 14:23:42 2011 UTC (13 years, 8 months ago) by tboccali
Content type: text/plain
Branch: MAIN
Changes since 1.31: +16 -19 lines
Log Message:
fix taginfo

File Contents

# User Rev Content
1 tboccali 1.1 // -*- C++ -*-
2     //
3     // Package: HbbAnalyzerNew
4     // Class: HbbAnalyzerNew
5     //
6     /**\class HbbAnalyzerNew HbbAnalyzerNew.cc Analysis/HbbAnalyzer/src/HbbAnalyzerNew.cc
7    
8     Description: <one line class summary>
9    
10     Implementation:
11     <Notes on implementation>
12     */
13     //
14     // Original Author: David Lopes Pegna,Address unknown,NONE,
15     // Created: Thu Mar 5 13:51:28 EST 2009
16 tboccali 1.32 // $Id: HbbAnalyzerNew.cc,v 1.31 2011/09/09 12:34:45 tboccali Exp $
17 tboccali 1.1 //
18     //
19    
20 tboccali 1.28 #include "CondFormats/JetMETObjects/interface/JetCorrectorParameters.h"
21     #include "CondFormats/JetMETObjects/interface/JetCorrectionUncertainty.h"
22     #include "JetMETCorrections/Objects/interface/JetCorrector.h"
23     #include "JetMETCorrections/Objects/interface/JetCorrectionsRecord.h"
24     #include "DataFormats/TrackReco/interface/TrackFwd.h"
25    
26 tboccali 1.2 #include "VHbbAnalysis/HbbAnalyzer/interface/HbbAnalyzerNew.h"
27 tboccali 1.5
28 tboccali 1.1 #define GENPTOLOR(a) TLorentzVector((a).px(), (a).py(), (a).pz(), (a).energy())
29     #define GENPTOLORP(a) TLorentzVector((a)->px(), (a)->py(), (a)->pz(), (a)->energy())
30    
31 tboccali 1.28
32     struct CompareJetPtMuons {
33     bool operator()( const VHbbEvent::MuonInfo& j1, const VHbbEvent::MuonInfo& j2 ) const {
34     return j1.p4.Pt() > j2.p4.Pt();
35     }
36     };
37     struct CompareJetPtElectrons {
38     bool operator()( const VHbbEvent::ElectronInfo& j1, const VHbbEvent::ElectronInfo& j2 ) const {
39     return j1.p4.Pt() > j2.p4.Pt();
40     }
41     };
42     struct CompareJetPtTaus {
43     bool operator()( const VHbbEvent::TauInfo& j1, const VHbbEvent::TauInfo& j2 ) const {
44     return j1.p4.Pt() > j2.p4.Pt();
45     }
46     };
47    
48    
49    
50 tboccali 1.1 HbbAnalyzerNew::HbbAnalyzerNew(const edm::ParameterSet& iConfig):
51 tboccali 1.7 eleLabel_(iConfig.getParameter<edm::InputTag>("electronTag")),
52     muoLabel_(iConfig.getParameter<edm::InputTag>("muonTag")),
53     jetLabel_(iConfig.getParameter<edm::InputTag>("jetTag")),
54     subjetLabel_(iConfig.getParameter<edm::InputTag>("subjetTag")),
55     simplejet1Label_(iConfig.getParameter<edm::InputTag>("simplejet1Tag")),
56     simplejet2Label_(iConfig.getParameter<edm::InputTag>("simplejet2Tag")),
57     simplejet3Label_(iConfig.getParameter<edm::InputTag>("simplejet3Tag")),
58     simplejet4Label_(iConfig.getParameter<edm::InputTag>("simplejet4Tag")),
59     tauLabel_(iConfig.getParameter<edm::InputTag>("tauTag")),
60     metLabel_(iConfig.getParameter<edm::InputTag>("metTag")),
61     phoLabel_(iConfig.getParameter<edm::InputTag>("photonTag")),
62     dimuLabel_(iConfig.getParameter<edm::InputTag>("dimuTag")),
63     dielecLabel_(iConfig.getParameter<edm::InputTag>("dielecTag")),
64     hltResults_(iConfig.getParameter<edm::InputTag>("hltResultsTag")),
65 tboccali 1.9 runOnMC_(iConfig.getParameter<bool>("runOnMC")), verbose_(iConfig.getUntrackedParameter<bool>("verbose")) {
66 tboccali 1.3
67 tboccali 1.1 //
68     // put the setwhatproduced etc etc
69    
70     produces<VHbbEvent>();
71 tboccali 1.11 produces<VHbbEventAuxInfo>();
72 tboccali 1.1
73    
74     }
75    
76    
77     HbbAnalyzerNew::~HbbAnalyzerNew(){
78    
79     // do anything here that needs to be done at desctruction time
80     // (e.g. close files, deallocate resources etc.)
81    
82     }
83    
84    
85     //
86     // member functions
87     //
88    
89     // ------------ method called to for each event ------------
90     void
91     HbbAnalyzerNew::produce(edm::Event& iEvent, const edm::EventSetup& iSetup){
92     using namespace edm;
93     using namespace reco;
94    
95 tboccali 1.28 // JEC Uncertainty
96    
97 tboccali 1.29 // JetCorrectionUncertainty *jecUnc=0;
98 tboccali 1.30 edm::ESHandle<JetCorrectorParametersCollection> JetCorParColl;
99 tboccali 1.28 iSetup.get<JetCorrectionsRecord>().get("AK5PF",JetCorParColl);
100 tboccali 1.30 JetCorrectionUncertainty *jecUnc=0;
101 tboccali 1.31 // if (!runOnMC_){
102 tboccali 1.28 JetCorrectorParameters const & JetCorPar = (*JetCorParColl)["Uncertainty"];
103 tboccali 1.30 jecUnc = new JetCorrectionUncertainty(JetCorPar);
104 tboccali 1.31 // }
105 tboccali 1.1
106 tboccali 1.11 std::auto_ptr<VHbbEvent> hbbInfo( new VHbbEvent() );
107     std::auto_ptr<VHbbEventAuxInfo> auxInfo( new VHbbEventAuxInfo() );
108 tboccali 1.1
109     //
110     // ??
111    
112     // trigger
113 tboccali 1.28
114     // trigger
115 tboccali 1.1 edm::Handle<edm::TriggerResults> hltresults;
116     //iEvent.getByLabel("TriggerResults", hltresults);
117    
118     //edm::InputTag tag("TriggerResults::HLT");
119     // edm::InputTag tag("TriggerResults::HLT0");
120     iEvent.getByLabel(hltResults_, hltresults);
121    
122     const edm::TriggerNames & triggerNames_ = iEvent.triggerNames(*hltresults);
123 tboccali 1.28
124 tboccali 1.1 int ntrigs = hltresults->size();
125 bortigno 1.25 if (ntrigs==0){std::cerr << "%HLTInfo -- No trigger name given in TriggerResults of the input " << std::endl;}
126 tboccali 1.1
127     BeamSpot vertexBeamSpot;
128     edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
129     iEvent.getByLabel("offlineBeamSpot",recoBeamSpotHandle);
130     vertexBeamSpot = *recoBeamSpotHandle;
131     /*
132     double BSx=vertexBeamSpot.x0();
133     double BSy=vertexBeamSpot.y0();
134     double BSz=vertexBeamSpot.z0();
135     */
136    
137     double MinVtxProb=-999.;
138     int VtxIn=-99;
139    
140     Handle<reco::VertexCollection> recVtxs;
141     iEvent.getByLabel("offlinePrimaryVertices", recVtxs);
142    
143 tboccali 1.15 auxInfo->pvInfo.nVertices = recVtxs->size();
144    
145 tboccali 1.1 for(size_t i = 0; i < recVtxs->size(); ++ i) {
146     const Vertex &vtx = (*recVtxs)[i];
147     double RecVtxProb=TMath::Prob(vtx.chi2(),vtx.ndof());
148     if(RecVtxProb>MinVtxProb){
149     VtxIn=i;
150     MinVtxProb=RecVtxProb;
151     }
152     }
153    
154     const Vertex &RecVtx = (*recVtxs)[VtxIn];
155     const Vertex &RecVtxFirst = (*recVtxs)[0];
156    
157 tboccali 1.11 auxInfo->pvInfo.firstPVInPT2 = TVector3(RecVtxFirst.x(), RecVtxFirst.y(), RecVtxFirst.z());
158     auxInfo->pvInfo.firstPVInProb = TVector3(RecVtx.x(), RecVtx.y(), RecVtx.z());
159 tboccali 1.1
160    
161     edm::Handle<double> rhoHandle;
162 tboccali 1.15 iEvent.getByLabel(edm::InputTag("kt6PFJets", "rho"),rhoHandle); auxInfo->puInfo.rho = *rhoHandle;
163 tboccali 1.1
164     //// real start
165    
166    
167     Handle<GenParticleCollection> genParticles;
168    
169     bool printJet=0;
170    
171    
172 tboccali 1.3 if(runOnMC_){
173 tboccali 1.1
174 tboccali 1.28 iEvent.getByLabel("genParticles", genParticles);
175 tboccali 1.1
176     for(size_t i = 0; i < genParticles->size(); ++ i) {
177 tboccali 1.28
178 tboccali 1.1 const GenParticle & p = (*genParticles)[i];
179     int id = p.pdgId();
180     int st = p.status();
181 tboccali 1.12
182     if(id==25){
183 tboccali 1.1
184 tboccali 1.12 VHbbEventAuxInfo::ParticleMCInfo htemp;
185     htemp.status=st;
186     htemp.charge=p.charge();
187     if(p.mother(0)!=0) htemp.momid=p.mother(0)->pdgId();
188     if(p.mother(0)!=0 && p.mother(0)->mother(0)!=0) htemp.gmomid=p.mother(0)->mother(0)->pdgId();
189 tboccali 1.13 htemp.p4 = GENPTOLOR(p);
190 tboccali 1.28
191 tboccali 1.1 int ndau = p.numberOfDaughters();
192     for(int j = 0; j < ndau; ++ j) {
193     const Candidate * Hdau = p.daughter( j );
194 tboccali 1.12 htemp.dauid.push_back(Hdau->pdgId());
195     htemp.dauFourMomentum.push_back(GENPTOLORP(Hdau));
196 tboccali 1.1 }
197 tboccali 1.12 (auxInfo->mcH).push_back(htemp);
198 tboccali 1.1 }
199 tboccali 1.28
200    
201     if(abs(id)==24){
202 tboccali 1.1
203 tboccali 1.12 VHbbEventAuxInfo::ParticleMCInfo wtemp;
204     wtemp.status=st;
205     wtemp.charge=p.charge();
206     if(p.mother(0)!=0) wtemp.momid=p.mother(0)->pdgId();
207     if(p.mother(0)!=0 && p.mother(0)->mother(0)!=0) wtemp.gmomid=p.mother(0)->mother(0)->pdgId();
208 tboccali 1.13 wtemp.p4=GENPTOLOR(p);
209 tboccali 1.28
210 tboccali 1.1 int ndau = p.numberOfDaughters();
211     for(int j = 0; j < ndau; ++ j) {
212     const Candidate * Wdau = p.daughter( j );
213 tboccali 1.12 wtemp.dauid.push_back(Wdau->pdgId());
214     wtemp.dauFourMomentum.push_back(GENPTOLORP(Wdau));
215 tboccali 1.1 }
216 tboccali 1.12 auxInfo->mcW.push_back(wtemp);
217 tboccali 1.1 }
218    
219     if(abs(id)==23){
220    
221 tboccali 1.28
222 tboccali 1.12 VHbbEventAuxInfo::ParticleMCInfo ztemp;
223     ztemp.status=st;
224     ztemp.charge=p.charge();
225     if(p.mother(0)!=0) ztemp.momid=p.mother(0)->pdgId();
226     if(p.mother(0)!=0 && p.mother(0)->mother(0)!=0) ztemp.gmomid=p.mother(0)->mother(0)->pdgId();
227 tboccali 1.13 ztemp.p4=GENPTOLOR(p);
228 tboccali 1.1
229     int ndau = p.numberOfDaughters();
230     for(int j = 0; j < ndau; ++ j) {
231     const Candidate * Zdau = p.daughter( j );
232 tboccali 1.12 ztemp.dauid.push_back(Zdau->pdgId());
233     ztemp.dauFourMomentum.push_back(GENPTOLOR(p));
234 tboccali 1.1 }
235 tboccali 1.12 auxInfo->mcZ.push_back(ztemp);
236 tboccali 1.1 }
237     //
238     // binfo
239     //
240 tboccali 1.12
241 tboccali 1.1
242     if(id==5){
243 tboccali 1.28
244 tboccali 1.12 VHbbEventAuxInfo::ParticleMCInfo btemp;
245     btemp.status=st;
246     btemp.charge=p.charge();
247     if(p.mother(0)!=0) btemp.momid=p.mother(0)->pdgId();
248     if(p.mother(0)!=0 && p.mother(0)->mother(0)!=0) btemp.gmomid=p.mother(0)->mother(0)->pdgId();
249 tboccali 1.28
250     btemp.p4=GENPTOLOR(p);
251    
252     int nHDaubdau = p.numberOfDaughters();
253     for(int j = 0; j < nHDaubdau; ++ j) {
254     const Candidate * Bdau = p.daughter( j );
255     btemp.dauid.push_back(Bdau->pdgId());
256     }
257 tboccali 1.12 auxInfo->mcB.push_back(btemp);
258 tboccali 1.1 }
259    
260     if(id==-5){
261 tboccali 1.28
262 tboccali 1.12 VHbbEventAuxInfo::ParticleMCInfo bbtemp;
263    
264     bbtemp.status=st;
265     bbtemp.charge=p.charge();
266     if(p.mother(0)!=0) bbtemp.momid=p.mother(0)->pdgId();
267     if(p.mother(0)!=0 && p.mother(0)->mother(0)!=0) bbtemp.gmomid=p.mother(0)->mother(0)->pdgId();
268 tboccali 1.28
269     bbtemp.p4=GENPTOLOR(p);
270    
271     int nHDaubdau = p.numberOfDaughters();
272     for(int j = 0; j < nHDaubdau; ++ j) {
273     const Candidate * Bdau = p.daughter( j );
274     bbtemp.dauid.push_back(Bdau->pdgId());
275     }
276    
277    
278 tboccali 1.12 auxInfo->mcBbar.push_back(bbtemp);
279     }
280 tboccali 1.1
281     if(abs(id)==4){
282 tboccali 1.12 VHbbEventAuxInfo::ParticleMCInfo ctemp;
283     ctemp.status=st;
284     ctemp.charge=p.charge();
285     if(p.mother(0)!=0) ctemp.momid=p.mother(0)->pdgId();
286     if(p.mother(0)!=0 && p.mother(0)->mother(0)!=0) ctemp.gmomid=p.mother(0)->mother(0)->pdgId();
287 tboccali 1.28
288     ctemp.p4=GENPTOLOR(p);
289    
290     int nHDaubdau = p.numberOfDaughters();
291     for(int j = 0; j < nHDaubdau; ++ j) {
292     const Candidate * Bdau = p.daughter( j );
293     ctemp.dauid.push_back(Bdau->pdgId());
294     }
295    
296 tboccali 1.12 auxInfo->mcC.push_back(ctemp);
297 tboccali 1.28
298 tboccali 1.1 }
299    
300     }
301    
302     } // isMC
303    
304     /////// end generator block
305    
306    
307     edm::Handle<edm::View<pat::Muon> > muonHandle;
308     iEvent.getByLabel(muoLabel_,muonHandle);
309     edm::View<pat::Muon> muons = *muonHandle;
310    
311     // hard jet
312     edm::Handle<edm::View<pat::Jet> > jetHandle;
313     iEvent.getByLabel(jetLabel_,jetHandle);
314     edm::View<pat::Jet> jets = *jetHandle;
315    
316     // sub jet
317     edm::Handle<edm::View<pat::Jet> > subjetHandle;
318     iEvent.getByLabel(subjetLabel_,subjetHandle);
319     edm::View<pat::Jet> subjets = *subjetHandle;
320    
321     // standard jets
322    
323     edm::Handle<edm::View<pat::Jet> > simplejet1Handle;
324     iEvent.getByLabel(simplejet1Label_,simplejet1Handle);
325     edm::View<pat::Jet> simplejets1 = *simplejet1Handle;
326    
327     edm::Handle<edm::View<pat::Jet> > simplejet2Handle;
328     iEvent.getByLabel(simplejet2Label_,simplejet2Handle);
329     edm::View<pat::Jet> simplejets2 = *simplejet2Handle;
330    
331     edm::Handle<edm::View<pat::Jet> > simplejet3Handle;
332     iEvent.getByLabel(simplejet3Label_,simplejet3Handle);
333     edm::View<pat::Jet> simplejets3 = *simplejet3Handle;
334    
335     edm::Handle<edm::View<pat::Jet> > simplejet4Handle;
336     iEvent.getByLabel(simplejet4Label_,simplejet4Handle);
337     edm::View<pat::Jet> simplejets4 = *simplejet4Handle;
338    
339    
340     edm::Handle<edm::View<pat::Electron> > electronHandle;
341     iEvent.getByLabel(eleLabel_,electronHandle);
342     edm::View<pat::Electron> electrons = *electronHandle;
343    
344    
345     // edm::Handle<edm::View<pat::Photon> > phoHandle;
346     // iEvent.getByLabel(phoLabel_,phoHandle);
347     // edm::View<pat::Photon> photons = *phoHandle;
348    
349     edm::Handle<edm::View<pat::Tau> > tauHandle;
350     iEvent.getByLabel(tauLabel_,tauHandle);
351     edm::View<pat::Tau> taus = *tauHandle;
352    
353     edm::Handle<CandidateView> dimuons;
354     iEvent.getByLabel(dimuLabel_,dimuons);
355    
356     edm::Handle<CandidateView> dielectrons;
357     iEvent.getByLabel(dielecLabel_,dielectrons);
358    
359 bortigno 1.19 //BTAGGING SCALE FACTOR FROM DATABASE
360     //Combined Secondary Vertex Loose
361     edm::ESHandle<BtagPerformance> bTagSF_CSVL_;
362     iSetup.get<BTagPerformanceRecord>().get("BTAGCSVL",bTagSF_CSVL_);
363     const BtagPerformance & bTagSF_CSVL = *(bTagSF_CSVL_.product());
364     //Combined Secondary Vertex Medium
365     edm::ESHandle<BtagPerformance> bTagSF_CSVM_;
366     iSetup.get<BTagPerformanceRecord>().get("BTAGCSVM",bTagSF_CSVM_);
367     const BtagPerformance & bTagSF_CSVM = *(bTagSF_CSVM_.product());
368     //Combined Secondary Vertex Tight
369     edm::ESHandle<BtagPerformance> bTagSF_CSVT_;
370     iSetup.get<BTagPerformanceRecord>().get("BTAGCSVT",bTagSF_CSVT_);
371     const BtagPerformance & bTagSF_CSVT = *(bTagSF_CSVT_.product());
372    
373 bortigno 1.21 edm::ESHandle<BtagPerformance> mistagSF_CSVL_;
374     iSetup.get<BTagPerformanceRecord>().get("MISTAGCSVL",mistagSF_CSVL_);
375     const BtagPerformance & mistagSF_CSVL = *(mistagSF_CSVL_.product());
376     //Combined Secondary Vertex Medium
377     edm::ESHandle<BtagPerformance> mistagSF_CSVM_;
378     iSetup.get<BTagPerformanceRecord>().get("MISTAGCSVM",mistagSF_CSVM_);
379     const BtagPerformance & mistagSF_CSVM = *(mistagSF_CSVM_.product());
380     //Combined Secondary Vertex Tight
381     edm::ESHandle<BtagPerformance> mistagSF_CSVT_;
382     iSetup.get<BTagPerformanceRecord>().get("MISTAGCSVT",mistagSF_CSVT_);
383     const BtagPerformance & mistagSF_CSVT = *(mistagSF_CSVT_.product());
384    
385 arizzi 1.27 BTagSFContainer btagSFs;
386     btagSFs.BTAGSF_CSVL = (bTagSF_CSVL_.product());
387     btagSFs.BTAGSF_CSVM = (bTagSF_CSVM_.product());
388     btagSFs.BTAGSF_CSVT = (bTagSF_CSVT_.product());
389     btagSFs.MISTAGSF_CSVL = (mistagSF_CSVL_.product());
390     btagSFs.MISTAGSF_CSVM = (mistagSF_CSVM_.product());
391     btagSFs.MISTAGSF_CSVT = (mistagSF_CSVT_.product());
392 tboccali 1.1
393     for(edm::View<pat::Jet>::const_iterator jet_iter = simplejets1.begin(); jet_iter!=simplejets1.end(); ++jet_iter){
394     // if(jet_iter->pt()>50)
395     // njetscounter++;
396     VHbbEvent::SimpleJet sj;
397 tboccali 1.28 fillSimpleJet(sj,jet_iter);
398 tboccali 1.31 // if(!runOnMC_)
399 tboccali 1.28
400 tboccali 1.31 setJecUnc(sj,jecUnc);
401 tboccali 1.28
402 tboccali 1.1 Particle::LorentzVector p4Jet = jet_iter->p4();
403    
404 tboccali 1.3 if(runOnMC_){
405 bortigno 1.19
406 arizzi 1.27 fillScaleFactors(sj, btagSFs);
407 bortigno 1.24
408     //PAT genJet matching
409     //genJet
410     const reco::GenJet *gJ = jet_iter->genJet();
411     //physical parton for mother info ONLY
412     if( (jet_iter->genParton())
413     and (jet_iter->genParton()->mother()) )
414     sj.bestMCmomid=jet_iter->genParton()->mother()->pdgId();
415     TLorentzVector gJp4;
416     if(gJ){
417     gJp4.SetPtEtaPhiE(gJ->pt(),gJ->eta(),gJ->phi(),gJ->energy());
418 tboccali 1.28 sj. bestMCp4mom = gJp4;
419 bortigno 1.24 if(verbose_){
420     std::clog << "genJet matched Pt = " << gJp4.Pt() << std::endl;
421     std::clog << "genJet matched eta = " << gJp4.Eta() << std::endl;
422 tboccali 1.28 std::clog << "genJet matched deltaR = " <<gJp4.DeltaR(sj.p4) << std::endl;
423 bortigno 1.24 std::clog << "genJet matched mother id = " << sj.bestMCmomid << std::endl;
424 tboccali 1.1 }
425     }
426 bortigno 1.24
427 bortigno 1.20 } //isMC
428 tboccali 1.1 hbbInfo->simpleJets.push_back(sj);
429    
430     }
431 tboccali 1.30
432     for(edm::View<pat::Jet>::const_iterator jet_iter = simplejets3.begin(); jet_iter!=simplejets3.end(); ++jet_iter){
433     // if(jet_iter->pt()>50)
434     // njetscounter++;
435     VHbbEvent::SimpleJet sj;
436     fillSimpleJet(sj,jet_iter);
437 tboccali 1.31 // if(!runOnMC_)
438     setJecUnc(sj,jecUnc);
439 tboccali 1.30
440    
441 tboccali 1.31 Particle::LorentzVector p4Jet = jet_iter->p4();
442 tboccali 1.30
443     if(runOnMC_){
444    
445     fillScaleFactors(sj, btagSFs);
446    
447     //PAT genJet matching
448     //genJet
449     const reco::GenJet *gJ = jet_iter->genJet();
450     //physical parton for mother info ONLY
451     if( (jet_iter->genParton())
452     and (jet_iter->genParton()->mother()) )
453     sj.bestMCmomid=jet_iter->genParton()->mother()->pdgId();
454     TLorentzVector gJp4;
455     if(gJ){
456     gJp4.SetPtEtaPhiE(gJ->pt(),gJ->eta(),gJ->phi(),gJ->energy());
457     sj. bestMCp4mom = gJp4;
458     if(verbose_){
459     std::clog << "genJet matched Pt = " << gJp4.Pt() << std::endl;
460     std::clog << "genJet matched eta = " << gJp4.Eta() << std::endl;
461     std::clog << "genJet matched deltaR = " <<gJp4.DeltaR(sj.p4) << std::endl;
462     std::clog << "genJet matched mother id = " << sj.bestMCmomid << std::endl;
463     }
464     }
465    
466     } //isMC
467     hbbInfo->simpleJets3.push_back(sj);
468    
469     }
470    
471     for(edm::View<pat::Jet>::const_iterator jet_iter = simplejets4.begin(); jet_iter!=simplejets4.end(); ++jet_iter){
472     // if(jet_iter->pt()>50)
473     // njetscounter++;
474     VHbbEvent::SimpleJet sj;
475     fillSimpleJet(sj,jet_iter);
476 tboccali 1.31 // if(!runOnMC_)
477     setJecUnc(sj,jecUnc);
478 tboccali 1.30
479    
480     Particle::LorentzVector p4Jet = jet_iter->p4();
481    
482     if(runOnMC_){
483    
484     fillScaleFactors(sj, btagSFs);
485    
486     //PAT genJet matching
487     //genJet
488     const reco::GenJet *gJ = jet_iter->genJet();
489     //physical parton for mother info ONLY
490     if( (jet_iter->genParton())
491     and (jet_iter->genParton()->mother()) )
492     sj.bestMCmomid=jet_iter->genParton()->mother()->pdgId();
493     TLorentzVector gJp4;
494     if(gJ){
495     gJp4.SetPtEtaPhiE(gJ->pt(),gJ->eta(),gJ->phi(),gJ->energy());
496     sj. bestMCp4mom = gJp4;
497     if(verbose_){
498     std::clog << "genJet matched Pt = " << gJp4.Pt() << std::endl;
499     std::clog << "genJet matched eta = " << gJp4.Eta() << std::endl;
500     std::clog << "genJet matched deltaR = " <<gJp4.DeltaR(sj.p4) << std::endl;
501     std::clog << "genJet matched mother id = " << sj.bestMCmomid << std::endl;
502     }
503     }
504    
505     } //isMC
506     hbbInfo->simpleJets4.push_back(sj);
507    
508     }
509    
510 tboccali 1.1
511     for(edm::View<pat::Jet>::const_iterator jet_iter = simplejets2.begin(); jet_iter!=simplejets2.end(); ++jet_iter){
512    
513     VHbbEvent::SimpleJet sj;
514 tboccali 1.28 fillSimpleJet(sj,jet_iter);
515 tboccali 1.31 // if(!runOnMC_)
516     setJecUnc(sj,jecUnc);
517 tboccali 1.28 /* sj.flavour = jet_iter->partonFlavour();
518 tboccali 1.1
519    
520     sj.tche=jet_iter->bDiscriminator("trackCountingHighEffBJetTags");
521     sj.tchp=jet_iter->bDiscriminator("trackCountingHighPurBJetTags");
522     sj.jp=jet_iter->bDiscriminator("jetProbabilityBJetTags");
523     sj.jpb=jet_iter->bDiscriminator("jetBProbabilityBJetTags");
524     sj.ssvhe=jet_iter->bDiscriminator("simpleSecondaryVertexHighEffBJetTags");
525     sj.csv=jet_iter->bDiscriminator("combinedSecondaryVertexBJetTags");
526     sj.csvmva=jet_iter->bDiscriminator("combinedSecondaryVertexMVABJetTags");
527     sj.charge=jet_iter->jetCharge();
528     sj.ntracks=jet_iter->associatedTracks().size();
529 tboccali 1.13 sj.p4=GENPTOLORP(jet_iter);
530 tboccali 1.6 sj.chargedTracksFourMomentum=(getChargedTracksMomentum(&*(jet_iter)));
531 bortigno 1.24 sj.SF_CSVL=1;
532     sj.SF_CSVM=1;
533     sj.SF_CSVT=1;
534     sj.SF_CSVLerr=0;
535     sj.SF_CSVMerr=0;
536     sj.SF_CSVTerr=0;
537 tboccali 1.28
538     //
539     // addtaginfo for csv
540     //
541    
542     if (jet_iter->hasTagInfo("SimpleSecondaryVertex")) {
543    
544     const reco::SecondaryVertexTagInfo * tf = jet_iter->tagInfoSecondaryVertex();
545     sj.vtxMass = tf->secondaryVertex(0).p4().mass();
546     sj.vtxNTracks = tf->secondaryVertex(0).nTracks();
547     Measurement1D m = tf->flightDistance(0);
548     sj.vtx3dL = m.value();
549     sj.vtx3deL = m.error();
550     }
551    
552    
553 bortigno 1.24 //
554     // add tVector
555     //
556 tboccali 1.5 sj.tVector = getTvect(&(*jet_iter));
557 tboccali 1.28 */
558 tboccali 1.1 Particle::LorentzVector p4Jet = jet_iter->p4();
559    
560 bortigno 1.24
561 tboccali 1.3 if(runOnMC_){
562 bortigno 1.24
563     //BTV scale factors
564 arizzi 1.27 fillScaleFactors(sj, btagSFs);
565 bortigno 1.24
566     //PAT genJet matching
567     //genJet
568     const reco::GenJet *gJ = jet_iter->genJet();
569     //physical parton for mother info ONLY
570     if( (jet_iter->genParton())
571     and (jet_iter->genParton()->mother()) )
572     sj.bestMCmomid=jet_iter->genParton()->mother()->pdgId();
573     TLorentzVector gJp4;
574     if(gJ){
575     gJp4.SetPtEtaPhiE(gJ->pt(),gJ->eta(),gJ->phi(),gJ->energy());
576 tboccali 1.28 sj. bestMCp4mom = gJp4;
577 bortigno 1.24 if(verbose_){
578     std::clog << "genJet matched Pt = " << gJp4.Pt() << std::endl;
579     std::clog << "genJet matched eta = " << gJp4.Eta() << std::endl;
580     std::clog << "genJet matched deltaR = " << gJp4.DeltaR(sj.p4) << std::endl;
581     std::clog << "genJet matched mother id = " << sj.bestMCmomid << std::endl;
582 tboccali 1.1 }
583     }
584 bortigno 1.24
585 tboccali 1.1 } //isMC
586    
587     hbbInfo->simpleJets2.push_back(sj);
588    
589     }
590    
591    
592     /* const GenJet* jet1Mc = bjet1.genJet();
593     const GenJet* jet2Mc = bjet2.genJet();
594     if(jet1Mc!=0){
595     MCbJet1MomId=jet1Mc->mother()->pdgId();
596     MCbJet1GMomId=jet1Mc->mother()->mother()->pdgId();
597     }
598    
599     if(jet2Mc!=0){
600     MCbJet2MomId=jet2Mc->mother()->pdgId();
601     MCbJet2GMomId=jet2Mc->mother()->mother()->pdgId();
602     }
603     */
604    
605    
606    
607     /////// hard jet
608    
609    
610     double matEta[1000*30],matPhi[1000*30];
611     for(int i=0;i<1000;i++){for(int j=0;j<30;j++){matEta[i*j]=-99.;matPhi[i*j]=-99.;}}
612    
613     for(edm::View<pat::Jet>::const_iterator jet_iter = jets.begin(); jet_iter!=jets.end(); ++jet_iter){
614    
615     if(printJet) {std::cout << "Jet Pt: " << jet_iter->pt() << " E,M: " << jet_iter->p4().E() << " " << jet_iter->p4().M() << "\n";}
616    
617     reco::Jet::Constituents constituents = jet_iter->getJetConstituents();
618    
619     // if(printJet) {std::cout << "NsubJets: " << constituents.size() << "\n";}
620     VHbbEvent::HardJet hj;
621     hj.constituents=constituents.size();
622 tboccali 1.13 hj.p4 =GENPTOLORP(jet_iter);
623 tboccali 1.28
624 tboccali 1.1 for (unsigned int iJC(0); iJC<constituents.size(); ++iJC ){
625     Jet::Constituent icandJet = constituents[iJC];
626    
627     if(printJet) {std::cout << "subJet Pt: " << icandJet->pt() << " subJet E,M,eta,phi: " << icandJet->p4().E() << ","
628     << icandJet->p4().M() << "," << icandJet->eta() << "," << icandJet->phi() << "\n"; }
629    
630    
631     hj.subFourMomentum.push_back(GENPTOLORP(icandJet));
632     hj.etaSub.push_back(icandJet->eta());
633     hj.phiSub.push_back(icandJet->phi());
634    
635     }
636     hbbInfo->hardJets.push_back(hj);
637     }
638    
639     // HardJetSubEta2.SetMatrixArray(matEta);
640     // HardJetSubPhi2.SetMatrixArray(matPhi);
641     // TMatrixDRow a1(HardJetSubEta2,0);
642     // for(int i=0;i<30;i++){
643     // std::cout << "test: " << a1[i] << "\n";
644     // }
645    
646     // pat subJets with Btag
647    
648    
649     for(edm::View<pat::Jet>::const_iterator subjet_iter = subjets.begin(); subjet_iter!=subjets.end(); ++subjet_iter){
650    
651     if(printJet) {std::cout << "SubJetTagged Pt: " << subjet_iter->pt() << " E,M,eta,phi,Btag: " << subjet_iter->p4().E()
652     << "," << subjet_iter->p4().M() << "," << subjet_iter->eta() << "," << subjet_iter->phi()
653     << "," << subjet_iter->bDiscriminator("combinedSecondaryVertexBJetTags") << "\n";}
654    
655     VHbbEvent::SimpleJet sj;
656 tboccali 1.28 fillSimpleJet(sj,subjet_iter);
657 tboccali 1.31 // if(!runOnMC_)
658     setJecUnc(sj,jecUnc);
659 tboccali 1.28 /* sj.flavour = subjet_iter->partonFlavour();
660 tboccali 1.5 sj.tVector = getTvect(&(*subjet_iter));
661 tboccali 1.1 sj.tche=subjet_iter->bDiscriminator("trackCountingHighEffBJetTags");
662     sj.tchp=subjet_iter->bDiscriminator("trackCountingHighPurBJetTags");
663     sj.jp=subjet_iter->bDiscriminator("jetProbabilityBJetTags");
664     sj.jpb=subjet_iter->bDiscriminator("jetBProbabilityBJetTags");
665     sj.ssvhe=subjet_iter->bDiscriminator("simpleSecondaryVertexHighEffBJetTags");
666     sj.csv=subjet_iter->bDiscriminator("combinedSecondaryVertexBJetTags");
667     sj.csvmva=subjet_iter->bDiscriminator("combinedSecondaryVertexMVABJetTags");
668     sj.charge=subjet_iter->jetCharge();
669     sj.ntracks=subjet_iter->associatedTracks().size();
670 tboccali 1.13 sj.p4=GENPTOLORP(subjet_iter);
671     sj.p4=(getChargedTracksMomentum(&*(subjet_iter)));
672 tboccali 1.28
673     //
674     // addtaginfo for csv
675     //
676    
677     if (subjet_iter->hasTagInfo("SimpleSecondaryVertex")) {
678    
679     const reco::SecondaryVertexTagInfo * tf = subjet_iter->tagInfoSecondaryVertex();
680     sj.vtxMass = tf->secondaryVertex(0).p4().mass();
681     sj.vtxNTracks = tf->secondaryVertex(0).nTracks();
682     Measurement1D m = tf->flightDistance(0);
683     sj.vtx3dL = m.value();
684     sj.vtx3deL = m.error();
685     }
686     */
687 tboccali 1.1 hbbInfo->subJets.push_back(sj);
688    
689     }
690    
691    
692     //
693     // met is calomet
694     //
695    
696     edm::Handle<edm::View<pat::MET> > metTCHandle;
697     iEvent.getByLabel("patMETsTC",metTCHandle);
698     edm::View<pat::MET> metsTC = *metTCHandle;
699 tboccali 1.9 if(metsTC.size()){
700     hbbInfo->tcmet.sumEt=(metsTC[0]).sumEt();
701 tboccali 1.32 hbbInfo->tcmet.metSig=(metsTC[0]).significance();
702 tboccali 1.9 hbbInfo->tcmet.eLong=(metsTC[0]).e_longitudinal();
703 tboccali 1.13 hbbInfo->tcmet.p4=GENPTOLOR((metsTC[0]));
704 tboccali 1.9 if (verbose_) std::cout <<" METTC "<< hbbInfo->tcmet.metSig <<" " << hbbInfo->tcmet.sumEt<<std::endl;
705     }
706    
707 tboccali 1.28
708 tboccali 1.29 edm::Handle<edm::View<reco::MET> > mHTHandle;
709 tboccali 1.28 iEvent.getByLabel("patMETsHT",mHTHandle);
710 tboccali 1.29 edm::View<reco::MET> metsHT = *mHTHandle;
711 tboccali 1.28 if(metsHT.size()){
712     hbbInfo->mht.sumEt=(metsHT[0]).sumEt();
713 tboccali 1.32 hbbInfo->mht.metSig=(metsHT[0]).significance();
714 tboccali 1.28 hbbInfo->mht.eLong=(metsHT[0]).e_longitudinal();
715     hbbInfo->mht.p4=GENPTOLOR((metsHT[0]));
716     if (verbose_) std::cout <<" METHT "<< hbbInfo->mht.metSig <<" " << hbbInfo->mht.sumEt<<std::endl;
717     }
718    
719     edm::Handle<edm::View<pat::MET> > metHandle;
720     iEvent.getByLabel(metLabel_,metHandle);
721     edm::View<pat::MET> mets = *metHandle;
722    
723 tboccali 1.9 if(mets.size()){
724     hbbInfo->calomet.sumEt=(mets[0]).sumEt();
725 tboccali 1.32 hbbInfo->calomet.metSig=(mets[0]).significance();
726 tboccali 1.9 hbbInfo->calomet.eLong=(mets[0]).e_longitudinal();
727 tboccali 1.13 hbbInfo->calomet.p4=GENPTOLOR((mets[0]));
728 tboccali 1.28 if (verbose_) std::cout <<" METCALO "<< hbbInfo->calomet.metSig <<" " << hbbInfo->calomet.sumEt<<std::endl;
729 tboccali 1.1 }
730 tboccali 1.9
731 tboccali 1.1 edm::Handle<edm::View<pat::MET> > metPFHandle;
732     iEvent.getByLabel("patMETsPF",metPFHandle);
733     edm::View<pat::MET> metsPF = *metPFHandle;
734 tboccali 1.28
735 tboccali 1.9 if(metsPF.size()){
736     hbbInfo->pfmet.sumEt=(metsPF[0]).sumEt();
737 tboccali 1.32 hbbInfo->pfmet.metSig=(metsPF[0]).significance();
738 tboccali 1.9 hbbInfo->pfmet.eLong=(metsPF[0]).e_longitudinal();
739 tboccali 1.13 hbbInfo->pfmet.p4=GENPTOLOR((metsPF[0]));
740 tboccali 1.28 if (verbose_) std::cout <<" METPF "<< hbbInfo->pfmet.metSig <<" " << hbbInfo->pfmet.sumEt<<std::endl;
741 tboccali 1.1 }
742 tboccali 1.28
743    
744 tboccali 1.9 if(verbose_){
745 tboccali 1.28 std::cout << "METs: calomet "<<mets.size()<<" tcmet"<<metsTC.size()<<" pfmet "<<metsPF.size()<<" MHT" <<metsHT.size()<<std::endl;
746 tboccali 1.9 }
747    
748 bortigno 1.25 if(verbose_)
749     std::cout << " INPUT MUONS "<<muons.size()<<std::endl;
750 tboccali 1.1
751     for(edm::View<pat::Muon>::const_iterator mu = muons.begin(); mu!=muons.end(); ++mu){
752     VHbbEvent::MuonInfo mf;
753 tboccali 1.13 mf.p4 =GENPTOLORP( mu);
754 tboccali 1.1 mf.charge=mu->charge();
755     mf.tIso=mu->trackIso();
756     mf.eIso=mu->ecalIso();
757     mf.hIso=mu->hcalIso();
758 arizzi 1.16 mf.pfChaIso=mu->chargedHadronIso();
759     mf.pfPhoIso=mu->photonIso();
760     mf.pfNeuIso=mu->neutralHadronIso();
761 tboccali 1.13 Geom::Phi<double> deltaphi(mu->phi()-atan2(mf.p4.Px(), mf.p4.Py()));
762 tboccali 1.1 double acop = deltaphi.value();
763     mf.acop=acop;
764    
765     mf.ipDb=mu->dB();
766     mf.ipErrDb=mu->edB();
767 bortigno 1.23 mf.cat=0;
768 bortigno 1.22 if(mu->isGlobalMuon()) mf.cat|=1;
769     if(mu->isTrackerMuon()) mf.cat|=2;
770 bortigno 1.23 if(mu->isStandAloneMuon()) mf.cat|=4;
771 tboccali 1.1 TrackRef trkMu1Ref = mu->get<TrackRef>();
772     if(trkMu1Ref.isNonnull()){
773     const Track* MuTrk1 = mu->get<TrackRef>().get();
774     mf.zPVPt=MuTrk1->dz(RecVtxFirst.position());
775     mf.zPVProb=MuTrk1->dz(RecVtx.position());
776     mf.nHits=MuTrk1->numberOfValidHits();
777     mf.chi2=MuTrk1->normalizedChi2();
778     TrackRef iTrack1 = mu->innerTrack();
779     const reco::HitPattern& p1 = iTrack1->hitPattern();
780     mf.nPixelHits=p1.pixelLayersWithMeasurement();
781     }
782     if(mu->isGlobalMuon()){
783     TrackRef gTrack = mu->globalTrack();
784     const reco::HitPattern& q = gTrack->hitPattern();
785     mf.globChi2=gTrack.get()->normalizedChi2();
786     mf.globNHits=q.numberOfValidMuonHits();
787 tboccali 1.8 mf. validMuStations = q. muonStationsWithValidHits();
788 tboccali 1.1 }else{
789     mf.globChi2=-99;
790     mf.globNHits=-99;
791     }
792 bortigno 1.18
793     //Muon trigger matching
794     for (int itrig = 0; itrig != ntrigs; ++itrig){
795     std::string trigName=triggerNames_.triggerName(itrig);
796 arizzi 1.26 if( (mu->triggerObjectMatchesByPath(trigName,false,false).size() != 0) ){
797 bortigno 1.18 mf.hltMatchedBits.push_back(itrig);
798     if(verbose_){
799     std::clog << "Trigger Matching box" << std::endl;
800     std::clog << "+++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
801     std::clog << "Matching parameters are defined in the cfg" << std::endl;
802     std::clog << "Trigger bit = " << itrig << std::endl;
803     std::clog << "Trigger name = " << trigName << std::endl;
804 arizzi 1.26 std::clog << "Trigger object matched collection size = " << mu->triggerObjectMatchesByPath(trigName,false,false).size() << std::endl;
805 bortigno 1.18 std::clog << "Pat Muon pt = " << mf.p4.Pt() << " HLT object matched = " << mu->triggerObjectMatch(0)->p4().Pt() << std::endl;
806     std::clog << "+++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
807     }
808     }
809     }
810 tboccali 1.8 //
811 bortigno 1.18
812 tboccali 1.8 // add stamuon
813    
814     // if (mu->isStandAloneMuon()) {
815     // reco::TrackRef sta = mu->standAloneMuon();
816     //
817     // }
818    
819 tboccali 1.1
820     // int muInfo[12];
821     // fillMuBlock(mu, muInfo);
822 tboccali 1.3 if(runOnMC_){
823 tboccali 1.1 const GenParticle* muMc = mu->genLepton();
824     if(muMc!=0){
825     mf.mcId=muMc->pdgId();
826     mf.mcFourMomentum=GENPTOLORP(muMc);
827     if(muMc->mother()!=0) mf.mcMomId=muMc->mother()->pdgId();
828     if(muMc->mother()!=0 && muMc->mother()->mother()!=0) mf.mcgMomId=muMc->mother()->mother()->pdgId();
829     } }
830     hbbInfo->muInfo.push_back(mf);
831     }
832    
833 tboccali 1.28 if(verbose_)
834 bortigno 1.25 std::cout << " INPUT electrons "<<electrons.size()<<std::endl;
835 tboccali 1.1 for(edm::View<pat::Electron>::const_iterator elec = electrons.begin(); elec!=electrons.end(); ++elec){
836     VHbbEvent::ElectronInfo ef;
837 tboccali 1.13 ef.p4=GENPTOLORP(elec);
838 tboccali 1.1 ef.scEta =elec->superCluster()->eta();
839     ef.scPhi =elec->superCluster()->phi();
840     // if(ElecEta[eleccont]!=0) ElecEt[eleccont]=elec->superCluster()->energy()/cosh(elec->superCluster()->eta());
841     ef.charge=elec->charge();
842     ef.tIso=elec->trackIso();
843     ef.eIso=elec->ecalIso();
844     ef.hIso=elec->hcalIso();
845 arizzi 1.16 ef.pfChaIso=elec->chargedHadronIso();
846     ef.pfPhoIso=elec->photonIso();
847     ef.pfNeuIso=elec->neutralHadronIso();
848    
849 tboccali 1.13 Geom::Phi<double> deltaphi(elec->superCluster()->phi()-atan2(hbbInfo->calomet.p4.Py(),hbbInfo->calomet.p4.Px()));
850 tboccali 1.1 ef.acop = deltaphi.value();
851 tboccali 1.8 //
852     // fill eleids
853     //
854 arizzi 1.16 /* ef.id95 = elec->electronID("simpleEleId95cIso");
855 tboccali 1.8 ef.id85 = elec->electronID("simpleEleId85cIso");
856     ef.id70 = elec->electronID("simpleEleId70cIso");
857     ef.id95r = elec->electronID("simpleEleId95relIso");
858     ef.id70r = elec->electronID("simpleEleId70relIso");
859     ef.id85r = elec->electronID("simpleEleId85relIso");
860 arizzi 1.16 */
861     ef.id95 =elec->electronID("eidVBTFCom95");
862     ef.id95r=elec->electronID("eidVBTFRel95");
863     ef.id85 =elec->electronID("eidVBTFCom85");
864     ef.id85r=elec->electronID("eidVBTFRel85");
865     ef.id80 =elec->electronID("eidVBTFCom80");
866     ef.id80r=elec->electronID("eidVBTFRel80");
867     ef.id70 =elec->electronID("eidVBTFCom70");
868     ef.id70r=elec->electronID("eidVBTFRel70");
869 tboccali 1.8
870 bortigno 1.25 //Electron trigger matching
871 bortigno 1.18 for (int itrig = 0; itrig != ntrigs; ++itrig){
872     std::string trigName=triggerNames_.triggerName(itrig);
873     if( (elec->triggerObjectMatchesByPath(trigName).size() != 0) ){
874     ef.hltMatchedBits.push_back(itrig);
875     if(verbose_){
876     std::clog << "Trigger Matching box" << std::endl;
877     std::clog << "+++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
878     std::clog << "Matching parameters are defined in the cfg" << std::endl;
879     std::clog << "Trigger bit = " << itrig << std::endl;
880     std::clog << "Trigger name = " << trigName << std::endl;
881     std::clog << "Trigger object matched collection size = " << elec->triggerObjectMatchesByPath(trigName).size() << std::endl;
882     std::clog << "Pat Electron pt = " << ef.p4.Pt() << " HLT object matched = " << elec->triggerObjectMatch(0)->p4().Pt() << std::endl;
883     std::clog << "+++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
884     }
885     }
886     }
887    
888 tboccali 1.3 if(runOnMC_){
889 tboccali 1.1 const GenParticle* elecMc = elec->genLepton();
890     if(elecMc!=0){
891     ef.mcId=elecMc->pdgId();
892     ef.mcFourMomentum=GENPTOLORP(elecMc);
893     if(elecMc->mother()!=0) ef.mcMomId=elecMc->mother()->pdgId();
894     if(elecMc->mother()!=0 && elecMc->mother()->mother()!=0) ef.mcgMomId=elecMc->mother()->mother()->pdgId();
895     }}
896     hbbInfo->eleInfo.push_back(ef);
897     }
898    
899 bortigno 1.25 if(verbose_)
900     std::cout << " INPUT taus "<<taus.size()<<std::endl;
901 tboccali 1.1 for(edm::View<pat::Tau>::const_iterator tau = taus.begin(); tau!=taus.end(); ++tau){
902     VHbbEvent::TauInfo tf;
903 tboccali 1.13 tf.p4=GENPTOLORP(tau);
904 tboccali 1.1 tf.charge=tau->charge();
905     tf.tIso=tau->trackIso();
906     tf.eIso=tau->ecalIso();
907     tf.hIso=tau->hcalIso();
908 tboccali 1.13 Geom::Phi<double> deltaphi(tau->phi()-atan2(hbbInfo->calomet.p4.Py(),hbbInfo->calomet.p4.Px()));
909 tboccali 1.1 double acop = deltaphi.value();
910     tf.acop=acop;
911     tf.idbyIso=tau->tauID("byIsolation");
912     tf.idbyTrackIso=tau->tauID("trackIsolation");
913     tf.idbyTaNCfrOnePercent=tau->tauID("byTaNCfrOnePercent");
914     tf.idbyTaNCfrHalfPercent=tau->tauID("byTaNCfrHalfPercent");
915     tf.idbyTaNCfrQuarterPercent=tau->tauID("byTaNCfrQuarterPercent");
916     tf.idbyTaNCfrTenthPercent=tau->tauID("byTaNCfrTenthPercent");
917     tf.idbyTaNC=tau->tauID("byTaNC");
918     hbbInfo->tauInfo.push_back(tf);
919     }
920    
921 tboccali 1.28 CompareJetPtMuons ptComparatorMu;
922     CompareJetPtElectrons ptComparatorE;
923     CompareJetPtTaus ptComparatorTau;
924    
925     std::sort(hbbInfo->muInfo.begin(), hbbInfo->muInfo.end(), ptComparatorMu);
926     std::sort(hbbInfo->eleInfo.begin(), hbbInfo->eleInfo.end(), ptComparatorE);
927     std::sort(hbbInfo->tauInfo.begin(), hbbInfo->tauInfo.end(), ptComparatorTau);
928    
929 tboccali 1.1
930     // dimuons and dielectrons
931    
932     for( size_t i = 0; i < dimuons->size(); i++ ) {
933     VHbbEvent::DiMuonInfo df;
934     const Candidate & dimuonCand = (*dimuons)[ i ];
935 tboccali 1.13 df.p4= GENPTOLOR(dimuonCand);
936 tboccali 1.1 const Candidate * lep0 = dimuonCand.daughter( 0 );
937     const Candidate * lep1 = dimuonCand.daughter( 1 );
938     // needed to access specific methods of pat::Muon
939     const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
940     const pat::Muon & muonDau1 = dynamic_cast<const pat::Muon &>(*lep1->masterClone());
941    
942 tboccali 1.13 df.daughter1.p4=GENPTOLOR(muonDau0);
943     df.daughter2.p4=GENPTOLOR(muonDau1);
944 tboccali 1.1
945     df.daughter1.tIso= muonDau0.trackIso();
946     df.daughter2.tIso= muonDau1.trackIso();
947    
948     df.daughter1.eIso= muonDau0.ecalIso();
949     df.daughter2.eIso= muonDau1.ecalIso();
950    
951     df.daughter1.hIso= muonDau0.hcalIso();
952     df.daughter2.hIso= muonDau1.hcalIso();
953    
954     df.daughter1.ipDb=muonDau0.dB();
955     df.daughter2.ipDb=muonDau1.dB();
956    
957     df.daughter1.ipErrDb=muonDau0.edB();
958     df.daughter2.ipErrDb=muonDau1.edB();
959    
960 bortigno 1.23 df.daughter1.cat=0;
961     if(muonDau0.isGlobalMuon()) df.daughter1.cat|=1;
962     if(muonDau0.isTrackerMuon()) df.daughter1.cat|=2;
963     if(muonDau0.isStandAloneMuon()) df.daughter1.cat|=4;
964     df.daughter2.cat=0;
965     if(muonDau1.isGlobalMuon()) df.daughter2.cat|=1;
966     if(muonDau1.isTrackerMuon()) df.daughter2.cat|=2;
967     if(muonDau1.isStandAloneMuon()) df.daughter2.cat|=4;
968 tboccali 1.1
969     TrackRef trkMu1Ref = muonDau0.get<TrackRef>();
970     TrackRef trkMu2Ref = muonDau1.get<TrackRef>();
971    
972     if(trkMu1Ref.isNonnull() && trkMu2Ref.isNonnull()){
973     const Track* MuTrk1 = muonDau0.get<TrackRef>().get();
974     const Track* MuTrk2 = muonDau1.get<TrackRef>().get();
975     df.daughter1.zPVPt=MuTrk1->dz(RecVtxFirst.position());
976     df.daughter1.zPVProb=MuTrk1->dz(RecVtx.position());
977     df.daughter2.zPVPt=MuTrk2->dz(RecVtxFirst.position());
978     df.daughter2.zPVProb=MuTrk2->dz(RecVtx.position());
979    
980     df.daughter1.nHits = MuTrk1->numberOfValidHits();
981     df.daughter2.nHits = MuTrk2->numberOfValidHits();
982    
983     df.daughter1.chi2 = MuTrk1->normalizedChi2();
984     df.daughter2.chi2 = MuTrk2->normalizedChi2();
985    
986     TrackRef iTrack1 = muonDau0.innerTrack();
987     const reco::HitPattern& p1 = iTrack1->hitPattern();
988     TrackRef iTrack2 = muonDau1.innerTrack();
989     const reco::HitPattern& p2 = iTrack2->hitPattern();
990    
991     df.daughter1.nPixelHits = p1.pixelLayersWithMeasurement();
992     df.daughter2.nPixelHits = p2.pixelLayersWithMeasurement();
993    
994     if(muonDau0.isGlobalMuon()){
995     TrackRef gTrack = muonDau0.globalTrack();
996     const reco::HitPattern& q = gTrack->hitPattern();
997     df.daughter1.globNHits=q.numberOfValidMuonHits();
998     df.daughter1.globChi2=gTrack.get()->normalizedChi2();
999 tboccali 1.8 df.daughter1.validMuStations = q. muonStationsWithValidHits();
1000 tboccali 1.1 }
1001     if(muonDau1.isGlobalMuon()){
1002     TrackRef gTrack = muonDau1.globalTrack();
1003     const reco::HitPattern& q = gTrack->hitPattern();
1004     df.daughter2.globNHits=q.numberOfValidMuonHits();
1005     df.daughter2.globChi2=gTrack.get()->normalizedChi2();
1006 tboccali 1.8 df.daughter2.validMuStations = q. muonStationsWithValidHits();
1007 tboccali 1.1 }
1008    
1009     }
1010    
1011     hbbInfo->diMuonInfo.push_back(df);
1012     }
1013    
1014     for( size_t i = 0; i < dielectrons->size(); i++ ) {
1015     VHbbEvent::DiElectronInfo df;
1016     const Candidate & dielecCand = (*dielectrons)[ i ];
1017    
1018 tboccali 1.13 df.p4=GENPTOLOR(dielecCand);
1019 tboccali 1.1
1020     // accessing the daughters of the dimuon candidate
1021     const Candidate * lep0 = dielecCand.daughter( 0 );
1022     const Candidate * lep1 = dielecCand.daughter( 1 );
1023     // needed to access specific methods of pat::Muon
1024     const pat::Electron & elecDau0 = dynamic_cast<const pat::Electron &>(*lep0->masterClone());
1025     const pat::Electron & elecDau1 = dynamic_cast<const pat::Electron &>(*lep1->masterClone());
1026    
1027 tboccali 1.13 df.daughter1.p4 = GENPTOLOR(elecDau0);
1028     df.daughter2.p4= GENPTOLOR(elecDau1);
1029 tboccali 1.1
1030     df.daughter1.tIso = elecDau0.trackIso();
1031     df.daughter2.tIso = elecDau1.trackIso();
1032    
1033     df.daughter1.eIso = elecDau0.ecalIso();
1034     df.daughter2.eIso = elecDau1.ecalIso();
1035    
1036     df.daughter1.hIso = elecDau0.hcalIso();
1037     df.daughter2.hIso = elecDau1.hcalIso();
1038    
1039 tboccali 1.8 // ids
1040 arizzi 1.17 /*df.daughter1.id95 = elecDau0.electronID("simpleEleId95cIso");
1041 tboccali 1.8 df.daughter1.id85 = elecDau0.electronID ("simpleEleId85cIso");
1042     df.daughter1.id70 = elecDau0.electronID ("simpleEleId70cIso");
1043     df.daughter1.id95r = elecDau0.electronID ("simpleEleId95relIso");
1044     df.daughter1.id85r = elecDau0.electronID ("simpleEleId85relIso");
1045     df.daughter1.id70r = elecDau0.electronID ("simpleEleId70relIso");
1046    
1047    
1048     df.daughter2.id95 = elecDau1.electronID("simpleEleId95cIso");
1049     df.daughter2.id85 = elecDau1.electronID ("simpleEleId85cIso");
1050     df.daughter2.id70 = elecDau1.electronID ("simpleEleId70cIso");
1051     df.daughter2.id95r = elecDau1.electronID ("simpleEleId95relIso");
1052     df.daughter2.id85r = elecDau1.electronID ("simpleEleId85relIso");
1053     df.daughter2.id70r = elecDau1.electronID ("simpleEleId70relIso");
1054 arizzi 1.17 */
1055 tboccali 1.1 hbbInfo->diElectronInfo.push_back(df);
1056    
1057     }
1058 tboccali 1.9 if (verbose_){
1059     std::cout <<" Pushing hbbInfo "<<std::endl;
1060     std::cout <<" SimpleJets1 = "<<hbbInfo->simpleJets.size()<<std::endl<<
1061     " SimpleJets2 = "<<hbbInfo->simpleJets2.size()<<std::endl<<
1062     " SubJets = "<<hbbInfo->subJets.size()<<std::endl<<
1063     " HardJets = "<<hbbInfo->hardJets.size()<<std::endl<<
1064     " Muons = "<<hbbInfo->muInfo.size()<<std::endl<<
1065     " Electrons = "<<hbbInfo->eleInfo.size()<<std::endl<<
1066     " Taus = "<<hbbInfo->tauInfo.size()<<std::endl<<
1067     " Electrons = "<<hbbInfo->eleInfo.size()<<std::endl<<
1068     "--------------------- "<<std::endl;
1069     }
1070    
1071    
1072 tboccali 1.1 iEvent.put(hbbInfo);
1073 tboccali 1.14 iEvent.put(auxInfo);
1074 tboccali 1.1
1075 tboccali 1.9
1076 tboccali 1.1 }
1077    
1078     void
1079     HbbAnalyzerNew::fillMuBlock(edm::View<pat::Muon>::const_iterator mu, int muInfo[15])
1080     {
1081     if(muon::isGoodMuon(*mu,muon::TMLastStationLoose)) muInfo[0]=1;
1082     if(muon::isGoodMuon(*mu,muon::TMLastStationTight)) muInfo[1]=1;
1083     if(muon::isGoodMuon(*mu,muon::TM2DCompatibilityLoose)) muInfo[2]=1;
1084     if(muon::isGoodMuon(*mu,muon::TM2DCompatibilityTight)) muInfo[3]=1;
1085     if(muon::isGoodMuon(*mu,muon::TMOneStationLoose)) muInfo[4]=1;
1086     if(muon::isGoodMuon(*mu,muon::TMOneStationTight)) muInfo[5]=1;
1087     if(muon::isGoodMuon(*mu,muon::TMLastStationOptimizedLowPtLoose)) muInfo[6]=1;
1088     if(muon::isGoodMuon(*mu,muon::TMLastStationOptimizedLowPtTight))muInfo[7]=1;
1089     if(muon::isGoodMuon(*mu,muon::TMOneStationAngLoose)) muInfo[8]=1;
1090     if(muon::isGoodMuon(*mu,muon::TMOneStationAngTight)) muInfo[9]=1;
1091     if(muon::isGoodMuon(*mu,muon::TMLastStationAngLoose)) muInfo[10]=1;
1092     if(muon::isGoodMuon(*mu,muon::TMLastStationAngTight)) muInfo[11]=1;
1093     if(muon::isGoodMuon(*mu,muon::GMTkChiCompatibility)) muInfo[12]=1;
1094     if(muon::isGoodMuon(*mu,muon::GMStaChiCompatibility)) muInfo[13]=1;
1095     if(muon::isGoodMuon(*mu,muon::GMTkKinkTight)) muInfo[14]=1;
1096     }
1097    
1098     // ------------ method called once each job just before starting event loop ------------
1099     void
1100     HbbAnalyzerNew::beginJob(){
1101     }
1102    
1103    
1104     // ------------ method called once each job just after ending the event loop ------------
1105     void
1106     HbbAnalyzerNew::endJob() {
1107     }
1108    
1109 tboccali 1.5 TVector2 HbbAnalyzerNew::getTvect( const pat::Jet* patJet ){
1110    
1111     TVector2 t_Vect(0,0);
1112     TVector2 null(0,0);
1113     TVector2 ci(0,0);
1114     TLorentzVector pi(0,0,0,0);
1115     TLorentzVector J(0,0,0,0);
1116     TVector2 r(0,0);
1117     double patJetpfcPt = 1e10;
1118     double r_mag = 1e10;
1119     unsigned int nOfconst = 0;
1120    
1121 tboccali 1.6
1122     if (patJet->isPFJet() == false) {
1123     return t_Vect;
1124     }
1125    
1126    
1127     //re-reconstruct the jet direction with the charged tracks
1128 tboccali 1.5 std::vector<reco::PFCandidatePtr>
1129     patJetpfc = patJet->getPFConstituents();
1130     for(size_t idx = 0; idx < patJetpfc.size(); idx++){
1131     if( patJetpfc.at(idx)->charge() != 0 ){
1132     pi.SetPtEtaPhiE( patJetpfc.at(idx)->pt(), patJetpfc.at(idx)->eta(), patJetpfc.at(idx)->phi(), patJetpfc.at(idx)->energy() );
1133     J += pi;
1134     nOfconst++;
1135     }
1136     }
1137     // if there are less than two charged tracks do not calculate the pull (there is not enough info). It returns a null vector
1138    
1139     if( nOfconst < 2 )
1140     return null;
1141 tboccali 1.6
1142    
1143 tboccali 1.5
1144     TVector2 v_J( J.Rapidity(), J.Phi() );
1145     //calculate TVector using only charged tracks
1146     for(size_t idx = 0; idx < patJetpfc.size(); idx++){
1147     if( patJetpfc.at(idx)->charge() != 0 ){
1148     patJetpfcPt = patJetpfc.at(idx)->pt();
1149     pi.SetPtEtaPhiE( patJetpfc.at(idx)->pt(), patJetpfc.at(idx)->eta(), patJetpfc.at(idx)->phi(), patJetpfc.at(idx)->energy() );
1150     r.Set( pi.Rapidity() - J.Rapidity(), Geom::deltaPhi( patJetpfc.at(idx)->phi(), J.Phi() ) );
1151     r_mag = r.Mod();
1152     t_Vect += ( patJetpfcPt / J.Pt() ) * r_mag * r;
1153     }
1154     }
1155    
1156 tboccali 1.6
1157 tboccali 1.5 return t_Vect;
1158    
1159     }
1160    
1161 tboccali 1.6 TLorentzVector HbbAnalyzerNew::getChargedTracksMomentum(const pat::Jet* patJet ){
1162     // return TLorentzVector();
1163     TLorentzVector pi(0,0,0,0);
1164     TLorentzVector v_j1(0,0,0,0);
1165    
1166    
1167     // std::cout <<"fff ECCCCCCOOOOO "<<patJet->isPFJet()<<std::endl;
1168    
1169     if (patJet->isPFJet() == false ){
1170     v_j1 = GENPTOLORP(patJet);
1171     return v_j1;
1172     }
1173     std::vector<reco::PFCandidatePtr>
1174     j1pfc = patJet->getPFConstituents();
1175     for(size_t idx = 0; idx < j1pfc.size(); idx++){
1176     if( j1pfc.at(idx)->charge() != 0 ){
1177     pi.SetPtEtaPhiE( j1pfc.at(idx)->pt(), j1pfc.at(idx)->eta(), j1pfc.at(idx)->phi(), j1pfc.at(idx)->energy() );
1178     v_j1 += pi;
1179     }
1180     }
1181     return v_j1;
1182     //re-
1183     }
1184 tboccali 1.5
1185 bortigno 1.24
1186     //Btagging scale factors
1187 arizzi 1.27 void HbbAnalyzerNew::fillScaleFactors(VHbbEvent::SimpleJet sj, BTagSFContainer iSF){
1188 bortigno 1.24
1189    
1190     BinningPointByMap measurePoint;
1191     //for a USDG
1192     //for CB jets
1193     //scale factor 1 for CB jets over 240GeV/c
1194     if( TMath::Abs(sj.flavour) == 4 or TMath::Abs(sj.flavour) == 5 ){
1195     measurePoint.insert( BinningVariables::JetEt, sj.p4.Et() );
1196     measurePoint.insert( BinningVariables::JetAbsEta, fabs(sj.p4.Eta()) );
1197     if( iSF.BTAGSF_CSVL->isResultOk(PerformanceResult::BTAGBEFFCORR , measurePoint) ){
1198     sj.SF_CSVL = iSF.BTAGSF_CSVL->getResult(PerformanceResult::BTAGBEFFCORR , measurePoint);
1199     sj.SF_CSVLerr = iSF.BTAGSF_CSVL->getResult(PerformanceResult::BTAGBERRCORR , measurePoint);
1200     if(verbose_){
1201     std::clog << "C/B Jet flavour = " << sj.flavour << std::endl;
1202     std::clog << "C/B Jet Et = " << sj.p4.Et() << std::endl;
1203     std::clog << "C/B Jet eta = " << sj.p4.Eta() << std::endl;
1204     std::clog << "C/B CSVL Scale Factor = " << sj.SF_CSVL << std::endl;
1205     std::clog << "C/B CSVL Scale Factor error = " << sj.SF_CSVLerr << std::endl;
1206     }
1207     }
1208     if( iSF.BTAGSF_CSVM->isResultOk(PerformanceResult::BTAGBEFFCORR , measurePoint) ){
1209     sj.SF_CSVM = iSF.BTAGSF_CSVM->getResult(PerformanceResult::BTAGBEFFCORR , measurePoint);
1210     sj.SF_CSVMerr = iSF.BTAGSF_CSVM->getResult(PerformanceResult::BTAGBERRCORR , measurePoint);
1211     }
1212     if( iSF.BTAGSF_CSVT->isResultOk(PerformanceResult::BTAGBEFFCORR , measurePoint) ){
1213     sj.SF_CSVT = iSF.BTAGSF_CSVT->getResult(PerformanceResult::BTAGBEFFCORR , measurePoint);
1214     sj.SF_CSVTerr = iSF.BTAGSF_CSVT->getResult(PerformanceResult::BTAGBERRCORR , measurePoint);
1215     }
1216     else{
1217     if(verbose_){
1218 bortigno 1.25 std::cerr << "No SF found in the database for this jet" << std::endl;
1219 bortigno 1.24 std::clog << "No SF found: Jet flavour = " << sj.flavour << std::endl;
1220     std::clog << "No SF found: Jet Et = " << sj.p4.Et() << std::endl;
1221     std::clog << "No SF found: Jet eta = " << sj.p4.Eta() << std::endl;
1222     }
1223     }
1224     }
1225     else {
1226     measurePoint.insert( BinningVariables::JetEt, sj.p4.Et() );
1227     measurePoint.insert( BinningVariables::JetAbsEta, fabs(sj.p4.Eta()) );
1228     if( iSF.MISTAGSF_CSVL->isResultOk(PerformanceResult::BTAGLEFFCORR , measurePoint) ){
1229     sj.SF_CSVL = iSF.MISTAGSF_CSVL->getResult(PerformanceResult::BTAGLEFFCORR , measurePoint);
1230     sj.SF_CSVLerr = iSF.MISTAGSF_CSVL->getResult(PerformanceResult::BTAGLERRCORR , measurePoint);
1231     if(verbose_){
1232     std::clog << "Light Jet flavour = " << sj.flavour << std::endl;
1233     std::clog << "Light Jet Et = " << sj.p4.Et() << std::endl;
1234     std::clog << "Light Jet eta = " << sj.p4.Eta() << std::endl;
1235     std::clog << "Light CSVL Scale Factor = " << sj.SF_CSVL << std::endl;
1236     std::clog << "Light CSVL Scale Factor error = " << sj.SF_CSVLerr << std::endl;
1237     }
1238     }
1239     if( iSF.MISTAGSF_CSVM->isResultOk(PerformanceResult::BTAGLEFFCORR , measurePoint) ){
1240     sj.SF_CSVM = iSF.MISTAGSF_CSVM->getResult(PerformanceResult::BTAGLEFFCORR , measurePoint);
1241     sj.SF_CSVMerr = iSF.MISTAGSF_CSVM->getResult(PerformanceResult::BTAGLERRCORR , measurePoint);
1242     }
1243     if( iSF.MISTAGSF_CSVT->isResultOk(PerformanceResult::BTAGLEFFCORR , measurePoint) ){
1244     sj.SF_CSVT = iSF.MISTAGSF_CSVT->getResult(PerformanceResult::BTAGLEFFCORR , measurePoint);
1245     sj.SF_CSVTerr = iSF.MISTAGSF_CSVT->getResult(PerformanceResult::BTAGLERRCORR , measurePoint);
1246     }
1247     else{
1248     if(verbose_){
1249 bortigno 1.25 std::cerr << "No SF found in the database for this jet" << std::endl;
1250 bortigno 1.24 std::clog << "No SF found: Jet flavour = " << sj.flavour << std::endl;
1251     std::clog << "No SF found: Jet Et = " << sj.p4.Et() << std::endl;
1252     std::clog << "No SF found: Jet eta = " << sj.p4.Eta() << std::endl;
1253     }
1254     }
1255     }
1256    
1257     }
1258    
1259 tboccali 1.28 void HbbAnalyzerNew::setJecUnc(VHbbEvent::SimpleJet& sj,JetCorrectionUncertainty* jecunc){
1260 tboccali 1.29 //
1261     // test
1262     //
1263    
1264     return;
1265 tboccali 1.28 double eta = sj.p4.Eta();
1266     double pt = sj.p4.Pt();
1267    
1268     jecunc->setJetEta(eta);
1269     jecunc->setJetPt(pt); // here you must use the CORRECTED jet pt
1270     double unc = jecunc->getUncertainty(true);
1271     sj.jecunc= unc;
1272     }
1273    
1274    
1275     void HbbAnalyzerNew ::fillSimpleJet (VHbbEvent::SimpleJet& sj, edm::View<pat::Jet>::const_iterator jet_iter){
1276     sj.flavour = jet_iter->partonFlavour();
1277    
1278     sj.tche=jet_iter->bDiscriminator("trackCountingHighEffBJetTags");
1279     sj.tchp=jet_iter->bDiscriminator("trackCountingHighPurBJetTags");
1280     sj.jp=jet_iter->bDiscriminator("jetProbabilityBJetTags");
1281     sj.jpb=jet_iter->bDiscriminator("jetBProbabilityBJetTags");
1282     sj.ssvhe=jet_iter->bDiscriminator("simpleSecondaryVertexHighEffBJetTags");
1283     sj.csv=jet_iter->bDiscriminator("combinedSecondaryVertexBJetTags");
1284     sj.csvmva=jet_iter->bDiscriminator("combinedSecondaryVertexMVABJetTags");
1285     sj.charge=jet_iter->jetCharge();
1286     sj.ntracks=jet_iter->associatedTracks().size();
1287     sj.p4=GENPTOLORP(jet_iter);
1288     sj.chargedTracksFourMomentum=(getChargedTracksMomentum(&*(jet_iter)));
1289     sj.SF_CSVL=1;
1290     sj.SF_CSVM=1;
1291     sj.SF_CSVT=1;
1292     sj.SF_CSVLerr=0;
1293     sj.SF_CSVMerr=0;
1294     sj.SF_CSVTerr=0;
1295    
1296    
1297 tboccali 1.29 if (jet_iter->isPFJet() == true) {
1298 tboccali 1.28
1299 tboccali 1.29 sj.chargedHadronEFraction = jet_iter-> chargedHadronEnergyFraction();
1300     sj.neutralHadronEFraction = jet_iter-> neutralHadronEnergyFraction ();
1301     sj.chargedEmEFraction = jet_iter-> chargedEmEnergyFraction ();
1302     sj.neutralEmEFraction = jet_iter-> neutralEmEnergyFraction ();
1303     sj. nConstituents = jet_iter->getPFConstituents().size();
1304    
1305     }
1306 tboccali 1.28 //
1307     // addtaginfo for csv
1308     //
1309    
1310     // if (jet_iter->hasTagInfo("SimpleSecondaryVertex")) {
1311    
1312     const reco::SecondaryVertexTagInfo * tf = jet_iter->tagInfoSecondaryVertex();
1313 tboccali 1.31 if (tf){
1314 tboccali 1.32 if (tf->nVertices() >0){
1315     sj.vtxMass = tf->secondaryVertex(0).p4().mass();
1316     sj.vtxNTracks = tf->secondaryVertex(0).nTracks();
1317     std::vector<reco::TrackBaseRef >::const_iterator tit = tf->secondaryVertex(0).tracks_begin();
1318     for (; tit< tf->secondaryVertex(0).tracks_end(); ++tit){
1319     sj.vtxTrackIds.push_back(tit->key());
1320     }
1321     Measurement1D m = tf->flightDistance(0);
1322     sj.vtx3dL = m.value();
1323     sj.vtx3deL = m.error();
1324     }
1325 tboccali 1.28 }
1326     //
1327     // add tVector
1328     //
1329     sj.tVector = getTvect(&(*jet_iter));
1330     }
1331    
1332    
1333 tboccali 1.1 //define this as a plug-in
1334     DEFINE_FWK_MODULE(HbbAnalyzerNew);