ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/RecoilTools.cc
Revision: 1.2
Committed: Wed Apr 4 09:51:31 2012 UTC (13 years, 1 month ago) by pharris
Content type: text/plain
Branch: MAIN
Changes since 1.1: +145 -0 lines
Log Message:
Added method for corrected Jets

File Contents

# User Rev Content
1 pharris 1.1 #include "MitPhysics/Utils/interface/RecoilTools.h"
2     #include "MitPhysics/Utils/interface/JetTools.h"
3     #include <TFile.h>
4    
5     ClassImp(mithep::RecoilTools)
6    
7     using namespace mithep;
8    
9     RecoilTools::RecoilTools(TString iJetMVAFile) {
10     fJetIDMVA = new JetIDMVA();
11     fJetIDMVA->Initialize( "JetIDMVA",iJetMVAFile,JetIDMVA::kBaseline);
12     }
13     //--------------------------------------------------------------------------------------------------
14     RecoilTools::~RecoilTools() {
15     delete fJetIDMVA;
16     }
17     //--------------------------------------------------------------------------------------------------
18     bool RecoilTools::filter(const PFJet *iJet,Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2) {
19     double pDEta1 = iJet->Eta() - iEta1;
20     double pDPhi1 = fabs(iJet->Phi() - iPhi1); if(pDPhi1 > 2.*TMath::Pi()-pDPhi1) pDPhi1 = 2.*TMath::Pi()-pDPhi1;
21     double pDR1 = sqrt(pDEta1*pDEta1 + pDPhi1*pDPhi1);
22     if(pDR1 < 0.5) return false;
23     double pDEta2 = iJet->Eta() - iEta2;
24     double pDPhi2 = fabs(iJet->Phi() - iPhi2); if(pDPhi2 > 2.*TMath::Pi()-pDPhi2) pDPhi2 = 2.*TMath::Pi()-pDPhi2;
25     double pDR2 = sqrt(pDEta2*pDEta2 + pDPhi2*pDPhi2);
26     if(pDR2 < 0.5) return false;
27     return true;
28     }
29    
30     //--------------------------------------------------------------------------------------------------
31     Met RecoilTools::pfRecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
32     const PFMet *iMet) {
33     Met lPFMet(iMet->Px(),iMet->Py());
34     lPFMet.SetSumEt(iMet->SumEt());
35     lPFMet.SetMex (lPFMet.Mex()+iVisPt*cos(iVisPhi));
36     lPFMet.SetMey (lPFMet.Mey()+iVisPt*sin(iVisPhi));
37     lPFMet.SetSumEt(lPFMet.SumEt()-iVisSumEt);
38     return lPFMet;
39     }
40     //--------------------------------------------------------------------------------------------------
41     Met RecoilTools::trackMet(const PFCandidateCol *iCands,const Vertex *iVertex,Double_t iDZCut) {
42     double trkMetx = 0;
43     double trkMety = 0;
44     double trkSumEt = 0;
45     for(UInt_t i=0; i<iCands->GetEntries(); ++i) {
46     const PFCandidate *pfcand = iCands->At(i);
47     if( (pfcand->HasTrackerTrk() && (fabs(pfcand->TrackerTrk()->DzCorrected(*iVertex))< iDZCut)) ||
48     (pfcand->HasGsfTrk() && (fabs(pfcand->GsfTrk()->DzCorrected(*iVertex)) < iDZCut)) ) {
49     trkMetx -= pfcand->Px();
50     trkMety -= pfcand->Py();
51     trkSumEt += pfcand->Pt();
52     }
53     }
54     Met lMet(trkMetx,trkMety);
55     lMet.SetSumEt(trkSumEt);
56     return lMet;
57     }
58    
59     //--------------------------------------------------------------------------------------------------
60     //Compute the recoil => here this requires the vector sum of the visible components
61     //VisPt => Vector sum pT of the visible non-recoiling components
62     //VisPhi => Vector sum Phi of the visible non-recoiling components
63     //visSumEt => Vector sum Et =f the visible non-recoiling components
64     Met RecoilTools::trackRecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
65     const PFCandidateCol *iCands,const Vertex *iVertex,double iDZCut) {
66     Met lTrkMet = trackMet(iCands,iVertex,iDZCut);
67     lTrkMet.SetMex (lTrkMet.Mex()+iVisPt*cos(iVisPhi));
68     lTrkMet.SetMey (lTrkMet.Mey()+iVisPt*sin(iVisPhi));
69     lTrkMet.SetSumEt(lTrkMet.SumEt()-iVisSumEt);
70     return lTrkMet;
71     }
72     //--------------------------------------------------------------------------------------------------
73     void RecoilTools::addNeut(const PFJet *iJet,FourVectorM &iVec,Double_t &iSumEt,
74     FactorizedJetCorrector *iJetCorrector,const PileupEnergyDensityCol *iPUEnergyDensity,
75     int iSign) {
76     FourVectorM lVec(0,0,0,0);
77     double lPt = fJetIDMVA->correctedPt(iJet,iJetCorrector,iPUEnergyDensity);
78     lPt *= (iJet->NeutralEmEnergy()/iJet->E() + iJet->NeutralHadronEnergy()/iJet->E());
79     lVec.SetPt(lPt); lVec.SetEta(iJet->Eta()); lVec.SetPhi(iJet->Phi()); lVec.SetM(iJet->Mass());
80     if(iSign > 0) iVec -= lVec;
81     if(iSign < 0) iVec += lVec;
82     iSumEt += lPt;
83     }
84 pharris 1.2
85     //--------------------------------------------------------------------------------------------------
86     //Corrected Jets
87     void RecoilTools::addNeut(const PFJet *iJet,FourVectorM &iVec,Double_t &iSumEt,int iSign) {
88     FourVectorM lVec(0,0,0,0);
89     double lPt = iJet->Pt();
90     lPt *= (iJet->NeutralEmEnergy()/iJet->E() + iJet->NeutralHadronEnergy()/iJet->E());
91     lVec.SetPt(lPt); lVec.SetEta(iJet->Eta()); lVec.SetPhi(iJet->Phi()); lVec.SetM(iJet->Mass());
92     if(iSign > 0) iVec -= lVec;
93     if(iSign < 0) iVec += lVec;
94     iSumEt += lPt;
95     }
96    
97 pharris 1.1 //--------------------------------------------------------------------------------------------------
98     Met RecoilTools::NoPUMet( const PFJetCol *iJets,FactorizedJetCorrector *iJetCorrector,
99     const PileupEnergyDensityCol *iPileupEnergyDensity,
100     const PFCandidateCol *iCands,const Vertex *iVertex,
101     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,Double_t iDZCut) {
102    
103     FourVectorM lVec (0,0,0,0); double lSumEt = 0;
104     for(UInt_t i0 = 0; i0 < iCands->GetEntries(); i0++) {
105     const PFCandidate *pPF = iCands->At(i0);
106     const Track* pTrack = pPF->TrackerTrk();
107     if(pPF->GsfTrk()) pTrack = pPF->GsfTrk();
108     if(pTrack == 0 ) continue;
109     if( !((pPF->HasTrackerTrk() && (fabs(pPF->TrackerTrk()->DzCorrected(*iVertex))<iDZCut)) ||
110     (pPF->HasGsfTrk() && (fabs(pPF->GsfTrk()->DzCorrected(*iVertex)) <iDZCut)))) continue;
111     lVec -= pPF->Mom();
112     lSumEt += pPF->Pt();
113     }
114     for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
115     const PFJet *pJet = iJets->At(i0);
116     if(!fJetIDMVA->pass(pJet,iVertex,iJetCorrector,iPileupEnergyDensity)) continue;
117     if(!filter(pJet,iPhi1,iEta1,iPhi2,iEta2)) continue; //Quick cleaning==> if not done already
118     addNeut(pJet,lVec,lSumEt,iJetCorrector,iPileupEnergyDensity);
119     }
120     Met lMet(lVec.Px(),lVec.Py());
121     lMet.SetSumEt(lSumEt);
122     return lMet;
123     }
124     //--------------------------------------------------------------------------------------------------
125 pharris 1.2 //Corrected Jets
126     Met RecoilTools::NoPUMet( const PFJetCol *iJets,const PFCandidateCol *iCands,const Vertex *iVertex,
127     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,Double_t iDZCut) {
128    
129     FourVectorM lVec (0,0,0,0); double lSumEt = 0;
130     for(UInt_t i0 = 0; i0 < iCands->GetEntries(); i0++) {
131     const PFCandidate *pPF = iCands->At(i0);
132     const Track* pTrack = pPF->TrackerTrk();
133     if(pPF->GsfTrk()) pTrack = pPF->GsfTrk();
134     if(pTrack == 0 ) continue;
135     if( !((pPF->HasTrackerTrk() && (fabs(pPF->TrackerTrk()->DzCorrected(*iVertex))<iDZCut)) ||
136     (pPF->HasGsfTrk() && (fabs(pPF->GsfTrk()->DzCorrected(*iVertex)) <iDZCut)))) continue;
137     lVec -= pPF->Mom();
138     lSumEt += pPF->Pt();
139     }
140     for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
141     const PFJet *pJet = iJets->At(i0);
142     if(!fJetIDMVA->pass(pJet,iVertex)) continue;
143     if(!filter(pJet,iPhi1,iEta1,iPhi2,iEta2)) continue; //Quick cleaning==> if not done already
144     addNeut(pJet,lVec,lSumEt);
145     }
146     Met lMet(lVec.Px(),lVec.Py());
147     lMet.SetSumEt(lSumEt);
148     return lMet;
149     }
150     //--------------------------------------------------------------------------------------------------
151 pharris 1.1 Met RecoilTools::NoPURecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
152     const PFJetCol *iJets,FactorizedJetCorrector *iJetCorrector,
153     const PileupEnergyDensityCol *iPileupEnergyDensity,
154     const PFCandidateCol *iCands,const Vertex *iVertex,
155     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
156     Double_t iDZCut) {
157    
158     Met lNoPUMet = NoPUMet(iJets,iJetCorrector,iPileupEnergyDensity,iCands,iVertex,iPhi1,iEta1,iPhi2,iEta2,iDZCut);
159     lNoPUMet.SetMex (lNoPUMet.Mex()+iVisPt*cos(iVisPhi));
160     lNoPUMet.SetMey (lNoPUMet.Mey()+iVisPt*sin(iVisPhi));
161     lNoPUMet.SetSumEt(lNoPUMet.SumEt()-iVisSumEt);
162     return lNoPUMet;
163     }
164     //--------------------------------------------------------------------------------------------------
165 pharris 1.2 //Corrected Jets
166     Met RecoilTools::NoPURecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
167     const PFJetCol *iJets,const PFCandidateCol *iCands,const Vertex *iVertex,
168     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
169     Double_t iDZCut) {
170    
171     Met lNoPUMet = NoPUMet(iJets,iCands,iVertex,iPhi1,iEta1,iPhi2,iEta2,iDZCut);
172     lNoPUMet.SetMex (lNoPUMet.Mex()+iVisPt*cos(iVisPhi));
173     lNoPUMet.SetMey (lNoPUMet.Mey()+iVisPt*sin(iVisPhi));
174     lNoPUMet.SetSumEt(lNoPUMet.SumEt()-iVisSumEt);
175     return lNoPUMet;
176     }
177     //--------------------------------------------------------------------------------------------------
178 pharris 1.1 Met RecoilTools::PUCMet( const PFJetCol *iJets,FactorizedJetCorrector *iJetCorrector,
179     const PileupEnergyDensityCol *iPileupEnergyDensity,
180     const PFCandidateCol *iCands,const Vertex *iVertex,
181     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
182     Double_t iDZCut) {
183    
184     FourVectorM lVec (0,0,0,0); double lSumEt = 0;
185     for(UInt_t i0 = 0; i0 < iCands->GetEntries(); i0++) {
186     const PFCandidate *pPF = iCands->At(i0);
187     const Track* pTrack = pPF->TrackerTrk();
188     if(pPF->GsfTrk()) pTrack = pPF->GsfTrk();
189     if(pTrack == 0 &&
190     (pPF->PFType() == PFCandidate::eGamma ||
191     pPF->PFType() == PFCandidate::eEGammaHF ||
192     pPF->PFType() == PFCandidate::eNeutralHadron ||
193     pPF->PFType() == PFCandidate::eHadronHF ))
194     {lVec -= pPF->Mom(); lSumEt += pPF->Pt();}
195     if(pTrack == 0 ) continue;
196     if( !((pPF->HasTrackerTrk() && (fabs(pPF->TrackerTrk()->DzCorrected(*iVertex))<iDZCut)) ||
197     (pPF->HasGsfTrk() && (fabs(pPF->GsfTrk()->DzCorrected(*iVertex)) <iDZCut)))) continue;
198     lVec -= pPF->Mom();
199     lSumEt += pPF->Pt();
200     }
201     for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
202     const PFJet *pJet = iJets->At(i0);
203     if(fJetIDMVA->correctedPt(pJet,iJetCorrector,iPileupEnergyDensity) < fJetIDMVA->fJetPtMin
204     && pJet->TrackCountingHighEffBJetTagsDisc() == -100) continue; //This line is a bug in the Met training//
205     if(!JetTools::passPFLooseId(pJet)) continue;
206     if(fJetIDMVA->pass(pJet,iVertex,iJetCorrector,iPileupEnergyDensity)) continue;
207     if(!filter(pJet,iPhi1,iEta1,iPhi2,iEta2)) continue; //Quick cleaning==> if not done already
208     addNeut(pJet,lVec,lSumEt,iJetCorrector,iPileupEnergyDensity,-1);
209     }
210     Met lMet(lVec.Px(),lVec.Py());
211     lMet.SetSumEt(lSumEt);
212     return lMet;
213     }
214 pharris 1.2 //--------------------------------------------------------------------------------------------------
215     //Corrected jets
216     Met RecoilTools::PUCMet( const PFJetCol *iJets,const PFCandidateCol *iCands,const Vertex *iVertex,
217     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
218     Double_t iDZCut) {
219    
220     FourVectorM lVec (0,0,0,0); double lSumEt = 0;
221     for(UInt_t i0 = 0; i0 < iCands->GetEntries(); i0++) {
222     const PFCandidate *pPF = iCands->At(i0);
223     const Track* pTrack = pPF->TrackerTrk();
224     if(pPF->GsfTrk()) pTrack = pPF->GsfTrk();
225     if(pTrack == 0 &&
226     (pPF->PFType() == PFCandidate::eGamma ||
227     pPF->PFType() == PFCandidate::eEGammaHF ||
228     pPF->PFType() == PFCandidate::eNeutralHadron ||
229     pPF->PFType() == PFCandidate::eHadronHF ))
230     {lVec -= pPF->Mom(); lSumEt += pPF->Pt();}
231     if(pTrack == 0 ) continue;
232     if( !((pPF->HasTrackerTrk() && (fabs(pPF->TrackerTrk()->DzCorrected(*iVertex))<iDZCut)) ||
233     (pPF->HasGsfTrk() && (fabs(pPF->GsfTrk()->DzCorrected(*iVertex)) <iDZCut)))) continue;
234     lVec -= pPF->Mom();
235     lSumEt += pPF->Pt();
236     }
237     for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
238     const PFJet *pJet = iJets->At(i0);
239     if(pJet->Pt() < fJetIDMVA->fJetPtMin
240     && pJet->TrackCountingHighEffBJetTagsDisc() == -100) continue; //This line is a bug in the Met training//
241     if(!JetTools::passPFLooseId(pJet)) continue;
242     if(fJetIDMVA->pass(pJet,iVertex)) continue;
243     if(!filter(pJet,iPhi1,iEta1,iPhi2,iEta2)) continue; //Quick cleaning==> if not done already
244     addNeut(pJet,lVec,lSumEt,-1);
245     }
246     Met lMet(lVec.Px(),lVec.Py());
247     lMet.SetSumEt(lSumEt);
248     return lMet;
249     }
250 pharris 1.1 //----> This MET is a bug need to fix it
251     //--------------------------------------------------------------------------------------------------
252     Met RecoilTools::PUCRecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
253     const PFJetCol *iJets,FactorizedJetCorrector *iJetCorrector,
254     const PileupEnergyDensityCol *iPileupEnergyDensity,
255     const PFCandidateCol *iCands,const Vertex *iVertex,
256     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
257     Double_t iDZCut) {
258     Met lPUCMet = PUCMet(iJets,iJetCorrector,iPileupEnergyDensity,iCands,iVertex,iPhi1,iEta1,iPhi2,iEta2,iDZCut);
259     lPUCMet.SetMex (lPUCMet.Mex()+iVisPt*cos(iVisPhi));
260     lPUCMet.SetMey (lPUCMet.Mey()+iVisPt*sin(iVisPhi));
261     lPUCMet.SetSumEt(lPUCMet.SumEt()-iVisSumEt);
262     return lPUCMet;
263     }
264     //--------------------------------------------------------------------------------------------------
265 pharris 1.2 //Corrected Jets
266     Met RecoilTools::PUCRecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
267     const PFJetCol *iJets,
268     const PFCandidateCol *iCands,const Vertex *iVertex,
269     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
270     Double_t iDZCut) {
271     Met lPUCMet = PUCMet(iJets,iCands,iVertex,iPhi1,iEta1,iPhi2,iEta2,iDZCut);
272     lPUCMet.SetMex (lPUCMet.Mex()+iVisPt*cos(iVisPhi));
273     lPUCMet.SetMey (lPUCMet.Mey()+iVisPt*sin(iVisPhi));
274     lPUCMet.SetSumEt(lPUCMet.SumEt()-iVisSumEt);
275     return lPUCMet;
276     }
277     //--------------------------------------------------------------------------------------------------
278 pharris 1.1 Met RecoilTools::PUMet( const PFJetCol *iJets,FactorizedJetCorrector *iJetCorrector,
279     const PileupEnergyDensityCol *iPileupEnergyDensity,
280     const PFCandidateCol *iCands,const Vertex *iVertex,
281     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
282     Double_t iDZCut) {
283    
284     FourVectorM lVec (0,0,0,0); double lSumEt = 0;
285     for(UInt_t i0 = 0; i0 < iCands->GetEntries(); i0++) {
286     const PFCandidate *pPF = iCands->At(i0);
287     const Track* pTrack = pPF->TrackerTrk();
288     if(pPF->GsfTrk()) pTrack = pPF->GsfTrk();
289     if(pTrack == 0 ) continue;
290     if( ((pPF->HasTrackerTrk() && (fabs(pPF->TrackerTrk()->DzCorrected(*iVertex))<iDZCut)) ||
291     (pPF->HasGsfTrk() && (fabs(pPF->GsfTrk()->DzCorrected(*iVertex)) <iDZCut)))) continue;
292     lVec -= pPF->Mom();
293     lSumEt += pPF->Pt();
294     }
295     for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
296     const PFJet *pJet = iJets->At(i0);
297     if(fJetIDMVA->correctedPt(pJet,iJetCorrector,iPileupEnergyDensity) < fJetIDMVA->fJetPtMin
298     && pJet->TrackCountingHighEffBJetTagsDisc() == -100) continue; //This line is a bug in the Met training//
299     if(!JetTools::passPFLooseId(pJet)) continue;
300     if(!filter(pJet,iPhi1,iEta1,iPhi2,iEta2)) continue; //Quick cleaning
301     if(fJetIDMVA->pass(pJet,iVertex,iJetCorrector,iPileupEnergyDensity)) continue;
302     addNeut(pJet,lVec,lSumEt,iJetCorrector,iPileupEnergyDensity);
303     }
304     Met lMet(lVec.Px(),lVec.Py());
305     lMet.SetSumEt(lSumEt);
306     return lMet;
307     }
308     //--------------------------------------------------------------------------------------------------
309 pharris 1.2 //Corrected Jets
310     Met RecoilTools::PUMet( const PFJetCol *iJets,
311     const PFCandidateCol *iCands,const Vertex *iVertex,
312     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
313     Double_t iDZCut) {
314    
315     FourVectorM lVec (0,0,0,0); double lSumEt = 0;
316     for(UInt_t i0 = 0; i0 < iCands->GetEntries(); i0++) {
317     const PFCandidate *pPF = iCands->At(i0);
318     const Track* pTrack = pPF->TrackerTrk();
319     if(pPF->GsfTrk()) pTrack = pPF->GsfTrk();
320     if(pTrack == 0 ) continue;
321     if( ((pPF->HasTrackerTrk() && (fabs(pPF->TrackerTrk()->DzCorrected(*iVertex))<iDZCut)) ||
322     (pPF->HasGsfTrk() && (fabs(pPF->GsfTrk()->DzCorrected(*iVertex)) <iDZCut)))) continue;
323     lVec -= pPF->Mom();
324     lSumEt += pPF->Pt();
325     }
326     for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
327     const PFJet *pJet = iJets->At(i0);
328     if(pJet->Pt() < fJetIDMVA->fJetPtMin
329     && pJet->TrackCountingHighEffBJetTagsDisc() == -100) continue; //This line is a bug in the Met training//
330     if(!JetTools::passPFLooseId(pJet)) continue;
331     if(!filter(pJet,iPhi1,iEta1,iPhi2,iEta2)) continue; //Quick cleaning
332     if(fJetIDMVA->pass(pJet,iVertex)) continue;
333     addNeut(pJet,lVec,lSumEt);
334     }
335     Met lMet(lVec.Px(),lVec.Py());
336     lMet.SetSumEt(lSumEt);
337     return lMet;
338     }
339     //--------------------------------------------------------------------------------------------------
340 pharris 1.1 Met RecoilTools::PURecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
341     const PFJetCol *iJets,FactorizedJetCorrector *iJetCorrector,
342     const PileupEnergyDensityCol *iPileupEnergyDensity,
343     const PFCandidateCol *iCands,const Vertex *iVertex,
344     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
345     Double_t iDZCut) {
346     Met lPUMet = PUMet(iJets,iJetCorrector,iPileupEnergyDensity,iCands,iVertex,iPhi1,iEta1,iPhi2,iEta2,iDZCut);
347     lPUMet.SetMex (lPUMet.Mex()+iVisPt*cos(iVisPhi));
348     lPUMet.SetMey (lPUMet.Mey()+iVisPt*sin(iVisPhi));
349     lPUMet.SetSumEt(lPUMet.SumEt()-iVisSumEt);
350     return lPUMet;
351     }
352 pharris 1.2 //--------------------------------------------------------------------------------------------------
353     //Corrected Jets
354     Met RecoilTools::PURecoil(Double_t iVisPt,Double_t iVisPhi,Double_t iVisSumEt,
355     const PFJetCol *iJets,
356     const PFCandidateCol *iCands,const Vertex *iVertex,
357     Double_t iPhi1,Double_t iEta1,Double_t iPhi2,Double_t iEta2,
358     Double_t iDZCut) {
359     Met lPUMet = PUMet(iJets,iCands,iVertex,iPhi1,iEta1,iPhi2,iEta2,iDZCut);
360     lPUMet.SetMex (lPUMet.Mex()+iVisPt*cos(iVisPhi));
361     lPUMet.SetMey (lPUMet.Mey()+iVisPt*sin(iVisPhi));
362     lPUMet.SetSumEt(lPUMet.SumEt()-iVisSumEt);
363     return lPUMet;
364     }