ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/CmsHi/JetAnalysis/src/HiInclusiveJetAnalyzer.cc
Revision: 1.33
Committed: Fri Jan 25 23:49:37 2013 UTC (12 years, 3 months ago) by yilmaz
Content type: text/plain
Branch: MAIN
CVS Tags: HiForest_V02_56, HiForest_V02_55
Changes since 1.32: +2 -0 lines
Log Message:
jet pt cut

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 yilmaz 1.25 #include "Geometry/Records/interface/CaloGeometryRecord.h"
23 yilmaz 1.1
24     #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
25     #include "DataFormats/JetReco/interface/CaloJetCollection.h"
26     #include "SimDataFormats/HiGenData/interface/GenHIEvent.h"
27     #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
28 mnguyen 1.10 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
29 yilmaz 1.1 #include "DataFormats/JetReco/interface/GenJetCollection.h"
30     #include "DataFormats/VertexReco/interface/Vertex.h"
31     #include "DataFormats/Math/interface/deltaPhi.h"
32     #include "DataFormats/Math/interface/deltaR.h"
33    
34     #include "DataFormats/Common/interface/TriggerResults.h"
35     #include "FWCore/Common/interface/TriggerNames.h"
36     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutSetup.h"
37     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
38     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerObjectMapRecord.h"
39     #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerObjectMap.h"
40     #include "L1Trigger/GlobalTrigger/interface/L1GlobalTrigger.h"
41    
42 yilmaz 1.25 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
43     #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
44    
45 yilmaz 1.1 using namespace std;
46     using namespace edm;
47     using namespace reco;
48    
49 yilmaz 1.25 HiInclusiveJetAnalyzer::HiInclusiveJetAnalyzer(const edm::ParameterSet& iConfig) :
50     geo(0)
51     {
52 yilmaz 1.1
53     jetTag_ = iConfig.getParameter<InputTag>("jetTag");
54 yilmaz 1.18 matchTag_ = iConfig.getUntrackedParameter<InputTag>("matchTag",jetTag_);
55    
56 mnguyen 1.8 vtxTag_ = iConfig.getUntrackedParameter<edm::InputTag>("vtxTag",edm::InputTag("hiSelectedVertex"));
57 yilmaz 1.17 trackTag_ = iConfig.getParameter<InputTag>("trackTag");
58 yilmaz 1.22 useQuality_ = iConfig.getUntrackedParameter<bool>("useQuality",1);
59     trackQuality_ = iConfig.getUntrackedParameter<string>("trackQuality","highPurity");
60 yilmaz 1.1
61     isMC_ = iConfig.getUntrackedParameter<bool>("isMC",false);
62 yilmaz 1.21 fillGenJets_ = iConfig.getUntrackedParameter<bool>("fillGenJets",false);
63    
64 yilmaz 1.14 doTrigger_ = iConfig.getUntrackedParameter<bool>("doTrigger",false);
65 yilmaz 1.17
66     rParam = iConfig.getParameter<double>("rParam");
67 yilmaz 1.19 hardPtMin_ = iConfig.getUntrackedParameter<double>("hardPtMin",4);
68 yilmaz 1.28 jetPtMin_ = iConfig.getUntrackedParameter<double>("jetPtMin",0);
69 yilmaz 1.19
70 yilmaz 1.1 if(isMC_){
71     genjetTag_ = iConfig.getParameter<InputTag>("genjetTag");
72     eventInfoTag_ = iConfig.getParameter<InputTag>("eventInfoTag");
73     }
74     verbose_ = iConfig.getUntrackedParameter<bool>("verbose",false);
75    
76     useCentrality_ = iConfig.getUntrackedParameter<bool>("useCentrality",false);
77 yjlee 1.4 useVtx_ = iConfig.getUntrackedParameter<bool>("useVtx",false);
78 yilmaz 1.1 useJEC_ = iConfig.getUntrackedParameter<bool>("useJEC",true);
79 yilmaz 1.2 usePat_ = iConfig.getUntrackedParameter<bool>("usePAT",true);
80 yilmaz 1.1
81 mnguyen 1.8 doLifeTimeTagging_ = iConfig.getUntrackedParameter<bool>("doLifeTimeTagging",false);
82 mnguyen 1.10 doLifeTimeTaggingExtras_ = iConfig.getUntrackedParameter<bool>("doLifeTimeTaggingExtras",true);
83 mnguyen 1.11 saveBfragments_ = iConfig.getUntrackedParameter<bool>("saveBfragments",false);
84 yilmaz 1.27 skipCorrections_ = iConfig.getUntrackedParameter<bool>("skipCorrections",false);
85 mnguyen 1.11
86 mnguyen 1.8 pfCandidateLabel_ = iConfig.getUntrackedParameter<edm::InputTag>("pfCandidateLabel",edm::InputTag("particleFlowTmp"));
87    
88 yilmaz 1.25 EBSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("EBRecHitSrc",edm::InputTag("ecalRecHit","EcalRecHitsEB"));
89     EESrc_ = iConfig.getUntrackedParameter<edm::InputTag>("EERecHitSrc",edm::InputTag("ecalRecHit","EcalRecHitsEE"));
90     HcalRecHitHFSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("hcalHFRecHitSrc",edm::InputTag("hfreco"));
91     HcalRecHitHBHESrc_ = iConfig.getUntrackedParameter<edm::InputTag>("hcalHBHERecHitSrc",edm::InputTag("hbhereco"));
92    
93 yilmaz 1.26 genParticleSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("genParticles",edm::InputTag("hiGenParticles"));
94    
95 yilmaz 1.14 if(doTrigger_){
96 yilmaz 1.1 L1gtReadout_ = iConfig.getParameter<edm::InputTag>("L1gtReadout");
97     hltResName_ = iConfig.getUntrackedParameter<string>("hltTrgResults","TriggerResults::HLT");
98    
99    
100     if (iConfig.exists("hltTrgNames"))
101     hltTrgNames_ = iConfig.getUntrackedParameter<vector<string> >("hltTrgNames");
102    
103     if (iConfig.exists("hltProcNames"))
104     hltProcNames_ = iConfig.getUntrackedParameter<vector<string> >("hltProcNames");
105     else {
106     hltProcNames_.push_back("FU");
107     hltProcNames_.push_back("HLT");
108     }
109     }
110    
111 yilmaz 1.29 // cout<<" jet collection : "<<jetTag_<<endl;
112 yilmaz 1.12 doSubEvent_ = 0;
113    
114 yilmaz 1.9 if(isMC_){
115 yilmaz 1.29 // cout<<" genjet collection : "<<genjetTag_<<endl;
116 yilmaz 1.9 genPtMin_ = iConfig.getUntrackedParameter<double>("genPtMin",0);
117 yilmaz 1.12 doSubEvent_ = iConfig.getUntrackedParameter<bool>("doSubEvent",1);
118 yilmaz 1.9 }
119 yilmaz 1.1
120    
121     }
122    
123    
124    
125     HiInclusiveJetAnalyzer::~HiInclusiveJetAnalyzer() { }
126    
127    
128    
129     void
130     HiInclusiveJetAnalyzer::beginRun(const edm::Run& run,
131     const edm::EventSetup & es) {}
132    
133     void
134     HiInclusiveJetAnalyzer::beginJob() {
135    
136     centrality_ = 0;
137    
138     //string jetTagName = jetTag_.label()+"_tree";
139     string jetTagTitle = jetTag_.label()+" Jet Analysis Tree";
140     t = fs1->make<TTree>("t",jetTagTitle.c_str());
141    
142 yjlee 1.6 // TTree* t= new TTree("t","Jet Response Analyzer");
143 yjlee 1.4 //t->Branch("run",&jets_.run,"run/I");
144 yilmaz 1.1 t->Branch("evt",&jets_.evt,"evt/I");
145 yjlee 1.4 //t->Branch("lumi",&jets_.lumi,"lumi/I");
146 yilmaz 1.1 t->Branch("b",&jets_.b,"b/F");
147 yjlee 1.4 if (useVtx_) {
148     t->Branch("vx",&jets_.vx,"vx/F");
149     t->Branch("vy",&jets_.vy,"vy/F");
150     t->Branch("vz",&jets_.vz,"vz/F");
151     }
152     if (useCentrality_) {
153     t->Branch("hf",&jets_.hf,"hf/F");
154     t->Branch("bin",&jets_.bin,"bin/I");
155     }
156 yjlee 1.7
157     t->Branch("nref",&jets_.nref,"nref/I");
158 yilmaz 1.1 t->Branch("rawpt",jets_.rawpt,"rawpt[nref]/F");
159 yilmaz 1.27 if(!skipCorrections_) t->Branch("jtpt",jets_.jtpt,"jtpt[nref]/F");
160 yilmaz 1.1 t->Branch("jteta",jets_.jteta,"jteta[nref]/F");
161     t->Branch("jty",jets_.jty,"jty[nref]/F");
162     t->Branch("jtphi",jets_.jtphi,"jtphi[nref]/F");
163 yilmaz 1.2 t->Branch("jtpu",jets_.jtpu,"jtpu[nref]/F");
164 yilmaz 1.23 t->Branch("jtm",jets_.jtm,"jtm[nref]/F");
165 yilmaz 1.1
166 yilmaz 1.17 // jet ID information, jet composition
167     t->Branch("discr_fr01", jets_.discr_fr01,"discr_fr01[nref]/F");
168    
169     t->Branch("trackMax", jets_.trackMax,"trackMax[nref]/F");
170     t->Branch("trackSum", jets_.trackSum,"trackSum[nref]/F");
171     t->Branch("trackN", jets_.trackN,"trackN[nref]/I");
172 yilmaz 1.19 t->Branch("trackHardSum", jets_.trackHardSum,"trackHardSum[nref]/F");
173     t->Branch("trackHardN", jets_.trackHardN,"trackHardN[nref]/I");
174 yilmaz 1.17
175     t->Branch("chargedMax", jets_.chargedMax,"chargedMax[nref]/F");
176     t->Branch("chargedSum", jets_.chargedSum,"chargedSum[nref]/F");
177     t->Branch("chargedN", jets_.chargedN,"chargedN[nref]/I");
178 yilmaz 1.19 t->Branch("chargedHardSum", jets_.chargedHardSum,"chargedHardSum[nref]/F");
179     t->Branch("chargedHardN", jets_.chargedHardN,"chargedHardN[nref]/I");
180 yilmaz 1.30
181 yilmaz 1.17 t->Branch("photonMax", jets_.photonMax,"photonMax[nref]/F");
182     t->Branch("photonSum", jets_.photonSum,"photonSum[nref]/F");
183     t->Branch("photonN", jets_.photonN,"photonN[nref]/I");
184 yilmaz 1.19 t->Branch("photonHardSum", jets_.photonHardSum,"photonHardSum[nref]/F");
185     t->Branch("photonHardN", jets_.photonHardN,"photonHardN[nref]/I");
186 yilmaz 1.17
187     t->Branch("neutralMax", jets_.neutralMax,"neutralMax[nref]/F");
188     t->Branch("neutralSum", jets_.neutralSum,"neutralSum[nref]/F");
189     t->Branch("neutralN", jets_.neutralN,"neutralN[nref]/I");
190    
191 yilmaz 1.25 t->Branch("hcalSum", jets_.hcalSum,"hcalSum[nref]/F");
192     t->Branch("ecalSum", jets_.ecalSum,"ecalSum[nref]/F");
193    
194 yilmaz 1.17 t->Branch("eMax", jets_.eMax,"eMax[nref]/F");
195     t->Branch("eSum", jets_.eSum,"eSum[nref]/F");
196     t->Branch("eN", jets_.eN,"eN[nref]/I");
197    
198     t->Branch("muMax", jets_.muMax,"muMax[nref]/F");
199     t->Branch("muSum", jets_.muSum,"muSum[nref]/F");
200     t->Branch("muN", jets_.muN,"muN[nref]/I");
201    
202 yilmaz 1.30
203     t->Branch("fHPD",jets_.fHPD,"fHPD[nref]");
204     t->Branch("fRBX",jets_.fRBX,"fRBX[nref]");
205 yilmaz 1.32 t->Branch("n90",jets_.n90,"n90[nref]");
206 yilmaz 1.30 t->Branch("fSubDet1",jets_.fSubDet1,"fSubDet1[nref]");
207     t->Branch("fSubDet2",jets_.fSubDet2,"fSubDet2[nref]");
208     t->Branch("fSubDet3",jets_.fSubDet3,"fSubDet3[nref]");
209     t->Branch("fSubDet4",jets_.fSubDet4,"fSubDet4[nref]");
210     t->Branch("restrictedEMF",jets_.restrictedEMF,"restrictedEMF[nref]");
211     t->Branch("nHCAL",jets_.nHCAL,"nHCAL[nref]");
212     t->Branch("nECAL",jets_.nECAL,"nECAL[nref]");
213     t->Branch("apprHPD",jets_.apprHPD,"apprHPD[nref]");
214     t->Branch("apprRBX",jets_.apprRBX,"apprRBX[nref]");
215    
216 yilmaz 1.32 // t->Branch("hitsInN90",jets_.n90,"hitsInN90[nref]");
217 yilmaz 1.30 t->Branch("n2RPC",jets_.n2RPC,"n2RPC[nref]");
218     t->Branch("n3RPC",jets_.n3RPC,"n3RPC[nref]");
219     t->Branch("nRPC",jets_.nRPC,"nRPC[nref]");
220    
221     t->Branch("fEB",jets_.fEB,"fEB[nref]");
222     t->Branch("fEE",jets_.fEE,"fEE[nref]");
223     t->Branch("fHB",jets_.fHB,"fHB[nref]");
224     t->Branch("fHE",jets_.fHE,"fHE[nref]");
225     t->Branch("fHO",jets_.fHO,"fHO[nref]");
226     t->Branch("fLong",jets_.fLong,"fLong[nref]");
227     t->Branch("fShort",jets_.fShort,"fShort[nref]");
228     t->Branch("fLS",jets_.fLS,"fLS[nref]");
229     t->Branch("fHFOOT",jets_.fHFOOT,"fHFOOT[nref]");
230    
231    
232     // Jet ID
233    
234 yilmaz 1.27 if(!skipCorrections_) t->Branch("matchedPt", jets_.matchedPt,"matchedPt[nref]/F");
235     t->Branch("matchedRawPt", jets_.matchedRawPt,"matchedRawPt[nref]/F");
236 yilmaz 1.18 t->Branch("matchedR", jets_.matchedR,"matchedR[nref]/F");
237 yilmaz 1.17
238 mnguyen 1.8 // b-jet discriminators
239     if (doLifeTimeTagging_) {
240    
241     t->Branch("discr_csvMva",jets_.discr_csvMva,"discr_csvMva[nref]/F");
242     t->Branch("discr_csvSimple",jets_.discr_csvSimple,"discr_csvSimple[nref]/F");
243     t->Branch("discr_muByIp3",jets_.discr_muByIp3,"discr_muByIp3[nref]/F");
244     t->Branch("discr_muByPt",jets_.discr_muByPt,"discr_muByPt[nref]/F");
245     t->Branch("discr_prob",jets_.discr_prob,"discr_prob[nref]/F");
246     t->Branch("discr_probb",jets_.discr_probb,"discr_probb[nref]/F");
247     t->Branch("discr_tcHighEff",jets_.discr_tcHighEff,"discr_tcHighEff[nref]/F");
248     t->Branch("discr_tcHighPur",jets_.discr_tcHighPur,"discr_tcHighPur[nref]/F");
249    
250 mnguyen 1.10 t->Branch("nsvtx", jets_.nsvtx, "nsvtx[nref]/I");
251     t->Branch("svtxntrk", jets_.svtxntrk, "svtxntrk[nref]/I");
252 mnguyen 1.8 t->Branch("svtxdl", jets_.svtxdl, "svtxdl[nref]/F");
253     t->Branch("svtxdls", jets_.svtxdls, "svtxdls[nref]/F");
254     t->Branch("svtxm", jets_.svtxm, "svtxm[nref]/F");
255     t->Branch("svtxpt", jets_.svtxpt, "svtxpt[nref]/F");
256    
257 mnguyen 1.10 t->Branch("nIPtrk",jets_.nIPtrk,"nIPtrk[nref]/I");
258     t->Branch("nselIPtrk",jets_.nselIPtrk,"nselIPtrk[nref]/I");
259 mnguyen 1.11
260 mnguyen 1.10 if (doLifeTimeTaggingExtras_) {
261 mnguyen 1.11 t->Branch("nIP",&jets_.nIP,"nIP/I");
262     t->Branch("ipJetIndex",jets_.ipJetIndex,"ipJetIndex[nIP]/I");
263     t->Branch("ipPt",jets_.ipPt,"ipPt[nIP]/F");
264     t->Branch("ipProb0",jets_.ipProb0,"ipProb0[nIP]/F");
265     t->Branch("ipProb1",jets_.ipProb1,"ipProb1[nIP]/F");
266     t->Branch("ip2d",jets_.ip2d,"ip2d[nIP]/F");
267     t->Branch("ip2dSig",jets_.ip2dSig,"ip2dSig[nIP]/F");
268     t->Branch("ip3d",jets_.ip3d,"ip3d[nIP]/F");
269     t->Branch("ip3dSig",jets_.ip3dSig,"ip3dSig[nIP]/F");
270     t->Branch("ipDist2Jet",jets_.ipDist2Jet,"ipDist2Jet[nIP]/F");
271     t->Branch("ipDist2JetSig",jets_.ipDist2JetSig,"ipDist2JetSig[nIP]/F");
272     t->Branch("ipClosest2Jet",jets_.ipClosest2Jet,"ipClosest2Jet[nIP]/F");
273    
274 mnguyen 1.10 }
275 mnguyen 1.8
276     t->Branch("mue", jets_.mue, "mue[nref]/F");
277     t->Branch("mupt", jets_.mupt, "mupt[nref]/F");
278     t->Branch("mueta", jets_.mueta, "mueta[nref]/F");
279     t->Branch("muphi", jets_.muphi, "muphi[nref]/F");
280     t->Branch("mudr", jets_.mudr, "mudr[nref]/F");
281     t->Branch("muptrel", jets_.muptrel, "muptrel[nref]/F");
282     t->Branch("muchg", jets_.muchg, "muchg[nref]/I");
283     }
284 ylai 1.16
285 mnguyen 1.8
286 yilmaz 1.1 if(isMC_){
287 mnguyen 1.10 t->Branch("beamId1",&jets_.beamId1,"beamId1/I");
288     t->Branch("beamId2",&jets_.beamId2,"beamId2/I");
289    
290 yilmaz 1.1 t->Branch("pthat",&jets_.pthat,"pthat/F");
291    
292     // Only matched gen jets
293     t->Branch("refpt",jets_.refpt,"refpt[nref]/F");
294     t->Branch("refeta",jets_.refeta,"refeta[nref]/F");
295     t->Branch("refy",jets_.refy,"refy[nref]/F");
296     t->Branch("refphi",jets_.refphi,"refphi[nref]/F");
297     t->Branch("refdphijt",jets_.refdphijt,"refdphijt[nref]/F");
298     t->Branch("refdrjt",jets_.refdrjt,"refdrjt[nref]/F");
299     // matched parton
300     t->Branch("refparton_pt",jets_.refparton_pt,"refparton_pt[nref]/F");
301 mnguyen 1.8 t->Branch("refparton_flavor",jets_.refparton_flavor,"refparton_flavor[nref]/I");
302     t->Branch("refparton_flavorForB",jets_.refparton_flavorForB,"refparton_flavorForB[nref]/I");
303 yilmaz 1.1
304 yilmaz 1.25 t->Branch("genChargedSum", jets_.genChargedSum,"genChargedSum[nref]/F");
305     t->Branch("genHardSum", jets_.genHardSum,"genHardSum[nref]/F");
306     t->Branch("signalChargedSum", jets_.signalChargedSum,"signalChargedSum[nref]/F");
307     t->Branch("signalHardSum", jets_.signalHardSum,"signalHardSum[nref]/F");
308    
309     if(doSubEvent_){
310     t->Branch("subid",jets_.subid,"subid[nref]/I");
311     }
312    
313 yilmaz 1.21 if(fillGenJets_){
314     // For all gen jets, matched or unmatched
315     t->Branch("ngen",&jets_.ngen,"ngen/I");
316     t->Branch("genmatchindex",jets_.genmatchindex,"genmatchindex[ngen]/I");
317     t->Branch("genpt",jets_.genpt,"genpt[ngen]/F");
318     t->Branch("geneta",jets_.geneta,"geneta[ngen]/F");
319     t->Branch("geny",jets_.geny,"geny[ngen]/F");
320     t->Branch("genphi",jets_.genphi,"genphi[ngen]/F");
321     t->Branch("gendphijt",jets_.gendphijt,"gendphijt[ngen]/F");
322     t->Branch("gendrjt",jets_.gendrjt,"gendrjt[ngen]/F");
323    
324     if(doSubEvent_){
325     t->Branch("gensubid",jets_.gensubid,"gensubid[ngen]/I");
326     }
327 yilmaz 1.12 }
328 yilmaz 1.21
329 mnguyen 1.11 if(saveBfragments_ ) {
330     t->Branch("bMult",&jets_.bMult,"bMult/I");
331     t->Branch("bJetIndex",jets_.bJetIndex,"bJetIndex[bMult]/I");
332     t->Branch("bStatus",jets_.bStatus,"bStatus[bMult]/I");
333     t->Branch("bVx",jets_.bVx,"bVx[bMult]/F");
334     t->Branch("bVy",jets_.bVy,"bVy[bMult]/F");
335     t->Branch("bVz",jets_.bVz,"bVz[bMult]/F");
336     t->Branch("bPt",jets_.bPt,"bPt[bMult]/F");
337     t->Branch("bEta",jets_.bEta,"bEta[bMult]/F");
338     t->Branch("bPhi",jets_.bPhi,"bPhi[bMult]/F");
339     t->Branch("bPdg",jets_.bPdg,"bPdg[bMult]/I");
340     t->Branch("bChg",jets_.bChg,"bChg[bMult]/I");
341     }
342 yilmaz 1.13
343 yilmaz 1.1 }
344 yjlee 1.7 /*
345 yilmaz 1.1 if(!isMC_){
346     t->Branch("nL1TBit",&jets_.nL1TBit,"nL1TBit/I");
347     t->Branch("l1TBit",jets_.l1TBit,"l1TBit[nL1TBit]/O");
348    
349     t->Branch("nL1ABit",&jets_.nL1ABit,"nL1ABit/I");
350     t->Branch("l1ABit",jets_.l1ABit,"l1ABit[nL1ABit]/O");
351    
352     t->Branch("nHLTBit",&jets_.nHLTBit,"nHLTBit/I");
353     t->Branch("hltBit",jets_.hltBit,"hltBit[nHLTBit]/O");
354    
355     }
356 yjlee 1.7 */
357 yilmaz 1.1 TH1D::SetDefaultSumw2();
358    
359    
360     }
361    
362    
363     void
364     HiInclusiveJetAnalyzer::analyze(const Event& iEvent,
365     const EventSetup& iSetup) {
366    
367     int event = iEvent.id().event();
368     int run = iEvent.id().run();
369     int lumi = iEvent.id().luminosityBlock();
370    
371     jets_.run = run;
372     jets_.evt = event;
373     jets_.lumi = lumi;
374    
375     LogDebug("HiInclusiveJetAnalyzer")<<"START event: "<<event<<" in run "<<run<<endl;
376    
377     int bin = -1;
378     double hf = 0.;
379     double b = 999.;
380    
381 yilmaz 1.25 if(!geo){
382     edm::ESHandle<CaloGeometry> pGeo;
383     iSetup.get<CaloGeometryRecord>().get(pGeo);
384     geo = pGeo.product();
385     }
386 yilmaz 1.1 if(useCentrality_){
387     if(!centrality_) centrality_ = new CentralityProvider(iSetup);
388     centrality_->newEvent(iEvent,iSetup); // make sure you do this first in every event
389     //double c = centrality_->centralityValue();
390     const reco::Centrality *cent = centrality_->raw();
391    
392     hf = cent->EtHFhitSum();
393    
394     bin = centrality_->getBin();
395     b = centrality_->bMean();
396     }
397    
398     // loop the events
399    
400     jets_.bin = bin;
401     jets_.hf = hf;
402    
403 yilmaz 1.25 reco::Vertex::Point vtx(0,0,0);
404     if (useVtx_) {
405     edm::Handle<vector<reco::Vertex> >vertex;
406     iEvent.getByLabel(vtxTag_, vertex);
407    
408     if(vertex->size()>0) {
409     jets_.vx=vertex->begin()->x();
410     jets_.vy=vertex->begin()->y();
411     jets_.vz=vertex->begin()->z();
412     vtx = vertex->begin()->position();
413     }
414     }
415 yilmaz 1.1
416 yilmaz 1.2 edm::Handle<pat::JetCollection> patjets;
417     if(usePat_)iEvent.getByLabel(jetTag_, patjets);
418 yilmaz 1.18
419     edm::Handle<pat::JetCollection> matchedjets;
420     iEvent.getByLabel(matchTag_, matchedjets);
421 yilmaz 1.2
422     edm::Handle<reco::JetView> jets;
423 yilmaz 1.1 iEvent.getByLabel(jetTag_, jets);
424    
425 mnguyen 1.8 edm::Handle<reco::PFCandidateCollection> pfCandidates;
426 yilmaz 1.17 iEvent.getByLabel(pfCandidateLabel_,pfCandidates);
427    
428     edm::Handle<reco::TrackCollection> tracks;
429     iEvent.getByLabel(trackTag_,tracks);
430    
431 yilmaz 1.25 edm::Handle<edm::SortedCollection<EcalRecHit,edm::StrictWeakOrdering<EcalRecHit> > > ebHits;
432     edm::Handle<edm::SortedCollection<EcalRecHit,edm::StrictWeakOrdering<EcalRecHit> > > eeHits;
433    
434     edm::Handle<HFRecHitCollection> hfHits;
435     edm::Handle<HBHERecHitCollection> hbheHits;
436    
437     iEvent.getByLabel(HcalRecHitHBHESrc_,hbheHits);
438     iEvent.getByLabel(HcalRecHitHFSrc_,hfHits);
439     iEvent.getByLabel(EBSrc_,ebHits);
440     iEvent.getByLabel(EESrc_,eeHits);
441    
442 yilmaz 1.26 edm::Handle<reco::GenParticleCollection> genparts;
443     iEvent.getByLabel(genParticleSrc_,genparts);
444    
445 yilmaz 1.25
446 yilmaz 1.1 // FILL JRA TREE
447     jets_.b = b;
448     jets_.nref = 0;
449 yilmaz 1.24
450 yilmaz 1.1
451 yilmaz 1.15 if(doTrigger_){
452 yilmaz 1.1 fillL1Bits(iEvent);
453     fillHLTBits(iEvent);
454     }
455    
456 yilmaz 1.24 for(unsigned int j = 0; j < jets->size(); ++j){
457     const reco::Jet& jet = (*jets)[j];
458 yilmaz 1.33
459     if(jets_.jtpt[jets_.nref] < jetPtMin_) continue;
460 yilmaz 1.2 if (useJEC_ && usePat_){
461     jets_.rawpt[jets_.nref]=(*patjets)[j].correctedJet("Uncorrected").pt();
462     }
463 mnguyen 1.8
464     if(doLifeTimeTagging_){
465    
466     if(jetTag_.label()=="icPu5patJets"){
467     jets_.discr_csvMva[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5CombinedSecondaryVertexMVABJetTags");
468     jets_.discr_csvSimple[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5CombinedSecondaryVertexBJetTags");
469     jets_.discr_muByIp3[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5SoftMuonByIP3dBJetTags");
470     jets_.discr_muByPt[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5SoftMuonByPtBJetTags");
471     jets_.discr_prob[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5JetBProbabilityBJetTags");
472     jets_.discr_probb[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5JetProbabilityBJetTags");
473     jets_.discr_tcHighEff[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5TrackCountingHighEffBJetTags");
474     jets_.discr_tcHighPur[jets_.nref] = (*patjets)[j].bDiscriminator("icPu5TrackCountingHighPurBJetTags");
475     }
476     else if(jetTag_.label()=="akPu3PFpatJets"){
477     jets_.discr_csvMva[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFCombinedSecondaryVertexMVABJetTags");
478     jets_.discr_csvSimple[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFCombinedSecondaryVertexBJetTags");
479     jets_.discr_muByIp3[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFSoftMuonByIP3dBJetTags");
480     jets_.discr_muByPt[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFSoftMuonByPtBJetTags");
481     jets_.discr_prob[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFJetBProbabilityBJetTags");
482     jets_.discr_probb[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFJetProbabilityBJetTags");
483     jets_.discr_tcHighEff[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFTrackCountingHighEffBJetTags");
484     jets_.discr_tcHighPur[jets_.nref] = (*patjets)[j].bDiscriminator("akPu3PFTrackCountingHighPurBJetTags");
485     }
486     else{
487 yilmaz 1.29 // cout<<" b-tagging variables not filled for this collection, turn of doLifeTimeTagging "<<endl;
488 mnguyen 1.8 }
489 mnguyen 1.10
490     const reco::SecondaryVertexTagInfo& tagInfoSV=*(*patjets)[j].tagInfoSecondaryVertex();
491    
492     jets_.nsvtx[jets_.nref] = tagInfoSV.nVertices();
493 mnguyen 1.8
494     if (tagInfoSV.nVertices()>0) {
495     jets_.svtxntrk[jets_.nref] = tagInfoSV.nVertexTracks(0);
496 mnguyen 1.10 // this is the 3d flight distance, for 2-D use (0,true)
497     Measurement1D m1D = tagInfoSV.flightDistance(0);
498 mnguyen 1.8 jets_.svtxdl[jets_.nref] = m1D.value();
499     jets_.svtxdls[jets_.nref] = m1D.significance();
500    
501 mnguyen 1.10 const reco::Vertex& svtx = tagInfoSV.secondaryVertex(0);
502 mnguyen 1.11 //cout<<" SV: vx: "<<svtx.x()<<" vy "<<svtx.y()<<" vz "<<svtx.z()<<endl;
503     //cout<<" PV: vx: "<<jet.vx()<<" vy "<<jet.vy()<<" vz "<<jet.vz()<<endl;
504 mnguyen 1.8 jets_.svtxm[jets_.nref] = svtx.p4().mass();
505 mnguyen 1.10 jets_.svtxpt[jets_.nref] = svtx.p4().pt();
506 mnguyen 1.11 //cout<<" chi2 "<<svtx.chi2()<<" ndof "<<svtx.ndof()<<endl;
507 mnguyen 1.8 }
508 mnguyen 1.10
509 mnguyen 1.8 const reco::TrackIPTagInfo& tagInfoIP=*(*patjets)[j].tagInfoTrackIP();
510 mnguyen 1.10
511     jets_.nIPtrk[jets_.nref] = tagInfoIP.tracks().size();
512     jets_.nselIPtrk[jets_.nref] = tagInfoIP.selectedTracks().size();
513 mnguyen 1.8
514 mnguyen 1.10 if (doLifeTimeTaggingExtras_) {
515 mnguyen 1.8
516 mnguyen 1.10 TrackRefVector selTracks=tagInfoIP.selectedTracks();
517    
518     GlobalPoint pv(tagInfoIP.primaryVertex()->position().x(),tagInfoIP.primaryVertex()->position().y(),tagInfoIP.primaryVertex()->position().z());
519    
520     for(int it=0;it<jets_.nselIPtrk[jets_.nref] ;it++)
521     {
522 mnguyen 1.11 jets_.ipJetIndex[jets_.nIP + it]= jets_.nref;
523 mnguyen 1.10 TrackIPTagInfo::TrackIPData data = tagInfoIP.impactParameterData()[it];
524 mnguyen 1.11 jets_.ipPt[jets_.nIP + it] = selTracks[it]->pt();
525     jets_.ipProb0[jets_.nIP + it] = tagInfoIP.probabilities(0)[it];
526     jets_.ipProb1[jets_.nIP + it] = tagInfoIP.probabilities(1)[it];
527     jets_.ip2d[jets_.nIP + it] = data.ip2d.value();
528     jets_.ip2dSig[jets_.nIP + it] = data.ip2d.significance();
529     jets_.ip3d[jets_.nIP + it] = data.ip3d.value();
530     jets_.ip3dSig[jets_.nIP + it] = data.ip3d.significance();
531     jets_.ipDist2Jet[jets_.nIP + it] = data.distanceToJetAxis.value();
532     jets_.ipDist2JetSig[jets_.nIP + it] = data.distanceToJetAxis.significance();
533     jets_.ipClosest2Jet[jets_.nIP + it] = (data.closestToJetAxis - pv).mag(); //decay length
534 mnguyen 1.10 }
535 mnguyen 1.11
536     jets_.nIP += jets_.nselIPtrk[jets_.nref];
537    
538 mnguyen 1.10 }
539    
540 mnguyen 1.8 const reco::PFCandidateCollection *pfCandidateColl = &(*pfCandidates);
541     int pfMuonIndex = getPFJetMuon(jet, pfCandidateColl);
542     if(pfMuonIndex >=0){
543     const reco::PFCandidate muon = pfCandidateColl->at(pfMuonIndex);
544     jets_.mupt[jets_.nref] = muon.pt();
545     jets_.mueta[jets_.nref] = muon.eta();
546     jets_.muphi[jets_.nref] = muon.phi();
547     jets_.mue[jets_.nref] = muon.energy();
548     jets_.mudr[jets_.nref] = reco::deltaR(jet,muon);
549     jets_.muptrel[jets_.nref] = getPtRel(muon, jet);
550     jets_.muchg[jets_.nref] = muon.charge();
551 yilmaz 1.17 }else{
552 ylai 1.16 jets_.mupt[jets_.nref] = 0.0;
553     jets_.mueta[jets_.nref] = 0.0;
554     jets_.muphi[jets_.nref] = 0.0;
555     jets_.mue[jets_.nref] = 0.0;
556     jets_.mudr[jets_.nref] = 9.9;
557     jets_.muptrel[jets_.nref] = 0.0;
558     jets_.muchg[jets_.nref] = 0;
559     }
560    
561 mnguyen 1.8 }
562    
563 yilmaz 1.17 // Jet ID variables
564    
565     jets_.muMax[jets_.nref] = 0;
566     jets_.muSum[jets_.nref] = 0;
567     jets_.muN[jets_.nref] = 0;
568    
569     jets_.eMax[jets_.nref] = 0;
570     jets_.eSum[jets_.nref] = 0;
571     jets_.eN[jets_.nref] = 0;
572    
573     jets_.neutralMax[jets_.nref] = 0;
574     jets_.neutralSum[jets_.nref] = 0;
575     jets_.neutralN[jets_.nref] = 0;
576    
577     jets_.photonMax[jets_.nref] = 0;
578     jets_.photonSum[jets_.nref] = 0;
579     jets_.photonN[jets_.nref] = 0;
580 yilmaz 1.19 jets_.photonHardSum[jets_.nref] = 0;
581     jets_.photonHardN[jets_.nref] = 0;
582 yilmaz 1.17
583     jets_.chargedMax[jets_.nref] = 0;
584     jets_.chargedSum[jets_.nref] = 0;
585     jets_.chargedN[jets_.nref] = 0;
586 yilmaz 1.19 jets_.chargedHardSum[jets_.nref] = 0;
587     jets_.chargedHardN[jets_.nref] = 0;
588 yilmaz 1.17
589     jets_.trackMax[jets_.nref] = 0;
590     jets_.trackSum[jets_.nref] = 0;
591     jets_.trackN[jets_.nref] = 0;
592 yilmaz 1.19 jets_.trackHardSum[jets_.nref] = 0;
593     jets_.trackHardN[jets_.nref] = 0;
594 yilmaz 1.17
595 yilmaz 1.25 jets_.hcalSum[jets_.nref] = 0;
596     jets_.ecalSum[jets_.nref] = 0;
597    
598     jets_.genChargedSum[jets_.nref] = 0;
599     jets_.genHardSum[jets_.nref] = 0;
600    
601     jets_.signalChargedSum[jets_.nref] = 0;
602     jets_.signalHardSum[jets_.nref] = 0;
603    
604     jets_.subid[jets_.nref] = -1;
605    
606 yilmaz 1.17 for(unsigned int icand = 0; icand < tracks->size(); ++icand){
607     const reco::Track& track = (*tracks)[icand];
608 yilmaz 1.22 if(useQuality_ ){
609     bool goodtrack = track.quality(reco::TrackBase::qualityByName(trackQuality_));
610     if(!goodtrack) continue;
611     }
612 yilmaz 1.18
613 yilmaz 1.17 double dr = deltaR(jet,track);
614     if(dr < rParam){
615     double ptcand = track.pt();
616     jets_.trackSum[jets_.nref] += ptcand;
617     jets_.trackN[jets_.nref] += 1;
618 yilmaz 1.19
619     if(ptcand > hardPtMin_){
620     jets_.trackHardSum[jets_.nref] += ptcand;
621     jets_.trackHardN[jets_.nref] += 1;
622    
623     }
624 yilmaz 1.17 if(ptcand > jets_.trackMax[jets_.nref]) jets_.trackMax[jets_.nref] = ptcand;
625    
626     }
627     }
628    
629     for(unsigned int icand = 0; icand < pfCandidates->size(); ++icand){
630     const reco::PFCandidate& track = (*pfCandidates)[icand];
631     double dr = deltaR(jet,track);
632     if(dr < rParam){
633     double ptcand = track.pt();
634     int pfid = track.particleId();
635    
636     switch(pfid){
637    
638     case 1:
639     jets_.chargedSum[jets_.nref] += ptcand;
640     jets_.chargedN[jets_.nref] += 1;
641 yilmaz 1.19 if(ptcand > hardPtMin_){
642     jets_.chargedHardSum[jets_.nref] += ptcand;
643     jets_.chargedHardN[jets_.nref] += 1;
644     }
645 yilmaz 1.17 if(ptcand > jets_.chargedMax[jets_.nref]) jets_.chargedMax[jets_.nref] = ptcand;
646     break;
647    
648     case 2:
649     jets_.eSum[jets_.nref] += ptcand;
650     jets_.eN[jets_.nref] += 1;
651     if(ptcand > jets_.eMax[jets_.nref]) jets_.eMax[jets_.nref] = ptcand;
652     break;
653    
654     case 3:
655     jets_.muSum[jets_.nref] += ptcand;
656     jets_.muN[jets_.nref] += 1;
657     if(ptcand > jets_.muMax[jets_.nref]) jets_.muMax[jets_.nref] = ptcand;
658     break;
659    
660     case 4:
661     jets_.photonSum[jets_.nref] += ptcand;
662     jets_.photonN[jets_.nref] += 1;
663 yilmaz 1.19 if(ptcand > hardPtMin_){
664     jets_.photonHardSum[jets_.nref] += ptcand;
665     jets_.photonHardN[jets_.nref] += 1;
666     }
667 yilmaz 1.17 if(ptcand > jets_.photonMax[jets_.nref]) jets_.photonMax[jets_.nref] = ptcand;
668     break;
669    
670     case 5:
671     jets_.neutralSum[jets_.nref] += ptcand;
672     jets_.neutralN[jets_.nref] += 1;
673     if(ptcand > jets_.neutralMax[jets_.nref]) jets_.neutralMax[jets_.nref] = ptcand;
674     break;
675    
676 mnguyen 1.20 default:
677     break;
678    
679 yilmaz 1.17 }
680     }
681     }
682    
683 yilmaz 1.25 // Calorimeter fractions
684    
685     for(unsigned int i = 0; i < hbheHits->size(); ++i){
686     const HBHERecHit & hit= (*hbheHits)[i];
687     math::XYZPoint pos = getPosition(hit.id(),vtx);
688     double dr = deltaR(jet.eta(),jet.phi(),pos.eta(),pos.phi());
689     if(dr < rParam){
690     jets_.hcalSum[jets_.nref] += getEt(pos,hit.energy());
691     }
692     }
693    
694     for(unsigned int i = 0; i < hfHits->size(); ++i){
695     const HFRecHit & hit= (*hfHits)[i];
696     math::XYZPoint pos = getPosition(hit.id(),vtx);
697     double dr = deltaR(jet.eta(),jet.phi(),pos.eta(),pos.phi());
698     if(dr < rParam){
699     jets_.hcalSum[jets_.nref] += getEt(pos,hit.energy());
700     }
701     }
702    
703    
704     for(unsigned int i = 0; i < ebHits->size(); ++i){
705     const EcalRecHit & hit= (*ebHits)[i];
706     math::XYZPoint pos = getPosition(hit.id(),vtx);
707     double dr = deltaR(jet.eta(),jet.phi(),pos.eta(),pos.phi());
708     if(dr < rParam){
709     jets_.ecalSum[jets_.nref] += getEt(pos,hit.energy());
710     }
711     }
712    
713     for(unsigned int i = 0; i < eeHits->size(); ++i){
714     const EcalRecHit & hit= (*eeHits)[i];
715     math::XYZPoint pos = getPosition(hit.id(),vtx);
716     double dr = deltaR(jet.eta(),jet.phi(),pos.eta(),pos.phi());
717     if(dr < rParam){
718     jets_.ecalSum[jets_.nref] += getEt(pos,hit.energy());
719     }
720     }
721    
722 yilmaz 1.30 // Jet ID for CaloJets
723    
724    
725    
726    
727    
728    
729    
730 yilmaz 1.25 // Alternative reconstruction matching (PF for calo, calo for PF)
731    
732 yilmaz 1.18 double drMin = 100;
733 mnguyen 1.20 for(unsigned int imatch = 0 ; imatch < matchedjets->size(); ++imatch){
734 yilmaz 1.27 const pat::Jet& mjet = (*matchedjets)[imatch];
735 yilmaz 1.18
736     double dr = deltaR(jet,mjet);
737     if(dr < drMin){
738     jets_.matchedPt[jets_.nref] = mjet.pt();
739 yilmaz 1.27 jets_.matchedRawPt[jets_.nref] = mjet.correctedJet("Uncorrected").pt();
740 yilmaz 1.18 jets_.matchedR[jets_.nref] = dr;
741 yilmaz 1.22 drMin = dr;
742 yilmaz 1.18 }
743     }
744 mnguyen 1.20
745 yilmaz 1.17 // if(etrk.quality(reco::TrackBase::qualityByName(qualityString_))) pev_.trkQual[pev_.nTrk]=1;
746    
747 ylai 1.16 /////////////////////////////////////////////////////////////////
748     // Jet core pt^2 discriminant for fake jets
749     // Edited by Yue Shi Lai <ylai@mit.edu>
750    
751     // Initial value is 0
752     jets_.discr_fr01[jets_.nref] = 0;
753     // Start with no directional adaption, i.e. the fake rejection
754     // axis is the jet axis
755     float pseudorapidity_adapt = jets_.jteta[jets_.nref];
756     float azimuth_adapt = jets_.jtphi[jets_.nref];
757    
758     // Unadapted discriminant with adaption search
759     for (size_t iteration = 0; iteration < 2; iteration++) {
760     float pseudorapidity_adapt_new = pseudorapidity_adapt;
761     float azimuth_adapt_new = azimuth_adapt;
762     float max_weighted_perp = 0;
763     float perp_square_sum = 0;
764    
765     for (size_t index_pf_candidate = 0;
766     index_pf_candidate < pfCandidates->size();
767     index_pf_candidate++) {
768     const reco::PFCandidate &p =
769     (*pfCandidates)[index_pf_candidate];
770    
771     switch (p.particleId()) {
772 mnguyen 1.20 //case 1: // Charged hadron
773     //case 3: // Muon
774 ylai 1.16 case 4: // Photon
775     {
776     const float dpseudorapidity =
777     p.eta() - pseudorapidity_adapt;
778     const float dazimuth =
779     reco::deltaPhi(p.phi(), azimuth_adapt);
780     // The Gaussian scale factor is 0.5 / (0.1 * 0.1)
781     // = 50
782     const float angular_weight =
783     exp(-50.0F * (dpseudorapidity * dpseudorapidity +
784     dazimuth * dazimuth));
785     const float weighted_perp =
786     angular_weight * p.pt() * p.pt();
787     const float weighted_perp_square =
788     weighted_perp * p.pt();
789    
790     perp_square_sum += weighted_perp_square;
791     if (weighted_perp >= max_weighted_perp) {
792     pseudorapidity_adapt_new = p.eta();
793     azimuth_adapt_new = p.phi();
794     max_weighted_perp = weighted_perp;
795     }
796     }
797 mnguyen 1.20 default:
798     break;
799 ylai 1.16 }
800     }
801     // Update the fake rejection value
802     jets_.discr_fr01[jets_.nref] = std::max(
803     jets_.discr_fr01[jets_.nref], perp_square_sum);
804     // Update the directional adaption
805     pseudorapidity_adapt = pseudorapidity_adapt_new;
806     azimuth_adapt = azimuth_adapt_new;
807     }
808    
809 yilmaz 1.1 jets_.jtpt[jets_.nref] = jet.pt();
810     jets_.jteta[jets_.nref] = jet.eta();
811     jets_.jtphi[jets_.nref] = jet.phi();
812     jets_.jty[jets_.nref] = jet.eta();
813 yilmaz 1.2 jets_.jtpu[jets_.nref] = jet.pileup();
814 yilmaz 1.23 jets_.jtm[jets_.nref] = jet.mass();
815 yilmaz 1.1
816 yilmaz 1.31 if(usePat_){
817 yilmaz 1.30
818     jets_.fHPD[jets_.nref] = (*patjets)[j].jetID().fHPD;
819     jets_.fRBX[jets_.nref] = (*patjets)[j].jetID().fRBX;
820 yilmaz 1.32 jets_.n90[jets_.nref] = (*patjets)[j].n90();
821 yilmaz 1.30 jets_.fSubDet1[jets_.nref] = (*patjets)[j].jetID().fSubDetector1;
822     jets_.fSubDet2[jets_.nref] = (*patjets)[j].jetID().fSubDetector2;
823     jets_.fSubDet3[jets_.nref] = (*patjets)[j].jetID().fSubDetector3;
824     jets_.fSubDet4[jets_.nref] = (*patjets)[j].jetID().fSubDetector4;
825     jets_.restrictedEMF[jets_.nref] = (*patjets)[j].jetID().restrictedEMF;
826     jets_.nHCAL[jets_.nref] = (*patjets)[j].jetID().nHCALTowers;
827     jets_.nECAL[jets_.nref] = (*patjets)[j].jetID().nECALTowers;
828     jets_.apprHPD[jets_.nref] = (*patjets)[j].jetID().approximatefHPD;
829     jets_.apprRBX[jets_.nref] = (*patjets)[j].jetID().approximatefRBX;
830    
831 yilmaz 1.32 // jets_.n90[jets_.nref] = (*patjets)[j].jetID().hitsInN90;
832 yilmaz 1.30 jets_.n2RPC[jets_.nref] = (*patjets)[j].jetID().numberOfHits2RPC;
833     jets_.n3RPC[jets_.nref] = (*patjets)[j].jetID().numberOfHits3RPC;
834     jets_.nRPC[jets_.nref] = (*patjets)[j].jetID().numberOfHitsRPC;
835    
836     jets_.fEB[jets_.nref] = (*patjets)[j].jetID().fEB;
837     jets_.fEE[jets_.nref] = (*patjets)[j].jetID().fEE;
838     jets_.fHB[jets_.nref] = (*patjets)[j].jetID().fHB;
839     jets_.fHE[jets_.nref] = (*patjets)[j].jetID().fHE;
840     jets_.fHO[jets_.nref] = (*patjets)[j].jetID().fHO;
841     jets_.fLong[jets_.nref] = (*patjets)[j].jetID().fLong;
842     jets_.fShort[jets_.nref] = (*patjets)[j].jetID().fShort;
843     jets_.fLS[jets_.nref] = (*patjets)[j].jetID().fLS;
844     jets_.fHFOOT[jets_.nref] = (*patjets)[j].jetID().fHFOOT;
845    
846    
847 yilmaz 1.31 }
848    
849     if(isMC_){
850    
851     for(UInt_t i = 0; i < genparts->size(); ++i){
852     const reco::GenParticle& p = (*genparts)[i];
853     if (p.status()!=1) continue;
854     if (p.charge()==0) continue;
855     double dr = deltaR(jet,p);
856     if(dr < rParam){
857     double ppt = p.pt();
858     jets_.genChargedSum[jets_.nref] += ppt;
859     if(ppt > hardPtMin_) jets_.genHardSum[jets_.nref] += ppt;
860     if(p.collisionId() == 0){
861     jets_.signalChargedSum[jets_.nref] += ppt;
862     if(ppt > hardPtMin_) jets_.signalHardSum[jets_.nref] += ppt;
863     }
864    
865     }
866     }
867    
868     }
869    
870     if(isMC_ && usePat_){
871    
872    
873 mnguyen 1.11 const reco::GenJet * genjet = (*patjets)[j].genJet();
874 mnguyen 1.8
875 yilmaz 1.2 if(genjet){
876     jets_.refpt[jets_.nref] = genjet->pt();
877     jets_.refeta[jets_.nref] = genjet->eta();
878     jets_.refphi[jets_.nref] = genjet->phi();
879     jets_.refy[jets_.nref] = genjet->eta();
880     jets_.refdphijt[jets_.nref] = reco::deltaPhi(jet.phi(), genjet->phi());
881     jets_.refdrjt[jets_.nref] = reco::deltaR(jet.eta(),jet.phi(),genjet->eta(),genjet->phi());
882 yilmaz 1.25
883     if(doSubEvent_){
884     const GenParticle* gencon = genjet->getGenConstituent(0);
885     jets_.subid[jets_.nref] = gencon->collisionId();
886     }
887    
888 yilmaz 1.2 }else{
889     jets_.refpt[jets_.nref] = -999.;
890     jets_.refeta[jets_.nref] = -999.;
891     jets_.refphi[jets_.nref] = -999.;
892     jets_.refy[jets_.nref] = -999.;
893     jets_.refdphijt[jets_.nref] = -999.;
894     jets_.refdrjt[jets_.nref] = -999.;
895     }
896 yilmaz 1.1
897 mnguyen 1.11 jets_.refparton_flavorForB[jets_.nref] = (*patjets)[j].partonFlavour();
898    
899     // matched partons
900     const reco::GenParticle & parton = *(*patjets)[j].genParton();
901    
902     if((*patjets)[j].genParton()){
903     jets_.refparton_pt[jets_.nref] = parton.pt();
904     jets_.refparton_flavor[jets_.nref] = parton.pdgId();
905    
906     if(saveBfragments_ && abs(jets_.refparton_flavorForB[jets_.nref])==5){
907    
908     usedStringPts.clear();
909    
910     // uncomment this if you want to know the ugly truth about parton matching -matt
911     //if(jet.pt() > 50 &&abs(parton.pdgId())!=5 && parton.pdgId()!=21)
912     // cout<<" Identified as a b, but doesn't match b or gluon, id = "<<parton.pdgId()<<endl;
913    
914     jets_.bJetIndex[jets_.bMult] = jets_.nref;
915     jets_.bStatus[jets_.bMult] = parton.status();
916     jets_.bVx[jets_.bMult] = parton.vx();
917     jets_.bVy[jets_.bMult] = parton.vy();
918     jets_.bVz[jets_.bMult] = parton.vz();
919     jets_.bPt[jets_.bMult] = parton.pt();
920     jets_.bEta[jets_.bMult] = parton.eta();
921     jets_.bPhi[jets_.bMult] = parton.phi();
922     jets_.bPdg[jets_.bMult] = parton.pdgId();
923     jets_.bChg[jets_.bMult] = parton.charge();
924     jets_.bMult++;
925     saveDaughters(parton);
926     }
927    
928    
929 mnguyen 1.8 } else {
930 mnguyen 1.11 jets_.refparton_pt[jets_.nref] = -999;
931     jets_.refparton_flavor[jets_.nref] = -999;
932 mnguyen 1.8 }
933 mnguyen 1.11
934    
935 yilmaz 1.2 }
936 yilmaz 1.1
937     jets_.nref++;
938    
939    
940     }
941    
942    
943     if(isMC_){
944    
945 mnguyen 1.10 edm::Handle<HepMCProduct> hepMCProduct;
946     iEvent.getByLabel(eventInfoTag_,hepMCProduct);
947     const HepMC::GenEvent* MCEvt = hepMCProduct->GetEvent();
948 yilmaz 1.24
949     std::pair<HepMC::GenParticle*,HepMC::GenParticle*> beamParticles = MCEvt->beam_particles();
950     if(beamParticles.first != 0)jets_.beamId1 = beamParticles.first->pdg_id();
951     if(beamParticles.second != 0)jets_.beamId2 = beamParticles.second->pdg_id();
952 mnguyen 1.10
953 yilmaz 1.1 edm::Handle<GenEventInfoProduct> hEventInfo;
954     iEvent.getByLabel(eventInfoTag_,hEventInfo);
955     //jets_.pthat = hEventInfo->binningValues()[0];
956    
957     // binning values and qscale appear to be equivalent, but binning values not always present
958     jets_.pthat = hEventInfo->qScale();
959    
960     edm::Handle<vector<reco::GenJet> >genjets;
961     iEvent.getByLabel(genjetTag_, genjets);
962    
963     jets_.ngen = 0;
964     for(unsigned int igen = 0 ; igen < genjets->size(); ++igen){
965     const reco::GenJet & genjet = (*genjets)[igen];
966    
967     float genjet_pt = genjet.pt();
968    
969     // threshold to reduce size of output in minbias PbPb
970 yilmaz 1.9 if(genjet_pt>genPtMin_){
971 yilmaz 1.1
972 yilmaz 1.30
973 yilmaz 1.1 jets_.genpt[jets_.ngen] = genjet_pt;
974     jets_.geneta[jets_.ngen] = genjet.eta();
975     jets_.genphi[jets_.ngen] = genjet.phi();
976     jets_.geny[jets_.ngen] = genjet.eta();
977    
978 yilmaz 1.12 if(doSubEvent_){
979     const GenParticle* gencon = genjet.getGenConstituent(0);
980     jets_.gensubid[jets_.ngen] = gencon->collisionId();
981     }
982 yilmaz 1.1
983     // find matching patJet if there is one
984    
985     jets_.gendrjt[jets_.ngen] = -1.0;
986     jets_.genmatchindex[jets_.ngen] = -1;
987    
988 yilmaz 1.30 for(int ijet = 0 ; ijet < jets_.nref; ++ijet){
989 mnguyen 1.8 // poor man's matching, someone fix please
990 yilmaz 1.30 if(fabs(genjet.pt()-jets_.refpt[ijet])<0.00001 &&
991     fabs(genjet.eta()-jets_.refeta[ijet])<0.00001){
992    
993     jets_.genmatchindex[jets_.ngen] = (int)ijet;
994     jets_.gendphijt[jets_.ngen] = reco::deltaPhi(jets_.refphi[ijet],genjet.phi());
995     jets_.gendrjt[jets_.ngen] = sqrt(pow(jets_.gendphijt[jets_.ngen],2)+pow(fabs(genjet.eta()-jets_.refeta[ijet]),2));
996 yilmaz 1.1
997     break;
998 yilmaz 1.30 }
999 yilmaz 1.1 }
1000     }
1001 yilmaz 1.30
1002 yilmaz 1.1 jets_.ngen++;
1003 yilmaz 1.30 }
1004 yilmaz 1.1
1005 yilmaz 1.30 }
1006 yilmaz 1.1
1007 yilmaz 1.30
1008    
1009    
1010 yilmaz 1.24
1011 yilmaz 1.1 t->Fill();
1012 mnguyen 1.10 memset(&jets_,0,sizeof jets_);
1013 yilmaz 1.24
1014 yilmaz 1.1 }
1015    
1016    
1017    
1018    
1019     //--------------------------------------------------------------------------------------------------
1020     void HiInclusiveJetAnalyzer::fillL1Bits(const edm::Event &iEvent)
1021     {
1022     edm::Handle< L1GlobalTriggerReadoutRecord > L1GlobalTrigger;
1023    
1024     iEvent.getByLabel(L1gtReadout_, L1GlobalTrigger);
1025     const TechnicalTriggerWord& technicalTriggerWordBeforeMask = L1GlobalTrigger->technicalTriggerWord();
1026    
1027     for (int i=0; i<64;i++)
1028     {
1029     jets_.l1TBit[i] = technicalTriggerWordBeforeMask.at(i);
1030     }
1031     jets_.nL1TBit = 64;
1032    
1033     int ntrigs = L1GlobalTrigger->decisionWord().size();
1034     jets_.nL1ABit = ntrigs;
1035    
1036     for (int i=0; i != ntrigs; i++) {
1037     bool accept = L1GlobalTrigger->decisionWord()[i];
1038     //jets_.l1ABit[i] = (accept == true)? 1:0;
1039     if(accept== true){
1040     jets_.l1ABit[i] = 1;
1041     }
1042     else{
1043     jets_.l1ABit[i] = 0;
1044     }
1045    
1046     }
1047     }
1048    
1049     //--------------------------------------------------------------------------------------------------
1050     void HiInclusiveJetAnalyzer::fillHLTBits(const edm::Event &iEvent)
1051     {
1052     // Fill HLT trigger bits.
1053     Handle<TriggerResults> triggerResultsHLT;
1054     getProduct(hltResName_, triggerResultsHLT, iEvent);
1055    
1056     const TriggerResults *hltResults = triggerResultsHLT.product();
1057     const TriggerNames & triggerNames = iEvent.triggerNames(*hltResults);
1058    
1059     jets_.nHLTBit = hltTrgNames_.size();
1060    
1061     for(size_t i=0;i<hltTrgNames_.size();i++){
1062    
1063     for(size_t j=0;j<triggerNames.size();++j) {
1064    
1065     if(triggerNames.triggerName(j) == hltTrgNames_[i]){
1066    
1067     //cout <<"hltTrgNames_(i) "<<hltTrgNames_[i]<<endl;
1068     //cout <<"triggerName(j) "<<triggerNames.triggerName(j)<<endl;
1069     //cout<<" result "<<triggerResultsHLT->accept(j)<<endl;
1070     jets_.hltBit[i] = triggerResultsHLT->accept(j);
1071     }
1072    
1073     }
1074     }
1075     }
1076    
1077     //--------------------------------------------------------------------------------------------------
1078     template <typename TYPE>
1079     inline void HiInclusiveJetAnalyzer::getProduct(const std::string name, edm::Handle<TYPE> &prod,
1080     const edm::Event &event) const
1081     {
1082     // Try to access data collection from EDM file. We check if we really get just one
1083     // product with the given name. If not we throw an exception.
1084    
1085     event.getByLabel(edm::InputTag(name),prod);
1086     if (!prod.isValid())
1087     throw edm::Exception(edm::errors::Configuration, "HiInclusiveJetAnalyzer::GetProduct()\n")
1088     << "Collection with label '" << name << "' is not valid" << std::endl;
1089     }
1090    
1091     //--------------------------------------------------------------------------------------------------
1092     template <typename TYPE>
1093     inline bool HiInclusiveJetAnalyzer::getProductSafe(const std::string name, edm::Handle<TYPE> &prod,
1094     const edm::Event &event) const
1095     {
1096     // Try to safely access data collection from EDM file. We check if we really get just one
1097     // product with the given name. If not, we return false.
1098    
1099     if (name.size()==0)
1100     return false;
1101    
1102     try {
1103     event.getByLabel(edm::InputTag(name),prod);
1104     if (!prod.isValid())
1105     return false;
1106     } catch (...) {
1107     return false;
1108     }
1109     return true;
1110     }
1111    
1112    
1113 mnguyen 1.8 int
1114     HiInclusiveJetAnalyzer::getPFJetMuon(const pat::Jet& pfJet, const reco::PFCandidateCollection *pfCandidateColl)
1115     {
1116    
1117     int pfMuonIndex = -1;
1118     float ptMax = 0.;
1119    
1120    
1121     for(unsigned icand=0;icand<pfCandidateColl->size(); icand++) {
1122     const reco::PFCandidate pfCandidate = pfCandidateColl->at(icand);
1123    
1124     int id = pfCandidate.particleId();
1125     if(abs(id) != 3) continue;
1126 yilmaz 1.1
1127 mnguyen 1.8 if(reco::deltaR(pfJet,pfCandidate)>0.5) continue;
1128    
1129     double pt = pfCandidate.pt();
1130     if(pt>ptMax){
1131     ptMax = pt;
1132     pfMuonIndex = (int) icand;
1133     }
1134     }
1135    
1136     return pfMuonIndex;
1137    
1138     }
1139    
1140    
1141     double
1142     HiInclusiveJetAnalyzer::getPtRel(const reco::PFCandidate lep, const pat::Jet& jet )
1143     {
1144    
1145     float lj_x = jet.p4().px();
1146     float lj_y = jet.p4().py();
1147     float lj_z = jet.p4().pz();
1148    
1149     // absolute values squared
1150     float lj2 = lj_x*lj_x+lj_y*lj_y+lj_z*lj_z;
1151     float lep2 = lep.px()*lep.px()+lep.py()*lep.py()+lep.pz()*lep.pz();
1152    
1153     // projection vec(mu) to lepjet axis
1154     float lepXlj = lep.px()*lj_x+lep.py()*lj_y+lep.pz()*lj_z;
1155    
1156     // absolute value squared and normalized
1157     float pLrel2 = lepXlj*lepXlj/lj2;
1158    
1159     // lep2 = pTrel2 + pLrel2
1160     float pTrel2 = lep2-pLrel2;
1161    
1162     return (pTrel2 > 0) ? std::sqrt(pTrel2) : 0.0;
1163     }
1164 mnguyen 1.11
1165     // Recursive function, but this version gets called only the first time
1166     void
1167     HiInclusiveJetAnalyzer::saveDaughters(const reco::GenParticle &gen){
1168    
1169     for(unsigned i=0;i<gen.numberOfDaughters();i++){
1170     const reco::Candidate & daughter = *gen.daughter(i);
1171     double daughterPt = daughter.pt();
1172     if(daughterPt<1.) continue;
1173     double daughterEta = daughter.eta();
1174     if(fabs(daughterEta)>3.) continue;
1175     int daughterPdgId = daughter.pdgId();
1176     int daughterStatus = daughter.status();
1177     // Special case when b->b+string, both b and string contain all daughters, so only take the string
1178     if(gen.pdgId()==daughterPdgId && gen.status()==3 && daughterStatus==2) continue;
1179    
1180     // cheesy way of finding strings which were already used
1181     if(daughter.pdgId()==92){
1182     for(unsigned ist=0;ist<usedStringPts.size();ist++){
1183     if(fabs(daughter.pt() - usedStringPts[ist]) < 0.0001) return;
1184     }
1185     usedStringPts.push_back(daughter.pt());
1186     }
1187     jets_.bJetIndex[jets_.bMult] = jets_.nref;
1188     jets_.bStatus[jets_.bMult] = daughterStatus;
1189     jets_.bVx[jets_.bMult] = daughter.vx();
1190     jets_.bVy[jets_.bMult] = daughter.vy();
1191     jets_.bVz[jets_.bMult] = daughter.vz();
1192     jets_.bPt[jets_.bMult] = daughterPt;
1193     jets_.bEta[jets_.bMult] = daughterEta;
1194     jets_.bPhi[jets_.bMult] = daughter.phi();
1195     jets_.bPdg[jets_.bMult] = daughterPdgId;
1196     jets_.bChg[jets_.bMult] = daughter.charge();
1197     jets_.bMult++;
1198     saveDaughters(daughter);
1199     }
1200     }
1201    
1202     // This version called for all subsequent calls
1203     void
1204     HiInclusiveJetAnalyzer::saveDaughters(const reco::Candidate &gen){
1205    
1206     for(unsigned i=0;i<gen.numberOfDaughters();i++){
1207     const reco::Candidate & daughter = *gen.daughter(i);
1208     double daughterPt = daughter.pt();
1209     if(daughterPt<1.) continue;
1210     double daughterEta = daughter.eta();
1211     if(fabs(daughterEta)>3.) continue;
1212     int daughterPdgId = daughter.pdgId();
1213     int daughterStatus = daughter.status();
1214     // Special case when b->b+string, both b and string contain all daughters, so only take the string
1215     if(gen.pdgId()==daughterPdgId && gen.status()==3 && daughterStatus==2) continue;
1216    
1217     // cheesy way of finding strings which were already used
1218     if(daughter.pdgId()==92){
1219     for(unsigned ist=0;ist<usedStringPts.size();ist++){
1220     if(fabs(daughter.pt() - usedStringPts[ist]) < 0.0001) return;
1221     }
1222     usedStringPts.push_back(daughter.pt());
1223     }
1224    
1225     jets_.bJetIndex[jets_.bMult] = jets_.nref;
1226     jets_.bStatus[jets_.bMult] = daughterStatus;
1227     jets_.bVx[jets_.bMult] = daughter.vx();
1228     jets_.bVy[jets_.bMult] = daughter.vy();
1229     jets_.bVz[jets_.bMult] = daughter.vz();
1230     jets_.bPt[jets_.bMult] = daughterPt;
1231     jets_.bEta[jets_.bMult] = daughterEta;
1232     jets_.bPhi[jets_.bMult] = daughter.phi();
1233     jets_.bPdg[jets_.bMult] = daughterPdgId;
1234     jets_.bChg[jets_.bMult] = daughter.charge();
1235     jets_.bMult++;
1236     saveDaughters(daughter);
1237     }
1238     }
1239 yilmaz 1.25
1240     double HiInclusiveJetAnalyzer::getEt(math::XYZPoint pos, double energy){
1241     double et = energy*sin(pos.theta());
1242     return et;
1243     }
1244    
1245     math::XYZPoint HiInclusiveJetAnalyzer::getPosition(const DetId &id, reco::Vertex::Point vtx){
1246     const GlobalPoint& pos=geo->getPosition(id);
1247     math::XYZPoint posV(pos.x() - vtx.x(),pos.y() - vtx.y(),pos.z() - vtx.z());
1248     return posV;
1249     }
1250    
1251    
1252 yilmaz 1.1
1253     DEFINE_FWK_MODULE(HiInclusiveJetAnalyzer);