ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/CmsHi/JetAnalysis/src/HiInclusiveJetAnalyzer.cc
Revision: 1.9
Committed: Sun Apr 22 19:12:44 2012 UTC (13 years ago) by yilmaz
Content type: text/plain
Branch: MAIN
CVS Tags: HiForest_V02_00
Changes since 1.8: +5 -3 lines
Log Message:
up

File Contents

# User Rev Content
1 yilmaz 1.1 /*
2     Based on the jet response analyzer
3     Modified by Matt Nguyen, November 2010
4    
5     */
6    
7     #include "CmsHi/JetAnalysis/interface/HiInclusiveJetAnalyzer.h"
8    
9     #include "FWCore/Framework/interface/EventSetup.h"
10     #include "FWCore/Framework/interface/ESHandle.h"
11     #include <Math/DistFunc.h>
12     #include "TMath.h"
13    
14     #include "FWCore/Framework/interface/ESHandle.h"
15    
16     #include "FWCore/MessageLogger/interface/MessageLogger.h"
17     #include "FWCore/Utilities/interface/Exception.h"
18     #include "FWCore/Framework/interface/EventSetup.h"
19    
20     #include "DataFormats/HeavyIonEvent/interface/CentralityBins.h"
21     #include "DataFormats/HeavyIonEvent/interface/Centrality.h"
22    
23     #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
24     #include "DataFormats/JetReco/interface/CaloJetCollection.h"
25     #include "SimDataFormats/HiGenData/interface/GenHIEvent.h"
26     #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
27     #include "DataFormats/JetReco/interface/GenJetCollection.h"
28     #include "DataFormats/VertexReco/interface/Vertex.h"
29     #include "DataFormats/Math/interface/deltaPhi.h"
30     #include "DataFormats/Math/interface/deltaR.h"
31    
32     #include "DataFormats/Common/interface/TriggerResults.h"
33     #include "FWCore/Common/interface/TriggerNames.h"
34     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutSetup.h"
35     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
36     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerObjectMapRecord.h"
37     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerObjectMap.h"
38     #include "L1Trigger/GlobalTrigger/interface/L1GlobalTrigger.h"
39    
40     using namespace std;
41     using namespace edm;
42     using namespace reco;
43    
44     HiInclusiveJetAnalyzer::HiInclusiveJetAnalyzer(const edm::ParameterSet& iConfig) {
45    
46    
47     jetTag_ = iConfig.getParameter<InputTag>("jetTag");
48 mnguyen 1.8 vtxTag_ = iConfig.getUntrackedParameter<edm::InputTag>("vtxTag",edm::InputTag("hiSelectedVertex"));
49 yilmaz 1.1
50     isMC_ = iConfig.getUntrackedParameter<bool>("isMC",false);
51 mnguyen 1.8
52 yilmaz 1.1 if(isMC_){
53     genjetTag_ = iConfig.getParameter<InputTag>("genjetTag");
54     eventInfoTag_ = iConfig.getParameter<InputTag>("eventInfoTag");
55     }
56     verbose_ = iConfig.getUntrackedParameter<bool>("verbose",false);
57    
58     useCentrality_ = iConfig.getUntrackedParameter<bool>("useCentrality",false);
59 yjlee 1.4 useVtx_ = iConfig.getUntrackedParameter<bool>("useVtx",false);
60 yilmaz 1.1 useJEC_ = iConfig.getUntrackedParameter<bool>("useJEC",true);
61 yilmaz 1.2 usePat_ = iConfig.getUntrackedParameter<bool>("usePAT",true);
62 yilmaz 1.1
63 mnguyen 1.8 doLifeTimeTagging_ = iConfig.getUntrackedParameter<bool>("doLifeTimeTagging",false);
64     pfCandidateLabel_ = iConfig.getUntrackedParameter<edm::InputTag>("pfCandidateLabel",edm::InputTag("particleFlowTmp"));
65    
66 yilmaz 1.1 if(!isMC_){
67     L1gtReadout_ = iConfig.getParameter<edm::InputTag>("L1gtReadout");
68     hltResName_ = iConfig.getUntrackedParameter<string>("hltTrgResults","TriggerResults::HLT");
69    
70    
71     if (iConfig.exists("hltTrgNames"))
72     hltTrgNames_ = iConfig.getUntrackedParameter<vector<string> >("hltTrgNames");
73    
74     if (iConfig.exists("hltProcNames"))
75     hltProcNames_ = iConfig.getUntrackedParameter<vector<string> >("hltProcNames");
76     else {
77     hltProcNames_.push_back("FU");
78     hltProcNames_.push_back("HLT");
79     }
80     }
81    
82     cout<<" jet collection : "<<jetTag_<<endl;
83 yilmaz 1.9 if(isMC_){
84     cout<<" genjet collection : "<<genjetTag_<<endl;
85     genPtMin_ = iConfig.getUntrackedParameter<double>("genPtMin",0);
86     }
87 yilmaz 1.1
88    
89     }
90    
91    
92    
93     HiInclusiveJetAnalyzer::~HiInclusiveJetAnalyzer() { }
94    
95    
96    
97     void
98     HiInclusiveJetAnalyzer::beginRun(const edm::Run& run,
99     const edm::EventSetup & es) {}
100    
101     void
102     HiInclusiveJetAnalyzer::beginJob() {
103    
104     centrality_ = 0;
105    
106     //string jetTagName = jetTag_.label()+"_tree";
107     string jetTagTitle = jetTag_.label()+" Jet Analysis Tree";
108     t = fs1->make<TTree>("t",jetTagTitle.c_str());
109    
110 yjlee 1.6 // TTree* t= new TTree("t","Jet Response Analyzer");
111 yjlee 1.4 //t->Branch("run",&jets_.run,"run/I");
112 yilmaz 1.1 t->Branch("evt",&jets_.evt,"evt/I");
113 yjlee 1.4 //t->Branch("lumi",&jets_.lumi,"lumi/I");
114 yilmaz 1.1 t->Branch("b",&jets_.b,"b/F");
115 yjlee 1.4 if (useVtx_) {
116     t->Branch("vx",&jets_.vx,"vx/F");
117     t->Branch("vy",&jets_.vy,"vy/F");
118     t->Branch("vz",&jets_.vz,"vz/F");
119     }
120     if (useCentrality_) {
121     t->Branch("hf",&jets_.hf,"hf/F");
122     t->Branch("bin",&jets_.bin,"bin/I");
123     }
124 yjlee 1.7
125     t->Branch("nref",&jets_.nref,"nref/I");
126 yilmaz 1.1 t->Branch("rawpt",jets_.rawpt,"rawpt[nref]/F");
127     t->Branch("jtpt",jets_.jtpt,"jtpt[nref]/F");
128     t->Branch("jteta",jets_.jteta,"jteta[nref]/F");
129     t->Branch("jty",jets_.jty,"jty[nref]/F");
130     t->Branch("jtphi",jets_.jtphi,"jtphi[nref]/F");
131 yilmaz 1.2 t->Branch("jtpu",jets_.jtpu,"jtpu[nref]/F");
132 yilmaz 1.1
133 mnguyen 1.8 // b-jet discriminators
134     if (doLifeTimeTagging_) {
135    
136     t->Branch("discr_csvMva",jets_.discr_csvMva,"discr_csvMva[nref]/F");
137     t->Branch("discr_csvSimple",jets_.discr_csvSimple,"discr_csvSimple[nref]/F");
138     t->Branch("discr_muByIp3",jets_.discr_muByIp3,"discr_muByIp3[nref]/F");
139     t->Branch("discr_muByPt",jets_.discr_muByPt,"discr_muByPt[nref]/F");
140     t->Branch("discr_prob",jets_.discr_prob,"discr_prob[nref]/F");
141     t->Branch("discr_probb",jets_.discr_probb,"discr_probb[nref]/F");
142     t->Branch("discr_tcHighEff",jets_.discr_tcHighEff,"discr_tcHighEff[nref]/F");
143     t->Branch("discr_tcHighPur",jets_.discr_tcHighPur,"discr_tcHighPur[nref]/F");
144    
145     t->Branch("nsvtx", jets_.nsvtx, "nsvtx[nref]/b");
146     t->Branch("svtxntrk", jets_.svtxntrk, "svtxntrk[nref]/b");
147     t->Branch("svtxdl", jets_.svtxdl, "svtxdl[nref]/F");
148     t->Branch("svtxdls", jets_.svtxdls, "svtxdls[nref]/F");
149     t->Branch("svtxm", jets_.svtxm, "svtxm[nref]/F");
150     t->Branch("svtxpt", jets_.svtxpt, "svtxpt[nref]/F");
151    
152     t->Branch("nIPtracks",jets_.nIPtracks,"nIPTracks[nref]/b");
153     t->Branch("nselIPtracks",jets_.nselIPtracks,"nselIPTracks[nref]/b");
154    
155     t->Branch("mue", jets_.mue, "mue[nref]/F");
156     t->Branch("mupt", jets_.mupt, "mupt[nref]/F");
157     t->Branch("mueta", jets_.mueta, "mueta[nref]/F");
158     t->Branch("muphi", jets_.muphi, "muphi[nref]/F");
159     t->Branch("mudr", jets_.mudr, "mudr[nref]/F");
160     t->Branch("muptrel", jets_.muptrel, "muptrel[nref]/F");
161     t->Branch("muchg", jets_.muchg, "muchg[nref]/I");
162     }
163    
164 yilmaz 1.1 if(isMC_){
165     t->Branch("pthat",&jets_.pthat,"pthat/F");
166    
167     // Only matched gen jets
168     t->Branch("refpt",jets_.refpt,"refpt[nref]/F");
169     t->Branch("refeta",jets_.refeta,"refeta[nref]/F");
170     t->Branch("refy",jets_.refy,"refy[nref]/F");
171     t->Branch("refphi",jets_.refphi,"refphi[nref]/F");
172     t->Branch("refdphijt",jets_.refdphijt,"refdphijt[nref]/F");
173     t->Branch("refdrjt",jets_.refdrjt,"refdrjt[nref]/F");
174     // matched parton
175     t->Branch("refparton_pt",jets_.refparton_pt,"refparton_pt[nref]/F");
176 mnguyen 1.8 t->Branch("refparton_flavor",jets_.refparton_flavor,"refparton_flavor[nref]/I");
177     t->Branch("refparton_flavorForB",jets_.refparton_flavorForB,"refparton_flavorForB[nref]/I");
178 yilmaz 1.1
179     // For all gen jets, matched or unmatched
180     t->Branch("ngen",&jets_.ngen,"ngen/I");
181     t->Branch("genmatchindex",jets_.genmatchindex,"genmatchindex[ngen]/I");
182     t->Branch("genpt",jets_.genpt,"genpt[ngen]/F");
183     t->Branch("geneta",jets_.geneta,"geneta[ngen]/F");
184     t->Branch("geny",jets_.geny,"geny[ngen]/F");
185     t->Branch("genphi",jets_.genphi,"genphi[ngen]/F");
186     t->Branch("gendphijt",jets_.gendphijt,"gendphijt[ngen]/F");
187     t->Branch("gendrjt",jets_.gendrjt,"gendrjt[ngen]/F");
188     }
189 yjlee 1.7 /*
190 yilmaz 1.1 if(!isMC_){
191     t->Branch("nL1TBit",&jets_.nL1TBit,"nL1TBit/I");
192     t->Branch("l1TBit",jets_.l1TBit,"l1TBit[nL1TBit]/O");
193    
194     t->Branch("nL1ABit",&jets_.nL1ABit,"nL1ABit/I");
195     t->Branch("l1ABit",jets_.l1ABit,"l1ABit[nL1ABit]/O");
196    
197     t->Branch("nHLTBit",&jets_.nHLTBit,"nHLTBit/I");
198     t->Branch("hltBit",jets_.hltBit,"hltBit[nHLTBit]/O");
199    
200     }
201 yjlee 1.7 */
202 yilmaz 1.1 TH1D::SetDefaultSumw2();
203    
204    
205     }
206    
207    
208     void
209     HiInclusiveJetAnalyzer::analyze(const Event& iEvent,
210     const EventSetup& iSetup) {
211    
212     int event = iEvent.id().event();
213     int run = iEvent.id().run();
214     int lumi = iEvent.id().luminosityBlock();
215    
216     jets_.run = run;
217     jets_.evt = event;
218     jets_.lumi = lumi;
219    
220     LogDebug("HiInclusiveJetAnalyzer")<<"START event: "<<event<<" in run "<<run<<endl;
221    
222     int bin = -1;
223     double hf = 0.;
224     double b = 999.;
225    
226     if(useCentrality_){
227     if(!centrality_) centrality_ = new CentralityProvider(iSetup);
228     centrality_->newEvent(iEvent,iSetup); // make sure you do this first in every event
229     //double c = centrality_->centralityValue();
230     const reco::Centrality *cent = centrality_->raw();
231    
232     hf = cent->EtHFhitSum();
233    
234     bin = centrality_->getBin();
235     b = centrality_->bMean();
236     }
237    
238    
239    
240    
241     //double jetPtMin = 35.;
242    
243    
244     // loop the events
245    
246     jets_.bin = bin;
247     jets_.hf = hf;
248    
249    
250     if (useVtx_) {
251     edm::Handle<vector<reco::Vertex> >vertex;
252     iEvent.getByLabel(vtxTag_, vertex);
253    
254     if(vertex->size()>0) {
255     jets_.vx=vertex->begin()->x();
256     jets_.vy=vertex->begin()->y();
257     jets_.vz=vertex->begin()->z();
258     }
259     }
260    
261 yilmaz 1.2 edm::Handle<pat::JetCollection> patjets;
262     if(usePat_)iEvent.getByLabel(jetTag_, patjets);
263    
264     edm::Handle<reco::JetView> jets;
265 yilmaz 1.1 iEvent.getByLabel(jetTag_, jets);
266    
267 mnguyen 1.8 edm::Handle<reco::PFCandidateCollection> pfCandidates;
268     if(doLifeTimeTagging_){
269     iEvent.getByLabel(pfCandidateLabel_,pfCandidates);
270     }
271 yilmaz 1.1 // FILL JRA TREE
272    
273     jets_.b = b;
274     jets_.nref = 0;
275    
276     if(!isMC_){
277     fillL1Bits(iEvent);
278     fillHLTBits(iEvent);
279     }
280    
281     for(unsigned int j = 0 ; j < jets->size(); ++j){
282 yilmaz 1.2 const reco::Jet& jet = (*jets)[j];
283 yilmaz 1.1
284     //cout<<" jet pt "<<jet.pt()<<endl;
285     //if(jet.pt() < jetPtMin) continue;
286 yilmaz 1.2 if (useJEC_ && usePat_){
287     jets_.rawpt[jets_.nref]=(*patjets)[j].correctedJet("Uncorrected").pt();
288     }
289 mnguyen 1.8
290     if(doLifeTimeTagging_){
291    
292     if(jetTag_.label()=="icPu5patJets"){
293     jets_.discr_csvMva[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5CombinedSecondaryVertexMVABJetTags");
294     jets_.discr_csvSimple[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5CombinedSecondaryVertexBJetTags");
295     jets_.discr_muByIp3[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5SoftMuonByIP3dBJetTags");
296     jets_.discr_muByPt[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5SoftMuonByPtBJetTags");
297     jets_.discr_prob[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5JetBProbabilityBJetTags");
298     jets_.discr_probb[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5JetProbabilityBJetTags");
299     jets_.discr_tcHighEff[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5TrackCountingHighEffBJetTags");
300     jets_.discr_tcHighPur[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5TrackCountingHighPurBJetTags");
301     }
302     else if(jetTag_.label()=="akPu3PFpatJets"){
303     jets_.discr_csvMva[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFCombinedSecondaryVertexMVABJetTags");
304     jets_.discr_csvSimple[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFCombinedSecondaryVertexBJetTags");
305     jets_.discr_muByIp3[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFSoftMuonByIP3dBJetTags");
306     jets_.discr_muByPt[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFSoftMuonByPtBJetTags");
307     jets_.discr_prob[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFJetBProbabilityBJetTags");
308     jets_.discr_probb[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFJetProbabilityBJetTags");
309     jets_.discr_tcHighEff[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFTrackCountingHighEffBJetTags");
310     jets_.discr_tcHighPur[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFTrackCountingHighPurBJetTags");
311     }
312     else{
313     cout<<" you fail at btagging "<<endl;
314     }
315    
316     const reco::SecondaryVertexTagInfo& tagInfoSV=*(*patjets)[j].tagInfoSecondaryVertex();
317     if (tagInfoSV.nVertices()>0) {
318     Measurement1D m1D = tagInfoSV.flightDistance(0);
319     jets_.nsvtx[jets_.nref] = tagInfoSV.nVertices();
320     jets_.svtxntrk[jets_.nref] = tagInfoSV.nVertexTracks(0);
321     jets_.svtxdl[jets_.nref] = m1D.value();
322     jets_.svtxdls[jets_.nref] = m1D.significance();
323    
324     const reco::Vertex& svtx = tagInfoSV.secondaryVertex(0);
325    
326     jets_.svtxm[jets_.nref] = svtx.p4().mass();
327     jets_.svtxpt[jets_.nref] = svtx.p4().pt();
328    
329     }
330     else {
331     jets_.nsvtx[jets_.nref] = 0;
332     jets_.svtxntrk[jets_.nref] = 0;
333     jets_.svtxdl[jets_.nref] = 0.0;
334     jets_.svtxdls[jets_.nref] = 0.0;
335     jets_.svtxm[jets_.nref] = 0.0;
336     jets_.svtxpt[jets_.nref] = 0.0;
337     }
338     const reco::TrackIPTagInfo& tagInfoIP=*(*patjets)[j].tagInfoTrackIP();
339    
340     jets_.nIPtracks[jets_.nref] = tagInfoIP.tracks().size();
341     jets_.nselIPtracks[jets_.nref] = tagInfoIP.selectedTracks().size();
342    
343     // would be nice to save the info for the tracks, but requires a more sophisticated tree
344     /*
345     //cout << "Jet pt: " << tagInfoIP.jet()->pt() << endl;
346     cout << "Tot tracks: " << tagInfoIP.tracks().size() << endl;
347     TrackRefVector selTracks=tagInfoIP.selectedTracks();
348     int n=selTracks.size();
349     cout << "Sel tracks: " << n << endl;
350     // false cout << " Pt \t d len \t jet dist \t p3d \t p2d\t ip3d \t ip2d " << endl;
351     GlobalPoint pv(tagInfoIP.primaryVertex()->position().x(),tagInfoIP.primaryVertex()->position().y(),tagInfoIP.primaryVertex()->position().z());
352     cout << pv << " vs " << tagInfoIP.primaryVertex()->position() << endl;
353     for(int j=0;j< n;j++)
354     {
355     TrackIPTagInfo::TrackIPData data = tagInfoIP.impactParameterData()[j];
356     cout << selTracks[j]->pt() << "\t";
357     cout << tagInfoIP.probabilities(0)[j] << "\t";
358     cout << tagInfoIP.probabilities(1)[j] << "\t";
359     cout << data.ip3d.value() << "\t";
360     cout << data.ip3d.significance() << "\t";
361     cout << data.distanceToJetAxis.value() << "\t";
362     cout << data.distanceToJetAxis.significance() << "\t";
363     cout << data.distanceToGhostTrack.value() << "\t";
364     cout << data.distanceToGhostTrack.significance() << "\t";
365     cout << data.closestToJetAxis << "\t";
366     cout << (data.closestToJetAxis - pv).mag() << "\t";
367     cout << data.closestToGhostTrack << "\t";
368     cout << (data.closestToGhostTrack - pv).mag() << "\t";
369     cout << data.ip2d.value() << "\t";
370     cout << data.ip2d.significance() << endl;
371     }
372     */
373    
374     const reco::PFCandidateCollection *pfCandidateColl = &(*pfCandidates);
375     int pfMuonIndex = getPFJetMuon(jet, pfCandidateColl);
376     if(pfMuonIndex >=0){
377     const reco::PFCandidate muon = pfCandidateColl->at(pfMuonIndex);
378     jets_.mupt[jets_.nref] = muon.pt();
379     jets_.mueta[jets_.nref] = muon.eta();
380     jets_.muphi[jets_.nref] = muon.phi();
381     jets_.mue[jets_.nref] = muon.energy();
382     jets_.mudr[jets_.nref] = reco::deltaR(jet,muon);
383     jets_.muptrel[jets_.nref] = getPtRel(muon, jet);
384     jets_.muchg[jets_.nref] = muon.charge();
385     }
386     else{
387     jets_.mupt[jets_.nref] = 0.0;
388     jets_.mueta[jets_.nref] = 0.0;
389     jets_.muphi[jets_.nref] = 0.0;
390     jets_.mue[jets_.nref] = 0.0;
391     jets_.mudr[jets_.nref] = 9.9;
392     jets_.muptrel[jets_.nref] = 0.0;
393     jets_.muchg[jets_.nref] = 0;
394     }
395     }
396    
397 yilmaz 1.1 jets_.jtpt[jets_.nref] = jet.pt();
398     jets_.jteta[jets_.nref] = jet.eta();
399     jets_.jtphi[jets_.nref] = jet.phi();
400     jets_.jty[jets_.nref] = jet.eta();
401 yilmaz 1.2 jets_.jtpu[jets_.nref] = jet.pileup();
402 yilmaz 1.1
403 yilmaz 1.2 if(isMC_ && usePat_){
404 mnguyen 1.8 jets_.refparton_flavorForB[jets_.nref] = (*patjets)[j].partonFlavour();
405 yilmaz 1.2 const reco::GenJet* genjet = (*patjets)[j].genJet();
406 mnguyen 1.8
407 yilmaz 1.2 if(genjet){
408     jets_.refpt[jets_.nref] = genjet->pt();
409     jets_.refeta[jets_.nref] = genjet->eta();
410     jets_.refphi[jets_.nref] = genjet->phi();
411     jets_.refy[jets_.nref] = genjet->eta();
412     jets_.refdphijt[jets_.nref] = reco::deltaPhi(jet.phi(), genjet->phi());
413     jets_.refdrjt[jets_.nref] = reco::deltaR(jet.eta(),jet.phi(),genjet->eta(),genjet->phi());
414     }else{
415     jets_.refpt[jets_.nref] = -999.;
416     jets_.refeta[jets_.nref] = -999.;
417     jets_.refphi[jets_.nref] = -999.;
418     jets_.refy[jets_.nref] = -999.;
419     jets_.refdphijt[jets_.nref] = -999.;
420     jets_.refdrjt[jets_.nref] = -999.;
421     }
422 yilmaz 1.1
423 yilmaz 1.2 // matched partons
424     const reco::GenParticle * parton = (*patjets)[j].genParton();
425     if(parton){
426 mnguyen 1.8 jets_.refparton_pt[jets_.nref] = parton->pt();
427     jets_.refparton_flavor[jets_.nref] = parton->pdgId();
428     } else {
429 yilmaz 1.1 jets_.refparton_pt[jets_.nref] = -999;
430     jets_.refparton_flavor[jets_.nref] = -999;
431 mnguyen 1.8 }
432 yilmaz 1.2 }
433 yilmaz 1.1
434     jets_.nref++;
435    
436    
437     }
438    
439    
440     if(isMC_){
441    
442     edm::Handle<GenEventInfoProduct> hEventInfo;
443     iEvent.getByLabel(eventInfoTag_,hEventInfo);
444     //jets_.pthat = hEventInfo->binningValues()[0];
445    
446     // binning values and qscale appear to be equivalent, but binning values not always present
447     jets_.pthat = hEventInfo->qScale();
448    
449     edm::Handle<vector<reco::GenJet> >genjets;
450     iEvent.getByLabel(genjetTag_, genjets);
451    
452     jets_.ngen = 0;
453     for(unsigned int igen = 0 ; igen < genjets->size(); ++igen){
454     const reco::GenJet & genjet = (*genjets)[igen];
455    
456     float genjet_pt = genjet.pt();
457    
458     // threshold to reduce size of output in minbias PbPb
459 yilmaz 1.9 if(genjet_pt>genPtMin_){
460 yilmaz 1.1
461     jets_.genpt[jets_.ngen] = genjet_pt;
462     jets_.geneta[jets_.ngen] = genjet.eta();
463     jets_.genphi[jets_.ngen] = genjet.phi();
464     jets_.geny[jets_.ngen] = genjet.eta();
465    
466    
467     // find matching patJet if there is one
468    
469     jets_.gendrjt[jets_.ngen] = -1.0;
470     jets_.genmatchindex[jets_.ngen] = -1;
471    
472     for(unsigned int ijet = 0 ; ijet < jets->size(); ++ijet){
473     const pat::Jet& jet = (*jets)[ijet];
474 mnguyen 1.8 const reco::GenJet* matchedGenJet = (*patjets)[ijet].genJet();
475     if(matchedGenJet){
476     // poor man's matching, someone fix please
477     if(fabs(genjet.pt()-matchedGenJet->pt())<0.0001 &&
478     fabs(genjet.eta()-matchedGenJet->eta())<0.0001 &&
479     (fabs(genjet.phi()-matchedGenJet->phi())<0.0001 || fabs(genjet.phi()-matchedGenJet->phi() - 2.0*TMath::Pi()) < 0.0001 )){
480 yilmaz 1.1
481     jets_.genmatchindex[jets_.ngen] = (int)ijet;
482     jets_.gendphijt[jets_.ngen] = reco::deltaPhi(jet.phi(),genjet.phi());
483     jets_.gendrjt[jets_.ngen] = reco::deltaR(jet,genjet);
484    
485     break;
486     }
487     }
488     }
489     jets_.ngen++;
490     }
491    
492     }
493    
494     }
495     t->Fill();
496     }
497    
498    
499    
500    
501     //--------------------------------------------------------------------------------------------------
502     void HiInclusiveJetAnalyzer::fillL1Bits(const edm::Event &iEvent)
503     {
504     edm::Handle< L1GlobalTriggerReadoutRecord > L1GlobalTrigger;
505    
506     iEvent.getByLabel(L1gtReadout_, L1GlobalTrigger);
507     const TechnicalTriggerWord& technicalTriggerWordBeforeMask = L1GlobalTrigger->technicalTriggerWord();
508    
509     for (int i=0; i<64;i++)
510     {
511     jets_.l1TBit[i] = technicalTriggerWordBeforeMask.at(i);
512     }
513     jets_.nL1TBit = 64;
514    
515     int ntrigs = L1GlobalTrigger->decisionWord().size();
516     jets_.nL1ABit = ntrigs;
517    
518     for (int i=0; i != ntrigs; i++) {
519     bool accept = L1GlobalTrigger->decisionWord()[i];
520     //jets_.l1ABit[i] = (accept == true)? 1:0;
521     if(accept== true){
522     jets_.l1ABit[i] = 1;
523     }
524     else{
525     jets_.l1ABit[i] = 0;
526     }
527    
528     }
529     }
530    
531     //--------------------------------------------------------------------------------------------------
532     void HiInclusiveJetAnalyzer::fillHLTBits(const edm::Event &iEvent)
533     {
534     // Fill HLT trigger bits.
535     Handle<TriggerResults> triggerResultsHLT;
536     getProduct(hltResName_, triggerResultsHLT, iEvent);
537    
538     const TriggerResults *hltResults = triggerResultsHLT.product();
539     const TriggerNames & triggerNames = iEvent.triggerNames(*hltResults);
540    
541     jets_.nHLTBit = hltTrgNames_.size();
542    
543     for(size_t i=0;i<hltTrgNames_.size();i++){
544    
545     for(size_t j=0;j<triggerNames.size();++j) {
546    
547     if(triggerNames.triggerName(j) == hltTrgNames_[i]){
548    
549     //cout <<"hltTrgNames_(i) "<<hltTrgNames_[i]<<endl;
550     //cout <<"triggerName(j) "<<triggerNames.triggerName(j)<<endl;
551     //cout<<" result "<<triggerResultsHLT->accept(j)<<endl;
552     jets_.hltBit[i] = triggerResultsHLT->accept(j);
553     }
554    
555     }
556     }
557     }
558    
559     //--------------------------------------------------------------------------------------------------
560     template <typename TYPE>
561     inline void HiInclusiveJetAnalyzer::getProduct(const std::string name, edm::Handle<TYPE> &prod,
562     const edm::Event &event) const
563     {
564     // Try to access data collection from EDM file. We check if we really get just one
565     // product with the given name. If not we throw an exception.
566    
567     event.getByLabel(edm::InputTag(name),prod);
568     if (!prod.isValid())
569     throw edm::Exception(edm::errors::Configuration, "HiInclusiveJetAnalyzer::GetProduct()\n")
570     << "Collection with label '" << name << "' is not valid" << std::endl;
571     }
572    
573     //--------------------------------------------------------------------------------------------------
574     template <typename TYPE>
575     inline bool HiInclusiveJetAnalyzer::getProductSafe(const std::string name, edm::Handle<TYPE> &prod,
576     const edm::Event &event) const
577     {
578     // Try to safely access data collection from EDM file. We check if we really get just one
579     // product with the given name. If not, we return false.
580    
581     if (name.size()==0)
582     return false;
583    
584     try {
585     event.getByLabel(edm::InputTag(name),prod);
586     if (!prod.isValid())
587     return false;
588     } catch (...) {
589     return false;
590     }
591     return true;
592     }
593    
594    
595 mnguyen 1.8 int
596     HiInclusiveJetAnalyzer::getPFJetMuon(const pat::Jet& pfJet, const reco::PFCandidateCollection *pfCandidateColl)
597     {
598    
599     int pfMuonIndex = -1;
600     float ptMax = 0.;
601    
602    
603     for(unsigned icand=0;icand<pfCandidateColl->size(); icand++) {
604     const reco::PFCandidate pfCandidate = pfCandidateColl->at(icand);
605    
606     int id = pfCandidate.particleId();
607     if(abs(id) != 3) continue;
608 yilmaz 1.1
609 mnguyen 1.8 if(reco::deltaR(pfJet,pfCandidate)>0.5) continue;
610    
611     double pt = pfCandidate.pt();
612     if(pt>ptMax){
613     ptMax = pt;
614     pfMuonIndex = (int) icand;
615     }
616     }
617    
618     return pfMuonIndex;
619    
620     }
621    
622    
623     double
624     HiInclusiveJetAnalyzer::getPtRel(const reco::PFCandidate lep, const pat::Jet& jet )
625     {
626    
627     float lj_x = jet.p4().px();
628     float lj_y = jet.p4().py();
629     float lj_z = jet.p4().pz();
630    
631     // absolute values squared
632     float lj2 = lj_x*lj_x+lj_y*lj_y+lj_z*lj_z;
633     float lep2 = lep.px()*lep.px()+lep.py()*lep.py()+lep.pz()*lep.pz();
634    
635     // projection vec(mu) to lepjet axis
636     float lepXlj = lep.px()*lj_x+lep.py()*lj_y+lep.pz()*lj_z;
637    
638     // absolute value squared and normalized
639     float pLrel2 = lepXlj*lepXlj/lj2;
640    
641     // lep2 = pTrel2 + pLrel2
642     float pTrel2 = lep2-pLrel2;
643    
644     return (pTrel2 > 0) ? std::sqrt(pTrel2) : 0.0;
645     }
646 yilmaz 1.1
647     DEFINE_FWK_MODULE(HiInclusiveJetAnalyzer);