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.6 by naodell, Sun May 23 21:56:11 2010 UTC vs.
Revision 1.16 by naodell, Thu Oct 14 22:44:24 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 < // Jet and vertex functions
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 41 | 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 "RecoVertex/PrimaryVertexProducer/interface/VertexHigherPtSquared.h"
37 +
38 + //GenParticles
39 + //#include "DataFormats/HepMCCandidate/interface/GenParticle.h"
40  
41   // Need to get correctors
42   #include "JetMETCorrections/Objects/interface/JetCorrector.h"
# Line 56 | Line 52
52  
53   //Root  stuff
54   #include "TROOT.h"
55 + #include "TH1.h"
56 + #include "TH2.h"
57 + #include "TProfile.h"
58   #include "TFile.h"
59   #include "TTree.h"
60   #include "TString.h"
# Line 86 | Line 85 | class MPIntuple : public edm::EDAnalyzer
85        virtual void endJob() ;
86  
87    bool triggerDecision(edm::Handle<edm::TriggerResults> &hltR, int iTrigger);
88 +  double sumPtSquared(const Vertex & v);
89  
90        // ----------member data ---------------------------
91  
# Line 93 | Line 93 | class MPIntuple : public edm::EDAnalyzer
93    edm::InputTag GenJetHandle_;
94    edm::InputTag PrimaryVtxHandle_;
95    edm::InputTag triggerResultsTag_;
96
97
96    //  Counting variables   //
97  
98 <  int eventNumber, runNumber, lumiSection;
98 >  int eventNumber, runNumber, lumiSection, bunchCross;
99  
100    TTree* sTree;
101    TFile* ntupleFile;
# Line 108 | Line 106 | class MPIntuple : public edm::EDAnalyzer
106  
107    bool doGenJets_;
108    bool doPFJets_;
109 <  bool isMC;
110 <
109 >  bool triggerHLT_;
110 >  bool isRealData;
111    string rootfilename;
112  
113    //Triggers
# Line 119 | Line 117 | class MPIntuple : public edm::EDAnalyzer
117    vector<string>  hlNames;
118    unsigned int triggerStatus;
119  
120 +  //Histograms
121 +  TH1F * h1_nAssociatedTracks;
122 +  TH1F * h1_trackZ;
123 +  TH1F * h1_trackDxy;
124 +  TH1F * h1_allTrackDeltaZ_PV;
125 +  TH1F * h1_allTrackDeltaZ_LJ;
126 +  TH2F * h2_nAssTracksVsJetPt;
127 +  TProfile * p1_nVtcs;
128 +
129 +
130  
131   };
132  
# Line 129 | Line 137 | MPIntuple::MPIntuple(const edm::Paramete
137    PrimaryVtxHandle_(iConfig.getUntrackedParameter<edm::InputTag>("PrimaryVtxTag")),
138    doGenJets_(iConfig.getUntrackedParameter<bool>("doGenJets")),
139    doPFJets_(iConfig.getUntrackedParameter<bool>("doPFJets")),
140 +  triggerHLT_(iConfig.getUntrackedParameter<bool>("triggerHLT")),
141    rootfilename(iConfig.getUntrackedParameter<string>("rootfilename")),
142    hlTriggerResults_(iConfig.getUntrackedParameter<string>("HLTriggerResults","TriggerResults")),
143    hltName_(iConfig.getUntrackedParameter<string>("hltName","HLT"))
144   {
136  //edm::TriggerNames
137  // triggerNames(iConfig);
138
145   }
146  
141
147   MPIntuple::~MPIntuple()
148   {
149  
# Line 152 | Line 157 | MPIntuple::~MPIntuple()
157   void MPIntuple::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
158   {
159  
160 +
161    eventNumber  = iEvent.id().event();
162    runNumber    = iEvent.id().run();
163    lumiSection  = (unsigned int)iEvent.getLuminosityBlock().luminosityBlock();
164 <  //  isMC = iEvent.???();
164 >  bunchCross   = (unsigned int)iEvent.bunchCrossing();
165 >  isRealData   = iEvent.isRealData();
166 >
167 >  edm::Handle<reco::BeamSpot> beamSpotHandle;
168 >  iEvent.getByLabel("offlineBeamSpot", beamSpotHandle);
169 >  reco::BeamSpot vertexBeamSpot = *beamSpotHandle;
170 >
171 >  int pfCount   = 0;
172 >  int genCount  = 0;
173 >  int vtxCount  = 0;
174 >  float ljVertexZ = -999;
175 >  float primaryVertexZ = -999;
176 >
177 >  //////////////////////////
178 >  //Get vertex information//
179 >  //////////////////////////
180 >
181 >  Handle<reco::VertexCollection> primaryVtcs;
182 >  iEvent.getByLabel(PrimaryVtxHandle_, primaryVtcs);
183    
184 <  int PFcount  = 0;
185 <  int Gencount = 0;
186 <  int Vtxcount = 0;
184 >  for(VertexCollection::const_iterator vtx_iter = primaryVtcs->begin(); vtx_iter!= primaryVtcs->end(); ++vtx_iter){
185 >    
186 >    reco::Vertex myVtx = reco::Vertex(*vtx_iter);
187 >    if(!myVtx.isValid() || myVtx.isFake()) continue;
188 >    TCPrimaryVtx* vtxCon = new ((*primaryVtx)[vtxCount]) TCPrimaryVtx;
189 >      
190 >    vtxCon->SetPosition(myVtx.x(), myVtx.y(), myVtx.z());
191 >    vtxCon->SetNDof(myVtx.ndof());
192 >    vtxCon->SetChi2(myVtx.chi2());
193 >    vtxCon->SetNTrks(myVtx.tracksSize());
194 >    vtxCon->SetSumPt2Trks(sumPtSquared(myVtx));
195 >
196 >    if(vtxCount == 0) primaryVertexZ = myVtx.z();
197 >
198 >    ++vtxCount;
199 >    
200 >  }
201 >
202 >  p1_nVtcs->Fill(runNumber, vtxCount);
203 >
204 >  ///////////////////////
205 >  //get jet information//
206 >  ///////////////////////
207  
208    if(doPFJets_){
209  
210 +    edm::Handle<reco::JetTagCollection> bTagHandle1;
211 +    iEvent.getByLabel("trackCountingHighEffBJetTags", bTagHandle1);
212 +    const reco::JetTagCollection & bTags1 = *(bTagHandle1.product());
213 +    reco::JetTagCollection::const_iterator jet_it_1;
214 +
215 +    edm::Handle<reco::JetTagCollection> bTagHandle2;
216 +    iEvent.getByLabel("trackCountingHighPurBJetTags", bTagHandle2);
217 +    const reco::JetTagCollection & bTags2 = *(bTagHandle2.product());
218 +    reco::JetTagCollection::const_iterator jet_it_2;
219 +
220 +
221      const JetCorrector* correctorL2 = JetCorrector::getJetCorrector ("ak5PFL2Relative",iSetup);
222      const JetCorrector* correctorL3 = JetCorrector::getJetCorrector ("ak5PFL3Absolute",iSetup);
223  
224      Handle<reco::PFJetCollection> PFJets;
225      iEvent.getByLabel(PFJetHandle_, PFJets);
226 <    
172 <    PFcount = 0;
173 <    
226 >        
227      for(PFJetCollection::const_iterator jet_iter = PFJets->begin(); jet_iter!= PFJets->end(); ++jet_iter){
228        
229        reco::PFJet myJet = reco::PFJet(*jet_iter);
177
178      float scale2 = correctorL2->correction(myJet);
179      float scale3 = correctorL3->correction(myJet);
180
230        if(myJet.et() > 5){
231 +
232 +        for(jet_it_1 = bTags1.begin(); jet_it_1 != bTags1.end(); jet_it_1++) {
233 +           if( (fabs(jet_it_1->first->eta() - myJet.eta()) < .005) && (deltaPhi(jet_it_1->first->phi(),myJet.phi()) < .005)) break;
234 +        }
235 +
236 +        for(jet_it_2 = bTags2.begin(); jet_it_2 != bTags2.end(); jet_it_2++) {
237 +           if( (fabs(jet_it_2->first->eta() - myJet.eta()) < .005) && (deltaPhi(jet_it_2->first->phi(),myJet.phi()) < .005)) break;
238 +        }
239                  
240 <        TCJet* jetCon = new ((*jet_ak5PF)[PFcount]) TCJet;
240 >        TCJet* jetCon = new ((*jet_ak5PF)[pfCount]) TCJet;
241        
242          jetCon->SetP4(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
243 <        jetCon->SetVtx(myJet.vx(), myJet.vy(), myJet.vz());
243 >        jetCon->SetVtx(-999.0, -999.0, -999.0);
244  
245          jetCon->SetChHadFrac(myJet.chargedHadronEnergyFraction());
246          jetCon->SetNeuHadFrac(myJet.neutralHadronEnergyFraction());
# Line 195 | Line 252 | void MPIntuple::analyze(const edm::Event
252  
253          jetCon->SetNumChPart(myJet.chargedMultiplicity());
254  
255 +        if(jet_it_2 != bTags2.end()) jetCon->SetBDiscrTrkCountHiPure(jet_it_2->second);
256 +        if(jet_it_1 != bTags1.end()) jetCon->SetBDiscrTrkCountHiEff(jet_it_1->second);
257 +
258 +        float scale2 = correctorL2->correction(myJet);
259 +        myJet.scaleEnergy(scale2);
260 +        float scale3 = correctorL3->correction(myJet);
261 +        myJet.scaleEnergy(scale3);
262 +
263 +        //more corrections?
264 +
265          jetCon->SetJetCorr(2, scale2);
266          jetCon->SetJetCorr(3, scale3);
200                
267  
268 <        ++PFcount;
268 >        /////////////////////////
269 >        //get associated tracks//
270 >        /////////////////////////
271 >
272 >        const reco::TrackRefVector &tracks = myJet.getTrackRefs();
273 >
274 >        float sumTrackZ, sumTrackIP;
275 >        float meanTrackZ, meanTrackIP;
276 >        int   nAssociatedTracks = 0;
277 >
278 >        sumTrackZ  = sumTrackIP  = 0;
279 >        meanTrackZ = meanTrackIP = -999;
280 >
281 >        if(myJet.pt() > 20){
282 >
283 >          for(TrackRefVector::const_iterator iTrack = tracks.begin(); iTrack != tracks.end(); ++iTrack){
284 >
285 >            const reco::Track& myTrack = **iTrack;
286 >
287 >            sumTrackZ += myTrack.vz();
288 >            sumTrackIP += myTrack.dxy(vertexBeamSpot.position());
289 >            ++nAssociatedTracks;
290 >            
291 >          }
292 >          
293 >          meanTrackZ = sumTrackZ/nAssociatedTracks;
294 >          h1_nAssociatedTracks->Fill(nAssociatedTracks);
295 >          h2_nAssTracksVsJetPt->Fill(nAssociatedTracks, myJet.pt());
296 >          
297 >          for(TrackRefVector::const_iterator iTrack = tracks.begin(); iTrack != tracks.end(); ++iTrack){
298 >            
299 >            const reco::Track& myTrack = **iTrack;
300 >            
301 >            h1_trackZ->Fill(meanTrackZ - myTrack.vz());
302 >            h1_trackDxy->Fill(myTrack.dxy(vertexBeamSpot.position()));
303 >            
304 >          }    
305 >          
306 >          if(pfCount == 0){
307 >            
308 >            ljVertexZ = meanTrackZ;
309 >            
310 >          }else{
311 >            
312 >            h1_allTrackDeltaZ_LJ->Fill(ljVertexZ - meanTrackZ);
313 >            
314 >          }
315 >          
316 >          h1_allTrackDeltaZ_PV->Fill(primaryVertexZ - meanTrackZ);
317 >          
318 >        }
319 >        
320 >        jetCon->SetVtx(0, 0, meanTrackZ);      
321 >        
322 >        ++pfCount;
323        }      
324      }  
325    }
326    
327 <  if(doGenJets_){
327 >  if(!isRealData){
328      
329      Handle<reco::GenJetCollection> GenJets;
330      iEvent.getByLabel(GenJetHandle_, GenJets);
331 <    
212 <    
331 >        
332      for(GenJetCollection::const_iterator jet_iter = GenJets->begin(); jet_iter!= GenJets->end(); ++jet_iter){
333        
334        reco::GenJet myJet = reco::GenJet(*jet_iter);
335        
336        if(myJet.pt() > 5){
337          
338 <        new ((*jetP4_ak5Gen)[Gencount]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
338 >        new ((*jetP4_ak5Gen)[genCount]) TLorentzVector(myJet.px(), myJet.py(), myJet.pz(), myJet.energy());
339          
340 <        ++Gencount;
340 >        ++genCount;
341          
342        }
343 <    }
343 >    }    
344    }
345 <
346 <
347 <  Handle<reco::VertexCollection> primaryVtcs;
348 <  iEvent.getByLabel(PrimaryVtxHandle_, primaryVtcs);
349 <
350 <  for(VertexCollection::const_iterator vtx_iter = primaryVtcs->begin(); vtx_iter!= primaryVtcs->end(); ++vtx_iter){
345 >  
346 >  ///////////////////////////  
347 >  //get trigger information//
348 >  ///////////////////////////
349 >
350 >  if(triggerHLT_){
351 >
352 >    edm::Handle<TriggerResults> hltR;
353 >    triggerResultsTag_ = InputTag(hlTriggerResults_,"",hltName_);
354 >    iEvent.getByLabel(triggerResultsTag_,hltR);
355      
356 <    reco::Vertex myVtx = reco::Vertex(*vtx_iter);
356 >    const TriggerNames & triggerNames = iEvent.triggerNames(*hltR);
357 >    hlNames=triggerNames.triggerNames();
358      
359 <    TCPrimaryVtx* vtxCon = new ((*primaryVtx)[Vtxcount]) TCPrimaryVtx;
236 <      
237 <    vtxCon->SetPosition(myVtx.x(), myVtx.y(), myVtx.z());
238 <    vtxCon->SetNDof(myVtx.ndof());
239 <    vtxCon->SetChi2(myVtx.chi2());
240 <            
241 <    ++Vtxcount;
359 >    string MPI_TriggerNames[] = {"HLT_PixelTracks_Multiplicity70", "HLT_MinBiasBSC_NoBPTX", "HLT_PixelTracks_Multiplicity40","HLT_L1Tech_HCAL_HF", "HLT_IsoTrackHB_8E29", "HLT_IsoTrackHE_8E29", "HLT_L1Tech_RPC_TTU_RBst1_collisions", "HLT_L1_BscMinBiasOR_BptxPlusORMinus", "HLT_L1Tech_BSC_halo_forPhysicsBackground", "HLT_L1Tech_BSC_HighMultiplicity", "HLT_MinBiasPixel_DoubleIsoTrack5", "HLT_MinBiasPixel_DoubleTrack", "HLT_MinBiasPixel_SingleTrack", "HLT_ZeroBiasPixel_SingleTrack", "HLT_MinBiasBSC", "HLT_StoppedHSCP_8E29", "HLT_Jet15U_HcalNoiseFiltered", "HLT_QuadJet15U", "HLT_DiJetAve30U_8E29", "HLT_DiJetAve15U_8E29", "HLT_FwdJet20U", "HLT_Jet50U", "HLT_Jet30U", "HLT_Jet15U", "HLT_BTagMu_Jet10U", "HLT_DoubleJet15U_ForwardBackward", "HLT_BTagIP_Jet50U", "HLT_DoubleLooseIsoTau15", "HLT_SingleLooseIsoTau20", "HLT_HT100U", "HLT_MET100", "HLT_MET45"};
360      
361 <  }
362 <
245 <
246 <
247 <  //----------  Filling HLT trigger bits!  ------------
248 <
249 <  edm::Handle<TriggerResults> hltR;
250 <  triggerResultsTag_ = InputTag(hlTriggerResults_,"",hltName_);
251 <  iEvent.getByLabel(triggerResultsTag_,hltR);
252 <
253 <  const TriggerNames & triggerNames = iEvent.triggerNames(*hltR);
254 <  hlNames=triggerNames.triggerNames();
255 <
256 <  string MPI_TriggerNames[32] = {"HLT_PixelTracks_Multiplicity70", "HLT_MinBiasBSC_NoBPTX", "HLT_PixelTracks_Multiplicity40","HLT_L1Tech_HCAL_HF", "HLT_IsoTrackHB_8E29", "HLT_IsoTrackHE_8E29", "HLT_L1Tech_RPC_TTU_RBst1_collisions", "HLT_L1_BscMinBiasOR_BptxPlusORMinus", "HLT_L1Tech_BSC_halo_forPhysicsBackground", "HLT_L1Tech_BSC_HighMultiplicity", "HLT_MinBiasPixel_DoubleIsoTrack5", "HLT_MinBiasPixel_DoubleTrack", "HLT_MinBiasPixel_SingleTrack", "HLT_ZeroBiasPixel_SingleTrack", "HLT_MinBiasBSC", "HLT_StoppedHSCP_8E29", "HLT_Jet15U_HcalNoiseFiltered", "HLT_QuadJet15U", "HLT_DiJetAve30U_8E29", "HLT_DiJetAve15U_8E29", "HLT_FwdJet20U", "HLT_Jet50U", "HLT_Jet30U", "HLT_Jet15U", "HLT_BTagMu_Jet10U", "HLT_DoubleJet15U_ForwardBackward", "HLT_BTagIP_Jet50U", "HLT_DoubleLooseIsoTau15", "HLT_SingleLooseIsoTau20", "HLT_HT100U", "HLT_MET100", "HLT_MET45"};
257 <
258 <  bool triggerPassed = false;
259 <  triggerStatus = 0x0;
260 <  
261 <  for (uint iT=0; iT<hlNames.size(); ++iT) {
262 <
263 <    triggerPassed = triggerDecision(hltR, iT);
361 >    bool triggerPassed = false;
362 >    triggerStatus = 0x0;
363      
364 <    if(triggerPassed){
364 >    for (uint i=0; i<hlNames.size(); ++i) {
365 >      
366 >      triggerPassed = triggerDecision(hltR, i);
367        
368 <      for (int j = 0; j != 32; ++j){
368 >      if(triggerPassed){
369          
370 <        if (hlNames[iT] == MPI_TriggerNames[j])
371 <          {
372 <            cout<<"trigger name: "<<hlNames[iT]<<"  status: "<<triggerPassed<<endl;
373 <            triggerStatus |= 0x01 << j;
374 <          }
370 >        for (uint j = 0; j != 32; ++j){
371 >          
372 >          if (hlNames[i] == MPI_TriggerNames[j])
373 >            {
374 >              //cout<<"trigger name: "<<hlNames[i]<<"list: "<<dec<<j+1<<endl;
375 >              triggerStatus |= 0x01 << j;
376 >              
377 >            }
378 >        }
379        }
380 <    }
381 <  }
382 <  
380 >    }
381 >  }
382 >  //cout<< "total status: "<<hex<<triggerStatus<<endl;
383 >
384 >
385 >
386 >  if((pfCount > 3 || genCount > 3) && vtxCount > 0) sTree -> Fill();
387  
279  if(PFcount > 0 || Gencount > 0 || Vtxcount > 0);  sTree -> Fill();
280  
388    jet_ak5PF->Clear();
389    primaryVtx->Clear();
390    jetP4_ak5Gen->Clear();
# Line 291 | Line 398 | void  MPIntuple::beginJob()
398    
399    ntupleFile           = new TFile(rootfilename.c_str(), "RECREATE");
400    sTree                = new TTree("mpiTree", "Tree for Jets");
401 <  
401 >
402 >  h1_trackZ            = new TH1F("h1_trackZ", "#Delta z for associated tracks", 60, -0.3, 0.3);
403 >  h1_nAssociatedTracks = new TH1F("h1_nAssociatedTracks", "Number of tracks associated to jet", 20, -0.5, 19.5);
404 >  h1_trackDxy          = new TH1F("h1_trackDxy", "dxy for all associated tracks", 50, -0.4, 0.4);
405 >  h1_allTrackDeltaZ_PV = new TH1F("h1_allTrackDeltaZ_PV", "#Delta z between jet and primary vertex", 60, -0.3, 0.3);
406 >  h1_allTrackDeltaZ_LJ = new TH1F("h1_allTrackDeltaZ_LJ", "#Delta z between leading jet and other jet vertices", 60, -0.3, 0.3);
407 >  h2_nAssTracksVsJetPt = new TH2F("h2_nAssTracksVsJetPt", "nTracks vs Jet p_{T}", 20, -0.5, 19.5, 50, 0, 100);
408 >  p1_nVtcs             = new TProfile("p1_nVtcs", "<N> per run", 5200.0, 132300.0, 137500.0, 0.0, 6.0);
409 >
410    jet_ak5PF            = new TClonesArray("TCJet");
411    jetP4_ak5Gen         = new TClonesArray("TLorentzVector");
412    primaryVtx           = new TClonesArray("TCPrimaryVtx");
413  
414 +
415    sTree->Branch("jet_ak5PF",&jet_ak5PF, 6400, 0);
416    sTree->Branch("jetP4_ak5Gen",&jetP4_ak5Gen, 6400, 0);
417    sTree->Branch("primaryVtx",&primaryVtx, 6400, 0);
# Line 304 | Line 420 | void  MPIntuple::beginJob()
420    sTree->Branch("runNumber",&runNumber, "runNumber/I");
421    sTree->Branch("lumiSection",&lumiSection, "lumiSection/I");
422    sTree->Branch("triggerStatus",&triggerStatus, "triggerStatus/i");
423 <  sTree->Branch("isMC",&isMC,"isMC/O");
424 <
423 >  sTree->Branch("isRealData",&isRealData, "isRealData/i");
424 >  sTree->Branch("bunchCross",&bunchCross, "bunchCross/i");
425  
426   }
427  
428   // ------------ method called once each job just after ending the event loop  ------------
429   void MPIntuple::endJob()
430   {
431 +
432 +  h1_trackZ->Write();
433 +  h1_nAssociatedTracks->Write();
434 +  h1_trackDxy->Write();
435 +  h1_allTrackDeltaZ_PV->Write();
436 +  h1_allTrackDeltaZ_LJ->Write();
437 +  h2_nAssTracksVsJetPt->Write();
438 +  p1_nVtcs->Write();
439 +
440    ntupleFile->Write();
441    ntupleFile->Close();
442  
# Line 327 | Line 452 | bool MPIntuple::triggerDecision(edm::Han
452        triggerPassed = true;
453      }
454      return triggerPassed;
455 <  }
455 > }
456 >
457 > double MPIntuple::sumPtSquared(const Vertex & v)
458 > {
459 >  double sum = 0.;
460 >  double pT;
461 >  for (Vertex::trackRef_iterator it = v.tracks_begin(); it != v.tracks_end(); it++) {
462 >    pT = (**it).pt();
463 >    double epT=(**it).ptError(); pT=pT>epT ? pT-epT : 0;
464  
465 +    sum += pT*pT;
466 +  }
467 +  return sum;
468 + }
469  
470   //define this as a plug-in
471   DEFINE_FWK_MODULE(MPIntuple);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines