ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/LeptonSelection/src/IsolationSelection.cc
Revision: 1.20
Committed: Mon May 14 18:01:02 2012 UTC (13 years ago) by khahn
Content type: text/plain
Branch: MAIN
Changes since 1.19: +2 -2 lines
Log Message:
no gamma/neutral thresholds for electrons

File Contents

# Content
1 #include <math.h>
2
3 #include "IsolationSelection.h"
4 #include "IsolationSelectionDefs.h"
5
6 #include "MathUtils.h"
7 #include "MuonTools.h"
8 #include "MuonIDMVA.h"
9 #include "ElectronTools.h"
10 #include "ElectronIDMVA.h"
11
12 using namespace mithep;
13
14 mithep::MuonIDMVA * muIsoMVA;
15 mithep::MuonTools muT;
16 mithep::ElectronIDMVA * eleIsoMVA;
17 mithep::ElectronTools eleT;
18
19 // global hack to sync
20 double gChargedIso;
21 double gGammaIso;
22 double gNeutralIso;
23
24 extern vector<bool> PFnoPUflag;
25
26 //--------------------------------------------------------------------------------------------------
27 Float_t computePFMuonIso(const mithep::Muon *muon,
28 const mithep::Vertex & vtx,
29 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
30 const Double_t dRMax)
31 //--------------------------------------------------------------------------------------------------
32 {
33 const Double_t dRMin = 0;
34 const Double_t neuPtMin = 1.0;
35 const Double_t dzMax = 0.1;
36
37 Double_t zLepton = (muon->BestTrk()) ? muon->BestTrk()->DzCorrected(vtx) : 0.0;
38
39 Float_t iso=0;
40 for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
41 const PFCandidate *pfcand = fPFCandidates->At(ipf);
42
43 if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue; // pT cut on neutral particles
44
45 // exclude THE muon
46 if(pfcand->TrackerTrk() && muon->TrackerTrk() && (pfcand->TrackerTrk()==muon->TrackerTrk())) continue;
47
48 // dz cut
49 Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(vtx) - zLepton) : 0;
50 if(dz >= dzMax) continue;
51
52 // check iso cone
53 Double_t dr = MathUtils::DeltaR(muon->Mom(), pfcand->Mom());
54 if(dr<dRMax && dr>=dRMin)
55 iso += pfcand->Pt();
56 }
57
58 return iso;
59 }
60
61 //--------------------------------------------------------------------------------------------------
62 Float_t computePFEleIso(const mithep::Electron *electron,
63 const mithep::Vertex & fVertex,
64 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
65 const Double_t dRMax)
66 //--------------------------------------------------------------------------------------------------
67 {
68 const Double_t dRMin = 0;
69 const Double_t neuPtMin = 1.0;
70 const Double_t dzMax = 0.1;
71
72 Double_t zLepton = (electron->BestTrk()) ? electron->BestTrk()->DzCorrected(fVertex) : 0.0;
73
74 Float_t iso=0;
75 for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
76 const PFCandidate *pfcand = (PFCandidate*)(fPFCandidates->At(ipf));
77
78 if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue; // pT cut on neutral particles
79
80 // dz cut
81 Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(fVertex) - zLepton) : 0;
82 if(dz >= dzMax) continue;
83
84 // remove THE electron
85 if(pfcand->TrackerTrk() && electron->TrackerTrk() && (pfcand->TrackerTrk()==electron->TrackerTrk())) continue;
86 if(pfcand->GsfTrk() && electron->GsfTrk() && (pfcand->GsfTrk()==electron->GsfTrk())) continue;
87
88 // check iso cone
89 Double_t dr = MathUtils::DeltaR(electron->Mom(), pfcand->Mom());
90 if(dr<dRMax && dr>=dRMin) {
91 // eta-strip veto for photons
92 if((pfcand->PFType() == PFCandidate::eGamma) && fabs(electron->Eta() - pfcand->Eta()) < 0.025) continue;
93
94 // Inner cone (one tower = dR < 0.07) veto for non-photon neutrals
95 if(!pfcand->HasTrk() && (pfcand->PFType() == PFCandidate::eNeutralHadron) &&
96 (MathUtils::DeltaR(electron->Mom(), pfcand->Mom()) < 0.07)) continue;
97
98 iso += pfcand->Pt();
99 }
100 }
101
102 return iso;
103 };
104
105 //--------------------------------------------------------------------------------------------------
106 bool pairwiseIsoSelection( ControlFlags &ctrl,
107 vector<SimpleLepton> &lepvec,
108 float rho )
109 //--------------------------------------------------------------------------------------------------
110 {
111
112 bool passiso=true;
113
114 for( int i=0; i<lepvec.size(); i++ )
115 {
116
117 if( !(lepvec[i].is4l) ) continue;
118
119 float effArea_ecal_i, effArea_hcal_i;
120 if( lepvec[i].isEB ) {
121 if( lepvec[i].type == 11 ) {
122 effArea_ecal_i = 0.101;
123 effArea_hcal_i = 0.021;
124 } else {
125 effArea_ecal_i = 0.074;
126 effArea_hcal_i = 0.022;
127 }
128 } else {
129 if( lepvec[i].type == 11 ) {
130 effArea_ecal_i = 0.046;
131 effArea_hcal_i = 0.040;
132 } else {
133 effArea_ecal_i = 0.045;
134 effArea_hcal_i = 0.030;
135 }
136 }
137
138 float isoEcal_corr_i = lepvec[i].isoEcal - (effArea_ecal_i*rho);
139 float isoHcal_corr_i = lepvec[i].isoHcal - (effArea_hcal_i*rho);
140
141 for( int j=i+1; j<lepvec.size(); j++ )
142 {
143
144 if( !(lepvec[j].is4l) ) continue;
145
146 float effArea_ecal_j, effArea_hcal_j;
147 if( lepvec[j].isEB ) {
148 if( lepvec[j].type == 11 ) {
149 effArea_ecal_j = 0.101;
150 effArea_hcal_j = 0.021;
151 } else {
152 effArea_ecal_j = 0.074;
153 effArea_hcal_j = 0.022;
154 }
155 } else {
156 if( lepvec[j].type == 11 ) {
157 effArea_ecal_j = 0.046;
158 effArea_hcal_j = 0.040;
159 } else {
160 effArea_ecal_j = 0.045;
161 effArea_hcal_j = 0.030;
162 }
163 }
164
165 float isoEcal_corr_j = lepvec[j].isoEcal - (effArea_ecal_j*rho);
166 float isoHcal_corr_j = lepvec[j].isoHcal - (effArea_hcal_j*rho);
167 float RIso_i = (lepvec[i].isoTrk+isoEcal_corr_i+isoHcal_corr_i)/lepvec[i].vec.Pt();
168 float RIso_j = (lepvec[j].isoTrk+isoEcal_corr_j+isoHcal_corr_j)/lepvec[j].vec.Pt();
169 float comboIso = RIso_i + RIso_j;
170
171 if( comboIso > 0.35 ) {
172 if( ctrl.debug ) cout << "combo failing for indices: " << i << "," << j << endl;
173 passiso = false;
174 return passiso;
175 }
176 }
177 }
178
179 return passiso;
180 }
181
182 //--------------------------------------------------------------------------------------------------
183 SelectionStatus muonIsoSelection(ControlFlags &ctrl,
184 const mithep::Muon * mu,
185 const mithep::Vertex & vtx,
186 const mithep::Array<mithep::PFCandidate> * fPFCandidateCol )
187 //--------------------------------------------------------------------------------------------------
188 {
189 float reliso = computePFMuonIso(mu,vtx,fPFCandidateCol,0.3)/mu->Pt();
190 bool isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 );
191 bool failiso = false;
192 if( isEB && mu->Pt() > 20 && reliso > PFISO_MU_LOOSE_EB_HIGHPT ) {
193 failiso = true;
194 }
195 if( isEB && mu->Pt() < 20 && reliso > PFISO_MU_LOOSE_EB_LOWPT ) {
196 failiso = true;
197 }
198 if( !(isEB) && mu->Pt() > 20 && reliso > PFISO_MU_LOOSE_EE_HIGHPT ) {
199 failiso = true;
200 }
201 if( !(isEB) && mu->Pt() < 20 && reliso > PFISO_MU_LOOSE_EE_LOWPT ) {
202 failiso = true;
203 }
204
205 SelectionStatus status;
206 if( !failiso ) status.setStatus(SelectionStatus::LOOSEISO);
207 if( !failiso ) status.setStatus(SelectionStatus::TIGHTISO);
208 return status;
209
210 };
211
212 //--------------------------------------------------------------------------------------------------
213 SelectionStatus electronIsoSelection(ControlFlags &ctrl,
214 const mithep::Electron * ele,
215 const mithep::Vertex &fVertex,
216 const mithep::Array<mithep::PFCandidate> * fPFCandidates)
217 //--------------------------------------------------------------------------------------------------
218 {
219
220 bool failiso=false;
221
222 float reliso = computePFEleIso(ele,fVertex,fPFCandidates,0.4)/ele->Pt();
223
224 if( ele->IsEB() && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EB_HIGHPT ) {
225 failiso = true;
226 }
227 if( ele->IsEB() && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EB_LOWPT ) {
228 failiso = true;
229 }
230 if(ctrl.debug) cout << "before iso check ..." << endl;
231 if( !(ele->IsEB()) && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EE_HIGHPT ) {
232 if(ctrl.debug) cout << "\tit fails ..." << endl;
233 failiso = true;
234 }
235 if( !(ele->IsEB()) && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EE_LOWPT ) {
236 failiso = true;
237 }
238
239 SelectionStatus status;
240 if( !failiso ) {
241 status.orStatus(SelectionStatus::LOOSEISO);
242 status.orStatus(SelectionStatus::TIGHTISO);
243 }
244 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
245 return status;
246
247 }
248
249
250 bool noIso(ControlFlags &, vector<SimpleLepton> &, float rho) {
251
252 return true;
253 }
254
255 //--------------------------------------------------------------------------------------------------
256 SelectionStatus muonIsoMVASelection(ControlFlags &ctrl,
257 const mithep::Muon * mu,
258 const mithep::Vertex & vtx,
259 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
260 const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
261 mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
262 vector<const mithep::Muon*> muonsToVeto,
263 vector<const mithep::Electron*> electronsToVeto)
264 //--------------------------------------------------------------------------------------------------
265 {
266
267 if( ctrl.debug ) {
268 cout << "muonIsoMVASelection :: muons to veto " << endl;
269 for( int i=0; i<muonsToVeto.size(); i++ ) {
270 const mithep::Muon * vmu = muonsToVeto[i];
271 cout << "\tpt: " << vmu->Pt()
272 << "\teta: " << vmu->Eta()
273 << "\tphi: " << vmu->Phi()
274 << endl;
275 }
276 cout << "muonIsoMVASelection :: electrson to veto " << endl;
277 for( int i=0; i<electronsToVeto.size(); i++ ) {
278 const mithep::Electron * vel = electronsToVeto[i];
279 cout << "\tpt: " << vel->Pt()
280 << "\teta: " << vel->Eta()
281 << "\tphi: " << vel->Phi()
282 << endl;
283 }
284 }
285 bool failiso=false;
286
287 //
288 // tmp iso rings
289 //
290 Double_t tmpChargedIso_DR0p0To0p1 = 0;
291 Double_t tmpChargedIso_DR0p1To0p2 = 0;
292 Double_t tmpChargedIso_DR0p2To0p3 = 0;
293 Double_t tmpChargedIso_DR0p3To0p4 = 0;
294 Double_t tmpChargedIso_DR0p4To0p5 = 0;
295 Double_t tmpChargedIso_DR0p5To0p7 = 0;
296
297 Double_t tmpGammaIso_DR0p0To0p1 = 0;
298 Double_t tmpGammaIso_DR0p1To0p2 = 0;
299 Double_t tmpGammaIso_DR0p2To0p3 = 0;
300 Double_t tmpGammaIso_DR0p3To0p4 = 0;
301 Double_t tmpGammaIso_DR0p4To0p5 = 0;
302 Double_t tmpGammaIso_DR0p5To0p7 = 0;
303
304 Double_t tmpNeutralHadronIso_DR0p0To0p1 = 0;
305 Double_t tmpNeutralHadronIso_DR0p1To0p2 = 0;
306 Double_t tmpNeutralHadronIso_DR0p2To0p3 = 0;
307 Double_t tmpNeutralHadronIso_DR0p3To0p4 = 0;
308 Double_t tmpNeutralHadronIso_DR0p4To0p5 = 0;
309 Double_t tmpNeutralHadronIso_DR0p5To0p7 = 0;
310
311
312
313 //
314 // final rings for the MVA
315 //
316 Double_t fChargedIso_DR0p0To0p1;
317 Double_t fChargedIso_DR0p1To0p2;
318 Double_t fChargedIso_DR0p2To0p3;
319 Double_t fChargedIso_DR0p3To0p4;
320 Double_t fChargedIso_DR0p4To0p5;
321 Double_t fChargedIso_DR0p5To0p7;
322
323 Double_t fGammaIso_DR0p0To0p1;
324 Double_t fGammaIso_DR0p1To0p2;
325 Double_t fGammaIso_DR0p2To0p3;
326 Double_t fGammaIso_DR0p3To0p4;
327 Double_t fGammaIso_DR0p4To0p5;
328 Double_t fGammaIso_DR0p5To0p7;
329
330 Double_t fNeutralHadronIso_DR0p0To0p1;
331 Double_t fNeutralHadronIso_DR0p1To0p2;
332 Double_t fNeutralHadronIso_DR0p2To0p3;
333 Double_t fNeutralHadronIso_DR0p3To0p4;
334 Double_t fNeutralHadronIso_DR0p4To0p5;
335 Double_t fNeutralHadronIso_DR0p5To0p7;
336
337
338 //
339 //Loop over PF Candidates
340 //
341 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
342 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
343
344 Double_t deta = (mu->Eta() - pf->Eta());
345 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
346 Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
347 if (dr > 0.5) continue;
348 if (dr < 0.01) continue;
349
350 if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
351
352 //
353 // Lepton Footprint Removal
354 //
355 Bool_t IsLeptonFootprint = kFALSE;
356 if (dr < 1.0) {
357
358 //
359 // Check for electrons
360 //
361 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
362 const mithep::Electron *tmpele = electronsToVeto[q];
363 // 4l electron
364 if( pf->HasTrackerTrk() ) {
365 if( pf->TrackerTrk() == tmpele->TrackerTrk() )
366 IsLeptonFootprint = kTRUE;
367 }
368 if( pf->HasGsfTrk() ) {
369 if( pf->GsfTrk() == tmpele->GsfTrk() )
370 IsLeptonFootprint = kTRUE;
371 }
372 // PF charged
373 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479
374 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
375 IsLeptonFootprint = kTRUE;
376 // PF gamma
377 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
378 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
379 IsLeptonFootprint = kTRUE;
380 } // loop over electrons
381
382 /*
383 //
384 // Check for muons
385 //
386 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
387 const mithep::Muon *tmpmu = muonsToVeto[q];
388 // 4l muon
389 if( pf->HasTrackerTrk() ) {
390 if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
391 IsLeptonFootprint = kTRUE;
392 }
393 // PF charged
394 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
395 IsLeptonFootprint = kTRUE;
396 } // loop over muons
397 */
398
399 if (IsLeptonFootprint)
400 continue;
401
402 //
403 // Charged Iso Rings
404 //
405 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
406
407 if( dr < 0.01 ) continue; // only for muon iso mva?
408 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
409
410 // if( pf->HasTrackerTrk() ) {
411 // if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
412 // if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
413 // << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
414 // << dr << endl;
415 // }
416
417
418 // Footprint Veto
419 if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
420 if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
421 if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
422 if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
423 if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
424 if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
425 }
426
427 //
428 // Gamma Iso Rings
429 //
430 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
431 if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
432 if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
433 if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
434 if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
435 if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
436 if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
437 }
438
439 //
440 // Other Neutral Iso Rings
441 //
442 else {
443 if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
444 if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
445 if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
446 if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
447 if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
448 if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
449 }
450
451 }
452
453 }
454
455 fChargedIso_DR0p0To0p1 = fmin((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
456 fChargedIso_DR0p1To0p2 = fmin((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
457 fChargedIso_DR0p2To0p3 = fmin((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
458 fChargedIso_DR0p3To0p4 = fmin((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
459 fChargedIso_DR0p4To0p5 = fmin((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
460
461
462 double rho = 0;
463 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
464 // rho = fPUEnergyDensity->At(0)->Rho();
465 if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
466 rho = fPUEnergyDensity->At(0)->RhoLowEta();
467
468 // WARNING!!!!
469 // hardcode for sync ...
470 EffectiveAreaVersion = muT.kMuEAData2011;
471 // WARNING!!!!
472
473
474 fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
475 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
476 ,2.5)
477 ,0.0);
478 fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
479 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p1To0p2,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
480 ,2.5)
481 ,0.0);
482 fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
483 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
484 ,2.5)
485 ,0.0);
486 fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
487 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p3To0p4,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
488 ,2.5)
489 ,0.0);
490 fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
491 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p4To0p5,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
492 ,2.5)
493 ,0.0);
494
495
496
497 fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
498 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p0To0p1,
499 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
500 , 2.5)
501 , 0.0);
502 fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
503 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p1To0p2,
504 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
505 , 2.5)
506 , 0.0);
507 fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
508 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p2To0p3,
509 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
510 , 2.5)
511 , 0.0);
512 fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
513 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p3To0p4,
514 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
515 , 2.5)
516 , 0.0);
517 fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
518 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p4To0p5,
519 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
520 , 2.5)
521 , 0.0);
522
523
524 double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
525 mu->Eta(),
526 mu->IsGlobalMuon(),
527 mu->IsTrackerMuon(),
528 fChargedIso_DR0p0To0p1,
529 fChargedIso_DR0p1To0p2,
530 fChargedIso_DR0p2To0p3,
531 fChargedIso_DR0p3To0p4,
532 fChargedIso_DR0p4To0p5,
533 fGammaIso_DR0p0To0p1,
534 fGammaIso_DR0p1To0p2,
535 fGammaIso_DR0p2To0p3,
536 fGammaIso_DR0p3To0p4,
537 fGammaIso_DR0p4To0p5,
538 fNeutralHadronIso_DR0p0To0p1,
539 fNeutralHadronIso_DR0p1To0p2,
540 fNeutralHadronIso_DR0p2To0p3,
541 fNeutralHadronIso_DR0p3To0p4,
542 fNeutralHadronIso_DR0p4To0p5,
543 ctrl.debug);
544
545 SelectionStatus status;
546 bool pass;
547
548 pass = false;
549 if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
550 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN0) pass = true;
551 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
552 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN1) pass = true;
553 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
554 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN2) pass = true;
555 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
556 && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN3) pass = true;
557 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN4) pass = true;
558 else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN5) pass = true;
559 if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
560
561 pass = false;
562 if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
563 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN0) pass = true;
564 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
565 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN1) pass = true;
566 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
567 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN2) pass = true;
568 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
569 && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN3) pass = true;
570 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN4) pass = true;
571 else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN5) pass = true;
572 if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
573
574 // pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
575
576 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
577 return status;
578
579 }
580
581
582 //--------------------------------------------------------------------------------------------------
583 SelectionStatus muonIsoMVASelection(ControlFlags &ctrl,
584 const mithep::Muon * mu,
585 const mithep::Vertex & vtx,
586 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
587 float rho,
588 //const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
589 mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
590 vector<const mithep::Muon*> muonsToVeto,
591 vector<const mithep::Electron*> electronsToVeto)
592 //--------------------------------------------------------------------------------------------------
593 // hacked version
594 {
595
596 if( ctrl.debug ) {
597 cout << "muonIsoMVASelection :: muons to veto " << endl;
598 for( int i=0; i<muonsToVeto.size(); i++ ) {
599 const mithep::Muon * vmu = muonsToVeto[i];
600 cout << "\tpt: " << vmu->Pt()
601 << "\teta: " << vmu->Eta()
602 << "\tphi: " << vmu->Phi()
603 << endl;
604 }
605 cout << "muonIsoMVASelection :: electrson to veto " << endl;
606 for( int i=0; i<electronsToVeto.size(); i++ ) {
607 const mithep::Electron * vel = electronsToVeto[i];
608 cout << "\tpt: " << vel->Pt()
609 << "\teta: " << vel->Eta()
610 << "\tphi: " << vel->Phi()
611 << endl;
612 }
613 }
614 bool failiso=false;
615
616 //
617 // tmp iso rings
618 //
619 Double_t tmpChargedIso_DR0p0To0p1 = 0;
620 Double_t tmpChargedIso_DR0p1To0p2 = 0;
621 Double_t tmpChargedIso_DR0p2To0p3 = 0;
622 Double_t tmpChargedIso_DR0p3To0p4 = 0;
623 Double_t tmpChargedIso_DR0p4To0p5 = 0;
624 Double_t tmpChargedIso_DR0p5To0p7 = 0;
625
626 Double_t tmpGammaIso_DR0p0To0p1 = 0;
627 Double_t tmpGammaIso_DR0p1To0p2 = 0;
628 Double_t tmpGammaIso_DR0p2To0p3 = 0;
629 Double_t tmpGammaIso_DR0p3To0p4 = 0;
630 Double_t tmpGammaIso_DR0p4To0p5 = 0;
631 Double_t tmpGammaIso_DR0p5To0p7 = 0;
632
633 Double_t tmpNeutralHadronIso_DR0p0To0p1 = 0;
634 Double_t tmpNeutralHadronIso_DR0p1To0p2 = 0;
635 Double_t tmpNeutralHadronIso_DR0p2To0p3 = 0;
636 Double_t tmpNeutralHadronIso_DR0p3To0p4 = 0;
637 Double_t tmpNeutralHadronIso_DR0p4To0p5 = 0;
638 Double_t tmpNeutralHadronIso_DR0p5To0p7 = 0;
639
640
641
642 //
643 // final rings for the MVA
644 //
645 Double_t fChargedIso_DR0p0To0p1;
646 Double_t fChargedIso_DR0p1To0p2;
647 Double_t fChargedIso_DR0p2To0p3;
648 Double_t fChargedIso_DR0p3To0p4;
649 Double_t fChargedIso_DR0p4To0p5;
650 Double_t fChargedIso_DR0p5To0p7;
651
652 Double_t fGammaIso_DR0p0To0p1;
653 Double_t fGammaIso_DR0p1To0p2;
654 Double_t fGammaIso_DR0p2To0p3;
655 Double_t fGammaIso_DR0p3To0p4;
656 Double_t fGammaIso_DR0p4To0p5;
657 Double_t fGammaIso_DR0p5To0p7;
658
659 Double_t fNeutralHadronIso_DR0p0To0p1;
660 Double_t fNeutralHadronIso_DR0p1To0p2;
661 Double_t fNeutralHadronIso_DR0p2To0p3;
662 Double_t fNeutralHadronIso_DR0p3To0p4;
663 Double_t fNeutralHadronIso_DR0p4To0p5;
664 Double_t fNeutralHadronIso_DR0p5To0p7;
665
666
667 //
668 //Loop over PF Candidates
669 //
670 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
671
672 if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
673
674 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
675
676 Double_t deta = (mu->Eta() - pf->Eta());
677 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
678 Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
679 if (dr > 1.0) continue;
680
681 if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
682
683 //
684 // Lepton Footprint Removal
685 //
686 Bool_t IsLeptonFootprint = kFALSE;
687 if (dr < 1.0) {
688
689 //
690 // Check for electrons
691 //
692 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
693 const mithep::Electron *tmpele = electronsToVeto[q];
694 // 4l electron
695 if( pf->HasTrackerTrk() ) {
696 if( pf->TrackerTrk() == tmpele->TrackerTrk() )
697 IsLeptonFootprint = kTRUE;
698 }
699 if( pf->HasGsfTrk() ) {
700 if( pf->GsfTrk() == tmpele->GsfTrk() )
701 IsLeptonFootprint = kTRUE;
702 }
703 // PF charged
704 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479
705 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
706 IsLeptonFootprint = kTRUE;
707 // PF gamma
708 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
709 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
710 IsLeptonFootprint = kTRUE;
711 } // loop over electrons
712
713 /* KH - commented for sync
714 //
715 // Check for muons
716 //
717 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
718 const mithep::Muon *tmpmu = muonsToVeto[q];
719 // 4l muon
720 if( pf->HasTrackerTrk() ) {
721 if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
722 IsLeptonFootprint = kTRUE;
723 }
724 // PF charged
725 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
726 IsLeptonFootprint = kTRUE;
727 } // loop over muons
728 */
729
730 if (IsLeptonFootprint)
731 continue;
732
733 //
734 // Charged Iso Rings
735 //
736 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
737
738 if( dr < 0.01 ) continue; // only for muon iso mva?
739 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
740
741 // if( pf->HasTrackerTrk() ) {
742 // if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
743 // if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
744 // << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
745 // << dr << endl;
746 // }
747 // if( pf->HasGsfTrk() ) {
748 // if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
749 // if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
750 // << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
751 // << dr << endl;
752 // }
753
754 // Footprint Veto
755 if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
756 if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
757 if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
758 if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
759 if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
760 if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
761 }
762
763 //
764 // Gamma Iso Rings
765 //
766 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
767 if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
768 if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
769 if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
770 if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
771 if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
772 if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
773 }
774
775 //
776 // Other Neutral Iso Rings
777 //
778 else {
779 if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
780 if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
781 if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
782 if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
783 if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
784 if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
785 }
786
787 }
788
789 }
790
791 fChargedIso_DR0p0To0p1 = fmin((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
792 fChargedIso_DR0p1To0p2 = fmin((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
793 fChargedIso_DR0p2To0p3 = fmin((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
794 fChargedIso_DR0p3To0p4 = fmin((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
795 fChargedIso_DR0p4To0p5 = fmin((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
796
797
798 // double rho = 0;
799 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
800 // rho = fPUEnergyDensity->At(0)->Rho();
801 // if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
802 // rho = fPUEnergyDensity->At(0)->RhoLowEta();
803
804 // WARNING!!!!
805 // hardcode for sync ...
806 EffectiveAreaVersion = muT.kMuEAData2011;
807 // WARNING!!!!
808
809
810 fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
811 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
812 ,2.5)
813 ,0.0);
814 fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
815 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p1To0p2,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
816 ,2.5)
817 ,0.0);
818 fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
819 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
820 ,2.5)
821 ,0.0);
822 fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
823 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p3To0p4,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
824 ,2.5)
825 ,0.0);
826 fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
827 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p4To0p5,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
828 ,2.5)
829 ,0.0);
830
831
832
833 fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
834 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p0To0p1,
835 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
836 , 2.5)
837 , 0.0);
838 fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
839 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p1To0p2,
840 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
841 , 2.5)
842 , 0.0);
843 fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
844 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p2To0p3,
845 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
846 , 2.5)
847 , 0.0);
848 fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
849 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p3To0p4,
850 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
851 , 2.5)
852 , 0.0);
853 fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
854 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p4To0p5,
855 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
856 , 2.5)
857 , 0.0);
858
859
860 double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
861 mu->Eta(),
862 mu->IsGlobalMuon(),
863 mu->IsTrackerMuon(),
864 fChargedIso_DR0p0To0p1,
865 fChargedIso_DR0p1To0p2,
866 fChargedIso_DR0p2To0p3,
867 fChargedIso_DR0p3To0p4,
868 fChargedIso_DR0p4To0p5,
869 fGammaIso_DR0p0To0p1,
870 fGammaIso_DR0p1To0p2,
871 fGammaIso_DR0p2To0p3,
872 fGammaIso_DR0p3To0p4,
873 fGammaIso_DR0p4To0p5,
874 fNeutralHadronIso_DR0p0To0p1,
875 fNeutralHadronIso_DR0p1To0p2,
876 fNeutralHadronIso_DR0p2To0p3,
877 fNeutralHadronIso_DR0p3To0p4,
878 fNeutralHadronIso_DR0p4To0p5,
879 ctrl.debug);
880
881 SelectionStatus status;
882 bool pass;
883
884 pass = false;
885 if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
886 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN0) pass = true;
887 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
888 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN1) pass = true;
889 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
890 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN2) pass = true;
891 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
892 && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN3) pass = true;
893 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN4) pass = true;
894 else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN5) pass = true;
895 if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
896
897 /*
898 pass = false;
899 if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
900 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN0) pass = true;
901 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
902 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN1) pass = true;
903 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
904 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN2) pass = true;
905 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
906 && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN3) pass = true;
907 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN4) pass = true;
908 else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN5) pass = true;
909 if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
910 */
911
912 // pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
913
914 status.isoMVA = mvaval;
915
916 if(ctrl.debug) {
917 cout << "returning status : " << hex << status.getStatus() << dec << endl;
918 cout << "MVAVAL : " << status.isoMVA << endl;
919 }
920 return status;
921
922 }
923
924
925 //--------------------------------------------------------------------------------------------------
926 void initMuonIsoMVA() {
927 //--------------------------------------------------------------------------------------------------
928 muIsoMVA = new mithep::MuonIDMVA();
929 vector<string> weightFiles;
930 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml");
931 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml");
932 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml");
933 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml");
934 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml");
935 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml");
936 muIsoMVA->Initialize( "MuonIsoMVA",
937 mithep::MuonIDMVA::kIsoRingsV0,
938 kTRUE, weightFiles);
939 }
940
941
942 //--------------------------------------------------------------------------------------------------
943 double muonPFIso04(ControlFlags &ctrl,
944 const mithep::Muon * mu,
945 const mithep::Vertex & vtx,
946 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
947 const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
948 mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
949 vector<const mithep::Muon*> muonsToVeto,
950 vector<const mithep::Electron*> electronsToVeto)
951 //--------------------------------------------------------------------------------------------------
952 {
953
954 if( ctrl.debug ) {
955 cout << "muonIsoMVASelection :: muons to veto " << endl;
956 for( int i=0; i<muonsToVeto.size(); i++ ) {
957 const mithep::Muon * vmu = muonsToVeto[i];
958 cout << "\tpt: " << vmu->Pt()
959 << "\teta: " << vmu->Eta()
960 << "\tphi: " << vmu->Phi()
961 << endl;
962 }
963 cout << "muonIsoMVASelection :: electrson to veto " << endl;
964 for( int i=0; i<electronsToVeto.size(); i++ ) {
965 const mithep::Electron * vel = electronsToVeto[i];
966 cout << "\tpt: " << vel->Pt()
967 << "\teta: " << vel->Eta()
968 << "\tphi: " << vel->Phi()
969 << endl;
970 }
971 }
972
973 //
974 // final iso
975 //
976 Double_t fChargedIso = 0.0;
977 Double_t fGammaIso = 0.0;
978 Double_t fNeutralHadronIso = 0.0;
979
980 //
981 //Loop over PF Candidates
982 //
983 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
984 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
985
986 Double_t deta = (mu->Eta() - pf->Eta());
987 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
988 Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
989 if (dr > 0.4) continue;
990
991 if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
992
993 //
994 // Lepton Footprint Removal
995 //
996 Bool_t IsLeptonFootprint = kFALSE;
997 if (dr < 1.0) {
998
999 //
1000 // Check for electrons
1001 //
1002 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1003 const mithep::Electron *tmpele = electronsToVeto[q];
1004 // 4l electron
1005 if( pf->HasTrackerTrk() ) {
1006 if( pf->TrackerTrk() == tmpele->TrackerTrk() )
1007 IsLeptonFootprint = kTRUE;
1008 }
1009 if( pf->HasGsfTrk() ) {
1010 if( pf->GsfTrk() == tmpele->GsfTrk() )
1011 IsLeptonFootprint = kTRUE;
1012 }
1013 // PF charged
1014 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
1015 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
1016 IsLeptonFootprint = kTRUE;
1017 // PF gamma
1018 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1019 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
1020 IsLeptonFootprint = kTRUE;
1021 } // loop over electrons
1022
1023 // KH, comment to sync
1024 /*
1025 //
1026 // Check for muons
1027 //
1028 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1029 const mithep::Muon *tmpmu = muonsToVeto[q];
1030 // 4l muon
1031 if( pf->HasTrackerTrk() ) {
1032 if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
1033 IsLeptonFootprint = kTRUE;
1034 }
1035 // PF charged
1036 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
1037 IsLeptonFootprint = kTRUE;
1038 } // loop over muons
1039 */
1040
1041 if (IsLeptonFootprint)
1042 continue;
1043
1044 //
1045 // Charged Iso
1046 //
1047 if (pf->Charge() != 0 ) {
1048
1049 //if( dr < 0.01 ) continue; // only for muon iso mva?
1050 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1051
1052 if( pf->HasTrackerTrk() ) {
1053 if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1054 if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1055 << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
1056 << dr << endl;
1057 }
1058 if( pf->HasGsfTrk() ) {
1059 if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1060 if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1061 << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
1062 << dr << endl;
1063 }
1064
1065
1066 fChargedIso += pf->Pt();
1067 }
1068
1069 //
1070 // Gamma Iso
1071 //
1072 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1073 // KH, add to sync
1074 if( pf->Pt() > 0.5 )
1075 fGammaIso += pf->Pt();
1076 }
1077
1078 //
1079 // Other Neutrals
1080 //
1081 else {
1082 // KH, add to sync
1083 if( pf->Pt() > 0.5 )
1084 fNeutralHadronIso += pf->Pt();
1085 }
1086
1087 }
1088
1089 }
1090
1091 double rho = 0;
1092 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1093 // rho = fPUEnergyDensity->At(0)->Rho();
1094 if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
1095 rho = fPUEnergyDensity->At(0)->RhoLowEta();
1096
1097 // WARNING!!!!
1098 // hardcode for sync ...
1099 EffectiveAreaVersion = muT.kMuEAData2011;
1100 // WARNING!!!!
1101
1102
1103 double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
1104 -rho*muT.MuonEffectiveArea(muT.kMuGammaAndNeutralHadronIso04,
1105 mu->Eta(),EffectiveAreaVersion)));
1106
1107 gChargedIso = fChargedIso;
1108 gGammaIso = fGammaIso;
1109 gNeutralIso = fNeutralHadronIso;
1110 return pfIso;
1111 }
1112
1113
1114 //--------------------------------------------------------------------------------------------------
1115 // hacked version
1116 double muonPFIso04(ControlFlags &ctrl,
1117 const mithep::Muon * mu,
1118 const mithep::Vertex & vtx,
1119 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1120 float rho,
1121 mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1122 vector<const mithep::Muon*> muonsToVeto,
1123 vector<const mithep::Electron*> electronsToVeto)
1124 //--------------------------------------------------------------------------------------------------
1125 {
1126
1127 extern double gChargedIso;
1128 extern double gGammaIso;
1129 extern double gNeutralIso;
1130
1131 if( ctrl.debug ) {
1132 cout << "muonIsoMVASelection :: muons to veto " << endl;
1133 for( int i=0; i<muonsToVeto.size(); i++ ) {
1134 const mithep::Muon * vmu = muonsToVeto[i];
1135 cout << "\tpt: " << vmu->Pt()
1136 << "\teta: " << vmu->Eta()
1137 << "\tphi: " << vmu->Phi()
1138 << endl;
1139 }
1140 cout << "muonIsoMVASelection :: electrson to veto " << endl;
1141 for( int i=0; i<electronsToVeto.size(); i++ ) {
1142 const mithep::Electron * vel = electronsToVeto[i];
1143 cout << "\tpt: " << vel->Pt()
1144 << "\teta: " << vel->Eta()
1145 << "\tphi: " << vel->Phi()
1146 << endl;
1147 }
1148 }
1149
1150 //
1151 // final iso
1152 //
1153 Double_t fChargedIso = 0.0;
1154 Double_t fGammaIso = 0.0;
1155 Double_t fNeutralHadronIso = 0.0;
1156
1157 //
1158 //Loop over PF Candidates
1159 //
1160 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1161
1162 if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1163 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1164
1165 Double_t deta = (mu->Eta() - pf->Eta());
1166 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
1167 Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
1168 if (dr > 0.4) continue;
1169
1170 if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
1171
1172 //
1173 // Lepton Footprint Removal
1174 //
1175 Bool_t IsLeptonFootprint = kFALSE;
1176 if (dr < 1.0) {
1177
1178 //
1179 // Check for electrons
1180 //
1181 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1182 const mithep::Electron *tmpele = electronsToVeto[q];
1183 // 4l electron
1184 if( pf->HasTrackerTrk() ) {
1185 if( pf->TrackerTrk() == tmpele->TrackerTrk() )
1186 IsLeptonFootprint = kTRUE;
1187 }
1188 if( pf->HasGsfTrk() ) {
1189 if( pf->GsfTrk() == tmpele->GsfTrk() )
1190 IsLeptonFootprint = kTRUE;
1191 }
1192 // PF charged
1193 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
1194 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
1195 IsLeptonFootprint = kTRUE;
1196 // PF gamma
1197 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1198 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
1199 IsLeptonFootprint = kTRUE;
1200 } // loop over electrons
1201
1202 /* KH - comment for sync
1203 //
1204 // Check for muons
1205 //
1206 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1207 const mithep::Muon *tmpmu = muonsToVeto[q];
1208 // 4l muon
1209 if( pf->HasTrackerTrk() ) {
1210 if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
1211 IsLeptonFootprint = kTRUE;
1212 }
1213 // PF charged
1214 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
1215 IsLeptonFootprint = kTRUE;
1216 } // loop over muons
1217 */
1218
1219 if (IsLeptonFootprint)
1220 continue;
1221
1222 //
1223 // Charged Iso
1224 //
1225 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1226
1227 //if( dr < 0.01 ) continue; // only for muon iso mva?
1228 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1229
1230
1231 // if( pf->HasTrackerTrk() ) {
1232 // if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1233 // if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1234 // << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
1235 // << dr << endl;
1236 // }
1237 // if( pf->HasGsfTrk() ) {
1238 // if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1239 // if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1240 // << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
1241 // << dr << endl;
1242 // }
1243
1244
1245 fChargedIso += pf->Pt();
1246 }
1247
1248 //
1249 // Gamma Iso
1250 //
1251 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1252 // KH, add to sync
1253 if( pf->Pt() > 0.5 )
1254 fGammaIso += pf->Pt();
1255 }
1256
1257 //
1258 // Other Neutrals
1259 //
1260 else {
1261 // KH, add to sync
1262 if( pf->Pt() > 0.5 )
1263 fNeutralHadronIso += pf->Pt();
1264 }
1265
1266 }
1267
1268 }
1269
1270 // double rho = 0;
1271 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1272 // rho = fPUEnergyDensity->At(0)->Rho();
1273
1274 // WARNING!!!!
1275 // hardcode for sync ...
1276 EffectiveAreaVersion = muT.kMuEAData2011;
1277 // WARNING!!!!
1278
1279
1280 double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
1281 -rho*muT.MuonEffectiveArea(muT.kMuGammaAndNeutralHadronIso04,
1282 mu->Eta(),EffectiveAreaVersion)));
1283 gChargedIso = fChargedIso;
1284 gGammaIso = fGammaIso;
1285 gNeutralIso = fNeutralHadronIso;
1286
1287 return pfIso;
1288 }
1289
1290
1291 //--------------------------------------------------------------------------------------------------
1292 SelectionStatus muonReferenceIsoSelection(ControlFlags &ctrl,
1293 const mithep::Muon * mu,
1294 const mithep::Vertex & vtx,
1295 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1296 const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1297 mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1298 vector<const mithep::Muon*> muonsToVeto,
1299 vector<const mithep::Electron*> electronsToVeto)
1300 //--------------------------------------------------------------------------------------------------
1301 {
1302
1303 SelectionStatus status;
1304
1305 double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, fPUEnergyDensity,
1306 EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
1307 // cout << "--------------> setting muon isoPF04 to" << pfIso << endl;
1308 status.isoPF04 = pfIso;
1309 status.chisoPF04 = gChargedIso;
1310 status.gaisoPF04 = gGammaIso;
1311 status.neisoPF04 = gNeutralIso;
1312
1313 bool pass = false;
1314 if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
1315
1316 if( pass ) {
1317 status.orStatus(SelectionStatus::LOOSEISO);
1318 status.orStatus(SelectionStatus::TIGHTISO);
1319 }
1320 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1321 return status;
1322
1323 }
1324
1325
1326 //--------------------------------------------------------------------------------------------------
1327 // hacked version
1328 SelectionStatus muonReferenceIsoSelection(ControlFlags &ctrl,
1329 const mithep::Muon * mu,
1330 const mithep::Vertex & vtx,
1331 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1332 float rho,
1333 mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1334 vector<const mithep::Muon*> muonsToVeto,
1335 vector<const mithep::Electron*> electronsToVeto)
1336 //--------------------------------------------------------------------------------------------------
1337 {
1338
1339 SelectionStatus status;
1340
1341 double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, rho,
1342 EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
1343
1344 status.isoPF04 = pfIso;
1345 status.chisoPF04 = gChargedIso;
1346 status.gaisoPF04 = gGammaIso;
1347 status.neisoPF04 = gNeutralIso;
1348
1349 bool pass = false;
1350 if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
1351
1352 if( pass ) {
1353 status.orStatus(SelectionStatus::LOOSEISO);
1354 status.orStatus(SelectionStatus::TIGHTISO);
1355 }
1356 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1357 return status;
1358
1359 }
1360
1361
1362
1363 //--------------------------------------------------------------------------------------------------
1364 SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
1365 const mithep::Electron * ele,
1366 const mithep::Vertex & vtx,
1367 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1368 const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1369 mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1370 vector<const mithep::Muon*> muonsToVeto,
1371 vector<const mithep::Electron*> electronsToVeto)
1372 //--------------------------------------------------------------------------------------------------
1373 {
1374
1375 if( ctrl.debug ) {
1376 cout << "electronIsoMVASelection :: muons to veto " << endl;
1377 for( int i=0; i<muonsToVeto.size(); i++ ) {
1378 const mithep::Muon * vmu = muonsToVeto[i];
1379 cout << "\tpt: " << vmu->Pt()
1380 << "\teta: " << vmu->Eta()
1381 << "\tphi: " << vmu->Phi()
1382 << endl;
1383 }
1384 cout << "electronIsoMVASelection :: electrson to veto " << endl;
1385 for( int i=0; i<electronsToVeto.size(); i++ ) {
1386 const mithep::Electron * vel = electronsToVeto[i];
1387 cout << "\tpt: " << vel->Pt()
1388 << "\teta: " << vel->Eta()
1389 << "\tphi: " << vel->Phi()
1390 << "\ttrk: " << vel->TrackerTrk()
1391 << endl;
1392 }
1393 }
1394
1395 bool failiso=false;
1396
1397 //
1398 // tmp iso rings
1399 //
1400 Double_t tmpChargedIso_DR0p0To0p1 = 0;
1401 Double_t tmpChargedIso_DR0p1To0p2 = 0;
1402 Double_t tmpChargedIso_DR0p2To0p3 = 0;
1403 Double_t tmpChargedIso_DR0p3To0p4 = 0;
1404 Double_t tmpChargedIso_DR0p4To0p5 = 0;
1405 Double_t tmpChargedIso_DR0p5To0p7 = 0;
1406
1407 Double_t tmpGammaIso_DR0p0To0p1 = 0;
1408 Double_t tmpGammaIso_DR0p1To0p2 = 0;
1409 Double_t tmpGammaIso_DR0p2To0p3 = 0;
1410 Double_t tmpGammaIso_DR0p3To0p4 = 0;
1411 Double_t tmpGammaIso_DR0p4To0p5 = 0;
1412 Double_t tmpGammaIso_DR0p5To0p7 = 0;
1413
1414 Double_t tmpNeutralHadronIso_DR0p0To0p1 = 0;
1415 Double_t tmpNeutralHadronIso_DR0p1To0p2 = 0;
1416 Double_t tmpNeutralHadronIso_DR0p2To0p3 = 0;
1417 Double_t tmpNeutralHadronIso_DR0p3To0p4 = 0;
1418 Double_t tmpNeutralHadronIso_DR0p4To0p5 = 0;
1419 Double_t tmpNeutralHadronIso_DR0p5To0p7 = 0;
1420
1421
1422
1423 //
1424 // final rings for the MVA
1425 //
1426 Double_t fChargedIso_DR0p0To0p1;
1427 Double_t fChargedIso_DR0p1To0p2;
1428 Double_t fChargedIso_DR0p2To0p3;
1429 Double_t fChargedIso_DR0p3To0p4;
1430 Double_t fChargedIso_DR0p4To0p5;
1431
1432 Double_t fGammaIso_DR0p0To0p1;
1433 Double_t fGammaIso_DR0p1To0p2;
1434 Double_t fGammaIso_DR0p2To0p3;
1435 Double_t fGammaIso_DR0p3To0p4;
1436 Double_t fGammaIso_DR0p4To0p5;
1437
1438 Double_t fNeutralHadronIso_DR0p0To0p1;
1439 Double_t fNeutralHadronIso_DR0p1To0p2;
1440 Double_t fNeutralHadronIso_DR0p2To0p3;
1441 Double_t fNeutralHadronIso_DR0p3To0p4;
1442 Double_t fNeutralHadronIso_DR0p4To0p5;
1443
1444
1445 //
1446 //Loop over PF Candidates
1447 //
1448 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1449
1450 if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1451
1452 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1453 Double_t deta = (ele->Eta() - pf->Eta());
1454 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
1455 Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
1456 if (dr > 0.5) continue;
1457 if(ctrl.debug) {
1458 cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
1459 if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
1460 cout << endl;
1461 }
1462
1463
1464 if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
1465 (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
1466
1467
1468 //
1469 // Lepton Footprint Removal
1470 //
1471 Bool_t IsLeptonFootprint = kFALSE;
1472 if (dr < 1.0) {
1473
1474 //
1475 // Check for electrons
1476 //
1477 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1478 const mithep::Electron *tmpele = electronsToVeto[q];
1479 // 4l electron
1480 if( pf->HasTrackerTrk() ) {
1481 if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
1482 if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
1483 IsLeptonFootprint = kTRUE;
1484 }
1485 }
1486 if( pf->HasGsfTrk() ) {
1487 if( pf->GsfTrk() == tmpele->GsfTrk() ) {
1488 if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
1489 IsLeptonFootprint = kTRUE;
1490 }
1491 }
1492 // PF charged
1493 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479
1494 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
1495 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
1496 IsLeptonFootprint = kTRUE;
1497 }
1498 // PF gamma
1499 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
1500 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
1501 if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1502 IsLeptonFootprint = kTRUE;
1503 }
1504 } // loop over electrons
1505
1506 /* KH - comment for sync
1507 //
1508 // Check for muons
1509 //
1510 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1511 const mithep::Muon *tmpmu = muonsToVeto[q];
1512 // 4l muon
1513 if( pf->HasTrackerTrk() ) {
1514 if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
1515 if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
1516 IsLeptonFootprint = kTRUE;
1517 }
1518 }
1519 // PF charged
1520 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
1521 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
1522 IsLeptonFootprint = kTRUE;
1523 }
1524 } // loop over muons
1525 */
1526
1527 if (IsLeptonFootprint)
1528 continue;
1529
1530 //
1531 // Charged Iso Rings
1532 //
1533 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1534
1535 // if( pf->HasGsfTrk() ) {
1536 // if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1537 // } else if( pf->HasTrackerTrk() ){
1538 // if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1539 // }
1540
1541 // Veto any PFmuon, or PFEle
1542 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1543
1544 // Footprint Veto
1545 if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
1546
1547 if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
1548 << "\ttype: " << pf->PFType()
1549 << "\ttrk: " << pf->TrackerTrk() << endl;
1550
1551 if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
1552 if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
1553 if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
1554 if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
1555 if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
1556 if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
1557
1558 }
1559
1560 //
1561 // Gamma Iso Rings
1562 //
1563 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1564
1565 if (fabs(ele->SCluster()->Eta()) > 1.479) {
1566 if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
1567 }
1568
1569 if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
1570 << dr << endl;
1571
1572 if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
1573 if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
1574 if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
1575 if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
1576 if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
1577 if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
1578
1579 }
1580
1581 //
1582 // Other Neutral Iso Rings
1583 //
1584 else {
1585 if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
1586 << dr << endl;
1587 if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
1588 if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
1589 if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
1590 if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
1591 if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
1592 if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
1593 }
1594
1595 }
1596
1597 }
1598
1599 fChargedIso_DR0p0To0p1 = fmin((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
1600 fChargedIso_DR0p1To0p2 = fmin((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
1601 fChargedIso_DR0p2To0p3 = fmin((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
1602 fChargedIso_DR0p3To0p4 = fmin((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
1603 fChargedIso_DR0p4To0p5 = fmin((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
1604
1605 double rho = 0;
1606 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1607 // rho = fPUEnergyDensity->At(0)->Rho();
1608 if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
1609 rho = fPUEnergyDensity->At(0)->RhoLowEta();
1610
1611 // WARNING!!!!
1612 // hardcode for sync ...
1613 // EffectiveAreaVersion = eleT.kEleEAData2011;
1614 EffectiveAreaVersion = eleT.kEleEAFall11MC;
1615 // WARNING!!!!
1616
1617 if( ctrl.debug) {
1618 cout << "RHO: " << rho << endl;
1619 cout << "eta: " << ele->SCluster()->Eta() << endl;
1620 cout << "target: " << EffectiveAreaVersion << endl;
1621 cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1622 ele->SCluster()->Eta(),
1623 EffectiveAreaVersion)
1624 << endl;
1625 cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1626 ele->SCluster()->Eta(),
1627 EffectiveAreaVersion)
1628 << endl;
1629 cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1630 ele->SCluster()->Eta(),
1631 EffectiveAreaVersion)
1632 << endl;
1633 cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1634 ele->SCluster()->Eta(),
1635 EffectiveAreaVersion)
1636 << endl;
1637 }
1638
1639 fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
1640 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
1641 ele->SCluster()->Eta(),
1642 EffectiveAreaVersion))/ele->Pt()
1643 ,2.5)
1644 ,0.0);
1645 fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
1646 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
1647 ele->SCluster()->Eta(),
1648 EffectiveAreaVersion))/ele->Pt()
1649 ,2.5)
1650 ,0.0);
1651 fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
1652 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
1653 ele->SCluster()->Eta()
1654 ,EffectiveAreaVersion))/ele->Pt()
1655 ,2.5)
1656 ,0.0);
1657 fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
1658 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
1659 ele->SCluster()->Eta(),
1660 EffectiveAreaVersion))/ele->Pt()
1661 ,2.5)
1662 ,0.0);
1663 fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
1664 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
1665 ele->SCluster()->Eta(),
1666 EffectiveAreaVersion))/ele->Pt()
1667 ,2.5)
1668 ,0.0);
1669
1670
1671 fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
1672 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1673 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1674 , 2.5)
1675 , 0.0);
1676 fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
1677 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1678 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1679 , 2.5)
1680 , 0.0);
1681 fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
1682 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1683 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1684 , 2.5)
1685 , 0.0);
1686 fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
1687 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1688 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1689 , 2.5)
1690 , 0.0);
1691 fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
1692 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
1693 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1694 , 2.5)
1695 , 0.0);
1696
1697 double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
1698 ele->SCluster()->Eta(),
1699 fChargedIso_DR0p0To0p1,
1700 fChargedIso_DR0p1To0p2,
1701 fChargedIso_DR0p2To0p3,
1702 fChargedIso_DR0p3To0p4,
1703 fChargedIso_DR0p4To0p5,
1704 fGammaIso_DR0p0To0p1,
1705 fGammaIso_DR0p1To0p2,
1706 fGammaIso_DR0p2To0p3,
1707 fGammaIso_DR0p3To0p4,
1708 fGammaIso_DR0p4To0p5,
1709 fNeutralHadronIso_DR0p0To0p1,
1710 fNeutralHadronIso_DR0p1To0p2,
1711 fNeutralHadronIso_DR0p2To0p3,
1712 fNeutralHadronIso_DR0p3To0p4,
1713 fNeutralHadronIso_DR0p4To0p5,
1714 ctrl.debug);
1715
1716 SelectionStatus status;
1717 bool pass = false;
1718
1719 Int_t subdet = 0;
1720 if (fabs(ele->SCluster()->Eta()) < 0.8) subdet = 0;
1721 else if (fabs(ele->SCluster()->Eta()) < 1.479) subdet = 1;
1722 else subdet = 2;
1723 Int_t ptBin = 0;
1724 if (ele->Pt() > 10.0) ptBin = 1;
1725
1726 Int_t MVABin = -1;
1727 if (subdet == 0 && ptBin == 0) MVABin = 0;
1728 if (subdet == 1 && ptBin == 0) MVABin = 1;
1729 if (subdet == 2 && ptBin == 0) MVABin = 2;
1730 if (subdet == 0 && ptBin == 1) MVABin = 3;
1731 if (subdet == 1 && ptBin == 1) MVABin = 4;
1732 if (subdet == 2 && ptBin == 1) MVABin = 5;
1733
1734 pass = false;
1735 if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN0 ) pass = true;
1736 if( MVABin == 1 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN1 ) pass = true;
1737 if( MVABin == 2 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN2 ) pass = true;
1738 if( MVABin == 3 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN3 ) pass = true;
1739 if( MVABin == 4 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN4 ) pass = true;
1740 if( MVABin == 5 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN5 ) pass = true;
1741 if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
1742
1743 // pass = false;
1744 // if( MVABin == 0 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN0 ) pass = true;
1745 // if( MVABin == 1 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN1 ) pass = true;
1746 // if( MVABin == 2 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN2 ) pass = true;
1747 // if( MVABin == 3 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN3 ) pass = true;
1748 // if( MVABin == 4 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN4 ) pass = true;
1749 // if( MVABin == 5 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN5 ) pass = true;
1750 // if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
1751
1752 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1753 return status;
1754
1755 }
1756
1757
1758
1759 //--------------------------------------------------------------------------------------------------
1760 SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
1761 const mithep::Electron * ele,
1762 const mithep::Vertex & vtx,
1763 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1764 float rho,
1765 //const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1766 mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1767 vector<const mithep::Muon*> muonsToVeto,
1768 vector<const mithep::Electron*> electronsToVeto)
1769 //--------------------------------------------------------------------------------------------------
1770 // hacked version
1771 {
1772 if( ctrl.debug ) {
1773 cout << "================> hacked ele Iso MVA <======================" << endl;
1774 }
1775
1776 if( ctrl.debug ) {
1777 cout << "electronIsoMVASelection :: muons to veto " << endl;
1778 for( int i=0; i<muonsToVeto.size(); i++ ) {
1779 const mithep::Muon * vmu = muonsToVeto[i];
1780 cout << "\tpt: " << vmu->Pt()
1781 << "\teta: " << vmu->Eta()
1782 << "\tphi: " << vmu->Phi()
1783 << endl;
1784 }
1785 cout << "electronIsoMVASelection :: electrson to veto " << endl;
1786 for( int i=0; i<electronsToVeto.size(); i++ ) {
1787 const mithep::Electron * vel = electronsToVeto[i];
1788 cout << "\tpt: " << vel->Pt()
1789 << "\teta: " << vel->Eta()
1790 << "\tphi: " << vel->Phi()
1791 << "\ttrk: " << vel->TrackerTrk()
1792 << endl;
1793 }
1794 }
1795
1796 bool failiso=false;
1797
1798 //
1799 // tmp iso rings
1800 //
1801 Double_t tmpChargedIso_DR0p0To0p1 = 0;
1802 Double_t tmpChargedIso_DR0p1To0p2 = 0;
1803 Double_t tmpChargedIso_DR0p2To0p3 = 0;
1804 Double_t tmpChargedIso_DR0p3To0p4 = 0;
1805 Double_t tmpChargedIso_DR0p4To0p5 = 0;
1806
1807 Double_t tmpGammaIso_DR0p0To0p1 = 0;
1808 Double_t tmpGammaIso_DR0p1To0p2 = 0;
1809 Double_t tmpGammaIso_DR0p2To0p3 = 0;
1810 Double_t tmpGammaIso_DR0p3To0p4 = 0;
1811 Double_t tmpGammaIso_DR0p4To0p5 = 0;
1812
1813
1814 Double_t tmpNeutralHadronIso_DR0p0To0p1 = 0;
1815 Double_t tmpNeutralHadronIso_DR0p1To0p2 = 0;
1816 Double_t tmpNeutralHadronIso_DR0p2To0p3 = 0;
1817 Double_t tmpNeutralHadronIso_DR0p3To0p4 = 0;
1818 Double_t tmpNeutralHadronIso_DR0p4To0p5 = 0;
1819
1820
1821
1822 //
1823 // final rings for the MVA
1824 //
1825 Double_t fChargedIso_DR0p0To0p1;
1826 Double_t fChargedIso_DR0p1To0p2;
1827 Double_t fChargedIso_DR0p2To0p3;
1828 Double_t fChargedIso_DR0p3To0p4;
1829 Double_t fChargedIso_DR0p4To0p5;
1830
1831 Double_t fGammaIso_DR0p0To0p1;
1832 Double_t fGammaIso_DR0p1To0p2;
1833 Double_t fGammaIso_DR0p2To0p3;
1834 Double_t fGammaIso_DR0p3To0p4;
1835 Double_t fGammaIso_DR0p4To0p5;
1836
1837 Double_t fNeutralHadronIso_DR0p0To0p1;
1838 Double_t fNeutralHadronIso_DR0p1To0p2;
1839 Double_t fNeutralHadronIso_DR0p2To0p3;
1840 Double_t fNeutralHadronIso_DR0p3To0p4;
1841 Double_t fNeutralHadronIso_DR0p4To0p5;
1842
1843
1844 //
1845 //Loop over PF Candidates
1846 //
1847 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1848
1849 if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1850
1851 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1852 Double_t deta = (ele->Eta() - pf->Eta());
1853 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
1854 Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
1855 if (dr > 1.0) continue;
1856
1857 if(ctrl.debug) {
1858 cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
1859 if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
1860 cout << endl;
1861 }
1862
1863
1864 if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
1865 (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
1866
1867
1868 //
1869 // Lepton Footprint Removal
1870 //
1871 Bool_t IsLeptonFootprint = kFALSE;
1872 if (dr < 1.0) {
1873
1874
1875 //
1876 // Check for electrons
1877 //
1878
1879 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1880 const mithep::Electron *tmpele = electronsToVeto[q];
1881 double tmpdr = mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta());
1882
1883 // 4l electron
1884 if( pf->HasTrackerTrk() ) {
1885 if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
1886 if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
1887 IsLeptonFootprint = kTRUE;
1888 }
1889 }
1890 if( pf->HasGsfTrk() ) {
1891 if( pf->GsfTrk() == tmpele->GsfTrk() ) {
1892 if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
1893 IsLeptonFootprint = kTRUE;
1894 }
1895 }
1896 // PF charged
1897 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479 && tmpdr < 0.015) {
1898 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
1899 IsLeptonFootprint = kTRUE;
1900 }
1901 // PF gamma
1902 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
1903 && tmpdr < 0.08) {
1904 if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1905 IsLeptonFootprint = kTRUE;
1906 }
1907 } // loop over electrons
1908
1909
1910 /* KH - comment for sync
1911 //
1912 // Check for muons
1913 //
1914 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1915 const mithep::Muon *tmpmu = muonsToVeto[q];
1916 // 4l muon
1917 if( pf->HasTrackerTrk() ) {
1918 if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
1919 if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
1920 IsLeptonFootprint = kTRUE;
1921 }
1922 }
1923 // PF charged
1924 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
1925 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
1926 IsLeptonFootprint = kTRUE;
1927 }
1928 } // loop over muons
1929 */
1930
1931 if (IsLeptonFootprint)
1932 continue;
1933
1934 //
1935 // Charged Iso Rings
1936 //
1937 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1938
1939 // if( pf->HasGsfTrk() ) {
1940 // if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1941 // } else if( pf->HasTrackerTrk() ){
1942 // if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1943 // }
1944
1945 // Veto any PFmuon, or PFEle
1946 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1947
1948 // Footprint Veto
1949 if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
1950
1951 if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
1952 << "\ttype: " << pf->PFType()
1953 << "\ttrk: " << pf->TrackerTrk() << endl;
1954
1955 if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
1956 if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
1957 if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
1958 if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
1959 if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
1960
1961 }
1962
1963 //
1964 // Gamma Iso Rings
1965 //
1966 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1967
1968 if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.08) continue;
1969
1970 if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
1971 << dr << endl;
1972
1973 if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
1974 if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
1975 if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
1976 if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
1977 if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
1978 }
1979
1980 //
1981 // Other Neutral Iso Rings
1982 //
1983 else {
1984 if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
1985 << dr << endl;
1986 if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
1987 if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
1988 if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
1989 if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
1990 if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
1991 }
1992
1993 }
1994
1995 }
1996
1997 fChargedIso_DR0p0To0p1 = fmin((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
1998 fChargedIso_DR0p1To0p2 = fmin((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
1999 fChargedIso_DR0p2To0p3 = fmin((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
2000 fChargedIso_DR0p3To0p4 = fmin((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
2001 fChargedIso_DR0p4To0p5 = fmin((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
2002
2003 if(ctrl.debug) {
2004 cout << "fChargedIso_DR0p0To0p1 : " << fChargedIso_DR0p0To0p1 << endl;
2005 cout << "fChargedIso_DR0p1To0p2 : " << fChargedIso_DR0p1To0p2 << endl;
2006 cout << "fChargedIso_DR0p2To0p3 : " << fChargedIso_DR0p2To0p3 << endl;
2007 cout << "fChargedIso_DR0p3To0p4 : " << fChargedIso_DR0p3To0p4 << endl;
2008 cout << "fChargedIso_DR0p4To0p5 : " << fChargedIso_DR0p4To0p5 << endl;
2009 }
2010
2011
2012 // rho=0;
2013 // double rho = 0;
2014 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2015 // rho = fPUEnergyDensity->At(0)->Rho();
2016 // if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
2017 // rho = fPUEnergyDensity->At(0)->RhoLowEta();
2018
2019 // WARNING!!!!
2020 // hardcode for sync ...
2021 EffectiveAreaVersion = eleT.kEleEAData2011;
2022 // WARNING!!!!
2023
2024 if( ctrl.debug) {
2025 cout << "RHO: " << rho << endl;
2026 cout << "eta: " << ele->SCluster()->Eta() << endl;
2027 cout << "target: " << EffectiveAreaVersion << endl;
2028 cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
2029 ele->SCluster()->Eta(),
2030 EffectiveAreaVersion)
2031 << endl;
2032 cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
2033 ele->SCluster()->Eta(),
2034 EffectiveAreaVersion)
2035 << endl;
2036 cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
2037 ele->SCluster()->Eta(),
2038 EffectiveAreaVersion)
2039 << endl;
2040 cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
2041 ele->SCluster()->Eta(),
2042 EffectiveAreaVersion)
2043 << endl;
2044 }
2045
2046 fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
2047 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
2048 ele->SCluster()->Eta(),
2049 EffectiveAreaVersion))/ele->Pt()
2050 ,2.5)
2051 ,0.0);
2052 fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
2053 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
2054 ele->SCluster()->Eta(),
2055 EffectiveAreaVersion))/ele->Pt()
2056 ,2.5)
2057 ,0.0);
2058 fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
2059 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
2060 ele->SCluster()->Eta()
2061 ,EffectiveAreaVersion))/ele->Pt()
2062 ,2.5)
2063 ,0.0);
2064 fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
2065 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
2066 ele->SCluster()->Eta(),
2067 EffectiveAreaVersion))/ele->Pt()
2068 ,2.5)
2069 ,0.0);
2070 fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
2071 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
2072 ele->SCluster()->Eta(),
2073 EffectiveAreaVersion))/ele->Pt()
2074 ,2.5)
2075 ,0.0);
2076
2077
2078 if( ctrl.debug) {
2079 cout << "fGammaIso_DR0p0To0p1: " << fGammaIso_DR0p0To0p1 << endl;
2080 cout << "fGammaIso_DR0p1To0p2: " << fGammaIso_DR0p1To0p2 << endl;
2081 cout << "fGammaIso_DR0p2To0p3: " << fGammaIso_DR0p2To0p3 << endl;
2082 cout << "fGammaIso_DR0p3To0p4: " << fGammaIso_DR0p3To0p4 << endl;
2083 cout << "fGammaIso_DR0p4To0p5: " << fGammaIso_DR0p4To0p5 << endl;
2084 }
2085
2086 fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
2087 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
2088 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
2089 , 2.5)
2090 , 0.0);
2091 fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
2092 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
2093 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
2094 , 2.5)
2095 , 0.0);
2096 fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
2097 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
2098 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
2099 , 2.5)
2100 , 0.0);
2101 fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
2102 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
2103 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
2104 , 2.5)
2105 , 0.0);
2106 fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
2107 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
2108 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
2109 , 2.5)
2110 , 0.0);
2111
2112 if( ctrl.debug) {
2113 cout << "fNeutralHadronIso_DR0p0To0p1: " << fNeutralHadronIso_DR0p0To0p1 << endl;
2114 cout << "fNeutralHadronIso_DR0p1To0p2: " << fNeutralHadronIso_DR0p1To0p2 << endl;
2115 cout << "fNeutralHadronIso_DR0p2To0p3: " << fNeutralHadronIso_DR0p2To0p3 << endl;
2116 cout << "fNeutralHadronIso_DR0p3To0p4: " << fNeutralHadronIso_DR0p3To0p4 << endl;
2117 cout << "fNeutralHadronIso_DR0p4To0p5: " << fNeutralHadronIso_DR0p4To0p5 << endl;
2118 }
2119
2120 double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
2121 ele->SCluster()->Eta(),
2122 fChargedIso_DR0p0To0p1,
2123 fChargedIso_DR0p1To0p2,
2124 fChargedIso_DR0p2To0p3,
2125 fChargedIso_DR0p3To0p4,
2126 fChargedIso_DR0p4To0p5,
2127 fGammaIso_DR0p0To0p1,
2128 fGammaIso_DR0p1To0p2,
2129 fGammaIso_DR0p2To0p3,
2130 fGammaIso_DR0p3To0p4,
2131 fGammaIso_DR0p4To0p5,
2132 fNeutralHadronIso_DR0p0To0p1,
2133 fNeutralHadronIso_DR0p1To0p2,
2134 fNeutralHadronIso_DR0p2To0p3,
2135 fNeutralHadronIso_DR0p3To0p4,
2136 fNeutralHadronIso_DR0p4To0p5,
2137 ctrl.debug);
2138
2139 SelectionStatus status;
2140 status.isoMVA = mvaval;
2141 bool pass = false;
2142
2143 Int_t subdet = 0;
2144 if (fabs(ele->SCluster()->Eta()) < 0.8) subdet = 0;
2145 else if (fabs(ele->SCluster()->Eta()) < 1.479) subdet = 1;
2146 else subdet = 2;
2147
2148 Int_t ptBin = 0;
2149 if (ele->Pt() >= 10.0) ptBin = 1;
2150
2151 Int_t MVABin = -1;
2152 if (subdet == 0 && ptBin == 0) MVABin = 0;
2153 if (subdet == 1 && ptBin == 0) MVABin = 1;
2154 if (subdet == 2 && ptBin == 0) MVABin = 2;
2155 if (subdet == 0 && ptBin == 1) MVABin = 3;
2156 if (subdet == 1 && ptBin == 1) MVABin = 4;
2157 if (subdet == 2 && ptBin == 1) MVABin = 5;
2158
2159 pass = false;
2160 if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN0 ) pass = true;
2161 if( MVABin == 1 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN1 ) pass = true;
2162 if( MVABin == 2 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN2 ) pass = true;
2163 if( MVABin == 3 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN3 ) pass = true;
2164 if( MVABin == 4 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN4 ) pass = true;
2165 if( MVABin == 5 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN5 ) pass = true;
2166 if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
2167
2168 // pass = false;
2169 // if( MVABin == 0 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN0 ) pass = true;
2170 // if( MVABin == 1 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN1 ) pass = true;
2171 // if( MVABin == 2 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN2 ) pass = true;
2172 // if( MVABin == 3 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN3 ) pass = true;
2173 // if( MVABin == 4 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN4 ) pass = true;
2174 // if( MVABin == 5 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN5 ) pass = true;
2175 // if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
2176
2177 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2178 return status;
2179
2180 }
2181
2182
2183 //--------------------------------------------------------------------------------------------------
2184 void initElectronIsoMVA() {
2185 //--------------------------------------------------------------------------------------------------
2186 eleIsoMVA = new mithep::ElectronIDMVA();
2187 vector<string> weightFiles;
2188 weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt5To10.weights.xml");
2189 weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt5To10.weights.xml");
2190 weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt10ToInf.weights.xml");
2191 weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt10ToInf.weights.xml");
2192 eleIsoMVA->Initialize( "ElectronIsoMVA",
2193 mithep::ElectronIDMVA::kIsoRingsV0,
2194 kTRUE, weightFiles);
2195 }
2196
2197
2198
2199 //--------------------------------------------------------------------------------------------------
2200 float electronPFIso04(ControlFlags &ctrl,
2201 const mithep::Electron * ele,
2202 const mithep::Vertex & vtx,
2203 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2204 const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2205 mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2206 vector<const mithep::Muon*> muonsToVeto,
2207 vector<const mithep::Electron*> electronsToVeto)
2208 //--------------------------------------------------------------------------------------------------
2209 {
2210
2211 if( ctrl.debug ) {
2212 cout << "electronIsoMVASelection :: muons to veto " << endl;
2213 for( int i=0; i<muonsToVeto.size(); i++ ) {
2214 const mithep::Muon * vmu = muonsToVeto[i];
2215 cout << "\tpt: " << vmu->Pt()
2216 << "\teta: " << vmu->Eta()
2217 << "\tphi: " << vmu->Phi()
2218 << endl;
2219 }
2220 cout << "electronIsoMVASelection :: electrson to veto " << endl;
2221 for( int i=0; i<electronsToVeto.size(); i++ ) {
2222 const mithep::Electron * vel = electronsToVeto[i];
2223 cout << "\tpt: " << vel->Pt()
2224 << "\teta: " << vel->Eta()
2225 << "\tphi: " << vel->Phi()
2226 << "\ttrk: " << vel->TrackerTrk()
2227 << endl;
2228 }
2229 }
2230
2231
2232 //
2233 // final iso
2234 //
2235 Double_t fChargedIso = 0.0;
2236 Double_t fGammaIso = 0.0;
2237 Double_t fNeutralHadronIso = 0.0;
2238
2239
2240 //
2241 //Loop over PF Candidates
2242 //
2243 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2244 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2245 Double_t deta = (ele->Eta() - pf->Eta());
2246 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2247 Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2248 if (dr >= 0.4) continue;
2249 if(ctrl.debug) {
2250 cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
2251 if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
2252 cout << endl;
2253 }
2254
2255
2256 if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2257 (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
2258
2259
2260 //
2261 // Lepton Footprint Removal
2262 //
2263 Bool_t IsLeptonFootprint = kFALSE;
2264 if (dr < 1.0) {
2265
2266 //
2267 // Check for electrons
2268 //
2269 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
2270 const mithep::Electron *tmpele = electronsToVeto[q];
2271 // 4l electron
2272 if( pf->HasTrackerTrk() ) {
2273 if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
2274 if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
2275 IsLeptonFootprint = kTRUE;
2276 }
2277 }
2278 if( pf->HasGsfTrk() ) {
2279 if( pf->GsfTrk() == tmpele->GsfTrk() ) {
2280 if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
2281 IsLeptonFootprint = kTRUE;
2282 }
2283 }
2284 // PF charged
2285 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
2286 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
2287 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
2288 IsLeptonFootprint = kTRUE;
2289 }
2290 // PF gamma
2291 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
2292 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
2293 if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
2294 IsLeptonFootprint = kTRUE;
2295 }
2296 } // loop over electrons
2297
2298
2299 //
2300 // Check for muons
2301 //
2302 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
2303 const mithep::Muon *tmpmu = muonsToVeto[q];
2304 // 4l muon
2305 if( pf->HasTrackerTrk() ) {
2306 if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
2307 if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
2308 IsLeptonFootprint = kTRUE;
2309 }
2310 }
2311 // PF charged
2312 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
2313 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
2314 IsLeptonFootprint = kTRUE;
2315 }
2316 } // loop over muons
2317
2318
2319 if (IsLeptonFootprint)
2320 continue;
2321
2322 //
2323 // Charged Iso
2324 //
2325 if (pf->Charge() != 0 ) {
2326
2327 if( pf->HasTrackerTrk() )
2328 if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2329 if( pf->HasGsfTrk() )
2330 if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2331
2332 // Veto any PFmuon, or PFEle
2333 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
2334
2335 // Footprint Veto
2336 if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2337
2338 if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2339 << "\ttype: " << pf->PFType()
2340 << "\ttrk: " << pf->TrackerTrk() << endl;
2341
2342 fChargedIso += pf->Pt();
2343 }
2344
2345 //
2346 // Gamma Iso
2347 //
2348 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2349
2350 if (fabs(ele->SCluster()->Eta()) > 1.479) {
2351 if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2352 }
2353 if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2354 << dr << endl;
2355 // KH, add to sync
2356 // if( pf->Pt() > 0.5 )
2357 fGammaIso += pf->Pt();
2358 }
2359
2360 //
2361 // Neutral Iso
2362 //
2363 else {
2364 if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2365 << dr << endl;
2366 // KH, add to sync
2367 // if( pf->Pt() > 0.5 )
2368 fNeutralHadronIso += pf->Pt();
2369 }
2370
2371 }
2372
2373 }
2374
2375 double rho = 0;
2376 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2377 // rho = fPUEnergyDensity->At(0)->Rho();
2378 if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
2379 rho = fPUEnergyDensity->At(0)->RhoLowEta();
2380
2381 // WARNING!!!!
2382 // hardcode for sync ...
2383 EffectiveAreaVersion = eleT.kEleEAData2011;
2384 // WARNING!!!!
2385
2386
2387 double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2388 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2389 ele->Eta(),EffectiveAreaVersion)));
2390
2391 gChargedIso = fChargedIso;
2392 gGammaIso = fGammaIso;
2393 gNeutralIso = fNeutralHadronIso;
2394
2395 return pfIso;
2396 }
2397
2398 //--------------------------------------------------------------------------------------------------
2399 // hacked version
2400 float electronPFIso04(ControlFlags &ctrl,
2401 const mithep::Electron * ele,
2402 const mithep::Vertex & vtx,
2403 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2404 float rho,
2405 mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2406 vector<const mithep::Muon*> muonsToVeto,
2407 vector<const mithep::Electron*> electronsToVeto)
2408 //--------------------------------------------------------------------------------------------------
2409 {
2410
2411 if( ctrl.debug ) {
2412 cout << "electronIsoMVASelection :: muons to veto " << endl;
2413 for( int i=0; i<muonsToVeto.size(); i++ ) {
2414 const mithep::Muon * vmu = muonsToVeto[i];
2415 cout << "\tpt: " << vmu->Pt()
2416 << "\teta: " << vmu->Eta()
2417 << "\tphi: " << vmu->Phi()
2418 << endl;
2419 }
2420 cout << "electronIsoMVASelection :: electrons to veto " << endl;
2421 for( int i=0; i<electronsToVeto.size(); i++ ) {
2422 const mithep::Electron * vel = electronsToVeto[i];
2423 cout << "\tpt: " << vel->Pt()
2424 << "\teta: " << vel->Eta()
2425 << "\tphi: " << vel->Phi()
2426 << "\ttrk: " << vel->TrackerTrk()
2427 << endl;
2428 }
2429 }
2430
2431
2432 //
2433 // final iso
2434 //
2435 Double_t fChargedIso = 0.0;
2436 Double_t fGammaIso = 0.0;
2437 Double_t fNeutralHadronIso = 0.0;
2438
2439
2440 //
2441 //Loop over PF Candidates
2442 //
2443 for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2444
2445
2446 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2447 Double_t deta = (ele->Eta() - pf->Eta());
2448 Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2449 Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2450
2451 if (dr > 0.4) continue;
2452 if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
2453
2454 if(ctrl.debug) {
2455 cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt() << "\tdR: " << dr;
2456 if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx)
2457 << "\ttrk: " << pf->HasTrackerTrk()
2458 << "\tgsf: " << pf->HasGsfTrk();
2459
2460 cout << endl;
2461 }
2462
2463
2464 //
2465 // sync : I don't think theyre doing this ...
2466 //
2467 // if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2468 // (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) {
2469 // if( ctrl.debug ) cout << "\tskipping, matches to the electron ..." << endl;
2470 // continue;
2471 // }
2472
2473
2474 //
2475 // Lepton Footprint Removal
2476 //
2477 Bool_t IsLeptonFootprint = kFALSE;
2478 if (dr < 1.0) {
2479
2480 //
2481 // Check for electrons
2482 //
2483 for (Int_t q=0; q < electronsToVeto.size(); ++q) {
2484 const mithep::Electron *tmpele = electronsToVeto[q];
2485 /*
2486 // 4l electron
2487 if( pf->HasTrackerTrk() ) {
2488 if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
2489 if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
2490 IsLeptonFootprint = kTRUE;
2491 }
2492 }
2493 if( pf->HasGsfTrk() ) {
2494 if( pf->GsfTrk() == tmpele->GsfTrk() ) {
2495 if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
2496 IsLeptonFootprint = kTRUE;
2497 }
2498 }
2499 */
2500 // PF charged
2501 if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
2502 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
2503 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
2504 IsLeptonFootprint = kTRUE;
2505 }
2506 // PF gamma
2507 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
2508 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
2509 if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
2510 IsLeptonFootprint = kTRUE;
2511 }
2512 } // loop over electrons
2513
2514 /* KH - comment for sync
2515 //
2516 // Check for muons
2517 //
2518 for (Int_t q=0; q < muonsToVeto.size(); ++q) {
2519 const mithep::Muon *tmpmu = muonsToVeto[q];
2520 // 4l muon
2521 if( pf->HasTrackerTrk() ) {
2522 if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
2523 if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
2524 IsLeptonFootprint = kTRUE;
2525 }
2526 }
2527 // PF charged
2528 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
2529 if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
2530 IsLeptonFootprint = kTRUE;
2531 }
2532 } // loop over muons
2533 */
2534
2535 if (IsLeptonFootprint)
2536 continue;
2537
2538 //
2539 // Charged Iso
2540 //
2541 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
2542
2543 // if( pf->HasTrackerTrk() )
2544 // if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2545 // if( pf->HasGsfTrk() )
2546 // if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2547
2548 // Veto any PFmuon, or PFEle
2549 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) {
2550 cout << "\t skipping, pf is and ele or mu .." <<endl;
2551 continue;
2552 }
2553
2554 // Footprint Veto
2555 if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2556
2557 if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2558 << "\ttype: " << pf->PFType()
2559 << "\ttrk: " << pf->TrackerTrk() << endl;
2560
2561 fChargedIso += pf->Pt();
2562 }
2563
2564 //
2565 // Gamma Iso
2566 //
2567 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2568
2569 if (fabs(ele->SCluster()->Eta()) > 1.479) {
2570 if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2571 }
2572 if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2573 << dr << endl;
2574 // KH, add to sync
2575 // if( pf->Pt() > 0.5 )
2576 fGammaIso += pf->Pt();
2577 }
2578
2579 //
2580 // Neutral Iso
2581 //
2582 else {
2583 if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2584 << dr << endl;
2585 // KH, add to sync
2586 // if( pf->Pt() > 0.5 )
2587 fNeutralHadronIso += pf->Pt();
2588 }
2589
2590 }
2591
2592 }
2593
2594 // double rho = 0;
2595 // if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2596 // rho = fPUEnergyDensity->At(0)->Rho();
2597
2598 // WARNING!!!!
2599 // hardcode for sync ...
2600 EffectiveAreaVersion = eleT.kEleEAData2011;
2601 // WARNING!!!!
2602
2603
2604 double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2605 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2606 ele->Eta(),EffectiveAreaVersion)));
2607
2608
2609 gChargedIso = fChargedIso;
2610 gGammaIso = fGammaIso;
2611 gNeutralIso = fNeutralHadronIso;
2612 return pfIso;
2613 }
2614
2615
2616 //--------------------------------------------------------------------------------------------------
2617 SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2618 const mithep::Electron * ele,
2619 const mithep::Vertex & vtx,
2620 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2621 const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2622 mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2623 vector<const mithep::Muon*> muonsToVeto,
2624 vector<const mithep::Electron*> electronsToVeto)
2625 //--------------------------------------------------------------------------------------------------
2626 {
2627
2628 SelectionStatus status;
2629
2630 double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, fPUEnergyDensity,
2631 EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
2632 // cout << "--------------> setting electron isoPF04 to " << pfIso << endl;
2633 status.isoPF04 = pfIso;
2634 status.chisoPF04 = gChargedIso;
2635 status.gaisoPF04 = gGammaIso;
2636 status.neisoPF04 = gNeutralIso;
2637
2638 bool pass = false;
2639 if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2640
2641 if( pass ) {
2642 status.orStatus(SelectionStatus::LOOSEISO);
2643 status.orStatus(SelectionStatus::TIGHTISO);
2644 }
2645 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2646 return status;
2647
2648 }
2649
2650
2651 //--------------------------------------------------------------------------------------------------
2652 // hacked version
2653 SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2654 const mithep::Electron * ele,
2655 const mithep::Vertex & vtx,
2656 const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2657 float rho,
2658 mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2659 vector<const mithep::Muon*> muonsToVeto,
2660 vector<const mithep::Electron*> electronsToVeto)
2661 //--------------------------------------------------------------------------------------------------
2662 {
2663
2664 SelectionStatus status;
2665
2666 double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, rho,
2667 EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
2668 status.isoPF04 = pfIso;
2669 status.chisoPF04 = gChargedIso;
2670 status.gaisoPF04 = gGammaIso;
2671 status.neisoPF04 = gNeutralIso;
2672 bool pass = false;
2673 if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2674
2675 if( pass ) {
2676 status.orStatus(SelectionStatus::LOOSEISO);
2677 status.orStatus(SelectionStatus::TIGHTISO);
2678 }
2679 if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2680 return status;
2681
2682 }