ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/MetTools.cc
Revision: 1.13
Committed: Sat Jul 7 11:33:59 2012 UTC (12 years, 10 months ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_029c, Mit_029b, Mit_029a, HEAD
Changes since 1.12: +23 -8 lines
Log Message:
new pmet

File Contents

# Content
1 // $Id: MetTools.cc,v 1.12 2012/04/28 19:10:01 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 const GenericParticle *genP) {
457
458 float trackNumeratorX =0, trackNumeratorY =0;
459 float neutralNumeratorX=0, neutralNumeratorY=0;
460 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
461
462 float trackNumeratorGenPX =0, trackNumeratorGenPY =0;
463 // added to the track quantities
464 if (genP) {
465 trackNumeratorGenPX -= genP->Px();
466 trackNumeratorGenPY -= genP->Py();
467 }
468
469 // muons Pt
470 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
471 trackNumeratorX -= fMuons->At(m)->Px();
472 trackNumeratorY -= fMuons->At(m)->Py();
473 }
474
475 // electrons Pt
476 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
477 trackNumeratorX -= fElectrons->At(m)->Px();
478 trackNumeratorY -= fElectrons->At(m)->Py();
479 }
480
481 // PF candidates pT
482 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
483
484 // CHS computation
485 if (fPFCandidates->At(i)->HasTrk()){
486 CHSNumeratorX -= fPFCandidates->At(i)->Px();
487 CHSNumeratorY -= fPFCandidates->At(i)->Py();
488 }
489 // NHS computation
490 if (fPFCandidates->At(i)->HasTrk() ||
491 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
492 NHSNumeratorX -= fPFCandidates->At(i)->Px();
493 NHSNumeratorY -= fPFCandidates->At(i)->Py();
494 }
495
496 // charged
497 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()){
498 bool isMuonTrack = false;
499 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
500 if (fMuons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) {
501 isMuonTrack = true;
502 break;
503 }
504 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fMuons->At(m)->Mom()) < intRadius) {
505 isMuonTrack = true;
506 break;
507 }
508 }
509 if (isMuonTrack) continue;
510
511 bool isElectronTrack = false;
512 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
513 if ( (fElectrons->At(m)->HasTrackerTrk() and fElectrons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) or
514 (fElectrons->At(m)->HasGsfTrk() and fElectrons->At(m)->GsfTrk() == fPFCandidates->At(i)->GsfTrk()) ) {
515 isElectronTrack = true;
516 break;
517 }
518 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fElectrons->At(m)->Mom()) < intRadius) {
519 isElectronTrack = true;
520 break;
521 }
522 }
523 if (isElectronTrack) continue;
524
525 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
526 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
527 trackNumeratorX -= fPFCandidates->At(i)->Px();
528 trackNumeratorY -= fPFCandidates->At(i)->Py();
529 fRecoil += fPFCandidates->At(i)->Mom();
530 fChargedRecoil += fPFCandidates->At(i)->Mom();
531 }
532 }
533
534 // neutral
535 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
536 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
537 neutralNumeratorX -= fPFCandidates->At(i)->Px();
538 neutralNumeratorY -= fPFCandidates->At(i)->Py();
539 fRecoil += fPFCandidates->At(i)->Mom();
540 }
541 }
542 }
543 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
544 fCorrectedTrackMet = mithep::Met(trackNumeratorX+trackNumeratorGenPX, trackNumeratorY+trackNumeratorGenPY);
545 fCHSMet = mithep::Met(CHSNumeratorX+trackNumeratorGenPX, CHSNumeratorY+trackNumeratorGenPY);
546 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
547 }
548
549
550 MetTools::MetTools(const MuonCol *fMuons, const ElectronCol *fElectrons, const PFCandidateCol *fPFCandidates,
551 const PFJetCol *pfJets,
552 const Vertex *fVertex, float deltaZCut, float ptCut, float etaCut, float intRadius,
553 const GenericParticle *genP) {
554
555 float trackNumeratorX =0, trackNumeratorY =0;
556 float neutralNumeratorX=0, neutralNumeratorY=0;
557 float CHSNumeratorX =0, CHSNumeratorY =0, NHSNumeratorX =0, NHSNumeratorY =0;
558
559 float trackNumeratorGenPX =0, trackNumeratorGenPY =0;
560 // added to the track quantities
561 if (genP) {
562 trackNumeratorGenPX -= genP->Px();
563 trackNumeratorGenPY -= genP->Py();
564 }
565
566 // muons Pt
567 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
568 trackNumeratorX -= fMuons->At(m)->Px();
569 trackNumeratorY -= fMuons->At(m)->Py();
570 }
571
572 // electrons Pt
573 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
574 trackNumeratorX -= fElectrons->At(m)->Px();
575 trackNumeratorY -= fElectrons->At(m)->Py();
576 }
577
578 // jets Pt
579 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
580 trackNumeratorX -= pfJets->At(j)->Px();
581 trackNumeratorY -= pfJets->At(j)->Py();
582 }
583
584 // PF candidates pT
585 for (UInt_t i=0; i<fPFCandidates->GetEntries(); ++i) {
586
587 // CHS computation
588 if (fPFCandidates->At(i)->HasTrk()){
589 CHSNumeratorX -= fPFCandidates->At(i)->Px();
590 CHSNumeratorY -= fPFCandidates->At(i)->Py();
591 }
592 // NHS computation
593 if (fPFCandidates->At(i)->HasTrk() ||
594 (fPFCandidates->At(i)->AbsEta() < 3.0 && fPFCandidates->At(i)->Pt() > 4.0)){
595 NHSNumeratorX -= fPFCandidates->At(i)->Px();
596 NHSNumeratorY -= fPFCandidates->At(i)->Py();
597 }
598
599 // jets
600 bool inTheJet = false;
601 for (UInt_t j = 0; j < pfJets->GetEntries(); ++j) {
602 for (UInt_t c=0;c<pfJets->At(j)->NPFCands();++c){
603 if (pfJets->At(j)->PFCand(c) == fPFCandidates->At(i)) {
604 inTheJet=true;
605 break;
606 }
607 }
608 if (inTheJet) break;
609 }
610 if (inTheJet) continue;
611
612 // charged
613 if (fPFCandidates->At(i)->HasTrackerTrk() || fPFCandidates->At(i)->HasGsfTrk()){
614 bool isMuonTrack = false;
615 for (UInt_t m = 0; m < fMuons->GetEntries(); ++m) {
616 if (fMuons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) {
617 isMuonTrack = true;
618 break;
619 }
620 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fMuons->At(m)->Mom()) < intRadius) {
621 isMuonTrack = true;
622 break;
623 }
624 }
625 if (isMuonTrack) continue;
626
627 bool isElectronTrack = false;
628 for (UInt_t m = 0; m < fElectrons->GetEntries(); ++m) {
629 if ( (fElectrons->At(m)->HasTrackerTrk() and fElectrons->At(m)->TrackerTrk() == fPFCandidates->At(i)->TrackerTrk()) or
630 (fElectrons->At(m)->HasGsfTrk() and fElectrons->At(m)->GsfTrk() == fPFCandidates->At(i)->GsfTrk()) ) {
631 isElectronTrack = true;
632 break;
633 }
634 if (intRadius > 0.0 && MathUtils::DeltaR(fPFCandidates->At(i)->Mom(), fElectrons->At(m)->Mom()) < intRadius) {
635 isElectronTrack = true;
636 break;
637 }
638 }
639 if (isElectronTrack) continue;
640
641 if ((fPFCandidates->At(i)->HasTrackerTrk() && fabs(fPFCandidates->At(i)->TrackerTrk()->DzCorrected(*fVertex)) < deltaZCut) ||
642 (fPFCandidates->At(i)->HasGsfTrk() && fabs(fPFCandidates->At(i)->GsfTrk()->DzCorrected(*fVertex) ) < deltaZCut)) {
643 trackNumeratorX -= fPFCandidates->At(i)->Px();
644 trackNumeratorY -= fPFCandidates->At(i)->Py();
645 fRecoil += fPFCandidates->At(i)->Mom();
646 fChargedRecoil += fPFCandidates->At(i)->Mom();
647 }
648 }
649
650 // neutral
651 if (fPFCandidates->At(i)->PFType()== PFCandidate::eNeutralHadron || fPFCandidates->At(i)->PFType()== PFCandidate::eGamma) {
652 if (fPFCandidates->At(i)->Pt() > ptCut and fabs(fPFCandidates->At(i)->Eta()) < etaCut ) {
653 neutralNumeratorX -= fPFCandidates->At(i)->Px();
654 neutralNumeratorY -= fPFCandidates->At(i)->Py();
655 fRecoil += fPFCandidates->At(i)->Mom();
656 }
657 }
658 }
659 fCorrectedMet = mithep::Met(trackNumeratorX+neutralNumeratorX, trackNumeratorY+neutralNumeratorY);
660 fCorrectedTrackMet = mithep::Met(trackNumeratorX+trackNumeratorGenPX, trackNumeratorY+trackNumeratorGenPY);
661 fCHSMet = mithep::Met(CHSNumeratorX+trackNumeratorGenPX, CHSNumeratorY+trackNumeratorGenPY);
662 fNHSMet = mithep::Met(NHSNumeratorX, NHSNumeratorY);
663 }
664
665
666 Met MetTools::GetMinimumMet(const Met *UncorrectedMet) {
667
668 return (fCorrectedMet.Pt() < UncorrectedMet->Pt()) ? fCorrectedMet : *UncorrectedMet;
669 }
670
671 Met MetTools::GetMinimumTrackMet(const Met *UncorrectedMet) {
672
673 return (fCorrectedTrackMet.Pt() < UncorrectedMet->Pt()) ? fCorrectedTrackMet : *UncorrectedMet;
674 }
675