ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/LeptonSelection/src/IsolationSelection.cc
(Generate patch)

Comparing UserCode/MitHzz4l/LeptonSelection/src/IsolationSelection.cc (file contents):
Revision 1.5 by khahn, Thu Apr 26 07:02:28 2012 UTC vs.
Revision 1.10 by khahn, Sat May 5 13:09:05 2012 UTC

# Line 257 | Line 257 | SelectionStatus muonIsoMVASelection(Cont
257   //--------------------------------------------------------------------------------------------------
258   {
259  
260 +  if( ctrl.debug ) {
261 +    cout << "muonIsoMVASelection :: muons to veto " << endl;
262 +    for( int i=0; i<muonsToVeto.size(); i++ ) {
263 +      const mithep::Muon * vmu = muonsToVeto[i];
264 +      cout << "\tpt: " << vmu->Pt()
265 +           << "\teta: " << vmu->Eta()
266 +           << "\tphi: " << vmu->Phi()
267 +           << endl;
268 +    }
269 +    cout << "muonIsoMVASelection :: electrson to veto " << endl;
270 +    for( int i=0; i<electronsToVeto.size(); i++ ) {
271 +      const mithep::Electron * vel = electronsToVeto[i];
272 +      cout << "\tpt: " << vel->Pt()
273 +           << "\teta: " << vel->Eta()
274 +           << "\tphi: " << vel->Phi()
275 +           << endl;
276 +    }
277 +  }
278    bool failiso=false;
279  
280    //
281    // tmp iso rings
282    //
283 <  Double_t tmpChargedIso_DR0p0To0p05  = 0;
284 <  Double_t tmpChargedIso_DR0p05To0p1  = 0;
285 <  Double_t tmpChargedIso_DR0p1To0p15  = 0;
268 <  Double_t tmpChargedIso_DR0p15To0p2  = 0;
269 <  Double_t tmpChargedIso_DR0p2To0p25  = 0;
270 <  Double_t tmpChargedIso_DR0p25To0p3  = 0;
283 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
284 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
285 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
286    Double_t tmpChargedIso_DR0p3To0p4  = 0;
287    Double_t tmpChargedIso_DR0p4To0p5  = 0;
288 +  Double_t tmpChargedIso_DR0p5To0p7  = 0;
289  
290 <  Double_t tmpGammaIso_DR0p0To0p05  = 0;
291 <  Double_t tmpGammaIso_DR0p05To0p1  = 0;
292 <  Double_t tmpGammaIso_DR0p1To0p15  = 0;
277 <  Double_t tmpGammaIso_DR0p15To0p2  = 0;
278 <  Double_t tmpGammaIso_DR0p2To0p25  = 0;
279 <  Double_t tmpGammaIso_DR0p25To0p3  = 0;
290 >  Double_t tmpGammaIso_DR0p0To0p1  = 0;
291 >  Double_t tmpGammaIso_DR0p1To0p2  = 0;
292 >  Double_t tmpGammaIso_DR0p2To0p3  = 0;
293    Double_t tmpGammaIso_DR0p3To0p4  = 0;
294    Double_t tmpGammaIso_DR0p4To0p5  = 0;
295 +  Double_t tmpGammaIso_DR0p5To0p7  = 0;
296  
297 <  Double_t tmpNeutralHadronIso_DR0p0To0p05  = 0;
298 <  Double_t tmpNeutralHadronIso_DR0p05To0p1  = 0;
299 <  Double_t tmpNeutralHadronIso_DR0p1To0p15  = 0;
286 <  Double_t tmpNeutralHadronIso_DR0p15To0p2  = 0;
287 <  Double_t tmpNeutralHadronIso_DR0p2To0p25  = 0;
288 <  Double_t tmpNeutralHadronIso_DR0p25To0p3  = 0;
297 >  Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
298 >  Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
299 >  Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
300    Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
301    Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
302 +  Double_t tmpNeutralHadronIso_DR0p5To0p7  = 0;
303 +
304          
292  Double_t tmp2ChargedIso_DR0p5To1p0  = 0;
305  
306    //
307    // final rings for the MVA
# Line 299 | Line 311 | SelectionStatus muonIsoMVASelection(Cont
311    Double_t fChargedIso_DR0p2To0p3;
312    Double_t fChargedIso_DR0p3To0p4;
313    Double_t fChargedIso_DR0p4To0p5;
314 +  Double_t fChargedIso_DR0p5To0p7;
315  
316    Double_t fGammaIso_DR0p0To0p1;
317    Double_t fGammaIso_DR0p1To0p2;
318    Double_t fGammaIso_DR0p2To0p3;
319    Double_t fGammaIso_DR0p3To0p4;
320    Double_t fGammaIso_DR0p4To0p5;
321 +  Double_t fGammaIso_DR0p5To0p7;
322  
323    Double_t fNeutralHadronIso_DR0p0To0p1;
324    Double_t fNeutralHadronIso_DR0p1To0p2;
325    Double_t fNeutralHadronIso_DR0p2To0p3;
326    Double_t fNeutralHadronIso_DR0p3To0p4;
327    Double_t fNeutralHadronIso_DR0p4To0p5;
328 +  Double_t fNeutralHadronIso_DR0p5To0p7;
329  
330  
331    //
# Line 324 | Line 339 | SelectionStatus muonIsoMVASelection(Cont
339      Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
340      if (dr > 1.0) continue;
341  
342 <    if (pf->PFType() == PFCandidate::eMuon && pf->TrackerTrk() == mu->TrackerTrk() ) continue;
342 >    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
343  
344      //
345      // Lepton Footprint Removal
# Line 337 | Line 352 | SelectionStatus muonIsoMVASelection(Cont
352        //
353        for (Int_t q=0; q < electronsToVeto.size(); ++q) {
354          const mithep::Electron *tmpele = electronsToVeto[q];
355 <        // PF electron
356 <        if( pf->PFType() == PFCandidate::eElectron && pf->TrackerTrk() == tmpele->TrackerTrk() )
357 <          IsLeptonFootprint = kTRUE;
355 >        // 4l electron
356 >        if( pf->HasTrackerTrk() ) {
357 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
358 >            IsLeptonFootprint = kTRUE;
359 >        }
360 >        if( pf->HasGsfTrk() ) {
361 >          if( pf->GsfTrk() == tmpele->GsfTrk() )
362 >            IsLeptonFootprint = kTRUE;
363 >        }
364          // PF charged
365          if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
366              && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
367            IsLeptonFootprint = kTRUE;
368          // PF gamma
369 <        if (pf->PFType() == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
369 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
370              && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
371            IsLeptonFootprint = kTRUE;
372        } // loop over electrons
# Line 355 | Line 376 | SelectionStatus muonIsoMVASelection(Cont
376        //
377        for (Int_t q=0; q < muonsToVeto.size(); ++q) {
378          const mithep::Muon *tmpmu = muonsToVeto[q];
379 <        // PF muons
380 <        if (pf->PFType() == PFCandidate::eMuon && pf->TrackerTrk() == tmpmu->TrackerTrk() )
381 <          IsLeptonFootprint = kTRUE;
379 >        // 4l muon
380 >        if( pf->HasTrackerTrk() ) {
381 >          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
382 >            IsLeptonFootprint = kTRUE;
383 >        }
384          // PF charged
385          if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
386            IsLeptonFootprint = kTRUE;
# Line 370 | Line 393 | SelectionStatus muonIsoMVASelection(Cont
393      //
394      // Charged Iso Rings
395      //
396 <    if (pf->Charge() != 0 && pf->HasTrackerTrk() ) {
396 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
397  
398 <      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
399 <                
377 <      // Veto any PFmuon, or PFEle
378 <      if (pf->PFType() == PFCandidate::eElectron || pf->PFType() == PFCandidate::eMuon) continue;
398 >      if( dr < 0.01 ) continue; // only for muon iso mva?
399 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
400  
401 <      // Footprint Veto
402 <      if (dr < 0.01) continue;
401 >      if( pf->HasTrackerTrk() ) {
402 >        if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
403 >        if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
404 >                              << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
405 >                              << dr << endl;
406 >      }
407 >      if( pf->HasGsfTrk() ) {
408 >        if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
409 >        if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
410 >                              << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
411 >                              << dr << endl;
412 >      }
413  
414 <      if (dr < 0.05)               tmpChargedIso_DR0p0To0p05 += pf->Pt();
415 <      if (dr >= 0.05 && dr < 0.10) tmpChargedIso_DR0p05To0p1 += pf->Pt();
416 <      if (dr >= 0.10 && dr < 0.15) tmpChargedIso_DR0p1To0p15 += pf->Pt();
417 <      if (dr >= 0.15 && dr < 0.20) tmpChargedIso_DR0p15To0p2 += pf->Pt();
418 <      if (dr >= 0.20 && dr < 0.25) tmpChargedIso_DR0p2To0p25 += pf->Pt();
419 <      if (dr >= 0.25 && dr < 0.3)  tmpChargedIso_DR0p25To0p3 += pf->Pt();
420 <      if (dr >= 0.3 && dr < 0.4)   tmpChargedIso_DR0p3To0p4  += pf->Pt();
390 <      if (dr >= 0.4 && dr < 0.5)   tmpChargedIso_DR0p4To0p5  += pf->Pt();
414 >      // Footprint Veto
415 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
416 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
417 >      if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
418 >      if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
419 >      if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
420 >      if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
421      }
422  
423      //
424      // Gamma Iso Rings
425      //
426 <    else if (pf->PFType() == PFCandidate::eGamma) {
427 <
428 <      if (dr < 0.05)               tmpGammaIso_DR0p0To0p05 += pf->Pt();
429 <      if (dr >= 0.05 && dr < 0.10) tmpGammaIso_DR0p05To0p1 += pf->Pt();
430 <      if (dr >= 0.10 && dr < 0.15) tmpGammaIso_DR0p1To0p15 += pf->Pt();
431 <      if (dr >= 0.15 && dr < 0.20) tmpGammaIso_DR0p15To0p2 += pf->Pt();
432 <      if (dr >= 0.20 && dr < 0.25) tmpGammaIso_DR0p2To0p25 += pf->Pt();
403 <      if (dr >= 0.25 && dr < 0.3)  tmpGammaIso_DR0p25To0p3 += pf->Pt();
404 <      if (dr >= 0.3 && dr < 0.4)   tmpGammaIso_DR0p3To0p4  += pf->Pt();
405 <      if (dr >= 0.4 && dr < 0.5)   tmpGammaIso_DR0p4To0p5  += pf->Pt();
426 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
427 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
428 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
429 >      if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
430 >      if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
431 >      if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
432 >      if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
433      }
434  
435      //
436      // Other Neutral Iso Rings
437      //
438      else {
439 <      if (dr < 0.05)               tmpNeutralHadronIso_DR0p0To0p05 += pf->Pt();
440 <      if (dr >= 0.05 && dr < 0.10) tmpNeutralHadronIso_DR0p05To0p1 += pf->Pt();
441 <      if (dr >= 0.10 && dr < 0.15) tmpNeutralHadronIso_DR0p1To0p15 += pf->Pt();
442 <      if (dr >= 0.15 && dr < 0.20) tmpNeutralHadronIso_DR0p15To0p2 += pf->Pt();
443 <      if (dr >= 0.20 && dr < 0.25) tmpNeutralHadronIso_DR0p2To0p25 += pf->Pt();
444 <      if (dr >= 0.25 && dr < 0.3)  tmpNeutralHadronIso_DR0p25To0p3 += pf->Pt();
418 <      if (dr >= 0.3 && dr < 0.4)   tmpNeutralHadronIso_DR0p3To0p4  += pf->Pt();
419 <      if (dr >= 0.4 && dr < 0.5)   tmpNeutralHadronIso_DR0p4To0p5  += pf->Pt();
439 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
440 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
441 >      if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
442 >      if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
443 >      if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
444 >      if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
445      }
446  
447      }
448  
449    }
450  
451 <  fChargedIso_DR0p0To0p1   = min((tmpChargedIso_DR0p0To0p05 + tmpChargedIso_DR0p05To0p1 )/mu->Pt(), 2.5);
452 <  fChargedIso_DR0p1To0p2   = min((tmpChargedIso_DR0p1To0p15 + tmpChargedIso_DR0p15To0p2)/mu->Pt(), 2.5);
453 <  fChargedIso_DR0p2To0p3   = min((tmpChargedIso_DR0p2To0p25 + tmpChargedIso_DR0p25To0p3)/mu->Pt(), 2.5);
451 >  fChargedIso_DR0p0To0p1   = min((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
452 >  fChargedIso_DR0p1To0p2   = min((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
453 >  fChargedIso_DR0p2To0p3   = min((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
454    fChargedIso_DR0p3To0p4   = min((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
455    fChargedIso_DR0p4To0p5   = min((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
456  
457 +
458    double rho = 0;
459    if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
460      rho = fPUEnergyDensity->At(0)->Rho();
461    
462  
463 <  fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p05 + tmpGammaIso_DR0p05To0p1
463 >  fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p1
464                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
465                                   ,2.5)
466                               ,0.0);
467 <  fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p15 + tmpGammaIso_DR0p15To0p2
467 >  fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p2
468                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p1To0p2,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
469                                   ,2.5)
470                               ,0.0);
471 <  fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p25 + tmpGammaIso_DR0p25To0p3
471 >  fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p3
472                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
473                                   ,2.5)
474                               ,0.0);
# Line 456 | Line 482 | SelectionStatus muonIsoMVASelection(Cont
482                               ,0.0);
483  
484  
485 <  fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p05 + tmpNeutralHadronIso_DR0p05To0p1
485 >
486 >  fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p1
487                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p0To0p1,
488                                                                   mu->Eta(),EffectiveAreaVersion))/mu->Pt()
489                                           , 2.5)
490                                       , 0.0);
491 <  fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p15 + tmpNeutralHadronIso_DR0p15To0p2
491 >  fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p2
492                                              -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p1To0p2,
493                                                                     mu->Eta(),EffectiveAreaVersion))/mu->Pt()
494                                             , 2.5)
495                                         , 0.0);
496 <  fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p25 + tmpNeutralHadronIso_DR0p25To0p3
496 >  fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p3
497                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p2To0p3,
498                                                                   mu->Eta(),EffectiveAreaVersion))/mu->Pt()
499                                           , 2.5)
# Line 482 | Line 509 | SelectionStatus muonIsoMVASelection(Cont
509                                           , 2.5)
510                                       , 0.0);
511  
512 +
513    double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
514                                               mu->Eta(),
515                                               fChargedIso_DR0p0To0p1,
# Line 502 | Line 530 | SelectionStatus muonIsoMVASelection(Cont
530                                               ctrl.debug);
531  
532    SelectionStatus status;
533 <  bool pass = false;
533 >  bool pass;
534  
535 +  pass = false;
536    if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
537 <      && fabs(mu->Eta()) < 1.5 && mu->Pt() < 10 && mvaval >= MUON_ISOMVA_CUT_BIN0)  pass = true;
537 >      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN0)   pass = true;
538    else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
539 <           && fabs(mu->Eta()) < 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_CUT_BIN1)  pass = true;
539 >           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN1)  pass = true;
540    else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
541 <           && fabs(mu->Eta()) > 1.5 && mu->Pt() < 10 && mvaval >= MUON_ISOMVA_CUT_BIN2)  pass = true;
541 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN2)  pass = true;
542    else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
543 <           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_CUT_BIN3)  pass = true;
544 <  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon()
545 <           && (mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated) && mvaval >= MUON_ISOMVA_CUT_BIN4)
546 <    pass = true;
543 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN3)  pass = true;
544 >  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN4)  pass = true;
545 >  else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN5)  pass = true;
546 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
547  
548 +  pass = false;
549 +  if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
550 +      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN0)   pass = true;
551 +  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
552 +           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN1)  pass = true;
553 +  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
554 +           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN2)  pass = true;
555 +  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
556 +           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN3)  pass = true;
557 +  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN4)  pass = true;
558 +  else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN5)  pass = true;
559 +  if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
560 +
561 +  //  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
562  
520  if( pass ) {
521    status.orStatus(SelectionStatus::LOOSEISO);
522    status.orStatus(SelectionStatus::TIGHTISO);
523  }
563    if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
564    return status;
565  
# Line 531 | Line 570 | void initMuonIsoMVA() {
570   //--------------------------------------------------------------------------------------------------
571    muIsoMVA = new mithep::MuonIDMVA();
572    vector<string> weightFiles;
573 <  weightFiles.push_back("../MitPhysics/data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml");
574 <  weightFiles.push_back("../MitPhysics/data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml");
575 <  weightFiles.push_back("../MitPhysics/data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml");
576 <  weightFiles.push_back("../MitPhysics/data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml");
577 <  weightFiles.push_back("../MitPhysics/data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml");
578 <  weightFiles.push_back("../MitPhysics/data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml");
573 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml");
574 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml");
575 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml");
576 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml");
577 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml");
578 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml");
579    muIsoMVA->Initialize( "MuonIsoMVA",
580                          mithep::MuonIDMVA::kIsoRingsV0,
581                          kTRUE, weightFiles);
582   }
583  
584  
585 + //--------------------------------------------------------------------------------------------------
586 + double  muonPFIso04(ControlFlags &ctrl,
587 +                    const mithep::Muon * mu,
588 +                    const mithep::Vertex & vtx,
589 +                    const mithep::Array<mithep::PFCandidate> * fPFCandidates,
590 +                    const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
591 +                    mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
592 +                    vector<const mithep::Muon*> muonsToVeto,
593 +                    vector<const mithep::Electron*> electronsToVeto)
594 + //--------------------------------------------------------------------------------------------------
595 + {
596 +  
597 +  if( ctrl.debug ) {
598 +    cout << "muonIsoMVASelection :: muons to veto " << endl;
599 +    for( int i=0; i<muonsToVeto.size(); i++ ) {
600 +      const mithep::Muon * vmu = muonsToVeto[i];
601 +      cout << "\tpt: " << vmu->Pt()
602 +           << "\teta: " << vmu->Eta()
603 +           << "\tphi: " << vmu->Phi()
604 +           << endl;
605 +    }
606 +    cout << "muonIsoMVASelection :: electrson to veto " << endl;
607 +    for( int i=0; i<electronsToVeto.size(); i++ ) {
608 +      const mithep::Electron * vel = electronsToVeto[i];
609 +      cout << "\tpt: " << vel->Pt()
610 +           << "\teta: " << vel->Eta()
611 +           << "\tphi: " << vel->Phi()
612 +           << endl;
613 +    }
614 +  }
615 +  bool failiso=false;
616 +
617 +  //
618 +  // tmp iso
619 +  //
620 +  Double_t tmpChargedIso        = 0;
621 +  Double_t tmpGammaIso          = 0;
622 +  Double_t tmpNeutralHadronIso  = 0;
623 +
624 +  //
625 +  // final iso
626 +  //
627 +  Double_t fChargedIso;
628 +  Double_t fGammaIso;
629 +  Double_t fNeutralHadronIso;
630 +
631 +  //
632 +  //Loop over PF Candidates
633 +  //
634 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
635 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
636 +
637 +    Double_t deta = (mu->Eta() - pf->Eta());
638 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
639 +    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
640 +    if (dr > 0.4) continue;
641 +
642 +    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
643 +
644 +    //
645 +    // Lepton Footprint Removal
646 +    //
647 +    Bool_t IsLeptonFootprint = kFALSE;
648 +    if (dr < 1.0) {
649 +
650 +      //
651 +      // Check for electrons
652 +      //
653 +      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
654 +        const mithep::Electron *tmpele = electronsToVeto[q];
655 +        // 4l electron
656 +        if( pf->HasTrackerTrk() ) {
657 +          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
658 +            IsLeptonFootprint = kTRUE;
659 +        }
660 +        if( pf->HasGsfTrk() ) {
661 +          if( pf->GsfTrk() == tmpele->GsfTrk() )
662 +            IsLeptonFootprint = kTRUE;
663 +        }
664 +        // PF charged
665 +        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
666 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
667 +          IsLeptonFootprint = kTRUE;
668 +        // PF gamma
669 +        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
670 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
671 +          IsLeptonFootprint = kTRUE;
672 +      } // loop over electrons
673 +      
674 +      //
675 +      // Check for muons
676 +      //
677 +      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
678 +        const mithep::Muon *tmpmu = muonsToVeto[q];
679 +        // 4l muon
680 +        if( pf->HasTrackerTrk() ) {
681 +          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
682 +            IsLeptonFootprint = kTRUE;
683 +        }
684 +        // PF charged
685 +        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
686 +          IsLeptonFootprint = kTRUE;
687 +      } // loop over muons
688 +
689 +
690 +    if (IsLeptonFootprint)
691 +      continue;
692 +
693 +    //
694 +    // Charged Iso Rings
695 +    //
696 +    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
697 +
698 +      if( dr < 0.01 ) continue; // only for muon iso mva?
699 +      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
700 +
701 +      if( pf->HasTrackerTrk() ) {
702 +        if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
703 +        if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
704 +                              << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
705 +                              << dr << endl;
706 +      }
707 +      if( pf->HasGsfTrk() ) {
708 +        if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
709 +        if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
710 +                              << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
711 +                              << dr << endl;
712 +      }
713 +
714 +
715 +      tmpChargedIso += pf->Pt();
716 +    }
717 +
718 +    //
719 +    // Gamma Iso
720 +    //
721 +    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
722 +      tmpGammaIso += pf->Pt();
723 +    }
724 +
725 +    //
726 +    // Other Neutral Iso Rings
727 +    //
728 +    else {
729 +      tmpNeutralHadronIso += pf->Pt();
730 +    }
731 +    
732 +    }
733 +    
734 +  }
735 +  
736 +  fChargedIso   = mu->Pt() * min((tmpChargedIso)/mu->Pt(), 2.5);
737 +  
738 +
739 +  double rho = 0;
740 +  if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
741 +    rho = fPUEnergyDensity->At(0)->Rho();
742 +  
743 +
744 +  fGammaIso = mu->Pt()*max(min((tmpGammaIso
745 +                                -rho*muT.MuonEffectiveArea(muT.kMuGammaIso04,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
746 +                               ,2.5)
747 +                           ,0.0);
748 +  fNeutralHadronIso = mu->Pt()*max(min((tmpNeutralHadronIso
749 +                                        -rho*muT.MuonEffectiveArea(muT.kMuNeutralIso04,
750 +                                                                   mu->Eta(),EffectiveAreaVersion))/mu->Pt()
751 +                                       , 2.5)
752 +                                   , 0.0);
753 +
754 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso;
755 +  
756 +  return pfIso;
757 + }
758 +
759 + //--------------------------------------------------------------------------------------------------
760 + SelectionStatus muonIsoReferenceSelection(ControlFlags &ctrl,
761 +                                          const mithep::Muon * mu,
762 +                                          const mithep::Vertex & vtx,
763 +                                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
764 +                                          const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
765 +                                          mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
766 +                                          vector<const mithep::Muon*> muonsToVeto,
767 +                                          vector<const mithep::Electron*> electronsToVeto)
768 + //--------------------------------------------------------------------------------------------------
769 + {
770 +  
771 +  SelectionStatus status;
772 +  
773 +  double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, fPUEnergyDensity,
774 +                              EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
775 +  bool pass = false;
776 +  if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
777 +  
778 +  if( pass ) {
779 +    status.orStatus(SelectionStatus::LOOSEISO);
780 +    status.orStatus(SelectionStatus::TIGHTISO);
781 +  }
782 +  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
783 +  return status;
784 +  
785 + }
786 +
787 +
788  
789   //--------------------------------------------------------------------------------------------------
790   SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
# Line 556 | Line 798 | SelectionStatus electronIsoMVASelection(
798   //--------------------------------------------------------------------------------------------------
799   {
800  
801 +  if( ctrl.debug ) {
802 +    cout << "electronIsoMVASelection :: muons to veto " << endl;
803 +    for( int i=0; i<muonsToVeto.size(); i++ ) {
804 +      const mithep::Muon * vmu = muonsToVeto[i];
805 +      cout << "\tpt: " << vmu->Pt()
806 +           << "\teta: " << vmu->Eta()
807 +           << "\tphi: " << vmu->Phi()
808 +           << endl;
809 +    }
810 +    cout << "electronIsoMVASelection :: electrson to veto " << endl;
811 +    for( int i=0; i<electronsToVeto.size(); i++ ) {
812 +      const mithep::Electron * vel = electronsToVeto[i];
813 +      cout << "\tpt: " << vel->Pt()
814 +           << "\teta: " << vel->Eta()
815 +           << "\tphi: " << vel->Phi()
816 +           << "\ttrk: " << vel->TrackerTrk()
817 +           << endl;
818 +    }
819 +  }
820 +
821    bool failiso=false;
822  
823    //
824    // tmp iso rings
825    //
826 <  Double_t tmpChargedIso_DR0p0To0p05  = 0;
827 <  Double_t tmpChargedIso_DR0p05To0p1  = 0;
828 <  Double_t tmpChargedIso_DR0p1To0p15  = 0;
567 <  Double_t tmpChargedIso_DR0p15To0p2  = 0;
568 <  Double_t tmpChargedIso_DR0p2To0p25  = 0;
569 <  Double_t tmpChargedIso_DR0p25To0p3  = 0;
826 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
827 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
828 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
829    Double_t tmpChargedIso_DR0p3To0p4  = 0;
830    Double_t tmpChargedIso_DR0p4To0p5  = 0;
831 +  Double_t tmpChargedIso_DR0p5To0p7  = 0;
832  
833 <  Double_t tmpGammaIso_DR0p0To0p05  = 0;
834 <  Double_t tmpGammaIso_DR0p05To0p1  = 0;
835 <  Double_t tmpGammaIso_DR0p1To0p15  = 0;
576 <  Double_t tmpGammaIso_DR0p15To0p2  = 0;
577 <  Double_t tmpGammaIso_DR0p2To0p25  = 0;
578 <  Double_t tmpGammaIso_DR0p25To0p3  = 0;
833 >  Double_t tmpGammaIso_DR0p0To0p1  = 0;
834 >  Double_t tmpGammaIso_DR0p1To0p2  = 0;
835 >  Double_t tmpGammaIso_DR0p2To0p3  = 0;
836    Double_t tmpGammaIso_DR0p3To0p4  = 0;
837    Double_t tmpGammaIso_DR0p4To0p5  = 0;
838 +  Double_t tmpGammaIso_DR0p5To0p7  = 0;
839  
840 <  Double_t tmpNeutralHadronIso_DR0p0To0p05  = 0;
841 <  Double_t tmpNeutralHadronIso_DR0p05To0p1  = 0;
842 <  Double_t tmpNeutralHadronIso_DR0p1To0p15  = 0;
585 <  Double_t tmpNeutralHadronIso_DR0p15To0p2  = 0;
586 <  Double_t tmpNeutralHadronIso_DR0p2To0p25  = 0;
587 <  Double_t tmpNeutralHadronIso_DR0p25To0p3  = 0;
840 >  Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
841 >  Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
842 >  Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
843    Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
844    Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
845 +  Double_t tmpNeutralHadronIso_DR0p5To0p7  = 0;
846 +
847          
591  Double_t tmp2ChargedIso_DR0p5To1p0  = 0;
848  
849    //
850    // final rings for the MVA
# Line 617 | Line 873 | SelectionStatus electronIsoMVASelection(
873    //
874    for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
875      const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
620
876      Double_t deta = (ele->Eta() - pf->Eta());
877      Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
878      Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
879 <    if (dr > 1.0) continue;
879 >    if (dr >= 0.5) continue;
880 >    if(ctrl.debug) {
881 >      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
882 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
883 >      cout << endl;
884 >    }
885  
886 <    if (pf->PFType() == PFCandidate::eElectron && pf->TrackerTrk() == ele->TrackerTrk() ) continue;
886 >
887 >    if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
888 >         (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
889 >    
890  
891      //
892      // Lepton Footprint Removal
# Line 636 | Line 899 | SelectionStatus electronIsoMVASelection(
899        //
900        for (Int_t q=0; q < electronsToVeto.size(); ++q) {
901          const mithep::Electron *tmpele = electronsToVeto[q];
902 <        // PF electron
903 <        if( pf->PFType() == PFCandidate::eElectron && pf->TrackerTrk() == tmpele->TrackerTrk() )
904 <          IsLeptonFootprint = kTRUE;
902 >        // 4l electron
903 >        if( pf->HasTrackerTrk()  ) {
904 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
905 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
906 >            IsLeptonFootprint = kTRUE;
907 >          }
908 >        }
909 >        if( pf->HasGsfTrk()  ) {
910 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
911 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
912 >            IsLeptonFootprint = kTRUE;
913 >          }
914 >        }
915          // PF charged
916          if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
917 <            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
917 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
918 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
919            IsLeptonFootprint = kTRUE;
920 +        }
921          // PF gamma
922 <        if (pf->PFType() == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
923 <            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
922 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
923 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
924 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
925            IsLeptonFootprint = kTRUE;
926 +        }
927        } // loop over electrons
928        
929        //
# Line 654 | Line 931 | SelectionStatus electronIsoMVASelection(
931        //
932        for (Int_t q=0; q < muonsToVeto.size(); ++q) {
933          const mithep::Muon *tmpmu = muonsToVeto[q];
934 <        // PF muons
935 <        if (pf->PFType() == PFCandidate::eMuon && pf->TrackerTrk() == tmpmu->TrackerTrk() )
936 <          IsLeptonFootprint = kTRUE;
934 >        // 4l muon
935 >        if( pf->HasTrackerTrk() ) {
936 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
937 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
938 >            IsLeptonFootprint = kTRUE;
939 >          }
940 >        }
941          // PF charged
942 <        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
942 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
943 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
944            IsLeptonFootprint = kTRUE;
945 +        }
946        } // loop over muons
947  
948  
# Line 669 | Line 952 | SelectionStatus electronIsoMVASelection(
952      //
953      // Charged Iso Rings
954      //
955 <    if (pf->Charge() != 0 && pf->HasTrackerTrk() ) {
955 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
956 >
957 >      if( pf->HasTrackerTrk() )
958 >        if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
959 >      if( pf->HasGsfTrk() )
960 >        if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
961  
674      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
675                
962        // Veto any PFmuon, or PFEle
963 <      if (pf->PFType() == PFCandidate::eElectron || pf->PFType() == PFCandidate::eMuon) continue;
963 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
964  
965        // Footprint Veto
966 <      if (dr < 0.01) continue;
966 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
967 >
968 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
969 >                           << "\ttype: " << pf->PFType()
970 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
971 >
972 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
973 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
974 >      if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
975 >      if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
976 >      if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
977 >      if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
978  
682      if (dr < 0.05)               tmpChargedIso_DR0p0To0p05 += pf->Pt();
683      if (dr >= 0.05 && dr < 0.10) tmpChargedIso_DR0p05To0p1 += pf->Pt();
684      if (dr >= 0.10 && dr < 0.15) tmpChargedIso_DR0p1To0p15 += pf->Pt();
685      if (dr >= 0.15 && dr < 0.20) tmpChargedIso_DR0p15To0p2 += pf->Pt();
686      if (dr >= 0.20 && dr < 0.25) tmpChargedIso_DR0p2To0p25 += pf->Pt();
687      if (dr >= 0.25 && dr < 0.3)  tmpChargedIso_DR0p25To0p3 += pf->Pt();
688      if (dr >= 0.3 && dr < 0.4)   tmpChargedIso_DR0p3To0p4  += pf->Pt();
689      if (dr >= 0.4 && dr < 0.5)   tmpChargedIso_DR0p4To0p5  += pf->Pt();
979      }
980  
981      //
982      // Gamma Iso Rings
983      //
984 <    else if (pf->PFType() == PFCandidate::eGamma) {
984 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
985 >
986 >      if (fabs(ele->SCluster()->Eta()) > 1.479) {
987 >        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
988 >      }
989 >
990 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
991 >                           << dr << endl;
992 >
993 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
994 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
995 >      if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
996 >      if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
997 >      if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
998 >      if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
999  
697      if (dr < 0.05)               tmpGammaIso_DR0p0To0p05 += pf->Pt();
698      if (dr >= 0.05 && dr < 0.10) tmpGammaIso_DR0p05To0p1 += pf->Pt();
699      if (dr >= 0.10 && dr < 0.15) tmpGammaIso_DR0p1To0p15 += pf->Pt();
700      if (dr >= 0.15 && dr < 0.20) tmpGammaIso_DR0p15To0p2 += pf->Pt();
701      if (dr >= 0.20 && dr < 0.25) tmpGammaIso_DR0p2To0p25 += pf->Pt();
702      if (dr >= 0.25 && dr < 0.3)  tmpGammaIso_DR0p25To0p3 += pf->Pt();
703      if (dr >= 0.3 && dr < 0.4)   tmpGammaIso_DR0p3To0p4  += pf->Pt();
704      if (dr >= 0.4 && dr < 0.5)   tmpGammaIso_DR0p4To0p5  += pf->Pt();
1000      }
1001  
1002      //
1003      // Other Neutral Iso Rings
1004      //
1005      else {
1006 <      if (dr < 0.05)               tmpNeutralHadronIso_DR0p0To0p05 += pf->Pt();
1007 <      if (dr >= 0.05 && dr < 0.10) tmpNeutralHadronIso_DR0p05To0p1 += pf->Pt();
1008 <      if (dr >= 0.10 && dr < 0.15) tmpNeutralHadronIso_DR0p1To0p15 += pf->Pt();
1009 <      if (dr >= 0.15 && dr < 0.20) tmpNeutralHadronIso_DR0p15To0p2 += pf->Pt();
1010 <      if (dr >= 0.20 && dr < 0.25) tmpNeutralHadronIso_DR0p2To0p25 += pf->Pt();
1011 <      if (dr >= 0.25 && dr < 0.3)  tmpNeutralHadronIso_DR0p25To0p3 += pf->Pt();
1012 <      if (dr >= 0.3 && dr < 0.4)   tmpNeutralHadronIso_DR0p3To0p4  += pf->Pt();
1013 <      if (dr >= 0.4 && dr < 0.5)   tmpNeutralHadronIso_DR0p4To0p5  += pf->Pt();
1006 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
1007 >                           << dr << endl;
1008 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
1009 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
1010 >      if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
1011 >      if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
1012 >      if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
1013 >      if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
1014      }
1015  
1016      }
1017  
1018    }
1019  
1020 <  fChargedIso_DR0p0To0p1   = min((tmpChargedIso_DR0p0To0p05 + tmpChargedIso_DR0p05To0p1 )/ele->Pt(), 2.5);
1021 <  fChargedIso_DR0p1To0p2   = min((tmpChargedIso_DR0p1To0p15 + tmpChargedIso_DR0p15To0p2)/ele->Pt(), 2.5);
1022 <  fChargedIso_DR0p2To0p3   = min((tmpChargedIso_DR0p2To0p25 + tmpChargedIso_DR0p25To0p3)/ele->Pt(), 2.5);
1020 >  fChargedIso_DR0p0To0p1   = min((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
1021 >  fChargedIso_DR0p1To0p2   = min((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
1022 >  fChargedIso_DR0p2To0p3   = min((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
1023    fChargedIso_DR0p3To0p4   = min((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
1024    fChargedIso_DR0p4To0p5   = min((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
1025  
1026    double rho = 0;
1027    if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1028      rho = fPUEnergyDensity->At(0)->Rho();
1029 <  
1030 <
1031 <  fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p05 + tmpGammaIso_DR0p05To0p1
1029 >
1030 >  if( ctrl.debug) {
1031 >    cout << "RHO: " << rho << endl;
1032 >    cout << "eta: " << ele->SCluster()->Eta() << endl;
1033 >    cout << "target: " << EffectiveAreaVersion << endl;
1034 >    cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1035 >                                                       ele->SCluster()->Eta(),
1036 >                                                       EffectiveAreaVersion)
1037 >         << endl;
1038 >    cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1039 >                                                       ele->SCluster()->Eta(),
1040 >                                                       EffectiveAreaVersion)
1041 >         << endl;
1042 >    cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1043 >                                                       ele->SCluster()->Eta(),
1044 >                                                       EffectiveAreaVersion)
1045 >         << endl;
1046 >    cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1047 >                                                       ele->SCluster()->Eta(),
1048 >                                                       EffectiveAreaVersion)
1049 >         << endl;
1050 >  }
1051 >
1052 >  fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p1
1053                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
1054 <                                                              ele->Eta(),
1054 >                                                              ele->SCluster()->Eta(),
1055                                                                EffectiveAreaVersion))/ele->Pt()
1056                                   ,2.5)
1057                               ,0.0);
1058 <  fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p15 + tmpGammaIso_DR0p15To0p2
1058 >  fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p2
1059                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
1060 <                                                              ele->Eta(),
1060 >                                                              ele->SCluster()->Eta(),
1061                                                                EffectiveAreaVersion))/ele->Pt()
1062                                   ,2.5)
1063                               ,0.0);
1064 <  fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p25 + tmpGammaIso_DR0p25To0p3
1064 >  fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p3
1065                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
1066 <                                                              ele->Eta()
1066 >                                                              ele->SCluster()->Eta()
1067                                                                ,EffectiveAreaVersion))/ele->Pt()
1068                                   ,2.5)
1069                               ,0.0);
1070    fGammaIso_DR0p3To0p4 = max(min((tmpGammaIso_DR0p3To0p4
1071                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
1072 <                                                              ele->Eta(),
1072 >                                                              ele->SCluster()->Eta(),
1073                                                                EffectiveAreaVersion))/ele->Pt()
1074                                   ,2.5)
1075                               ,0.0);
1076    fGammaIso_DR0p4To0p5 = max(min((tmpGammaIso_DR0p4To0p5
1077                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
1078 <                                                              ele->Eta(),
1078 >                                                              ele->SCluster()->Eta(),
1079                                                                EffectiveAreaVersion))/ele->Pt()
1080                                   ,2.5)
1081                               ,0.0);
1082  
1083  
1084 <  fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p05 + tmpNeutralHadronIso_DR0p05To0p1
1084 >  fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p1
1085                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1086 <                                                                 ele->Eta(),EffectiveAreaVersion))/ele->Pt()
1086 >                                                                 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1087                                           , 2.5)
1088                                       , 0.0);
1089 <  fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p15 + tmpNeutralHadronIso_DR0p15To0p2
1089 >  fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p2
1090                                              -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1091 <                                                                   ele->Eta(),EffectiveAreaVersion))/ele->Pt()
1091 >                                                                   ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1092                                             , 2.5)
1093                                         , 0.0);
1094 <  fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p25 + tmpNeutralHadronIso_DR0p25To0p3
1094 >  fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p3
1095                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1096 <                                                                 ele->Eta(),EffectiveAreaVersion))/ele->Pt()
1096 >                                                                 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1097                                           , 2.5)
1098                                       , 0.0);
1099    fNeutralHadronIso_DR0p3To0p4 = max(min((tmpNeutralHadronIso_DR0p3To0p4
1100                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1101 <                                                                 ele->Eta(), EffectiveAreaVersion))/ele->Pt()
1101 >                                                                 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1102                                           , 2.5)
1103                                       , 0.0);
1104    fNeutralHadronIso_DR0p4To0p5 = max(min((tmpNeutralHadronIso_DR0p4To0p5
1105                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
1106 <                                                                 ele->Eta(), EffectiveAreaVersion))/ele->Pt()
1106 >                                                                 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1107                                           , 2.5)
1108                                       , 0.0);
1109  
1110    double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
1111 <                                             ele->Eta(),
1112 <                                             fChargedIso_DR0p0To0p1,
1113 <                                             fChargedIso_DR0p1To0p2,
1114 <                                             fChargedIso_DR0p2To0p3,
1115 <                                             fChargedIso_DR0p3To0p4,
1116 <                                             fChargedIso_DR0p4To0p5,
1117 <                                             fGammaIso_DR0p0To0p1,
1118 <                                             fGammaIso_DR0p1To0p2,
1119 <                                             fGammaIso_DR0p2To0p3,
1120 <                                             fGammaIso_DR0p3To0p4,
1121 <                                             fGammaIso_DR0p4To0p5,
1122 <                                             fNeutralHadronIso_DR0p0To0p1,
1123 <                                             fNeutralHadronIso_DR0p1To0p2,
1124 <                                             fNeutralHadronIso_DR0p2To0p3,
1125 <                                             fNeutralHadronIso_DR0p3To0p4,
1126 <                                             fNeutralHadronIso_DR0p4To0p5,
1127 <                                             ctrl.debug);
1111 >                                                ele->SCluster()->Eta(),
1112 >                                                fChargedIso_DR0p0To0p1,
1113 >                                                fChargedIso_DR0p1To0p2,
1114 >                                                fChargedIso_DR0p2To0p3,
1115 >                                                fChargedIso_DR0p3To0p4,
1116 >                                                fChargedIso_DR0p4To0p5,
1117 >                                                fGammaIso_DR0p0To0p1,
1118 >                                                fGammaIso_DR0p1To0p2,
1119 >                                                fGammaIso_DR0p2To0p3,
1120 >                                                fGammaIso_DR0p3To0p4,
1121 >                                                fGammaIso_DR0p4To0p5,
1122 >                                                fNeutralHadronIso_DR0p0To0p1,
1123 >                                                fNeutralHadronIso_DR0p1To0p2,
1124 >                                                fNeutralHadronIso_DR0p2To0p3,
1125 >                                                fNeutralHadronIso_DR0p3To0p4,
1126 >                                                fNeutralHadronIso_DR0p4To0p5,
1127 >                                                ctrl.debug);
1128  
1129    SelectionStatus status;
1130    bool pass = false;
# Line 827 | Line 1143 | SelectionStatus electronIsoMVASelection(
1143    if (subdet == 0 && ptBin == 1) MVABin = 3;
1144    if (subdet == 1 && ptBin == 1) MVABin = 4;
1145    if (subdet == 2 && ptBin == 1) MVABin = 5;
830
831  if( MVABin == 0 && mvaval > ELECTRON_ISOMVA_CUT_BIN0 ) pass = true;
832  if( MVABin == 1 && mvaval > ELECTRON_ISOMVA_CUT_BIN1 ) pass = true;
833  if( MVABin == 2 && mvaval > ELECTRON_ISOMVA_CUT_BIN2 ) pass = true;
834  if( MVABin == 3 && mvaval > ELECTRON_ISOMVA_CUT_BIN3 ) pass = true;
835  if( MVABin == 4 && mvaval > ELECTRON_ISOMVA_CUT_BIN4 ) pass = true;
836  if( MVABin == 5 && mvaval > ELECTRON_ISOMVA_CUT_BIN5 ) pass = true;
1146  
1147 <  if( pass ) {
1148 <    status.orStatus(SelectionStatus::LOOSEISO);
1149 <    status.orStatus(SelectionStatus::TIGHTISO);
1150 <  }
1147 >  pass = false;
1148 >  if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN0 ) pass = true;
1149 >  if( MVABin == 1 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN1 ) pass = true;
1150 >  if( MVABin == 2 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN2 ) pass = true;
1151 >  if( MVABin == 3 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN3 ) pass = true;
1152 >  if( MVABin == 4 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN4 ) pass = true;
1153 >  if( MVABin == 5 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN5 ) pass = true;
1154 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
1155 >
1156 >  pass = false;
1157 >  if( MVABin == 0 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN0 ) pass = true;
1158 >  if( MVABin == 1 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN1 ) pass = true;
1159 >  if( MVABin == 2 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN2 ) pass = true;
1160 >  if( MVABin == 3 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN3 ) pass = true;
1161 >  if( MVABin == 4 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN4 ) pass = true;
1162 >  if( MVABin == 5 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN5 ) pass = true;
1163 >  if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
1164 >
1165    if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1166    return status;
1167 <
1167 >  
1168   }
1169  
1170  
# Line 858 | Line 1181 | void initElectronIsoMVA() {
1181                          mithep::ElectronIDMVA::kIsoRingsV0,
1182                          kTRUE, weightFiles);
1183   }
1184 +
1185 +
1186 +
1187 + //--------------------------------------------------------------------------------------------------
1188 + float electronPFIso04(ControlFlags &ctrl,
1189 +                                const mithep::Electron * ele,
1190 +                                const mithep::Vertex & vtx,
1191 +                                const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1192 +                                const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1193 +                                mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1194 +                                vector<const mithep::Muon*> muonsToVeto,
1195 +                                vector<const mithep::Electron*> electronsToVeto)
1196 + //--------------------------------------------------------------------------------------------------
1197 + {
1198 +
1199 +  if( ctrl.debug ) {
1200 +    cout << "electronIsoMVASelection :: muons to veto " << endl;
1201 +    for( int i=0; i<muonsToVeto.size(); i++ ) {
1202 +      const mithep::Muon * vmu = muonsToVeto[i];
1203 +      cout << "\tpt: " << vmu->Pt()
1204 +           << "\teta: " << vmu->Eta()
1205 +           << "\tphi: " << vmu->Phi()
1206 +           << endl;
1207 +    }
1208 +    cout << "electronIsoMVASelection :: electrson to veto " << endl;
1209 +    for( int i=0; i<electronsToVeto.size(); i++ ) {
1210 +      const mithep::Electron * vel = electronsToVeto[i];
1211 +      cout << "\tpt: " << vel->Pt()
1212 +           << "\teta: " << vel->Eta()
1213 +           << "\tphi: " << vel->Phi()
1214 +           << "\ttrk: " << vel->TrackerTrk()
1215 +           << endl;
1216 +    }
1217 +  }
1218 +
1219 +  bool failiso=false;
1220 +
1221 +  //
1222 +  // tmp iso
1223 +  //
1224 +  Double_t tmpChargedIso        = 0;
1225 +  Double_t tmpGammaIso          = 0;
1226 +  Double_t tmpNeutralHadronIso  = 0;
1227 +
1228 +  //
1229 +  // final iso
1230 +  //
1231 +  Double_t fChargedIso;
1232 +  Double_t fGammaIso;
1233 +  Double_t fNeutralHadronIso;
1234 +
1235 +
1236 +  //
1237 +  //Loop over PF Candidates
1238 +  //
1239 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1240 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1241 +    Double_t deta = (ele->Eta() - pf->Eta());
1242 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
1243 +    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
1244 +    if (dr >= 0.4) continue;
1245 +    if(ctrl.debug) {
1246 +      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
1247 +      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
1248 +      cout << endl;
1249 +    }
1250 +
1251 +
1252 +    if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
1253 +         (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
1254 +    
1255 +
1256 +    //
1257 +    // Lepton Footprint Removal
1258 +    //
1259 +    Bool_t IsLeptonFootprint = kFALSE;
1260 +    if (dr < 1.0) {
1261 +
1262 +      //
1263 +      // Check for electrons
1264 +      //
1265 +      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1266 +        const mithep::Electron *tmpele = electronsToVeto[q];
1267 +        // 4l electron
1268 +        if( pf->HasTrackerTrk()  ) {
1269 +          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
1270 +            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
1271 +            IsLeptonFootprint = kTRUE;
1272 +          }
1273 +        }
1274 +        if( pf->HasGsfTrk()  ) {
1275 +          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
1276 +            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
1277 +            IsLeptonFootprint = kTRUE;
1278 +          }
1279 +        }
1280 +        // PF charged
1281 +        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
1282 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
1283 +          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
1284 +          IsLeptonFootprint = kTRUE;
1285 +        }
1286 +        // PF gamma
1287 +        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1288 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
1289 +          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1290 +          IsLeptonFootprint = kTRUE;
1291 +        }
1292 +      } // loop over electrons
1293 +      
1294 +      //
1295 +      // Check for muons
1296 +      //
1297 +      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1298 +        const mithep::Muon *tmpmu = muonsToVeto[q];
1299 +        // 4l muon
1300 +        if( pf->HasTrackerTrk() ) {
1301 +          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
1302 +            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
1303 +            IsLeptonFootprint = kTRUE;
1304 +          }
1305 +        }
1306 +        // PF charged
1307 +        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
1308 +          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
1309 +          IsLeptonFootprint = kTRUE;
1310 +        }
1311 +      } // loop over muons
1312 +
1313 +
1314 +    if (IsLeptonFootprint)
1315 +      continue;
1316 +
1317 +    //
1318 +    // Charged Iso Rings
1319 +    //
1320 +    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1321 +
1322 +      if( pf->HasTrackerTrk() )
1323 +        if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1324 +      if( pf->HasGsfTrk() )
1325 +        if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1326 +
1327 +      // Veto any PFmuon, or PFEle
1328 +      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1329 +
1330 +      // Footprint Veto
1331 +      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
1332 +
1333 +      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
1334 +                           << "\ttype: " << pf->PFType()
1335 +                           << "\ttrk: " << pf->TrackerTrk() << endl;
1336 +
1337 +      tmpChargedIso += pf->Pt();
1338 +    }
1339 +
1340 +    //
1341 +    // Gamma Iso
1342 +    //
1343 +    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1344 +
1345 +      if (fabs(ele->SCluster()->Eta()) > 1.479) {
1346 +        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
1347 +      }
1348 +      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
1349 +                           << dr << endl;
1350 +      tmpGammaIso += pf->Pt();
1351 +    }
1352 +
1353 +    //
1354 +    // Neutral Iso
1355 +    //
1356 +    else {
1357 +      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
1358 +                           << dr << endl;
1359 +      tmpNeutralHadronIso += pf->Pt();
1360 +    }
1361 +
1362 +    }
1363 +
1364 +  }
1365 +
1366 +  fChargedIso   = ele->Pt()*min((tmpChargedIso)/ele->Pt(), 2.5);
1367 +
1368 +  double rho = 0;
1369 +  if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1370 +    rho = fPUEnergyDensity->At(0)->Rho();
1371 +
1372 +  if( ctrl.debug) {
1373 +    cout << "RHO: " << rho << endl;
1374 +    cout << "eta: " << ele->SCluster()->Eta() << endl;
1375 +    cout << "target: " << EffectiveAreaVersion << endl;
1376 +    cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1377 +                                                       ele->SCluster()->Eta(),
1378 +                                                       EffectiveAreaVersion)
1379 +         << endl;
1380 +    cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1381 +                                                       ele->SCluster()->Eta(),
1382 +                                                       EffectiveAreaVersion)
1383 +         << endl;
1384 +    cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1385 +                                                       ele->SCluster()->Eta(),
1386 +                                                       EffectiveAreaVersion)
1387 +         << endl;
1388 +    cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1389 +                                                       ele->SCluster()->Eta(),
1390 +                                                       EffectiveAreaVersion)
1391 +         << endl;
1392 +  }
1393 +
1394 +  fGammaIso = ele->Pt()*max(min((tmpGammaIso
1395 +                       -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIso04,
1396 +                                                       ele->SCluster()->Eta(),
1397 +                                                       EffectiveAreaVersion))/ele->Pt()
1398 +                      ,2.5)
1399 +                  ,0.0);
1400 +  fNeutralHadronIso = ele->Pt()*max(min((tmpNeutralHadronIso
1401 +                               -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIso04,
1402 +                                                               ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1403 +                              , 2.5)
1404 +                          , 0.0);
1405 +
1406 +  double pfiso = fChargedIso + fGammaIso + fNeutralHadronIso;
1407 +
1408 +  return pfiso;
1409 + }
1410 +
1411 + //--------------------------------------------------------------------------------------------------
1412 + SelectionStatus electronIsoReferenceSelection(ControlFlags &ctrl,
1413 +                                              const mithep::Electron * ele,
1414 +                                              const mithep::Vertex & vtx,
1415 +                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1416 +                                              const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1417 +                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1418 +                                              vector<const mithep::Muon*> muonsToVeto,
1419 +                                              vector<const mithep::Electron*> electronsToVeto)
1420 + //--------------------------------------------------------------------------------------------------
1421 + {
1422 +
1423 +  SelectionStatus status;
1424 +
1425 +  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, fPUEnergyDensity,
1426 +                                  EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
1427 +  bool pass = false;
1428 +  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
1429 +
1430 +  if( pass ) {
1431 +    status.orStatus(SelectionStatus::LOOSEISO);
1432 +    status.orStatus(SelectionStatus::TIGHTISO);
1433 +  }
1434 +  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1435 +  return status;
1436 +
1437 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines