ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/MetTools.cc
Revision: 1.12
Committed: Sat Apr 28 19:10:01 2012 UTC (13 years ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_028a, Mit_028, Mit_027, Mit_027a
Changes since 1.11: +91 -1 lines
Log Message:
adding radial pf muon isolation and chs/nhs met

File Contents

# Content
1 // $Id: MetTools.cc,v 1.11 2011/09/17 13:55:23 ceballos Exp $
2
3 #include "MitPhysics/Utils/interface/MetTools.h"
4 #include <TFile.h>
5
6 ClassImp(mithep::MetTools)
7
8 using namespace mithep;
9
10 //--------------------------------------------------------------------------------------------------
11 MetTools::MetTools(const MuonCol *fMuons, const PFCandidateCol *fPFCandidates, const Vertex *fVertex,
12 float deltaZCut, float ptCut, float etaCut) {
13
14 float trackNumeratorX =0, trackNumeratorY =0;
15 float neutralNumeratorX=0, neutralNumeratorY=0;
16 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
17
18 // muons Pt
19 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
20 trackNumeratorX -= fMuons->At(m)->Px();
21 trackNumeratorY -= fMuons->At(m)->Py();
22 }
23
24 // PF candidates pT
25 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
26
27 // CHS computation
28 if (fPFCandidates->At(i)->HasTrk()){
29 CHSNumeratorX -= fPFCandidates->At(i)->Px();
30 CHSNumeratorY -= fPFCandidates->At(i)->Py();
31 }
32 // NHS computation
33 if (fPFCandidates->At(i)->HasTrk() ||
34 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
35 NHSNumeratorX -= fPFCandidates->At(i)->Px();
36 NHSNumeratorY -= fPFCandidates->At(i)->Py();
37 }
38
39 // charged
40 if (fPFCandidates->At(i)->HasTrackerTrk()){
41
42 bool isMuonTrack = false;
43 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
44 if (fMuons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) {
45 isMuonTrack = true;
46 break;
47 }
48 }
49 if (isMuonTrack) continue;
50
51 if (fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) {
52 trackNumeratorX -= fPFCandidates->At(i)->Px();
53 trackNumeratorY -= fPFCandidates->At(i)->Py();
54 fRecoil += fPFCandidates->At(i)->Mom();
55 fChargedRecoil += fPFCandidates->At(i)->Mom();
56 }
57 }
58
59 // neutral
60 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
61 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
62 neutralNumeratorX -= fPFCandidates->At(i)->Px();
63 neutralNumeratorY -= fPFCandidates->At(i)->Py();
64 fRecoil += fPFCandidates->At(i)->Mom();
65 }
66 }
67 }
68
69 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
70 fCorrectedTrackMet = mithep::Met(trackNumeratorX, trackNumeratorY);
71 fCHSMet = mithep::Met(CHSNumeratorX, CHSNumeratorY);
72 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
73 }
74
75 MetTools::MetTools(const ElectronCol *fElectrons, const PFCandidateCol *fPFCandidates, const Vertex *fVertex,
76 float deltaZCut, float ptCut, float etaCut) {
77
78 float trackNumeratorX =0, trackNumeratorY =0;
79 float neutralNumeratorX=0, neutralNumeratorY=0;
80 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
81
82 // electrons Pt
83 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
84 trackNumeratorX -= fElectrons->At(m)->Px();
85 trackNumeratorY -= fElectrons->At(m)->Py();
86 }
87
88 // PF candidates pT
89 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
90
91 // CHS computation
92 if (fPFCandidates->At(i)->HasTrk()){
93 CHSNumeratorX -= fPFCandidates->At(i)->Px();
94 CHSNumeratorY -= fPFCandidates->At(i)->Py();
95 }
96 // NHS computation
97 if (fPFCandidates->At(i)->HasTrk() ||
98 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
99 NHSNumeratorX -= fPFCandidates->At(i)->Px();
100 NHSNumeratorY -= fPFCandidates->At(i)->Py();
101 }
102
103 // charged
104 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()){
105 bool isElectronTrack = false;
106 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
107 if ( (fElectrons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) or
108 (fElectrons->At(m)->HasGsfTrk() and fElectrons->At(m)->GsfTrk() == fPFCandidates->At(i)->GsfTrk()) ) {
109 isElectronTrack = true;
110 break;
111 }
112 }
113 if (isElectronTrack) continue;
114
115 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
116 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
117 trackNumeratorX -= fPFCandidates->At(i)->Px();
118 trackNumeratorY -= fPFCandidates->At(i)->Py();
119 fRecoil += fPFCandidates->At(i)->Mom();
120 fChargedRecoil += fPFCandidates->At(i)->Mom();
121 }
122 }
123
124 // neutral
125 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
126 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
127 neutralNumeratorX -= fPFCandidates->At(i)->Px();
128 neutralNumeratorY -= fPFCandidates->At(i)->Py();
129 fRecoil += fPFCandidates->At(i)->Mom();
130 }
131 }
132 }
133
134 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
135 fCorrectedTrackMet = mithep::Met(trackNumeratorX, trackNumeratorY);
136 fCHSMet = mithep::Met(CHSNumeratorX, CHSNumeratorY);
137 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
138 }
139
140
141 //--------------------------------------------------------------------------------------------------
142 MetTools::MetTools(const MuonCol *fMuons, const PFCandidateCol *fPFCandidates, const PFJetCol *pfJets, const Vertex *fVertex,
143 float deltaZCut, float ptCut, float etaCut) {
144
145 float trackNumeratorX =0, trackNumeratorY =0;
146 float neutralNumeratorX=0, neutralNumeratorY=0;
147 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
148
149 // muons Pt
150 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
151 trackNumeratorX -= fMuons->At(m)->Px();
152 trackNumeratorY -= fMuons->At(m)->Py();
153 }
154
155 // jets Pt
156 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
157 trackNumeratorX -= pfJets->At(j)->Px();
158 trackNumeratorY -= pfJets->At(j)->Py();
159 }
160
161 // PF candidates pT
162 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
163
164 // CHS computation
165 if (fPFCandidates->At(i)->HasTrk()){
166 CHSNumeratorX -= fPFCandidates->At(i)->Px();
167 CHSNumeratorY -= fPFCandidates->At(i)->Py();
168 }
169 // NHS computation
170 if (fPFCandidates->At(i)->HasTrk() ||
171 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
172 NHSNumeratorX -= fPFCandidates->At(i)->Px();
173 NHSNumeratorY -= fPFCandidates->At(i)->Py();
174 }
175
176 // jets
177 bool inTheJet = false;
178 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
179 for (UInt_t c=0;c<pfJets->At(j)->NPFCands();++c){
180 if (pfJets->At(j)->PFCand(c) == fPFCandidates->At(i)) {
181 inTheJet=true;
182 break;
183 }
184 }
185 if (inTheJet) break;
186 }
187 if (inTheJet) continue;
188
189 // charged
190 if (fPFCandidates->At(i)->HasTrackerTrk()){
191
192 bool isMuonTrack = false;
193 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
194 if (fMuons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) {
195 isMuonTrack = true;
196 break;
197 }
198 }
199 if (isMuonTrack) continue;
200
201 if (fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) {
202 trackNumeratorX -= fPFCandidates->At(i)->Px();
203 trackNumeratorY -= fPFCandidates->At(i)->Py();
204 fRecoil += fPFCandidates->At(i)->Mom();
205 fChargedRecoil += fPFCandidates->At(i)->Mom();
206 }
207 }
208
209 // neutral
210 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
211 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
212 neutralNumeratorX -= fPFCandidates->At(i)->Px();
213 neutralNumeratorY -= fPFCandidates->At(i)->Py();
214 fRecoil += fPFCandidates->At(i)->Mom();
215 }
216 }
217 }
218
219 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
220 fCorrectedTrackMet = mithep::Met(trackNumeratorX, trackNumeratorY);
221 fCHSMet = mithep::Met(CHSNumeratorX, CHSNumeratorY);
222 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
223 }
224
225
226 MetTools::MetTools(const ElectronCol *fElectrons, const PFCandidateCol *fPFCandidates, const PFJetCol *pfJets, const Vertex *fVertex,
227 float deltaZCut, float ptCut, float etaCut) {
228
229 float trackNumeratorX =0, trackNumeratorY =0;
230 float neutralNumeratorX=0, neutralNumeratorY=0;
231 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
232
233 // electrons Pt
234 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
235 trackNumeratorX -= fElectrons->At(m)->Px();
236 trackNumeratorY -= fElectrons->At(m)->Py();
237 }
238
239 // jets Pt
240 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
241 trackNumeratorX -= pfJets->At(j)->Px();
242 trackNumeratorY -= pfJets->At(j)->Py();
243 }
244
245 // PF candidates pT
246 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
247
248 // CHS computation
249 if (fPFCandidates->At(i)->HasTrk()){
250 CHSNumeratorX -= fPFCandidates->At(i)->Px();
251 CHSNumeratorY -= fPFCandidates->At(i)->Py();
252 }
253 // NHS computation
254 if (fPFCandidates->At(i)->HasTrk() ||
255 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
256 NHSNumeratorX -= fPFCandidates->At(i)->Px();
257 NHSNumeratorY -= fPFCandidates->At(i)->Py();
258 }
259
260 // jets
261 bool inTheJet = false;
262 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
263 for (UInt_t c=0;c<pfJets->At(j)->NPFCands();++c){
264 if (pfJets->At(j)->PFCand(c) == fPFCandidates->At(i)) {
265 inTheJet=true;
266 break;
267 }
268 }
269 if (inTheJet) break;
270 }
271 if (inTheJet) continue;
272
273 // charged
274 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()){
275 bool isElectronTrack = false;
276 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
277 if ( (fElectrons->At(m)->HasTrackerTrk() and fElectrons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) or
278 (fElectrons->At(m)->HasGsfTrk() and fElectrons->At(m)->GsfTrk() == fPFCandidates->At(i)->GsfTrk()) ) {
279 isElectronTrack = true;
280 break;
281 }
282 }
283 if (isElectronTrack) continue;
284
285 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
286 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
287 trackNumeratorX -= fPFCandidates->At(i)->Px();
288 trackNumeratorY -= fPFCandidates->At(i)->Py();
289 fRecoil += fPFCandidates->At(i)->Mom();
290 fChargedRecoil += fPFCandidates->At(i)->Mom();
291 }
292 }
293
294 // neutral
295 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
296 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
297 neutralNumeratorX -= fPFCandidates->At(i)->Px();
298 neutralNumeratorY -= fPFCandidates->At(i)->Py();
299 fRecoil += fPFCandidates->At(i)->Mom();
300 }
301 }
302 }
303
304 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
305 fCorrectedTrackMet = mithep::Met(trackNumeratorX, trackNumeratorY);
306 fCHSMet = mithep::Met(CHSNumeratorX, CHSNumeratorY);
307 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
308 }
309
310
311 void MetTools::AddToCorrectedTrackMet( const Particle *p, bool debug ) {
312 float MetX = fCorrectedTrackMet.Mex();
313 float MetY = fCorrectedTrackMet.Mey();
314
315 if (debug) std::cout << "AddToCorrectedTrackMet:\n";
316 if (debug) std::cout << "Before: " << MetX << " " << MetY << std::endl;
317
318 MetX -= p->Px();
319 MetY -= p->Py();
320
321 if (debug) std::cout << "Add : " << p->Px() << " " << p->Py() << std::endl;
322 if (debug) std::cout << "After : " << MetX << " " << MetY << std::endl;
323
324 fCorrectedTrackMet.SetMex(MetX);
325 fCorrectedTrackMet.SetMey(MetY);
326
327 return;
328 }
329
330 void MetTools::AddToCorrectedMet( const Particle *p) {
331 float MetX=fCorrectedMet.Mex();
332 float MetY=fCorrectedMet.Mey();
333
334 MetX -= p->Px();
335 MetY -= p->Py();
336
337 fCorrectedMet.SetMex(MetX);
338 fCorrectedMet.SetMey(MetY);
339
340 return;
341 }
342
343 void MetTools::AddToRecoil( const Particle *p) {
344
345 if (p->Charge() != 0) {
346 fChargedRecoil += p->Mom();
347 }
348 fRecoil += p->Mom();
349
350 return;
351 }
352
353
354
355 void MetTools::RemoveParticleInIsoConeFromTrackMet( const Particle *p, const PFCandidateCol *fPFCandidates, const Vertex *fVertex, float deltaZCut , float deltaR, bool debug ) {
356 float MetX = fCorrectedTrackMet.Mex();
357 float MetY = fCorrectedTrackMet.Mey();
358
359 if (debug) std::cout << "RemoveParticleInIsoConeFromTrackMet:\n";
360 if (debug) std::cout << "Before: " << MetX << " " << MetY << std::endl;
361
362 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
363 //charged
364 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()) {
365 //passes dZ cut
366 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
367 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
368 //inside cone
369 if (MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), p->Mom()) < deltaR ) {
370 MetX += fPFCandidates->At(i)->Px();
371 MetY += fPFCandidates->At(i)->Py();
372 if (debug) std::cout << "Subtract : " << fPFCandidates->At(i)->Px() << " " << fPFCandidates->At(i)->Py() << " : " << std::endl;
373 }
374 }
375 }
376 }
377
378 if (debug) std::cout << "After : " << MetX << " " << MetY << std::endl;
379
380 fCorrectedTrackMet.SetMex(MetX);
381 fCorrectedTrackMet.SetMey(MetY);
382
383 return;
384 }
385
386
387 void MetTools::RemoveParticleInIsoConeFromCorrectedMet( const Particle *p, const PFCandidateCol *fPFCandidates, const Vertex *fVertex, float deltaZCut, float ptCut, float etaCut , float deltaR) {
388 float MetX = fCorrectedMet.Mex();
389 float MetY = fCorrectedMet.Mey();
390
391 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
392
393 //inside cone
394 if (MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), p->Mom()) < deltaR ) {
395
396 //charged
397 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()) {
398 //passes dZ cut
399 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
400 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
401 MetX += p->Px();
402 MetY += p->Py();
403 }
404 }
405
406 //neutrals
407 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
408 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
409 MetX += fPFCandidates->At(i)->Px();
410 MetY += fPFCandidates->At(i)->Py();
411 }
412 }
413 }
414
415 }
416
417 fCorrectedMet.SetMex(MetX);
418 fCorrectedMet.SetMey(MetY);
419
420 return;
421 }
422
423
424 void MetTools::RemoveParticleInIsoConeFromRecoil( const Particle *p, const PFCandidateCol *fPFCandidates, const Vertex *fVertex, float deltaZCut, float ptCut, float etaCut , float deltaR) {
425
426 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
427
428 //inside cone
429 if (MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), p->Mom()) < deltaR ) {
430
431 //charged
432 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()) {
433 //passes dZ cut
434 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
435 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
436 fChargedRecoil -= fPFCandidates->At(i)->Mom();
437 fRecoil -= fPFCandidates->At(i)->Mom();
438 }
439 }
440
441 //neutrals
442 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
443 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
444 fRecoil -= fPFCandidates->At(i)->Mom();
445 }
446 }
447 }
448 }
449
450 return;
451 }
452
453
454 MetTools::MetTools(const MuonCol *fMuons, const ElectronCol *fElectrons, const PFCandidateCol *fPFCandidates,
455 const Vertex *fVertex, float deltaZCut, float ptCut, float etaCut, float intRadius) {
456
457 float trackNumeratorX =0, trackNumeratorY =0;
458 float neutralNumeratorX=0, neutralNumeratorY=0;
459 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
460
461 // muons Pt
462 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
463 trackNumeratorX -= fMuons->At(m)->Px();
464 trackNumeratorY -= fMuons->At(m)->Py();
465 }
466
467 // electrons Pt
468 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
469 trackNumeratorX -= fElectrons->At(m)->Px();
470 trackNumeratorY -= fElectrons->At(m)->Py();
471 }
472
473 // PF candidates pT
474 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
475
476 // CHS computation
477 if (fPFCandidates->At(i)->HasTrk()){
478 CHSNumeratorX -= fPFCandidates->At(i)->Px();
479 CHSNumeratorY -= fPFCandidates->At(i)->Py();
480 }
481 // NHS computation
482 if (fPFCandidates->At(i)->HasTrk() ||
483 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
484 NHSNumeratorX -= fPFCandidates->At(i)->Px();
485 NHSNumeratorY -= fPFCandidates->At(i)->Py();
486 }
487
488 // charged
489 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()){
490 bool isMuonTrack = false;
491 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
492 if (fMuons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) {
493 isMuonTrack = true;
494 break;
495 }
496 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fMuons->At(m)->Mom()) < intRadius) {
497 isMuonTrack = true;
498 break;
499 }
500 }
501 if (isMuonTrack) continue;
502
503 bool isElectronTrack = false;
504 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
505 if ( (fElectrons->At(m)->HasTrackerTrk() and fElectrons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) or
506 (fElectrons->At(m)->HasGsfTrk() and fElectrons->At(m)->GsfTrk() == fPFCandidates->At(i)->GsfTrk()) ) {
507 isElectronTrack = true;
508 break;
509 }
510 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fElectrons->At(m)->Mom()) < intRadius) {
511 isElectronTrack = true;
512 break;
513 }
514 }
515 if (isElectronTrack) continue;
516
517 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
518 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
519 trackNumeratorX -= fPFCandidates->At(i)->Px();
520 trackNumeratorY -= fPFCandidates->At(i)->Py();
521 fRecoil += fPFCandidates->At(i)->Mom();
522 fChargedRecoil += fPFCandidates->At(i)->Mom();
523 }
524 }
525
526 // neutral
527 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
528 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
529 neutralNumeratorX -= fPFCandidates->At(i)->Px();
530 neutralNumeratorY -= fPFCandidates->At(i)->Py();
531 fRecoil += fPFCandidates->At(i)->Mom();
532 }
533 }
534 }
535 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
536 fCorrectedTrackMet = mithep::Met(trackNumeratorX, trackNumeratorY);
537 fCHSMet = mithep::Met(CHSNumeratorX, CHSNumeratorY);
538 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
539 }
540
541
542 MetTools::MetTools(const MuonCol *fMuons, const ElectronCol *fElectrons, const PFCandidateCol *fPFCandidates,
543 const PFJetCol *pfJets,
544 const Vertex *fVertex, float deltaZCut, float ptCut, float etaCut, float intRadius) {
545
546 float trackNumeratorX =0, trackNumeratorY =0;
547 float neutralNumeratorX=0, neutralNumeratorY=0;
548 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
549
550 // muons Pt
551 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
552 trackNumeratorX -= fMuons->At(m)->Px();
553 trackNumeratorY -= fMuons->At(m)->Py();
554 }
555
556 // electrons Pt
557 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
558 trackNumeratorX -= fElectrons->At(m)->Px();
559 trackNumeratorY -= fElectrons->At(m)->Py();
560 }
561
562 // jets Pt
563 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
564 trackNumeratorX -= pfJets->At(j)->Px();
565 trackNumeratorY -= pfJets->At(j)->Py();
566 }
567
568 // PF candidates pT
569 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
570
571 // CHS computation
572 if (fPFCandidates->At(i)->HasTrk()){
573 CHSNumeratorX -= fPFCandidates->At(i)->Px();
574 CHSNumeratorY -= fPFCandidates->At(i)->Py();
575 }
576 // NHS computation
577 if (fPFCandidates->At(i)->HasTrk() ||
578 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
579 NHSNumeratorX -= fPFCandidates->At(i)->Px();
580 NHSNumeratorY -= fPFCandidates->At(i)->Py();
581 }
582
583 // jets
584 bool inTheJet = false;
585 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
586 for (UInt_t c=0;c<pfJets->At(j)->NPFCands();++c){
587 if (pfJets->At(j)->PFCand(c) == fPFCandidates->At(i)) {
588 inTheJet=true;
589 break;
590 }
591 }
592 if (inTheJet) break;
593 }
594 if (inTheJet) continue;
595
596
597 // charged
598 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()){
599 bool isMuonTrack = false;
600 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
601 if (fMuons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) {
602 isMuonTrack = true;
603 break;
604 }
605 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fMuons->At(m)->Mom()) < intRadius) {
606 isMuonTrack = true;
607 break;
608 }
609 }
610 if (isMuonTrack) continue;
611
612 bool isElectronTrack = false;
613 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
614 if ( (fElectrons->At(m)->HasTrackerTrk() and fElectrons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) or
615 (fElectrons->At(m)->HasGsfTrk() and fElectrons->At(m)->GsfTrk() == fPFCandidates->At(i)->GsfTrk()) ) {
616 isElectronTrack = true;
617 break;
618 }
619 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fElectrons->At(m)->Mom()) < intRadius) {
620 isElectronTrack = true;
621 break;
622 }
623 }
624 if (isElectronTrack) continue;
625
626 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
627 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
628 trackNumeratorX -= fPFCandidates->At(i)->Px();
629 trackNumeratorY -= fPFCandidates->At(i)->Py();
630 fRecoil += fPFCandidates->At(i)->Mom();
631 fChargedRecoil += fPFCandidates->At(i)->Mom();
632 }
633 }
634
635 // neutral
636 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
637 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
638 neutralNumeratorX -= fPFCandidates->At(i)->Px();
639 neutralNumeratorY -= fPFCandidates->At(i)->Py();
640 fRecoil += fPFCandidates->At(i)->Mom();
641 }
642 }
643 }
644 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
645 fCorrectedTrackMet = mithep::Met(trackNumeratorX, trackNumeratorY);
646 fCHSMet = mithep::Met(CHSNumeratorX, CHSNumeratorY);
647 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
648 }
649
650
651 Met MetTools::GetMinimumMet(const Met *UncorrectedMet) {
652
653 return (fCorrectedMet.Pt() < UncorrectedMet->Pt()) ? fCorrectedMet : *UncorrectedMet;
654 }
655
656 Met MetTools::GetMinimumTrackMet(const Met *UncorrectedMet) {
657
658 return (fCorrectedTrackMet.Pt() < UncorrectedMet->Pt()) ? fCorrectedTrackMet : *UncorrectedMet;
659 }
660