ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MPIAnalyzer/src/MPIntuple.cc
(Generate patch)

Comparing UserCode/MPIAnalyzer/src/MPIntuple.cc (file contents):
Revision 1.2 by andrey, Fri May 21 22:30:38 2010 UTC vs.
Revision 1.25 by naodell, Tue Nov 30 14:08:14 2010 UTC

# Line 1 | Line 1
1 /*
2 Description: <one line class summary>
3
4 Implementation:
5     n-tuple creator for jet studies
6 */
7 //
1   // Original Author:  "Nathaniel Odell"
2   // Secondary Author: Steven Won
3   // With contributions from: Andrey Pozdnyakov
4   //         Created:  Thurs April 22  2010
5   // $Id$
13 //
14 //
15
6  
7   // system include files
8   #include <memory>
# Line 25 | Line 15
15   #include "FWCore/Framework/interface/EventSetup.h"
16   #include "FWCore/Framework/interface/Event.h"
17   #include "FWCore/Framework/interface/MakerMacros.h"
28
18   #include "FWCore/ParameterSet/interface/ParameterSet.h"
30
19   #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
20   #include "Geometry/Records/interface/CaloGeometryRecord.h"
21 + #include "DataFormats/Math/interface/deltaPhi.h"
22  
23 + // Libraries for objects
24   #include "DataFormats/JetReco/interface/CaloJet.h"
25   #include "DataFormats/JetReco/interface/CaloJetCollection.h"
26   #include "DataFormats/JetReco/interface/PFJet.h"
# Line 40 | Line 30
30   #include "DataFormats/JetReco/interface/Jet.h"
31   #include "DataFormats/VertexReco/interface/Vertex.h"
32   #include "DataFormats/VertexReco/interface/VertexFwd.h"
33 + #include "DataFormats/BTauReco/interface/JetTag.h"
34 + #include "DataFormats/TrackReco/interface/Track.h"
35 + #include "DataFormats/BeamSpot/interface/BeamSpot.h"
36 + #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
37 + #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h"
38 +
39 + //#include "RecoVertex/PrimaryVertexProducer/interface/VertexHigherPtSquared.h"
40 +
41 + //GenParticles
42 + #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
43 +
44 + // Need to get correctors
45 + #include "JetMETCorrections/Objects/interface/JetCorrector.h"
46 +
47 + // ntuple storage classes
48 + #include "TCJet.h"
49 + #include "TCPrimaryVtx.h"
50 + #include "TCGenJet.h"
51  
52   // Need for HLT trigger info:
53   #include "FWCore/Common/interface/TriggerNames.h"
54   #include "DataFormats/Common/interface/TriggerResults.h"
55   #include "HLTrigger/HLTcore/interface/HLTConfigProvider.h"
48 //
56  
57 + //Root  stuff
58   #include "TROOT.h"
59 + #include "TH1.h"
60 + #include "TH2.h"
61 + #include "TProfile.h"
62   #include "TFile.h"
63   #include "TTree.h"
64   #include "TString.h"
# Line 78 | Line 89 | class MPIntuple : public edm::EDAnalyzer
89        virtual void endJob() ;
90  
91    bool triggerDecision(edm::Handle<edm::TriggerResults> &hltR, int iTrigger);
92 +  double sumPtSquared(const Vertex & v);
93  
94        // ----------member data ---------------------------
95  
96    edm::InputTag PFJetHandle_;
85  edm::InputTag CaloJetHandle_;
86  edm::InputTag PFJetHandle_corr;
87  edm::InputTag CaloJetHandle_corr;
97    edm::InputTag GenJetHandle_;
98    edm::InputTag PrimaryVtxHandle_;
99 <
91 <
99 >  edm::InputTag triggerResultsTag_;
100    //  Counting variables   //
101  
102 <  int eventNumber, runNumber, lumiSection;
103 <
104 <  TTree *sTree;
102 >  int eventNumber, runNumber, lumiSection, bunchCross;
103 >  double ptHat, qScale, crossSection;
104 >  
105 >  TTree* sTree;
106    TFile* ntupleFile;
107  
108 <  TClonesArray* jetP4_ak5PF;
109 <  TClonesArray* jetP4_ak5PF_corr;
110 <  TClonesArray* jetVtx3_ak5PF;
102 <  TClonesArray* jetVtx3_ak5PF_corr;
103 <  TClonesArray* jetP4_ak5Calo;
104 <  TClonesArray* jetP4_ak5Calo_corr;
105 <  TClonesArray* jetVtx3_ak5Calo;
106 <  TClonesArray* jetVtx3_ak5Calo_corr;
107 <  TClonesArray* jetP4_ak5Gen;
108 <  TClonesArray* jetVtx3_ak5Gen;
109 <  TClonesArray* PrimaryVtx3;
108 >  TClonesArray* jet_ak5PF;
109 >  TClonesArray* jet_ak5Gen;
110 >  TClonesArray* primaryVtx;
111  
112    bool doGenJets_;
112  bool doCaloJets_;
113    bool doPFJets_;
114 <
114 >  bool triggerHLT_;
115 >  bool isRealData;
116    string rootfilename;
117  
118    //Triggers
119 <  std::string hlTriggerResults_;
120 <  edm::TriggerNames triggerNames;
120 <  std::string hltName_;
121 <  std::string  triggerName_;
119 >  string hlTriggerResults_, hltName_, triggerName_;
120 >  TriggerNames triggerNames;
121    HLTConfigProvider hltConfig_;
122 <  edm::InputTag triggerResultsTag_;
123 <  std::vector<std::string>  hlNames;
122 >  vector<string>  hlNames;
123 >  unsigned int triggerStatus;
124  
125 +  //Histograms
126 +  TH1D * h1_fracAssociatedTracks;
127 +  TH1D * h1_meanJetTrackZ;
128 +  TH1D * h1_trackDxy;
129 +  TH1D * h1_jetVertexZ;
130 +  TH1D * h1_associatedSumPt;
131 +  TH1D * h1_associatedVertexIndex;
132 +  TH2F * h2_nAssTracksVsJetPt;
133 +  TProfile * p1_nVtcs;
134  
127 };
135  
136 < MPIntuple::MPIntuple(const edm::ParameterSet& iConfig):
136 > };
137  
138 <  PFJetHandle_(iConfig.getUntrackedParameter<edm::InputTag>("PFJetTag")),
132 <  CaloJetHandle_(iConfig.getUntrackedParameter<edm::InputTag>("CaloJetTag")),
133 <  PFJetHandle_corr(iConfig.getUntrackedParameter<edm::InputTag>("PFJetTag_corr")),
134 <  CaloJetHandle_corr(iConfig.getUntrackedParameter<edm::InputTag>("CaloJetTag_corr")),
135 <  GenJetHandle_(iConfig.getUntrackedParameter<edm::InputTag>("GenJetTag")),
136 <  PrimaryVtxHandle_(iConfig.getUntrackedParameter<edm::InputTag>("PrimaryVtxTag")),
137 <  doGenJets_(iConfig.getUntrackedParameter<bool>("doGenJets")),
138 <  doCaloJets_(iConfig.getUntrackedParameter<bool>("doCaloJets")),
139 <  doPFJets_(iConfig.getUntrackedParameter<bool>("doPFJets")),
140 <  rootfilename(iConfig.getUntrackedParameter<string>("rootfilename")),
141 <  hlTriggerResults_(iConfig.getUntrackedParameter<string>("HLTriggerResults","TriggerResults")),
142 <  hltName_(iConfig.getUntrackedParameter<string>("hltName","HLT"))
138 > MPIntuple::MPIntuple(const edm::ParameterSet& iConfig)
139   {
140 <  //edm::TriggerNames
141 <  // triggerNames(iConfig);
142 <
140 >  PFJetHandle_ = iConfig.getUntrackedParameter<edm::InputTag>("PFJetTag");
141 >  GenJetHandle_ = iConfig.getUntrackedParameter<edm::InputTag>("GenJetTag");
142 >  PrimaryVtxHandle_ = iConfig.getUntrackedParameter<edm::InputTag>("PrimaryVtxTag");
143 >  doGenJets_ = iConfig.getUntrackedParameter<bool>("doGenJets");
144 >  doPFJets_ = iConfig.getUntrackedParameter<bool>("doPFJets");
145 >  triggerHLT_ = iConfig.getUntrackedParameter<bool>("triggerHLT");
146 >  rootfilename = iConfig.getUntrackedParameter<string>("rootfilename");
147 >  hlTriggerResults_ = iConfig.getUntrackedParameter<string>("HLTriggerResults","TriggerResults");
148 >  hltName_ = iConfig.getUntrackedParameter<string>("hltName");
149   }
150  
149
151   MPIntuple::~MPIntuple()
152   {
153  
154   }
155  
155
156   //
157   // member functions
158   //
# Line 161 | Line 161 | MPIntuple::~MPIntuple()
161   void MPIntuple::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
162   {
163  
164 <  eventNumber = iEvent.id().event();
165 <  runNumber   = iEvent.id().run();
164 >  eventNumber  = iEvent.id().event();
165 >  runNumber    = iEvent.id().run();
166    lumiSection  = (unsigned int)iEvent.getLuminosityBlock().luminosityBlock();
167 +  bunchCross   = (unsigned int)iEvent.bunchCrossing();
168 +  isRealData   = iEvent.isRealData();
169 +
170 +
171 +  edm::Handle<reco::BeamSpot> beamSpotHandle;
172 +  iEvent.getByLabel("offlineBeamSpot", beamSpotHandle);
173 +  reco::BeamSpot vertexBeamSpot = *beamSpotHandle;
174 +
175 +  int pfCount   = 0;
176 +  int genCount  = 0;
177 +  int vtxCount  = 0;
178 +  double primaryVertexZ = -999;
179 +
180 +  //////////////////////////
181 +  //Get vertex information//
182 +  //////////////////////////
183 +
184 +  Handle<reco::VertexCollection> primaryVtcs;
185 +  iEvent.getByLabel(PrimaryVtxHandle_, primaryVtcs);
186    
187 <  int PFcount = 0;
188 <  int Calocount = 0;
189 <  int PFcount_corr = 0;
190 <  int Calocount_corr = 0;
191 <  int Gencount = 0;
192 <  int Vtxcount = 0;
187 >  for(VertexCollection::const_iterator vtx_iter = primaryVtcs->begin(); vtx_iter!= primaryVtcs->end(); ++vtx_iter){
188 >    
189 >    reco::Vertex myVtx = reco::Vertex(*vtx_iter);
190 >    if(!myVtx.isValid() || myVtx.isFake()) continue;
191 >    TCPrimaryVtx* vtxCon = new ((*primaryVtx)[vtxCount]) TCPrimaryVtx;
192 >      
193 >    //cout<<myVtx.nTracks()<<endl;
194  
195 <  if(doPFJets_){
195 >    vtxCon->SetPosition(myVtx.x(), myVtx.y(), myVtx.z());
196 >    vtxCon->SetNDof(myVtx.ndof());
197 >    vtxCon->SetChi2(myVtx.chi2());
198 >    vtxCon->SetNTrks(myVtx.tracksSize());
199 >    vtxCon->SetSumPt2Trks(sumPtSquared(myVtx));
200 >
201 >    if(vtxCount == 0) primaryVertexZ = myVtx.z();
202 >
203 >    ++vtxCount;
204      
205 +  }
206 +
207 +  p1_nVtcs->Fill(runNumber, vtxCount);
208 +
209 +  ///////////////////////
210 +  //get jet information//
211 +  ///////////////////////
212 +
213 +  if(doPFJets_){
214 +
215 +    edm::Handle<reco::JetTagCollection> bTagHandle1;
216 +    iEvent.getByLabel("trackCountingHighEffBJetTags", bTagHandle1);
217 +    const reco::JetTagCollection & bTags1 = *(bTagHandle1.product());
218 +    reco::JetTagCollection::const_iterator jet_it_1;
219 +
220 +    edm::Handle<reco::JetTagCollection> bTagHandle2;
221 +    iEvent.getByLabel("trackCountingHighPurBJetTags", bTagHandle2);
222 +    const reco::JetTagCollection & bTags2 = *(bTagHandle2.product());
223 +    reco::JetTagCollection::const_iterator jet_it_2;
224 +
225 +
226 +    const JetCorrector* correctorL2 = JetCorrector::getJetCorrector ("ak5PFL2Relative",iSetup);
227 +    const JetCorrector* correctorL3 = JetCorrector::getJetCorrector ("ak5PFL3Absolute",iSetup);
228 +
229      Handle<reco::PFJetCollection> PFJets;
230      iEvent.getByLabel(PFJetHandle_, PFJets);
231 <    
180 <    PFcount = 0;
181 <    
231 >        
232      for(PFJetCollection::const_iterator jet_iter = PFJets->begin(); jet_iter!= PFJets->end(); ++jet_iter){
233        
234        reco::PFJet myJet = reco::PFJet(*jet_iter);
235 +      if(myJet.pt() > 5){
236 +
237 +        for(jet_it_1 = bTags1.begin(); jet_it_1 != bTags1.end(); jet_it_1++) {
238 +           if( (fabs(jet_it_1->first->eta() - myJet.eta()) < .005) && (deltaPhi(jet_it_1->first->phi(),myJet.phi()) < .005)) break;
239 +        }
240 +
241 +        for(jet_it_2 = bTags2.begin(); jet_it_2 != bTags2.end(); jet_it_2++) {
242 +           if( (fabs(jet_it_2->first->eta() - myJet.eta()) < .005) && (deltaPhi(jet_it_2->first->phi(),myJet.phi()) < .005)) break;
243 +        }
244 +                
245 +        TCJet* jetCon = new ((*jet_ak5PF)[pfCount]) TCJet;
246        
247 <      if(myJet.et() > 5){
248 <        
249 <        new ((*jetP4_ak5PF)[PFcount]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
250 <        new ((*jetVtx3_ak5PF)[PFcount]) TVector3(myJet.vx(), myJet.vy(), myJet.vz());
251 <        
252 <        ++PFcount;
253 <      }
254 <      
255 <    }
256 <    
257 <    
258 <    PFcount_corr = 0;
259 <    
260 <    Handle<reco::PFJetCollection> PFJets_corr;
261 <    iEvent.getByLabel(PFJetHandle_corr, PFJets_corr);
262 <    
263 <    for(PFJetCollection::const_iterator jet_iter = PFJets_corr->begin(); jet_iter!= PFJets_corr->end(); ++jet_iter){
264 <      
265 <      reco::PFJet myJet = reco::PFJet(*jet_iter);
266 <      
267 <      if(myJet.et() > 5){
268 <        
269 <        new ((*jetP4_ak5PF_corr)[PFcount_corr]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
270 <        new ((*jetVtx3_ak5PF_corr)[PFcount_corr]) TVector3(myJet.vx(), myJet.vy(), myJet.vz());
271 <        
272 <        ++PFcount_corr;
273 <      }
274 <    }
247 >        jetCon->SetP4(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
248 >        jetCon->SetVtx(-999.0, -999.0, -999.0);
249 >
250 >        jetCon->SetChHadFrac(myJet.chargedHadronEnergyFraction());
251 >        jetCon->SetNeuHadFrac(myJet.neutralHadronEnergyFraction());
252 >        jetCon->SetChEmFrac(myJet.chargedEmEnergyFraction());
253 >        jetCon->SetNeuEmFrac(myJet.neutralEmEnergyFraction());
254 >
255 >        jetCon->SetNumConstit(myJet.chargedMultiplicity() + myJet.neutralMultiplicity());
256 >        jetCon->SetNumChPart(myJet.chargedMultiplicity());
257 >
258 >        jetCon->SetNumChPart(myJet.chargedMultiplicity());
259 >
260 >        if(jet_it_2 != bTags2.end()) jetCon->SetBDiscrTrkCountHiPure(jet_it_2->second);
261 >        if(jet_it_1 != bTags1.end()) jetCon->SetBDiscrTrkCountHiEff(jet_it_1->second);
262 >
263 >        double scale2 = correctorL2->correction(myJet);
264 >        myJet.scaleEnergy(scale2);
265 >        double scale3 = correctorL3->correction(myJet);
266 >        myJet.scaleEnergy(scale3);
267 >
268 >        //more corrections?
269 >
270 >        jetCon->SetJetCorr(2, scale2);
271 >        jetCon->SetJetCorr(3, scale3);
272 >
273 >        /////////////////////////
274 >        //get associated tracks//
275 >        /////////////////////////
276 >
277 >        const reco::TrackRefVector &tracks = myJet.getTrackRefs();
278 >
279 >        vector<TVector3> vtxPositionCollection;
280 >        vector<double>  associatedTrackSumPt;
281 >        vector<unsigned int> jetTrackAddresses;
282 >        double sumTrackX, sumTrackY, sumTrackZ, sumTrackIP, sumTrackPt;
283 >        //double meanTrackX, meanTrackY, meanTrackZ, meanTrackIP;
284 >        int   nJetTracks, nVertexTracks, nAssociatedTracks, vertexIndex;
285 >        int   vCount = 0;
286 >
287 >        nJetTracks = nVertexTracks = nAssociatedTracks = 0;
288 >        sumTrackX = sumTrackY = sumTrackZ  = sumTrackIP  = sumTrackPt = 0;
289 >        //meanTrackZ = meanTrackIP = -999;
290 >
291 >        if(myJet.pt() > 10 && fabs(myJet.eta()) < 2.4){
292 >
293 >          for(TrackRefVector::const_iterator iTrack = tracks.begin(); iTrack != tracks.end(); ++iTrack){
294 >
295 >            const reco::Track &myJetTrack = **iTrack;
296 >
297 >            sumTrackPt += myJetTrack.pt();
298 >            sumTrackX  += myJetTrack.vx();
299 >            sumTrackY  += myJetTrack.vy();            
300 >            sumTrackZ  += myJetTrack.vz();
301 >            sumTrackIP += myJetTrack.dxy(vertexBeamSpot.position());
302 >            jetTrackAddresses.push_back((unsigned int)&myJetTrack);
303 >            ++nJetTracks;
304 >          }
305 >
306 >          if(nJetTracks > 0){
307 >
308 >            jetCon->SetVtx(sumTrackX/nJetTracks, sumTrackY/nJetTracks, sumTrackZ/nJetTracks);          
309 >
310 >            h1_meanJetTrackZ->Fill(sumTrackZ/nJetTracks);
311 >            h1_trackDxy->Fill(sumTrackIP/nJetTracks);
312 >
313 >          }
314 >          /*meanTrackX = sumTrackX/nJetTracks;
315 >          meanTrackY = sumTrackY/nJetTracks;      
316 >          meanTrackZ = sumTrackZ/nJetTracks;
317 >          */
318 >
319 >          if(jetTrackAddresses.size() > 0){
320 >
321 >            for(VertexCollection::const_iterator vtx_iter = primaryVtcs->begin(); vtx_iter!= primaryVtcs->end(); ++vtx_iter){
322 >              
323 >              reco::Vertex myVtx = reco::Vertex(*vtx_iter);
324 >              if(!myVtx.isValid() || myVtx.isFake()) continue;
325 >
326 >              TVector3 *iVtxPosition = new TVector3(myVtx.x(), myVtx.y(), myVtx.z());
327 >              vtxPositionCollection.push_back(*iVtxPosition);
328 >              associatedTrackSumPt.push_back(0);            
329 >            
330 >              for(Vertex::trackRef_iterator iTrackRef = myVtx.tracks_begin(); iTrackRef != myVtx.tracks_end(); ++iTrackRef){
331 >                const edm::RefToBase<reco::Track> &myTrackRef = *iTrackRef;
332 >
333 >                if(myTrackRef.isAvailable()){
334 >                  const reco::Track &myVertexTrack = *myTrackRef.get();        
335 >
336 >                  for(vector<unsigned int>::const_iterator iTrackAddress = jetTrackAddresses.begin(); iTrackAddress != jetTrackAddresses.end(); ++iTrackAddress){
337 >
338 >                    if(*iTrackAddress == (unsigned int)&myVertexTrack){
339 >
340 >                      associatedTrackSumPt.at(vCount) += myVertexTrack.pt()/sumTrackPt;
341 >                      ++nAssociatedTracks;
342 >
343 >                    }
344 >                  }
345 >                }
346 >              }
347 >              ++vCount;  
348 >            }
349 >                    
350 >            double maxSumPtFraction = 0;
351 >            vCount = vertexIndex = 0;
352 >
353 >            for(vector<double>::const_iterator iTrackSumPt = associatedTrackSumPt.begin(); iTrackSumPt != associatedTrackSumPt.end(); ++iTrackSumPt) {
354 >
355 >              if(*iTrackSumPt > maxSumPtFraction){
356 >
357 >                maxSumPtFraction = *iTrackSumPt;  
358 >                vertexIndex      = vCount + 1;
359 >
360 >              }
361 >              ++vCount;
362 >            }
363 >
364 >            if(vertexIndex > 0){
365 >
366 >              h1_jetVertexZ->Fill(vtxPositionCollection[vertexIndex-1].z());
367 >
368 >            }
369 >
370 >            jetCon->SetVtxSumPt(maxSumPtFraction);
371 >            jetCon->SetVtxIndex(vertexIndex);
372 >
373 >            h1_fracAssociatedTracks->Fill((double)nAssociatedTracks/(double)nJetTracks);
374 >            h1_associatedSumPt->Fill(maxSumPtFraction);
375 >            h1_associatedVertexIndex->Fill(vertexIndex);
376 >            h2_nAssTracksVsJetPt->Fill(myJet.pt(), nAssociatedTracks);
377 >          }
378 >        }        
379 >        ++pfCount;
380 >      }      
381 >    }  
382    }
383    
384 <  if(doCaloJets_){
217 <    
218 <    Calocount = 0;
384 >  if(!isRealData){
385      
386 <    Handle<reco::CaloJetCollection> CaloJets;
387 <    iEvent.getByLabel(CaloJetHandle_, CaloJets);
388 <    
389 <    for(CaloJetCollection::const_iterator jet_iter = CaloJets->begin(); jet_iter!= CaloJets->end(); ++jet_iter){
390 <      
391 <      reco::CaloJet myJet = reco::CaloJet(*jet_iter);
392 <      
393 <      if(myJet.et() > 5){
394 <        
395 <        new ((*jetP4_ak5Calo)[Calocount]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
396 <        new ((*jetVtx3_ak5Calo)[Calocount]) TVector3(myJet.vx(), myJet.vy(), myJet.vz());
397 <        
398 <        ++Calocount;
399 <        
400 <      }
386 >    Handle<GenEventInfoProduct> GenEventInfoHandle;
387 >    iEvent.getByLabel("generator", GenEventInfoHandle);
388 >
389 >    Handle<GenRunInfoProduct> GenRunInfoHandle;
390 >    iEvent.getByLabel("generator", GenRunInfoHandle);
391 >
392 >    Handle<reco::GenJetCollection> GenJets;
393 >    iEvent.getByLabel(GenJetHandle_, GenJets);
394 >
395 >    ptHat = qScale = -1; crossSection = 0;
396 >
397 >    if(GenEventInfoHandle.isValid())
398 >    {
399 >      qScale       = GenEventInfoHandle->qScale();
400 >      ptHat        = (GenEventInfoHandle->hasBinningValues() ? GenEventInfoHandle->binningValues()[0] : 0.0);
401      }
402 <    
403 <    Handle<reco::CaloJetCollection> CaloJets_corr;
404 <    iEvent.getByLabel(CaloJetHandle_corr, CaloJets_corr);
405 <    
406 <    Calocount_corr = 0;
407 <    
242 <    for(CaloJetCollection::const_iterator jet_iter = CaloJets_corr->begin(); jet_iter!= CaloJets_corr->end(); ++jet_iter){
402 >    if(GenRunInfoHandle.isValid())
403 >    {
404 >      crossSection = GenRunInfoHandle->crossSection();
405 >    }
406 >        
407 >    for(GenJetCollection::const_iterator jet_iter = GenJets->begin(); jet_iter!= GenJets->end(); ++jet_iter){
408        
409 <      reco::CaloJet myJet = reco::CaloJet(*jet_iter);
409 >      reco::GenJet myJet = reco::GenJet(*jet_iter);
410        
411 <      if(myJet.et() > 5){
411 >      if(myJet.pt() > 5){
412          
413 <        new ((*jetP4_ak5Calo_corr)[Calocount_corr]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
414 <        new ((*jetVtx3_ak5Calo_corr)[Calocount_corr]) TVector3(myJet.vx(), myJet.vy(), myJet.vz());
413 >        TCGenJet* jetCon = new ((*jet_ak5Gen)[genCount]) TCGenJet;
414 >
415 >        jetCon->SetP4(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
416 >
417 >        jetCon->SetHadEnergy(myJet.hadEnergy());
418 >        jetCon->SetEmEnergy(myJet.emEnergy());
419 >        jetCon->SetInvEnergy(myJet.invisibleEnergy());
420 >        jetCon->SetAuxEnergy(myJet.auxiliaryEnergy());
421 >        jetCon->SetNumConstit(myJet.getGenConstituents().size());
422 >
423 >        const reco::GenParticle *myGenParticle = myJet.getGenConstituent(0);
424 >        const reco::Candidate   *myMother      = myGenParticle->mother();
425 >        int   nGrandMas = 1;
426 >
427 >        for(int iter = 0; nGrandMas != 0; ++iter)
428 >        {
429 >          myMother  = myMother->mother();
430 >          nGrandMas = myMother->mother()->numberOfMothers();                
431 >        }
432 >        //cout<<myJet.print()<<endl;
433 >        //cout<<"Jet flavor: "<< myMother->pdgId()<<endl;
434 >        jetCon->SetJetFlavor(myMother->pdgId());        
435 >        ++genCount;
436          
251        ++Calocount_corr;
437        }
438 <    }
438 >    }    
439    }
440    
441 <  if(doGenJets_){
442 <    
443 <    Handle<reco::GenJetCollection> GenJets;
444 <    iEvent.getByLabel(GenJetHandle_, GenJets);
441 >  ///////////////////////////  
442 >  //get trigger information//
443 >  ///////////////////////////
444 >
445 >  if(triggerHLT_){
446 >
447 >    edm::Handle<TriggerResults> hltR;
448 >    triggerResultsTag_ = InputTag(hlTriggerResults_,"",hltName_);
449 >    iEvent.getByLabel(triggerResultsTag_,hltR);
450 >    
451 >    const TriggerNames & triggerNames = iEvent.triggerNames(*hltR);
452 >    hlNames=triggerNames.triggerNames();
453 >    
454 >    string MPI_TriggerNames[] = {"HLT_PixelTracks_Multiplicity70",
455 >                                 "HLT_MinBiasBSC_NoBPTX",
456 >                                 "HLT_PixelTracks_Multiplicity40",
457 >                                 "HLT_L1Tech_HCAL_HF",
458 >                                 "HLT_IsoTrackHB_8E29",
459 >                                 "HLT_IsoTrackHE_8E29",
460 >                                 "HLT_L1Tech_RPC_TTU_RBst1_collisions",
461 >                                 "HLT_L1_BscMinBiasOR_BptxPlusORMinus",
462 >                                 "HLT_L1Tech_BSC_halo_forPhysicsBackground",
463 >                                 "HLT_L1Tech_BSC_HighMultiplicity",
464 >                                 "HLT_MinBiasPixel_DoubleIsoTrack5",
465 >                                 "HLT_MinBiasPixel_DoubleTrack",
466 >                                 "HLT_MinBiasPixel_SingleTrack",
467 >                                 "HLT_ZeroBiasPixel_SingleTrack",
468 >                                 "HLT_MinBiasBSC",
469 >                                 "HLT_StoppedHSCP_8E29",
470 >                                 "HLT_Jet15U_HcalNoiseFiltered",
471 >                                 "HLT_QuadJet15U",
472 >                                 "HLT_DiJetAve30U_8E29",
473 >                                 "HLT_DiJetAve15U_8E29",
474 >                                 "HLT_FwdJet20U",
475 >                                 "HLT_Jet50U",
476 >                                 "HLT_Jet30U",
477 >                                 "HLT_Jet15U",
478 >                                 "HLT_BTagMu_Jet10U",
479 >                                 "HLT_DoubleJet15U_ForwardBackward",
480 >                                 "HLT_BTagIP_Jet50U",
481 >                                 "HLT_DoubleLooseIsoTau15",
482 >                                 "HLT_SingleLooseIsoTau20",
483 >                                 "HLT_HT100U",
484 >                                 "HLT_MET100",
485 >                                 "HLT_MET45"};
486      
487 +    bool triggerPassed = false;
488 +    triggerStatus = 0x0;
489      
490 <    for(GenJetCollection::const_iterator jet_iter = GenJets->begin(); jet_iter!= GenJets->end(); ++jet_iter){
490 >    for (uint i=0; i<hlNames.size(); ++i) {
491        
492 <      reco::GenJet myJet = reco::GenJet(*jet_iter);
492 >      triggerPassed = triggerDecision(hltR, i);
493        
494 <      if(myJet.et() > 5){
494 >      if(triggerPassed){
495          
496 <        new ((*jetP4_ak5Gen)[Gencount]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
269 <        new ((*jetVtx3_ak5Gen)[Gencount]) TVector3(myJet.vx(), myJet.vy(), myJet.vz());
270 <        
271 <        ++Gencount;
272 <        
273 <      }
274 <    }
275 <  }
276 <  
277 <  
278 <  Handle<reco::VertexCollection> primaryVtx;
279 <  iEvent.getByLabel(PrimaryVtxHandle_, primaryVtx);
496 >        for (uint j = 0; j != 32; ++j){
497  
498 <  for(VertexCollection::const_iterator vtx_iter = primaryVtx->begin(); vtx_iter!= primaryVtx->end(); ++vtx_iter){
499 <    
500 <    reco::Vertex myVtx = reco::Vertex(*vtx_iter);
501 <    
502 <    new ((*PrimaryVtx3)[Vtxcount]) TVector3(myVtx.x(), myVtx.y(), myVtx.z());
503 <    
504 <    ++Vtxcount;
505 <    
498 >          if (hlNames[i] == MPI_TriggerNames[j])
499 >          {
500 >            //cout<<"HLTrigger name: "<<hlNames[i]<<" bit: "<<dec<<j+1<<endl;
501 >            triggerStatus |= 0x01 << j;      
502 >          }
503 >        }
504 >      }
505 >    }
506    }
507 <  
291 <  
292 <  if(Calocount > 0 || Calocount_corr >0 || PFcount_corr > 0 || PFcount > 0 || Gencount > 0)  sTree -> Fill();
507 >  //cout<< "total status: "<<hex<<triggerStatus<<endl;
508  
294  jetP4_ak5PF->Clear();
295  jetP4_ak5PF_corr->Clear();
296  jetVtx3_ak5PF->Clear();
297  jetP4_ak5Calo->Clear();
298  jetP4_ak5Calo_corr->Clear();
299  jetVtx3_ak5Calo->Clear();
300  jetP4_ak5Gen->Clear();
301  jetVtx3_ak5Gen->Clear();
302  
303
304
305  //----------  Filling HLT trigger bits!  ------------
306
307  edm::Handle<TriggerResults> hltR;
308  triggerResultsTag_ = InputTag(hlTriggerResults_,"",hltName_);
309  iEvent.getByLabel(triggerResultsTag_,hltR);
310  const edm::TriggerNames & triggerNames = iEvent.triggerNames(*hltR);
311  hlNames=triggerNames.triggerNames();
312  bool triggerPassed = false;
313  
314  for (uint iT=0; iT<hlNames.size(); ++iT)
315    {
316      triggerPassed = triggerDecision(hltR, iT);
317      cout<<"trigger name: "<<hlNames[iT]<<"  status: "<<triggerPassed<<endl;
318      
319      // ----------->> Fill them Here! <<----------------------
320    }
321  //----------         ------------------   ---------------  
509  
510 +
511 +  if((pfCount > 1 || genCount > 1) && vtxCount > 0) sTree -> Fill();
512  
513 +  jet_ak5PF->Clear();
514 +  primaryVtx->Clear();
515 +  jet_ak5Gen->Clear();
516  
517   }
518  
# Line 329 | Line 521 | void MPIntuple::analyze(const edm::Event
521   void  MPIntuple::beginJob()
522   {
523    
524 <  ntupleFile           = new TFile(rootfilename.c_str(), "RECREATE");
525 <  sTree                = new TTree("dpsTree", "Tree for Jets");
526 <  
527 <  jetP4_ak5PF          = new TClonesArray("TLorentzVector");
528 <  jetVtx3_ak5PF        = new TClonesArray("TVector3");
529 <  jetP4_ak5Calo        = new TClonesArray("TLorentzVector");
530 <  jetVtx3_ak5Calo      = new TClonesArray("TVector3");
531 <  jetP4_ak5PF_corr     = new TClonesArray("TLorentzVector");
532 <  jetVtx3_ak5PF_corr   = new TClonesArray("TVector3");
533 <  jetP4_ak5Calo_corr   = new TClonesArray("TLorentzVector");
534 <  jetVtx3_ak5Calo_corr = new TClonesArray("TVector3");
535 <  jetP4_ak5Gen         = new TClonesArray("TLorentzVector");
536 <  jetVtx3_ak5Gen       = new TClonesArray("TVector3");
537 <  PrimaryVtx3          = new TClonesArray("TVector3");
538 <
539 <  sTree->Branch("jetP4_ak5PF",&jetP4_ak5PF, 6400, 0);
540 <  sTree->Branch("jetP4_ak5PF_corr",&jetP4_ak5PF_corr, 6400, 0);
541 <  sTree->Branch("jetVtx3_ak5PF",&jetVtx3_ak5PF, 6400, 0);
542 <  sTree->Branch("jetVtx3_ak5PF_corr",&jetVtx3_ak5PF, 6400, 0);
543 <  sTree->Branch("jetP4_ak5Calo",&jetP4_ak5Calo, 6400, 0);
352 <  sTree->Branch("jetP4_ak5Calo_corr",&jetP4_ak5Calo_corr, 6400, 0);
353 <  sTree->Branch("jetVtx3_ak5Calo",&jetVtx3_ak5Calo, 6400, 0);
354 <  sTree->Branch("jetVtx3_ak5Calo_corr",&jetVtx3_ak5Calo, 6400, 0);
355 <  sTree->Branch("jetP4_ak5Gen",&jetP4_ak5Gen, 6400, 0);
356 <  sTree->Branch("jetVtx3_ak5Gen",&jetVtx3_ak5Gen, 6400, 0);
357 <  sTree->Branch("PrimaryVtx",&PrimaryVtx3, 6400, 0);
524 >  ntupleFile               = new TFile(rootfilename.c_str(), "RECREATE");
525 >  sTree                    = new TTree("mpiTree", "Tree for Jets");
526 >
527 >  h1_fracAssociatedTracks  = new TH1D("h1_fracAssociatedTracks", "Fraction of associated jet tracks", 20, 0.0, 1.0);
528 >  h1_trackDxy              = new TH1D("h1_trackDxy", "dxy for all associated tracks", 50, -0.4, 0.4);
529 >  h1_meanJetTrackZ         = new TH1D("h1_meanJetTrackZ", "<z> from jet tracks", 50, -25.0, 25.0);
530 >  h1_jetVertexZ            = new TH1D("h1_jetVertexZ", "z for vertex associated to jet", 50, -25.0, 25.0);
531 >  h1_associatedSumPt       = new TH1D("h1_associatedSumPt", "ratio of sum p_{T} between associatedTracks and jetTracks", 20, 0.0, 1.0);
532 >  h1_associatedVertexIndex = new TH1D("h1_associatedVertex", "number of jets associated to primary vertex", 5, -0.5, 4.5);
533 >  h2_nAssTracksVsJetPt     = new TH2F("h2_nAssTracksVsJetPt", "nTracks vs Jet p_{T}", 50, 0, 100, 20, -0.5, 19.5);
534 >  p1_nVtcs                 = new TProfile("p1_nVtcs", "<N> per run", 5200.0, 132300.0, 137500.0, 0.0, 6.0);
535 >
536 >  jet_ak5PF                = new TClonesArray("TCJet");
537 >  jet_ak5Gen               = new TClonesArray("TCGenJet");
538 >  primaryVtx               = new TClonesArray("TCPrimaryVtx");
539 >
540 >
541 >  sTree->Branch("jet_ak5PF",&jet_ak5PF, 6400, 0);
542 >  sTree->Branch("jet_ak5Gen",&jet_ak5Gen, 6400, 0);
543 >  sTree->Branch("primaryVtx",&primaryVtx, 6400, 0);
544  
545    sTree->Branch("eventNumber",&eventNumber, "eventNumber/I");
546    sTree->Branch("runNumber",&runNumber, "runNumber/I");
547    sTree->Branch("lumiSection",&lumiSection, "lumiSection/I");
548 <
548 >  sTree->Branch("triggerStatus",&triggerStatus, "triggerStatus/i");
549 >  sTree->Branch("isRealData",&isRealData, "isRealData/i");
550 >  sTree->Branch("bunchCross",&bunchCross, "bunchCross/i");
551 >  sTree->Branch("ptHat",&ptHat, "ptHat/d");
552 >  sTree->Branch("qScale", &qScale, "qScale/d");
553 >  sTree->Branch("crossSection", &crossSection, "crossSection/d");
554   }
555  
556   // ------------ method called once each job just after ending the event loop  ------------
557   void MPIntuple::endJob()
558   {
559 +
560 +  ntupleFile->cd();
561 +
562 +  h1_fracAssociatedTracks->Write();
563 +  h1_meanJetTrackZ->Write();
564 +  h1_trackDxy->Write();
565 +  h1_jetVertexZ->Write();
566 +  h1_associatedSumPt->Write();
567 +  h1_associatedVertexIndex->Write();
568 +  h2_nAssTracksVsJetPt->Write();
569 +  p1_nVtcs->Write();
570 +
571    ntupleFile->Write();
572    ntupleFile->Close();
573  
# Line 380 | Line 583 | bool MPIntuple::triggerDecision(edm::Han
583        triggerPassed = true;
584      }
585      return triggerPassed;
586 <  }
586 > }
587 >
588 > double MPIntuple::sumPtSquared(const Vertex & v)
589 > {
590 >  double sum = 0.;
591 >  double pT;
592 >  for (Vertex::trackRef_iterator it = v.tracks_begin(); it != v.tracks_end(); it++) {
593 >    pT = (**it).pt();
594 >    double epT=(**it).ptError(); pT=pT>epT ? pT-epT : 0;
595  
596 +    sum += pT*pT;
597 +  }
598 +  return sum;
599 + }
600  
601   //define this as a plug-in
602   DEFINE_FWK_MODULE(MPIntuple);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines