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.8 by khahn, Wed May 2 17:50:58 2012 UTC vs.
Revision 1.32 by anlevin, Fri Oct 5 09:22:32 2012 UTC

# Line 16 | Line 16 | 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,
28 >                         const mithep::Vertex * vtx,
29                           const mithep::Array<mithep::PFCandidate> * fPFCandidates,
30                           const Double_t dRMax)
31   //--------------------------------------------------------------------------------------------------
# Line 27 | Line 34 | Float_t computePFMuonIso(const mithep::M
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;
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++) {
# Line 39 | Line 46 | Float_t computePFMuonIso(const mithep::M
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;
49 >    Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(*vtx) - zLepton) : 0;
50      if(dz >= dzMax) continue;
51      
52      // check iso cone
# Line 53 | Line 60 | Float_t computePFMuonIso(const mithep::M
60  
61   //--------------------------------------------------------------------------------------------------
62   Float_t computePFEleIso(const mithep::Electron *electron,
63 <                        const mithep::Vertex & fVertex,
63 >                        const mithep::Vertex * fVertex,
64                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
65                          const Double_t dRMax)
66   //--------------------------------------------------------------------------------------------------
# Line 62 | Line 69 | Float_t computePFEleIso(const mithep::El
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;
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++) {
# Line 71 | Line 78 | Float_t computePFEleIso(const mithep::El
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;
81 >    Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(*fVertex) - zLepton) : 0;
82      if(dz >= dzMax) continue;
83      
84      // remove THE electron
# Line 157 | Line 164 | bool pairwiseIsoSelection( ControlFlags
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();      
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 ) {
# Line 175 | Line 182 | bool pairwiseIsoSelection( ControlFlags
182   //--------------------------------------------------------------------------------------------------
183   SelectionStatus muonIsoSelection(ControlFlags &ctrl,
184                                   const mithep::Muon * mu,
185 <                                 const mithep::Vertex & vtx,
185 >                                 const mithep::Vertex * vtx,
186                                   const mithep::Array<mithep::PFCandidate> * fPFCandidateCol   )
187   //--------------------------------------------------------------------------------------------------
188   {
# Line 205 | Line 212 | SelectionStatus muonIsoSelection(Control
212   //--------------------------------------------------------------------------------------------------
213   SelectionStatus electronIsoSelection(ControlFlags &ctrl,
214                                       const mithep::Electron * ele,
215 <                                     const mithep::Vertex &fVertex,
215 >                                     const mithep::Vertex *fVertex,
216                                       const mithep::Array<mithep::PFCandidate> * fPFCandidates)
217   //--------------------------------------------------------------------------------------------------
218   {
# Line 220 | Line 227 | SelectionStatus electronIsoSelection(Con
227    if( ele->IsEB() && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EB_LOWPT ) {
228      failiso = true;
229    }
223  if(ctrl.debug) cout << "before iso check ..." << endl;
230    if( !(ele->IsEB()) && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EE_HIGHPT ) {
225    if(ctrl.debug) cout << "\tit fails ..." << endl;
231      failiso = true;
232    }
233    if( !(ele->IsEB()) && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EE_LOWPT ) {
# Line 245 | Line 250 | bool noIso(ControlFlags &, vector<Simple
250          return true;
251   }
252  
253 +
254   //--------------------------------------------------------------------------------------------------
255   SelectionStatus muonIsoMVASelection(ControlFlags &ctrl,
256                                      const mithep::Muon * mu,
257 <                                    const mithep::Vertex & vtx,
257 >                                    const mithep::Vertex * vtx,
258                                      const mithep::Array<mithep::PFCandidate> * fPFCandidates,
259                                      const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
260                                      mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
# Line 332 | Line 338 | SelectionStatus muonIsoMVASelection(Cont
338    //Loop over PF Candidates
339    //
340    for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
341 +
342 +    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
343 +
344      const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
345  
346      Double_t deta = (mu->Eta() - pf->Eta());
# Line 362 | Line 371 | SelectionStatus muonIsoMVASelection(Cont
371              IsLeptonFootprint = kTRUE;
372          }
373          // PF charged
374 <        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
374 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479
375              && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
376            IsLeptonFootprint = kTRUE;
377          // PF gamma
378 <        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
378 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
379              && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
380            IsLeptonFootprint = kTRUE;
381        } // loop over electrons
382        
383 +      /* KH - commented for sync
384        //
385        // Check for muons
386        //
# Line 385 | Line 395 | SelectionStatus muonIsoMVASelection(Cont
395          if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
396            IsLeptonFootprint = kTRUE;
397        } // loop over muons
398 <
398 >      */
399  
400      if (IsLeptonFootprint)
401        continue;
# Line 398 | Line 408 | SelectionStatus muonIsoMVASelection(Cont
408        if( dr < 0.01 ) continue; // only for muon iso mva?
409        if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
410  
411 <      if( pf->HasTrackerTrk() ) {
412 <        if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
413 <        if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
414 <                              << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
415 <                              << dr << endl;
416 <      }
417 <      if( pf->HasGsfTrk() ) {
418 <        if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
419 <        if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
420 <                              << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
421 <                              << dr << endl;
422 <      }
411 > //       if( pf->HasTrackerTrk() ) {
412 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
413 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
414 > //                            << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
415 > //                            << dr << endl;
416 > //       }
417 > //       if( pf->HasGsfTrk() ) {
418 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
419 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
420 > //                            << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
421 > //                            << dr << endl;
422 > //       }
423  
424        // Footprint Veto
425        if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
# Line 448 | Line 458 | SelectionStatus muonIsoMVASelection(Cont
458  
459    }
460  
461 <  fChargedIso_DR0p0To0p1   = min((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
462 <  fChargedIso_DR0p1To0p2   = min((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
463 <  fChargedIso_DR0p2To0p3   = min((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
464 <  fChargedIso_DR0p3To0p4   = min((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
465 <  fChargedIso_DR0p4To0p5   = min((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
461 >  fChargedIso_DR0p0To0p1   = fmin((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
462 >  fChargedIso_DR0p1To0p2   = fmin((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
463 >  fChargedIso_DR0p2To0p3   = fmin((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
464 >  fChargedIso_DR0p3To0p4   = fmin((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
465 >  fChargedIso_DR0p4To0p5   = fmin((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
466  
467  
468    double rho = 0;
469    if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
470      rho = fPUEnergyDensity->At(0)->Rho();
471 +
472 + //   if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
473 + //     rho = fPUEnergyDensity->At(0)->RhoLowEta();
474    
475 +  // WARNING!!!!  
476 +  // hardcode for sync ...
477 +  EffectiveAreaVersion = muT.kMuEAData2011;
478 +  // WARNING!!!!  
479 +
480  
481 <  fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p1
481 >  fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
482                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
483                                   ,2.5)
484                               ,0.0);
485 <  fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p2
485 >  fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
486                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p1To0p2,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
487                                   ,2.5)
488                               ,0.0);
489 <  fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p3
489 >  fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
490                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
491                                   ,2.5)
492                               ,0.0);
493 <  fGammaIso_DR0p3To0p4 = max(min((tmpGammaIso_DR0p3To0p4
493 >  fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
494                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p3To0p4,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
495                                   ,2.5)
496                               ,0.0);
497 <  fGammaIso_DR0p4To0p5 = max(min((tmpGammaIso_DR0p4To0p5
497 >  fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
498                                    -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p4To0p5,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
499                                   ,2.5)
500                               ,0.0);
501  
502  
503  
504 <  fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p1
504 >  fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
505                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p0To0p1,
506                                                                   mu->Eta(),EffectiveAreaVersion))/mu->Pt()
507                                           , 2.5)
508                                       , 0.0);
509 <  fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p2
509 >  fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
510                                              -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p1To0p2,
511                                                                     mu->Eta(),EffectiveAreaVersion))/mu->Pt()
512                                             , 2.5)
513                                         , 0.0);
514 <  fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p3
514 >  fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
515                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p2To0p3,
516                                                                   mu->Eta(),EffectiveAreaVersion))/mu->Pt()
517                                           , 2.5)
518                                       , 0.0);
519 <  fNeutralHadronIso_DR0p3To0p4 = max(min((tmpNeutralHadronIso_DR0p3To0p4
519 >  fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
520                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p3To0p4,
521                                                                   mu->Eta(), EffectiveAreaVersion))/mu->Pt()
522                                           , 2.5)
523                                       , 0.0);
524 <  fNeutralHadronIso_DR0p4To0p5 = max(min((tmpNeutralHadronIso_DR0p4To0p5
524 >  fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
525                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p4To0p5,
526                                                                   mu->Eta(), EffectiveAreaVersion))/mu->Pt()
527                                           , 2.5)
# Line 511 | Line 529 | SelectionStatus muonIsoMVASelection(Cont
529  
530  
531    double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
532 <                                             mu->Eta(),
533 <                                             fChargedIso_DR0p0To0p1,
534 <                                             fChargedIso_DR0p1To0p2,
535 <                                             fChargedIso_DR0p2To0p3,
536 <                                             fChargedIso_DR0p3To0p4,
537 <                                             fChargedIso_DR0p4To0p5,
538 <                                             fGammaIso_DR0p0To0p1,
539 <                                             fGammaIso_DR0p1To0p2,
540 <                                             fGammaIso_DR0p2To0p3,
541 <                                             fGammaIso_DR0p3To0p4,
542 <                                             fGammaIso_DR0p4To0p5,
543 <                                             fNeutralHadronIso_DR0p0To0p1,
544 <                                             fNeutralHadronIso_DR0p1To0p2,
545 <                                             fNeutralHadronIso_DR0p2To0p3,
546 <                                             fNeutralHadronIso_DR0p3To0p4,
547 <                                             fNeutralHadronIso_DR0p4To0p5,
548 <                                             ctrl.debug);
532 >                                               mu->Eta(),
533 >                                               mu->IsGlobalMuon(),
534 >                                               mu->IsTrackerMuon(),
535 >                                               fChargedIso_DR0p0To0p1,
536 >                                               fChargedIso_DR0p1To0p2,
537 >                                               fChargedIso_DR0p2To0p3,
538 >                                               fChargedIso_DR0p3To0p4,
539 >                                               fChargedIso_DR0p4To0p5,
540 >                                               fGammaIso_DR0p0To0p1,
541 >                                               fGammaIso_DR0p1To0p2,
542 >                                               fGammaIso_DR0p2To0p3,
543 >                                               fGammaIso_DR0p3To0p4,
544 >                                               fGammaIso_DR0p4To0p5,
545 >                                               fNeutralHadronIso_DR0p0To0p1,
546 >                                               fNeutralHadronIso_DR0p1To0p2,
547 >                                               fNeutralHadronIso_DR0p2To0p3,
548 >                                               fNeutralHadronIso_DR0p3To0p4,
549 >                                               fNeutralHadronIso_DR0p4To0p5,
550 >                                               ctrl.debug);
551  
552    SelectionStatus status;
553 <  bool pass = false;
553 >  bool pass;
554  
555 +  pass = false;
556    if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
557 <      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN0)   pass = true;
557 >      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_OPT_BIN0)   pass = true;
558    else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
559 <           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN1)  pass = true;
559 >           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_OPT_BIN1)  pass = true;
560    else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
561 <           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN2)  pass = true;
561 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_OPT_BIN2)  pass = true;
562    else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
563 <           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN3)  pass = true;
564 <  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon()
565 <            && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN4)
566 <    pass = true;
563 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_OPT_BIN3)  pass = true;
564 >  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_OPT_BIN4)  pass = true;
565 >  else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_OPT_BIN5)  pass = true;
566 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
567  
568 +  /*
569 +  pass = false;
570 +  if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
571 +      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN0)   pass = true;
572 +  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
573 +           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN1)  pass = true;
574 +  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
575 +           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN2)  pass = true;
576 +  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
577 +           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN3)  pass = true;
578 +  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN4)  pass = true;
579 +  else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN5)  pass = true;
580 +  if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
581 +  */
582 +
583 +  //  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
584 +
585 +  status.isoMVA = mvaval;
586 +
587 +  if(ctrl.debug)  {
588 +    cout << "returning status : " << hex << status.getStatus() << dec << endl;
589 +    cout << "MVAVAL : " << status.isoMVA << endl;
590 +  }
591 +  return status;
592  
593 <  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
593 > }
594  
595 <  if( pass ) {
596 <    status.orStatus(SelectionStatus::LOOSEISO);
597 <    status.orStatus(SelectionStatus::TIGHTISO);
595 >
596 > //--------------------------------------------------------------------------------------------------
597 > SelectionStatus muonIsoMVASelection(ControlFlags &ctrl,
598 >                                    const mithep::Muon * mu,
599 >                                    const mithep::Vertex * vtx,
600 >                                    const mithep::Array<mithep::PFCandidate> * fPFCandidates,
601 >                                    float rho,
602 >                                    //const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
603 >                                    mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
604 >                                    vector<const mithep::Muon*> muonsToVeto,
605 >                                    vector<const mithep::Electron*> electronsToVeto)
606 > //--------------------------------------------------------------------------------------------------
607 > // hacked version
608 > {
609 >
610 >  if( ctrl.debug ) {
611 >    cout << "muonIsoMVASelection :: muons to veto " << endl;
612 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
613 >      const mithep::Muon * vmu = muonsToVeto[i];
614 >      cout << "\tpt: " << vmu->Pt()
615 >           << "\teta: " << vmu->Eta()
616 >           << "\tphi: " << vmu->Phi()
617 >           << endl;
618 >    }
619 >    cout << "muonIsoMVASelection :: electrson to veto " << endl;
620 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
621 >      const mithep::Electron * vel = electronsToVeto[i];
622 >      cout << "\tpt: " << vel->Pt()
623 >           << "\teta: " << vel->Eta()
624 >           << "\tphi: " << vel->Phi()
625 >           << endl;
626 >    }
627 >  }
628 >  bool failiso=false;
629 >
630 >  //
631 >  // tmp iso rings
632 >  //
633 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
634 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
635 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
636 >  Double_t tmpChargedIso_DR0p3To0p4  = 0;
637 >  Double_t tmpChargedIso_DR0p4To0p5  = 0;
638 >  Double_t tmpChargedIso_DR0p5To0p7  = 0;
639 >
640 >  Double_t tmpGammaIso_DR0p0To0p1  = 0;
641 >  Double_t tmpGammaIso_DR0p1To0p2  = 0;
642 >  Double_t tmpGammaIso_DR0p2To0p3  = 0;
643 >  Double_t tmpGammaIso_DR0p3To0p4  = 0;
644 >  Double_t tmpGammaIso_DR0p4To0p5  = 0;
645 >  Double_t tmpGammaIso_DR0p5To0p7  = 0;
646 >
647 >  Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
648 >  Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
649 >  Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
650 >  Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
651 >  Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
652 >  Double_t tmpNeutralHadronIso_DR0p5To0p7  = 0;
653 >
654 >        
655 >
656 >  //
657 >  // final rings for the MVA
658 >  //
659 >  Double_t fChargedIso_DR0p0To0p1;
660 >  Double_t fChargedIso_DR0p1To0p2;
661 >  Double_t fChargedIso_DR0p2To0p3;
662 >  Double_t fChargedIso_DR0p3To0p4;
663 >  Double_t fChargedIso_DR0p4To0p5;
664 >  Double_t fChargedIso_DR0p5To0p7;
665 >
666 >  Double_t fGammaIso_DR0p0To0p1;
667 >  Double_t fGammaIso_DR0p1To0p2;
668 >  Double_t fGammaIso_DR0p2To0p3;
669 >  Double_t fGammaIso_DR0p3To0p4;
670 >  Double_t fGammaIso_DR0p4To0p5;
671 >  Double_t fGammaIso_DR0p5To0p7;
672 >
673 >  Double_t fNeutralHadronIso_DR0p0To0p1;
674 >  Double_t fNeutralHadronIso_DR0p1To0p2;
675 >  Double_t fNeutralHadronIso_DR0p2To0p3;
676 >  Double_t fNeutralHadronIso_DR0p3To0p4;
677 >  Double_t fNeutralHadronIso_DR0p4To0p5;
678 >  Double_t fNeutralHadronIso_DR0p5To0p7;
679 >
680 >
681 >  //
682 >  //Loop over PF Candidates
683 >  //
684 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
685 >
686 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
687 >
688 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
689 >
690 >    Double_t deta = (mu->Eta() - pf->Eta());
691 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
692 >    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
693 >    if (dr > 1.0) continue;
694 >
695 >    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
696 >
697 >    //
698 >    // Lepton Footprint Removal
699 >    //
700 >    Bool_t IsLeptonFootprint = kFALSE;
701 >    if (dr < 1.0) {
702 >
703 >      //
704 >      // Check for electrons
705 >      //
706 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
707 >        const mithep::Electron *tmpele = electronsToVeto[q];
708 >        // 4l electron
709 >        if( pf->HasTrackerTrk() ) {
710 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
711 >            IsLeptonFootprint = kTRUE;
712 >        }
713 >        if( pf->HasGsfTrk() ) {
714 >          if( pf->GsfTrk() == tmpele->GsfTrk() )
715 >            IsLeptonFootprint = kTRUE;
716 >        }
717 >        // PF charged
718 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479
719 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
720 >          IsLeptonFootprint = kTRUE;
721 >        // PF gamma
722 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
723 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
724 >          IsLeptonFootprint = kTRUE;
725 >      } // loop over electrons
726 >      
727 >      /* KH - commented for sync
728 >      //
729 >      // Check for muons
730 >      //
731 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
732 >        const mithep::Muon *tmpmu = muonsToVeto[q];
733 >        // 4l muon
734 >        if( pf->HasTrackerTrk() ) {
735 >          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
736 >            IsLeptonFootprint = kTRUE;
737 >        }
738 >        // PF charged
739 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
740 >          IsLeptonFootprint = kTRUE;
741 >      } // loop over muons
742 >      */
743 >
744 >    if (IsLeptonFootprint)
745 >      continue;
746 >
747 >    //
748 >    // Charged Iso Rings
749 >    //
750 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
751 >
752 >      if( dr < 0.01 ) continue; // only for muon iso mva?
753 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
754 >
755 > //       if( pf->HasTrackerTrk() ) {
756 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
757 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
758 > //                            << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
759 > //                            << dr << endl;
760 > //       }
761 > //       if( pf->HasGsfTrk() ) {
762 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
763 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
764 > //                            << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
765 > //                            << dr << endl;
766 > //       }
767 >
768 >      // Footprint Veto
769 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
770 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
771 >      if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
772 >      if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
773 >      if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
774 >      if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
775 >    }
776 >
777 >    //
778 >    // Gamma Iso Rings
779 >    //
780 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
781 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
782 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
783 >      if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
784 >      if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
785 >      if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
786 >      if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
787 >    }
788 >
789 >    //
790 >    // Other Neutral Iso Rings
791 >    //
792 >    else {
793 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
794 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
795 >      if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
796 >      if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
797 >      if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
798 >      if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
799 >    }
800 >
801 >    }
802 >
803 >  }
804 >
805 >  fChargedIso_DR0p0To0p1   = fmin((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
806 >  fChargedIso_DR0p1To0p2   = fmin((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
807 >  fChargedIso_DR0p2To0p3   = fmin((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
808 >  fChargedIso_DR0p3To0p4   = fmin((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
809 >  fChargedIso_DR0p4To0p5   = fmin((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
810 >
811 >
812 > //   double rho = 0;
813 > //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
814 > //     rho = fPUEnergyDensity->At(0)->Rho();
815 > //   if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
816 > //     rho = fPUEnergyDensity->At(0)->RhoLowEta();
817 >  
818 >  // WARNING!!!!  
819 >  // hardcode for sync ...
820 >  EffectiveAreaVersion = muT.kMuEAData2011;
821 >  // WARNING!!!!  
822 >
823 >
824 >  fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
825 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
826 >                                 ,2.5)
827 >                             ,0.0);
828 >  fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
829 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p1To0p2,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
830 >                                 ,2.5)
831 >                             ,0.0);
832 >  fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
833 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
834 >                                 ,2.5)
835 >                             ,0.0);
836 >  fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
837 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p3To0p4,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
838 >                                 ,2.5)
839 >                             ,0.0);
840 >  fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
841 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p4To0p5,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
842 >                                 ,2.5)
843 >                             ,0.0);
844 >
845 >
846 >
847 >  fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
848 >                                          -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p0To0p1,
849 >                                                                 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
850 >                                         , 2.5)
851 >                                     , 0.0);
852 >  fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
853 >                                            -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p1To0p2,
854 >                                                                   mu->Eta(),EffectiveAreaVersion))/mu->Pt()
855 >                                           , 2.5)
856 >                                       , 0.0);
857 >  fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
858 >                                          -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p2To0p3,
859 >                                                                 mu->Eta(),EffectiveAreaVersion))/mu->Pt()
860 >                                         , 2.5)
861 >                                     , 0.0);
862 >  fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
863 >                                          -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p3To0p4,
864 >                                                                 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
865 >                                         , 2.5)
866 >                                     , 0.0);
867 >  fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
868 >                                          -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p4To0p5,
869 >                                                                 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
870 >                                         , 2.5)
871 >                                     , 0.0);
872 >
873 >
874 >  double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
875 >                                               mu->Eta(),
876 >                                               mu->IsGlobalMuon(),
877 >                                               mu->IsTrackerMuon(),
878 >                                               fChargedIso_DR0p0To0p1,
879 >                                               fChargedIso_DR0p1To0p2,
880 >                                               fChargedIso_DR0p2To0p3,
881 >                                               fChargedIso_DR0p3To0p4,
882 >                                               fChargedIso_DR0p4To0p5,
883 >                                               fGammaIso_DR0p0To0p1,
884 >                                               fGammaIso_DR0p1To0p2,
885 >                                               fGammaIso_DR0p2To0p3,
886 >                                               fGammaIso_DR0p3To0p4,
887 >                                               fGammaIso_DR0p4To0p5,
888 >                                               fNeutralHadronIso_DR0p0To0p1,
889 >                                               fNeutralHadronIso_DR0p1To0p2,
890 >                                               fNeutralHadronIso_DR0p2To0p3,
891 >                                               fNeutralHadronIso_DR0p3To0p4,
892 >                                               fNeutralHadronIso_DR0p4To0p5,
893 >                                               ctrl.debug);
894 >
895 >  SelectionStatus status;
896 >  bool pass;
897 >
898 >  pass = false;
899 >  if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
900 >      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN0)   pass = true;
901 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
902 >           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN1)  pass = true;
903 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
904 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN2)  pass = true;
905 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
906 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN3)  pass = true;
907 >  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN4)  pass = true;
908 >  else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_LOOSE_FORPFID_CUT_BIN5)  pass = true;
909 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
910 >
911 >  /*
912 >  pass = false;
913 >  if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
914 >      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN0)   pass = true;
915 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
916 >           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN1)  pass = true;
917 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
918 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN2)  pass = true;
919 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
920 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN3)  pass = true;
921 >  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN4)  pass = true;
922 >  else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_TIGHT_FORPFID_CUT_BIN5)  pass = true;
923 >  if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
924 >  */
925 >
926 >  //  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
927 >
928 >  status.isoMVA = mvaval;
929 >
930 >  if(ctrl.debug)  {
931 >    cout << "returning status : " << hex << status.getStatus() << dec << endl;
932 >    cout << "MVAVAL : " << status.isoMVA << endl;
933    }
554  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
934    return status;
935  
936   }
937  
938 +
939   //--------------------------------------------------------------------------------------------------
940   void initMuonIsoMVA() {
941   //--------------------------------------------------------------------------------------------------
# Line 574 | Line 954 | void initMuonIsoMVA() {
954  
955  
956  
957 +
958 + //--------------------------------------------------------------------------------------------------
959 + double  muonPFIso04(ControlFlags &ctrl,
960 +                    const mithep::Muon * mu,
961 +                    const mithep::Vertex * vtx,
962 +                    const mithep::Array<mithep::PFCandidate> * fPFCandidates,
963 +                    const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
964 +                    mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
965 +                    vector<const mithep::PFCandidate*> photonsToVeto)
966 + //--------------------------------------------------------------------------------------------------
967 + {
968 +
969 +  extern double gChargedIso;  
970 +  extern double  gGammaIso;      
971 +  extern double  gNeutralIso;
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 +
985 +    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
986 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
987 +
988 +    //
989 +    // veto FSR recovered photons
990 +    //
991 +    bool vetoPhoton = false;
992 +    for( int p=0; p<photonsToVeto.size(); p++ ) {
993 +      if( pf == photonsToVeto[p] ) {
994 +        vetoPhoton = true;
995 +        break;
996 +      }
997 +    } if( vetoPhoton ) continue;
998 +    //
999 +    //
1000 +    //
1001 +
1002 +    Double_t deta = (mu->Eta() - pf->Eta());
1003 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
1004 +    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
1005 +    if (dr > 0.4) continue;
1006 +
1007 +    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
1008 +
1009 +    //
1010 +    // Charged Iso
1011 +    //
1012 +    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1013 +
1014 +      //if( dr < 0.01 ) continue; // only for muon iso mva?
1015 +      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1016 +      fChargedIso += pf->Pt();
1017 +    }
1018 +    
1019 +    //
1020 +    // Gamma Iso
1021 +    //
1022 +    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1023 +      // KH, add to sync
1024 +      if( pf->Pt() > 0.5 )
1025 +      fGammaIso += pf->Pt();
1026 +    }
1027 +    
1028 +    //
1029 +    // Other Neutrals
1030 +    //
1031 +    else {
1032 +      if( pf->Pt() > 0.5 )
1033 +        fNeutralHadronIso += pf->Pt();
1034 +    }
1035 +  }
1036 +
1037 +  double rho=0;
1038 +  if( (EffectiveAreaVersion == mithep::MuonTools::kMuEAFall11MC) ||
1039 +      (EffectiveAreaVersion == mithep::MuonTools::kMuEAData2011) ) {
1040 +    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25()) ||
1041 +          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25())))
1042 +      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25();
1043 +    //rho = fPUEnergyDensity->At(0)->Rho();
1044 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1045 +    EffectiveAreaVersion  = mithep::MuonTools::kMuEAData2011;
1046 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1047 +  } else {
1048 +    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsCentralNeutral()) ||
1049 +          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsCentralNeutral())))
1050 +      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsCentralNeutral();
1051 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1052 +    EffectiveAreaVersion  = mithep::MuonTools::kMuEAData2012;
1053 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1054 +  }
1055 +  if(ctrl.debug) cout << "rho: " << rho << endl;
1056 +
1057 +  TLorentzVector  tmpvec;
1058 +  tmpvec.SetPtEtaPhiM(mu->Pt(),mu->Eta(),mu->Phi(),mu->Mass());
1059 +  for( int p=0; p<photonsToVeto.size(); p++ ) {
1060 +    const mithep::PFCandidate * pf  = photonsToVeto[p];
1061 +    TLorentzVector pfvec;
1062 +    pfvec.SetPtEtaPhiM(pf->Pt(),pf->Eta(),pf->Phi(),0.);
1063 +    tmpvec += pfvec;
1064 +  }
1065 +
1066 +  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
1067 +                                        -rho*muT.MuonEffectiveArea(muT.kMuGammaAndNeutralHadronIso04,
1068 +                                                                   //tmpvec.Eta(),EffectiveAreaVersion)));
1069 +                                                                   mu->Eta(),EffectiveAreaVersion)));
1070 +  gChargedIso = fChargedIso;
1071 +  gGammaIso   = fGammaIso;
1072 +  gNeutralIso = fNeutralHadronIso;
1073 +  
1074 +  if( ctrl.debug ) {
1075 +    cout << "PFiso: " << pfIso
1076 +         << "\tfChargedIso: " << fChargedIso
1077 +         << "\tfGammaIso: " << fGammaIso
1078 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
1079 +         << endl;
1080 +  }
1081 +
1082 +  return pfIso;
1083 + }
1084 +
1085 +
1086 +
1087 +
1088 + //--------------------------------------------------------------------------------------------------
1089 + // hacked version
1090 + double  muonPFIso04(ControlFlags &ctrl,
1091 +                    const mithep::Muon * mu,
1092 +                    const mithep::Vertex * vtx,
1093 +                    const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1094 +                    float rho,
1095 +                    mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1096 +                    vector<const mithep::Muon*> muonsToVeto,
1097 +                    vector<const mithep::Electron*> electronsToVeto)
1098 + //--------------------------------------------------------------------------------------------------
1099 + {
1100 +
1101 +  extern double gChargedIso;  
1102 +  extern double  gGammaIso;      
1103 +  extern double  gNeutralIso;
1104 +  
1105 +  if( ctrl.debug ) {
1106 +    cout << "muonIsoMVASelection :: muons to veto " << endl;
1107 +    for( int i=0; i<muonsToVeto.size(); i++ ) {
1108 +      const mithep::Muon * vmu = muonsToVeto[i];
1109 +      cout << "\tpt: " << vmu->Pt()
1110 +           << "\teta: " << vmu->Eta()
1111 +           << "\tphi: " << vmu->Phi()
1112 +           << endl;
1113 +    }
1114 +    cout << "muonIsoMVASelection :: electrson to veto " << endl;
1115 +    for( int i=0; i<electronsToVeto.size(); i++ ) {
1116 +      const mithep::Electron * vel = electronsToVeto[i];
1117 +      cout << "\tpt: " << vel->Pt()
1118 +           << "\teta: " << vel->Eta()
1119 +           << "\tphi: " << vel->Phi()
1120 +           << endl;
1121 +    }
1122 +  }
1123 +
1124 +  //
1125 +  // final iso
1126 +  //
1127 +  Double_t fChargedIso  = 0.0;
1128 +  Double_t fGammaIso  = 0.0;
1129 +  Double_t fNeutralHadronIso  = 0.0;
1130 +
1131 +  //
1132 +  //Loop over PF Candidates
1133 +  //
1134 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1135 +
1136 +    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1137 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1138 +
1139 +    Double_t deta = (mu->Eta() - pf->Eta());
1140 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
1141 +    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
1142 +    if (dr > 0.4) continue;
1143 +
1144 +    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
1145 +
1146 +    //
1147 +    // Lepton Footprint Removal
1148 +    //
1149 +    Bool_t IsLeptonFootprint = kFALSE;
1150 +    if (dr < 1.0) {
1151 +
1152 +      //
1153 +      // Check for electrons
1154 +      //
1155 +      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1156 +        const mithep::Electron *tmpele = electronsToVeto[q];
1157 +        // 4l electron
1158 +        if( pf->HasTrackerTrk() ) {
1159 +          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
1160 +            IsLeptonFootprint = kTRUE;
1161 +        }
1162 +        if( pf->HasGsfTrk() ) {
1163 +          if( pf->GsfTrk() == tmpele->GsfTrk() )
1164 +            IsLeptonFootprint = kTRUE;
1165 +        }
1166 +        // PF charged
1167 +        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
1168 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
1169 +          IsLeptonFootprint = kTRUE;
1170 +        // PF gamma
1171 +        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1172 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
1173 +          IsLeptonFootprint = kTRUE;
1174 +      } // loop over electrons
1175 +
1176 +      /* KH - comment for sync      
1177 +      //
1178 +      // Check for muons
1179 +      //
1180 +      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1181 +        const mithep::Muon *tmpmu = muonsToVeto[q];
1182 +        // 4l muon
1183 +        if( pf->HasTrackerTrk() ) {
1184 +          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
1185 +            IsLeptonFootprint = kTRUE;
1186 +        }
1187 +        // PF charged
1188 +        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
1189 +          IsLeptonFootprint = kTRUE;
1190 +      } // loop over muons
1191 +      */
1192 +
1193 +    if (IsLeptonFootprint)
1194 +      continue;
1195 +
1196 +    //
1197 +    // Charged Iso
1198 +    //
1199 +    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1200 +
1201 +      //if( dr < 0.01 ) continue; // only for muon iso mva?
1202 +      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1203 +
1204 +
1205 + //       if( pf->HasTrackerTrk() ) {
1206 + //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1207 + //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1208 + //                            << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
1209 + //                            << dr << endl;
1210 + //       }
1211 + //       if( pf->HasGsfTrk() ) {
1212 + //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1213 + //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1214 + //                            << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
1215 + //                            << dr << endl;
1216 + //       }
1217 +
1218 +
1219 +      fChargedIso += pf->Pt();
1220 +    }
1221 +
1222 +    //
1223 +    // Gamma Iso
1224 +    //
1225 +    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1226 +      // KH, add to sync
1227 +      if( pf->Pt() > 0.5 )
1228 +      fGammaIso += pf->Pt();
1229 +    }
1230 +
1231 +    //
1232 +    // Other Neutrals
1233 +    //
1234 +    else {
1235 +      // KH, add to sync
1236 +      if( pf->Pt() > 0.5 )
1237 +        fNeutralHadronIso += pf->Pt();
1238 +    }
1239 +    
1240 +    }
1241 +    
1242 +  }
1243 +  
1244 + //   double rho = 0;
1245 + //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1246 + //     rho = fPUEnergyDensity->At(0)->Rho();
1247 +
1248 +  // WARNING!!!!  
1249 +  // hardcode for sync ...
1250 +  EffectiveAreaVersion = muT.kMuEAData2011;
1251 +  // WARNING!!!!  
1252 +
1253 +
1254 +  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
1255 +                                        -rho*muT.MuonEffectiveArea(muT.kMuGammaAndNeutralHadronIso04,
1256 +                                                                   mu->Eta(),EffectiveAreaVersion)));
1257 +  gChargedIso = fChargedIso;
1258 +  gGammaIso   = fGammaIso;
1259 +  gNeutralIso = fNeutralHadronIso;
1260 +  
1261 +  return pfIso;
1262 + }
1263 +
1264 +
1265 + //--------------------------------------------------------------------------------------------------
1266 + SelectionStatus muonReferenceIsoSelection(ControlFlags &ctrl,
1267 +                                          const mithep::Muon * mu,
1268 +                                          const mithep::Vertex * vtx,
1269 +                                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1270 +                                          const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1271 +                                          mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1272 +                                          vector<const mithep::PFCandidate*> photonsToVeto)
1273 + //--------------------------------------------------------------------------------------------------
1274 + {
1275 +  
1276 +  SelectionStatus status;
1277 +
1278 +  double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, fPUEnergyDensity,
1279 +                              EffectiveAreaVersion, photonsToVeto);
1280 +  //  cout << "--------------> setting muon isoPF04 to" << pfIso << endl;
1281 +  status.isoPF04 = pfIso;
1282 +  status.chisoPF04 = gChargedIso;
1283 +  status.gaisoPF04 = gGammaIso;
1284 +  status.neisoPF04 = gNeutralIso;
1285 +
1286 +  bool pass = false;
1287 +  if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
1288 +  
1289 +  if( pass ) {
1290 +    status.orStatus(SelectionStatus::LOOSEISO);
1291 +    status.orStatus(SelectionStatus::TIGHTISO);
1292 +  }
1293 +  if(ctrl.debug) {
1294 +    cout << "mu relpfIso: " << pfIso/mu->Pt() << endl;
1295 +    cout << "returning status : " << hex << status.getStatus() << dec << endl;
1296 +  }
1297 +  return status;
1298 +  
1299 + }
1300 +
1301 +
1302 + //--------------------------------------------------------------------------------------------------
1303 + // hacked version
1304 + SelectionStatus muonReferenceIsoSelection(ControlFlags &ctrl,
1305 +                                          const mithep::Muon * mu,
1306 +                                          const mithep::Vertex * vtx,
1307 +                                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1308 +                                          float rho,
1309 +                                          mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1310 +                                          vector<const mithep::Muon*> muonsToVeto,
1311 +                                          vector<const mithep::Electron*> electronsToVeto)
1312 + //--------------------------------------------------------------------------------------------------
1313 + {
1314 +  
1315 +  SelectionStatus status;
1316 +  
1317 +  double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, rho,
1318 +                              EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
1319 +
1320 +  status.isoPF04 = pfIso;
1321 +  status.chisoPF04 = gChargedIso;
1322 +  status.gaisoPF04 = gGammaIso;
1323 +  status.neisoPF04 = gNeutralIso;
1324 +
1325 +  bool pass = false;
1326 +  if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
1327 +  
1328 +  if( pass ) {
1329 +    status.orStatus(SelectionStatus::LOOSEISO);
1330 +    status.orStatus(SelectionStatus::TIGHTISO);
1331 +  }
1332 +  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1333 +  return status;
1334 +  
1335 + }
1336 +
1337 +
1338 +
1339 +
1340   //--------------------------------------------------------------------------------------------------
1341   SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
1342                                          const mithep::Electron * ele,
1343 <                                        const mithep::Vertex & vtx,
1343 >                                        const mithep::Vertex * vtx,
1344                                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1345                                          const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1346                                          mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
# Line 616 | Line 1379 | SelectionStatus electronIsoMVASelection(
1379    Double_t tmpChargedIso_DR0p2To0p3  = 0;
1380    Double_t tmpChargedIso_DR0p3To0p4  = 0;
1381    Double_t tmpChargedIso_DR0p4To0p5  = 0;
619  Double_t tmpChargedIso_DR0p5To0p7  = 0;
1382  
1383    Double_t tmpGammaIso_DR0p0To0p1  = 0;
1384    Double_t tmpGammaIso_DR0p1To0p2  = 0;
1385    Double_t tmpGammaIso_DR0p2To0p3  = 0;
1386    Double_t tmpGammaIso_DR0p3To0p4  = 0;
1387    Double_t tmpGammaIso_DR0p4To0p5  = 0;
1388 <  Double_t tmpGammaIso_DR0p5To0p7  = 0;
1388 >
1389  
1390    Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
1391    Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
1392    Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
1393    Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
1394    Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
633  Double_t tmpNeutralHadronIso_DR0p5To0p7  = 0;
1395  
1396          
1397  
# Line 660 | Line 1421 | SelectionStatus electronIsoMVASelection(
1421    //Loop over PF Candidates
1422    //
1423    for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1424 +
1425 +    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1426 +
1427      const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1428      Double_t deta = (ele->Eta() - pf->Eta());
1429      Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
1430      Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
1431 <    if (dr >= 0.5) continue;
1431 >    if (dr > 1.0) continue;
1432 >
1433      if(ctrl.debug) {
1434        cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
1435 <      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
1435 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx);
1436        cout << endl;
1437      }
1438  
# Line 682 | Line 1447 | SelectionStatus electronIsoMVASelection(
1447      Bool_t IsLeptonFootprint = kFALSE;
1448      if (dr < 1.0) {
1449  
1450 +
1451        //
1452        // Check for electrons
1453        //
1454 +
1455        for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1456          const mithep::Electron *tmpele = electronsToVeto[q];
1457 +        double tmpdr = mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta());
1458 +
1459          // 4l electron
1460          if( pf->HasTrackerTrk()  ) {
1461            if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
# Line 701 | Line 1470 | SelectionStatus electronIsoMVASelection(
1470            }
1471          }
1472          // PF charged
1473 <        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
705 <            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
1473 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479 && tmpdr < 0.015) {
1474            if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
1475            IsLeptonFootprint = kTRUE;
1476          }
1477          // PF gamma
1478 <        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1479 <            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
1478 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
1479 >            && tmpdr < 0.08) {
1480            if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1481            IsLeptonFootprint = kTRUE;
1482          }
1483        } // loop over electrons
1484 <      
1484 >
1485 >
1486 >      /* KH - comment for sync            
1487        //
1488        // Check for muons
1489        //
# Line 732 | Line 1502 | SelectionStatus electronIsoMVASelection(
1502            IsLeptonFootprint = kTRUE;
1503          }
1504        } // loop over muons
1505 <
1505 >      */
1506  
1507      if (IsLeptonFootprint)
1508        continue;
# Line 742 | Line 1512 | SelectionStatus electronIsoMVASelection(
1512      //
1513      if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1514  
1515 <      if( pf->HasTrackerTrk() )
1516 <        if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1517 <      if( pf->HasGsfTrk() )
1518 <        if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1515 > //       if( pf->HasGsfTrk() ) {
1516 > //       if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1517 > //       } else if( pf->HasTrackerTrk() ){
1518 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1519 > //       }
1520  
1521        // Veto any PFmuon, or PFEle
1522        if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
# Line 762 | Line 1533 | SelectionStatus electronIsoMVASelection(
1533        if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
1534        if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
1535        if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
765      if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
1536  
1537      }
1538  
# Line 771 | Line 1541 | SelectionStatus electronIsoMVASelection(
1541      //
1542      else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1543  
1544 <      if (fabs(ele->SCluster()->Eta()) > 1.479) {
775 <        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
776 <      }
1544 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.08) continue;
1545  
1546        if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
1547                             << dr << endl;
# Line 783 | Line 1551 | SelectionStatus electronIsoMVASelection(
1551        if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
1552        if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
1553        if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
786      if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
787
1554      }
1555  
1556      //
# Line 798 | Line 1564 | SelectionStatus electronIsoMVASelection(
1564        if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
1565        if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
1566        if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
801      if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
1567      }
1568  
1569      }
1570  
1571    }
1572  
1573 <  fChargedIso_DR0p0To0p1   = min((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
1574 <  fChargedIso_DR0p1To0p2   = min((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
1575 <  fChargedIso_DR0p2To0p3   = min((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
1576 <  fChargedIso_DR0p3To0p4   = min((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
1577 <  fChargedIso_DR0p4To0p5   = min((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
1573 >  fChargedIso_DR0p0To0p1   = fmin((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
1574 >  fChargedIso_DR0p1To0p2   = fmin((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
1575 >  fChargedIso_DR0p2To0p3   = fmin((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
1576 >  fChargedIso_DR0p3To0p4   = fmin((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
1577 >  fChargedIso_DR0p4To0p5   = fmin((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
1578 >
1579 >  if(ctrl.debug) {
1580 >    cout << "fChargedIso_DR0p0To0p1 : " << fChargedIso_DR0p0To0p1  << endl;
1581 >    cout << "fChargedIso_DR0p1To0p2 : " << fChargedIso_DR0p1To0p2  << endl;
1582 >    cout << "fChargedIso_DR0p2To0p3 : " << fChargedIso_DR0p2To0p3  << endl;
1583 >    cout << "fChargedIso_DR0p3To0p4 : " << fChargedIso_DR0p3To0p4  << endl;
1584 >    cout << "fChargedIso_DR0p4To0p5 : " << fChargedIso_DR0p4To0p5  << endl;
1585 >  }
1586 >
1587  
1588    double rho = 0;
1589    if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1590      rho = fPUEnergyDensity->At(0)->Rho();
1591 +  //   if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
1592 +  //     rho = fPUEnergyDensity->At(0)->RhoLowEta();
1593 +  
1594 +  // WARNING!!!!  
1595 +  // hardcode for sync ...
1596 +  EffectiveAreaVersion = eleT.kEleEAData2011;
1597 +  // WARNING!!!!  
1598  
1599    if( ctrl.debug) {
1600      cout << "RHO: " << rho << endl;
# Line 837 | Line 1618 | SelectionStatus electronIsoMVASelection(
1618           << endl;
1619    }
1620  
1621 <  fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p1
1621 >  fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
1622                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
1623                                                                ele->SCluster()->Eta(),
1624                                                                EffectiveAreaVersion))/ele->Pt()
1625                                   ,2.5)
1626                               ,0.0);
1627 <  fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p2
1627 >  fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
1628                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
1629                                                                ele->SCluster()->Eta(),
1630                                                                EffectiveAreaVersion))/ele->Pt()
1631                                   ,2.5)
1632                               ,0.0);
1633 <  fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p3
1633 >  fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
1634                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
1635                                                                ele->SCluster()->Eta()
1636                                                                ,EffectiveAreaVersion))/ele->Pt()
1637                                   ,2.5)
1638                               ,0.0);
1639 <  fGammaIso_DR0p3To0p4 = max(min((tmpGammaIso_DR0p3To0p4
1639 >  fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
1640                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
1641                                                                ele->SCluster()->Eta(),
1642                                                                EffectiveAreaVersion))/ele->Pt()
1643                                   ,2.5)
1644                               ,0.0);
1645 <  fGammaIso_DR0p4To0p5 = max(min((tmpGammaIso_DR0p4To0p5
1645 >  fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
1646                                    -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
1647                                                                ele->SCluster()->Eta(),
1648                                                                EffectiveAreaVersion))/ele->Pt()
# Line 869 | Line 1650 | SelectionStatus electronIsoMVASelection(
1650                               ,0.0);
1651  
1652  
1653 <  fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p1
1653 >  if( ctrl.debug) {
1654 >    cout << "fGammaIso_DR0p0To0p1: " << fGammaIso_DR0p0To0p1 << endl;
1655 >    cout << "fGammaIso_DR0p1To0p2: " << fGammaIso_DR0p1To0p2 << endl;
1656 >    cout << "fGammaIso_DR0p2To0p3: " << fGammaIso_DR0p2To0p3 << endl;
1657 >    cout << "fGammaIso_DR0p3To0p4: " << fGammaIso_DR0p3To0p4 << endl;
1658 >    cout << "fGammaIso_DR0p4To0p5: " << fGammaIso_DR0p4To0p5 << endl;
1659 >  }
1660 >
1661 >  fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
1662                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1663                                                                   ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1664                                           , 2.5)
1665                                       , 0.0);
1666 <  fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p2
1666 >  fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
1667                                              -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1668                                                                     ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1669                                             , 2.5)
1670                                         , 0.0);
1671 <  fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p3
1671 >  fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
1672                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1673                                                                   ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1674                                           , 2.5)
1675                                       , 0.0);
1676 <  fNeutralHadronIso_DR0p3To0p4 = max(min((tmpNeutralHadronIso_DR0p3To0p4
1676 >  fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
1677                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1678                                                                   ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1679                                           , 2.5)
1680                                       , 0.0);
1681 <  fNeutralHadronIso_DR0p4To0p5 = max(min((tmpNeutralHadronIso_DR0p4To0p5
1681 >  fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
1682                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
1683                                                                   ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1684                                           , 2.5)
1685                                       , 0.0);
1686  
1687 +  if( ctrl.debug) {
1688 +    cout << "fNeutralHadronIso_DR0p0To0p1: " << fNeutralHadronIso_DR0p0To0p1 << endl;
1689 +    cout << "fNeutralHadronIso_DR0p1To0p2: " << fNeutralHadronIso_DR0p1To0p2 << endl;
1690 +    cout << "fNeutralHadronIso_DR0p2To0p3: " << fNeutralHadronIso_DR0p2To0p3 << endl;
1691 +    cout << "fNeutralHadronIso_DR0p3To0p4: " << fNeutralHadronIso_DR0p3To0p4 << endl;
1692 +    cout << "fNeutralHadronIso_DR0p4To0p5: " << fNeutralHadronIso_DR0p4To0p5 << endl;
1693 +  }
1694 +
1695    double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
1696                                                  ele->SCluster()->Eta(),
1697                                                  fChargedIso_DR0p0To0p1,
# Line 915 | Line 1712 | SelectionStatus electronIsoMVASelection(
1712                                                  ctrl.debug);
1713  
1714    SelectionStatus status;
1715 +  status.isoMVA = mvaval;
1716    bool pass = false;
1717  
1718    Int_t subdet = 0;
1719    if (fabs(ele->SCluster()->Eta()) < 0.8) subdet = 0;
1720    else if (fabs(ele->SCluster()->Eta()) < 1.479) subdet = 1;
1721    else subdet = 2;
1722 +
1723    Int_t ptBin = 0;
1724 <  if (ele->Pt() > 10.0) ptBin = 1;
1724 >  if (ele->Pt() >= 10.0) ptBin = 1;
1725    
1726    Int_t MVABin = -1;
1727    if (subdet == 0 && ptBin == 0) MVABin = 0;
# Line 931 | Line 1730 | SelectionStatus electronIsoMVASelection(
1730    if (subdet == 0 && ptBin == 1) MVABin = 3;
1731    if (subdet == 1 && ptBin == 1) MVABin = 4;
1732    if (subdet == 2 && ptBin == 1) MVABin = 5;
934
935  if( MVABin == 0 && mvaval > ELECTRON_ISOMVA_CUT_BIN0 ) pass = true;
936  if( MVABin == 1 && mvaval > ELECTRON_ISOMVA_CUT_BIN1 ) pass = true;
937  if( MVABin == 2 && mvaval > ELECTRON_ISOMVA_CUT_BIN2 ) pass = true;
938  if( MVABin == 3 && mvaval > ELECTRON_ISOMVA_CUT_BIN3 ) pass = true;
939  if( MVABin == 4 && mvaval > ELECTRON_ISOMVA_CUT_BIN4 ) pass = true;
940  if( MVABin == 5 && mvaval > ELECTRON_ISOMVA_CUT_BIN5 ) pass = true;
1733  
1734 <  // pre-selection iso ...
1735 <  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
1734 >  pass = false;
1735 >  if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN0 ) pass = true;
1736 >  if( MVABin == 1 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN1 ) pass = true;
1737 >  if( MVABin == 2 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN2 ) pass = true;
1738 >  if( MVABin == 3 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN3 ) pass = true;
1739 >  if( MVABin == 4 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN4 ) pass = true;
1740 >  if( MVABin == 5 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN5 ) pass = true;
1741 >  //  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
1742 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
1743 >
1744 > //   pass = false;
1745 > //   if( MVABin == 0 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN0 ) pass = true;
1746 > //   if( MVABin == 1 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN1 ) pass = true;
1747 > //   if( MVABin == 2 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN2 ) pass = true;
1748 > //   if( MVABin == 3 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN3 ) pass = true;
1749 > //   if( MVABin == 4 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN4 ) pass = true;
1750 > //   if( MVABin == 5 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN5 ) pass = true;
1751 > //   if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
1752  
945  if( pass ) {
946    status.orStatus(SelectionStatus::LOOSEISO);
947    status.orStatus(SelectionStatus::TIGHTISO);
948  }
1753    if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1754    return status;
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  
# Line 965 | Line 2193 | void initElectronIsoMVA() {
2193                          mithep::ElectronIDMVA::kIsoRingsV0,
2194                          kTRUE, weightFiles);
2195   }
2196 +
2197 +
2198 +
2199 +
2200 + //--------------------------------------------------------------------------------------------------
2201 + float electronPFIso04(ControlFlags &ctrl,
2202 +                      const mithep::Electron * ele,
2203 +                      const mithep::Vertex * vtx,
2204 +                      const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2205 +                      const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2206 +                      mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2207 +                      vector<const mithep::PFCandidate*> photonsToVeto)        
2208 + //--------------------------------------------------------------------------------------------------
2209 + {
2210 +
2211 +  //
2212 +  // final iso
2213 +  //
2214 +  Double_t fChargedIso = 0.0;
2215 +  Double_t fGammaIso = 0.0;
2216 +  Double_t fNeutralHadronIso = 0.0;
2217 +
2218 +
2219 +  //
2220 +  //Loop over PF Candidates
2221 +  //
2222 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2223 +
2224 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2225 +
2226 +    //
2227 +    // veto FSR recovered photons
2228 +    //
2229 +    bool vetoPhoton = false;
2230 +    for( int p=0; p<photonsToVeto.size(); p++ ) {
2231 +      if( pf == photonsToVeto[p] ) {
2232 +        vetoPhoton = true;
2233 +        break;
2234 +      }
2235 +    } if( vetoPhoton ) continue;
2236 +
2237 +    Double_t deta = (ele->Eta() - pf->Eta());
2238 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2239 +    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2240 +
2241 +    if (dr > 0.4) continue;
2242 +    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
2243 +
2244 +    if(ctrl.debug) {
2245 +      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt() << "\tdR: " << dr;
2246 +      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx)
2247 +                                     << "\ttrk: " << pf->HasTrackerTrk()
2248 +                                     << "\tgsf: " << pf->HasGsfTrk();
2249 +      
2250 +      cout << endl;
2251 +    }
2252 +
2253 +
2254 +    //
2255 +    // sync : I don't think theyre doing this ...
2256 +    //
2257 +    //     if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2258 +    //   (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) {
2259 +    //       if( ctrl.debug ) cout << "\tskipping, matches to the electron ..."  << endl;
2260 +    //       continue;
2261 +    //     }
2262 +
2263 +
2264 +    //
2265 +    // Lepton Footprint Removal
2266 +    //
2267 +    Bool_t IsLeptonFootprint = kFALSE;
2268 +    if (dr < 1.0) {
2269 +
2270 +
2271 +    //
2272 +    // Charged Iso
2273 +    //
2274 +    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
2275 +
2276 +      // Veto any PFmuon, or PFEle
2277 +      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) {
2278 +        if( ctrl.debug ) cout << "\t skipping, pf is and ele or mu .." <<endl;
2279 +        continue;
2280 +      }
2281 +
2282 +      // Footprint Veto
2283 +      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2284 +
2285 +      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2286 +                           << "\ttype: " << pf->PFType()
2287 +                           << "\ttrk: " << pf->TrackerTrk() << endl;
2288 +
2289 +      fChargedIso += pf->Pt();
2290 +    }
2291 +
2292 +    //
2293 +    // Gamma Iso
2294 +    //
2295 +    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2296 +
2297 +      if (fabs(ele->SCluster()->Eta()) > 1.479) {
2298 +        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2299 +      }
2300 +
2301 +      assert(ele->HasSuperCluster());
2302 +      if(ele->GsfTrk()->NExpectedHitsInner()>0 && pf->MvaGamma() > 0.99 && pf->HasSCluster() && ele->SCluster() == pf->SCluster())      continue;
2303 +
2304 +
2305 +      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2306 +                           << dr << endl;
2307 +      // KH, add to sync
2308 +      //      if( pf->Pt() > 0.5 )
2309 +        fGammaIso += pf->Pt();
2310 +    }
2311 +
2312 +    //
2313 +    // Neutral Iso
2314 +    //
2315 +    else {
2316 +      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2317 +                           << dr << endl;
2318 +      // KH, add to sync
2319 +      //      if( pf->Pt() > 0.5 )
2320 +        fNeutralHadronIso += pf->Pt();
2321 +    }
2322 +
2323 +    }
2324 +
2325 +  }
2326 +
2327 +
2328 +  double rho=0;
2329 +  if( (EffectiveAreaVersion == mithep::ElectronTools::kEleEAFall11MC) ||
2330 +      (EffectiveAreaVersion == mithep::ElectronTools::kEleEAData2011) ) {
2331 +    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25()) ||
2332 +          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25())))
2333 +      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25();
2334 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2335 +    EffectiveAreaVersion  = mithep::ElectronTools::kEleEAData2011;
2336 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2337 +  } else {
2338 +    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJets()) ||
2339 +          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJets())))
2340 +      rho = fPUEnergyDensity->At(0)->RhoKt6PFJets();
2341 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2342 +    EffectiveAreaVersion  = mithep::ElectronTools::kEleEAData2012;
2343 +    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2344 +  }
2345 +  if(ctrl.debug) cout << "rho: " << rho << endl;
2346 +
2347 +  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2348 +                                        -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2349 +                                                                   ele->Eta(),EffectiveAreaVersion)));
2350 +
2351 +
2352 +  gChargedIso = fChargedIso;
2353 +  gGammaIso = fGammaIso;
2354 +  gNeutralIso = fNeutralHadronIso;  
2355 +
2356 +  if( ctrl.debug ) {
2357 +    cout << "PFiso: " << pfIso
2358 +         << "\tfChargedIso: " << fChargedIso
2359 +         << "\tfGammaIso: " << fGammaIso
2360 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2361 +         << endl;
2362 +  }
2363 +
2364 +  return pfIso;
2365 + }
2366 +
2367 +
2368 +
2369 + //--------------------------------------------------------------------------------------------------
2370 + // hacked version
2371 + float electronPFIso04(ControlFlags &ctrl,
2372 +                      const mithep::Electron * ele,
2373 +                      const mithep::Vertex * vtx,
2374 +                      const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2375 +                      float rho,
2376 +                      mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2377 +                      vector<const mithep::Muon*> muonsToVeto,
2378 +                      vector<const mithep::Electron*> electronsToVeto)
2379 + //--------------------------------------------------------------------------------------------------
2380 + {
2381 +
2382 +  if( ctrl.debug ) {
2383 +    cout << "electronIsoMVASelection :: muons to veto " << endl;
2384 +    for( int i=0; i<muonsToVeto.size(); i++ ) {
2385 +      const mithep::Muon * vmu = muonsToVeto[i];
2386 +      cout << "\tpt: " << vmu->Pt()
2387 +           << "\teta: " << vmu->Eta()
2388 +           << "\tphi: " << vmu->Phi()
2389 +           << endl;
2390 +    }
2391 +    cout << "electronIsoMVASelection :: electrons to veto " << endl;
2392 +    for( int i=0; i<electronsToVeto.size(); i++ ) {
2393 +      const mithep::Electron * vel = electronsToVeto[i];
2394 +      cout << "\tpt: " << vel->Pt()
2395 +           << "\teta: " << vel->Eta()
2396 +           << "\tphi: " << vel->Phi()
2397 +           << "\ttrk: " << vel->TrackerTrk()
2398 +           << endl;
2399 +    }
2400 +  }
2401 +
2402 +
2403 +  //
2404 +  // final iso
2405 +  //
2406 +  Double_t fChargedIso = 0.0;
2407 +  Double_t fGammaIso = 0.0;
2408 +  Double_t fNeutralHadronIso = 0.0;
2409 +
2410 +
2411 +  //
2412 +  //Loop over PF Candidates
2413 +  //
2414 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2415 +
2416 +
2417 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2418 +    Double_t deta = (ele->Eta() - pf->Eta());
2419 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2420 +    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2421 +
2422 +    if (dr > 0.4) continue;
2423 +    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
2424 +
2425 +    if(ctrl.debug) {
2426 +      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt() << "\tdR: " << dr;
2427 +      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx)
2428 +                                     << "\ttrk: " << pf->HasTrackerTrk()
2429 +                                     << "\tgsf: " << pf->HasGsfTrk();
2430 +      
2431 +      cout << endl;
2432 +    }
2433 +
2434 +
2435 +    //
2436 +    // sync : I don't think theyre doing this ...
2437 +    //
2438 +    //     if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2439 +    //   (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) {
2440 +    //       if( ctrl.debug ) cout << "\tskipping, matches to the electron ..."  << endl;
2441 +    //       continue;
2442 +    //     }
2443 +
2444 +
2445 +    //
2446 +    // Lepton Footprint Removal
2447 +    //
2448 +    Bool_t IsLeptonFootprint = kFALSE;
2449 +    if (dr < 1.0) {
2450 +
2451 +      //
2452 +      // Check for electrons
2453 +      //
2454 +      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
2455 +        const mithep::Electron *tmpele = electronsToVeto[q];
2456 +        /*
2457 +        // 4l electron
2458 +        if( pf->HasTrackerTrk()  ) {
2459 +          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
2460 +            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
2461 +            IsLeptonFootprint = kTRUE;
2462 +          }
2463 +        }
2464 +        if( pf->HasGsfTrk()  ) {
2465 +          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
2466 +            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
2467 +            IsLeptonFootprint = kTRUE;
2468 +          }
2469 +        }
2470 +        */
2471 +        // PF charged
2472 +        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
2473 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
2474 +          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
2475 +          IsLeptonFootprint = kTRUE;
2476 +        }
2477 +        // PF gamma
2478 +        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
2479 +            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
2480 +          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
2481 +          IsLeptonFootprint = kTRUE;
2482 +        }
2483 +      } // loop over electrons
2484 +
2485 +      /* KH - comment for sync            
2486 +      //
2487 +      // Check for muons
2488 +      //
2489 +      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
2490 +        const mithep::Muon *tmpmu = muonsToVeto[q];
2491 +        // 4l muon
2492 +        if( pf->HasTrackerTrk() ) {
2493 +          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
2494 +            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
2495 +            IsLeptonFootprint = kTRUE;
2496 +          }
2497 +        }
2498 +        // PF charged
2499 +        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
2500 +          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
2501 +          IsLeptonFootprint = kTRUE;
2502 +        }
2503 +      } // loop over muons
2504 +      */
2505 +
2506 +    if (IsLeptonFootprint)
2507 +      continue;
2508 +
2509 +    //
2510 +    // Charged Iso
2511 +    //
2512 +    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
2513 +
2514 + //       if( pf->HasTrackerTrk() )
2515 + //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2516 + //       if( pf->HasGsfTrk() )
2517 + //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2518 +
2519 +      // Veto any PFmuon, or PFEle
2520 +      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) {
2521 +        if( ctrl.debug ) cout << "\t skipping, pf is and ele or mu .." <<endl;
2522 +        continue;
2523 +      }
2524 +
2525 +      // Footprint Veto
2526 +      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2527 +
2528 +      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2529 +                           << "\ttype: " << pf->PFType()
2530 +                           << "\ttrk: " << pf->TrackerTrk() << endl;
2531 +
2532 +      fChargedIso += pf->Pt();
2533 +    }
2534 +
2535 +    //
2536 +    // Gamma Iso
2537 +    //
2538 +    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2539 +
2540 +      if (fabs(ele->SCluster()->Eta()) > 1.479) {
2541 +        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2542 +      }
2543 +      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2544 +                           << dr << endl;
2545 +      // KH, add to sync
2546 +      //      if( pf->Pt() > 0.5 )
2547 +        fGammaIso += pf->Pt();
2548 +    }
2549 +
2550 +    //
2551 +    // Neutral Iso
2552 +    //
2553 +    else {
2554 +      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2555 +                           << dr << endl;
2556 +      // KH, add to sync
2557 +      //      if( pf->Pt() > 0.5 )
2558 +        fNeutralHadronIso += pf->Pt();
2559 +    }
2560 +
2561 +    }
2562 +
2563 +  }
2564 +
2565 + //   double rho = 0;
2566 + //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2567 + //     rho = fPUEnergyDensity->At(0)->Rho();
2568 +
2569 +  // WARNING!!!!  
2570 +  // hardcode for sync ...
2571 +  EffectiveAreaVersion = eleT.kEleEAData2011;
2572 +  // WARNING!!!!  
2573 +
2574 +
2575 +  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2576 +                                        -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2577 +                                                                   ele->Eta(),EffectiveAreaVersion)));
2578 +
2579 +
2580 +  gChargedIso = fChargedIso;
2581 +  gGammaIso = fGammaIso;
2582 +  gNeutralIso = fNeutralHadronIso;  
2583 +  return pfIso;
2584 + }
2585 +
2586 +
2587 + //--------------------------------------------------------------------------------------------------
2588 + SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2589 +                                              const mithep::Electron * ele,
2590 +                                              const mithep::Vertex * vtx,
2591 +                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2592 +                                              const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2593 +                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2594 +                                              vector<const mithep::PFCandidate*> photonsToVeto)
2595 + //--------------------------------------------------------------------------------------------------
2596 + {
2597 +
2598 +  SelectionStatus status;
2599 +
2600 +  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, fPUEnergyDensity,
2601 +                                  EffectiveAreaVersion, photonsToVeto);
2602 +  //  cout << "--------------> setting electron isoPF04 to " << pfIso << endl;
2603 +  status.isoPF04 = pfIso;
2604 +  status.chisoPF04 = gChargedIso;
2605 +  status.gaisoPF04 = gGammaIso;
2606 +  status.neisoPF04 = gNeutralIso;
2607 +
2608 +  bool pass = false;
2609 +  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2610 +
2611 +  if( pass ) {
2612 +    status.orStatus(SelectionStatus::LOOSEISO);
2613 +    status.orStatus(SelectionStatus::TIGHTISO);
2614 +  }
2615 +  if(ctrl.debug) {
2616 +    cout << "el relpfIso: " << pfIso/ele->Pt() << endl;
2617 +    cout << "returning status : " << hex << status.getStatus() << dec << endl;
2618 +  }
2619 +  return status;
2620 +
2621 + }
2622 +
2623 +
2624 + //--------------------------------------------------------------------------------------------------
2625 + // hacked version
2626 + SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2627 +                                              const mithep::Electron * ele,
2628 +                                              const mithep::Vertex * vtx,
2629 +                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2630 +                                              float rho,
2631 +                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2632 +                                              vector<const mithep::Muon*> muonsToVeto,
2633 +                                              vector<const mithep::Electron*> electronsToVeto)
2634 + //--------------------------------------------------------------------------------------------------
2635 + {
2636 +
2637 +  SelectionStatus status;
2638 +
2639 +  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, rho,
2640 +                                  EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
2641 +  status.isoPF04 = pfIso;
2642 +  status.chisoPF04 = gChargedIso;
2643 +  status.gaisoPF04 = gGammaIso;
2644 +  status.neisoPF04 = gNeutralIso;
2645 +  bool pass = false;
2646 +  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2647 +
2648 +  if( pass ) {
2649 +    status.orStatus(SelectionStatus::LOOSEISO);
2650 +    status.orStatus(SelectionStatus::TIGHTISO);
2651 +  }
2652 +  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2653 +  return status;
2654 +
2655 + }
2656 +
2657 +
2658 +
2659 + //--------------------------------------------------------------------------------------------------
2660 + double  dbetaCorrectedIsoDr03(ControlFlags & ctrl,
2661 +                              const mithep::PFCandidate * photon,
2662 +                              const mithep::Muon * lepton,
2663 +                              const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2664 + //--------------------------------------------------------------------------------------------------
2665 + {
2666 +
2667 +  //
2668 +  // final iso
2669 +  //
2670 +  Double_t fChargedIso  = 0.0;
2671 +  Double_t fGammaIso  = 0.0;
2672 +  Double_t fNeutralHadronIso  = 0.0;
2673 +  Double_t fpfPU  = 0.0;
2674 +
2675 +  //
2676 +  // Loop over PF Candidates
2677 +  //
2678 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2679 +
2680 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2681 +    
2682 +    Double_t deta = (photon->Eta() - pf->Eta());
2683 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2684 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2685 +    if (dr > 0.3) continue;
2686 +
2687 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2688 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2689 +        fpfPU += pf->Pt();
2690 +      continue;
2691 +    }
2692 +    
2693 +    //
2694 +    // skip this photon
2695 +    //
2696 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2697 +        pf->Et() == photon->Et() ) continue;
2698 +    
2699 +      
2700 +    //
2701 +    // Charged Iso
2702 +    //
2703 +    if (pf->Charge() != 0 ) {
2704 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2705 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2706 +        fChargedIso += pf->Pt();
2707 +    }
2708 +    
2709 +    //
2710 +    // Gamma Iso
2711 +    //
2712 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2713 +      if( pf->Pt() > 0.5 && dr > 0.01)
2714 +        fGammaIso += pf->Pt();
2715 +    }
2716 +    
2717 +    //
2718 +    // Other Neutrals
2719 +    //
2720 +    else {
2721 +      if( pf->Pt() > 0.5 && dr > 0.01)
2722 +        fNeutralHadronIso += pf->Pt();
2723 +    }
2724 +    
2725 +  }
2726 +  
2727 +  if( ctrl.debug ) {
2728 +    cout << "photon dbetaIso :: " << endl;
2729 +    cout << "\tfChargedIso: " << fChargedIso
2730 +         << "\tfGammaIso: " << fGammaIso
2731 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2732 +         << "\tfpfPU: " << fpfPU
2733 +         << endl;
2734 +  }
2735 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso - 0.5*fpfPU;
2736 +  return pfIso/photon->Pt();
2737 + }
2738 +
2739 +
2740 + //--------------------------------------------------------------------------------------------------
2741 + double  dbetaCorrectedIsoDr03(ControlFlags & ctrl,
2742 +                              const mithep::PFCandidate * photon,
2743 +                              const mithep::Electron * lepton,
2744 +                              const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2745 + //--------------------------------------------------------------------------------------------------
2746 + {
2747 +
2748 +  //
2749 +  // final iso
2750 +  //
2751 +  Double_t fChargedIso  = 0.0;
2752 +  Double_t fGammaIso  = 0.0;
2753 +  Double_t fNeutralHadronIso  = 0.0;
2754 +  Double_t fpfPU  = 0.0;
2755 +
2756 +  //
2757 +  // Loop over PF Candidates
2758 +  //
2759 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2760 +
2761 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2762 +    
2763 +    Double_t deta = (photon->Eta() - pf->Eta());
2764 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2765 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2766 +    if (dr > 0.3) continue;
2767 +
2768 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2769 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2770 +        fpfPU += pf->Pt();
2771 +      continue;
2772 +    }
2773 +    
2774 +    //
2775 +    // skip this photon
2776 +    //
2777 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2778 +        pf->Et() == photon->Et() ) continue;
2779 +    
2780 +      
2781 +    //
2782 +    // Charged Iso
2783 +    //
2784 +    if (pf->Charge() != 0 ) {
2785 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2786 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2787 +        fChargedIso += pf->Pt();
2788 +    }
2789 +    
2790 +    //
2791 +    // Gamma Iso
2792 +    //
2793 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2794 +      if( pf->Pt() > 0.5 && dr > 0.01)
2795 +        fGammaIso += pf->Pt();
2796 +    }
2797 +    
2798 +    //
2799 +    // Other Neutrals
2800 +    //
2801 +    else {
2802 +      if( pf->Pt() > 0.5 && dr > 0.01)
2803 +        fNeutralHadronIso += pf->Pt();
2804 +    }
2805 +    
2806 +  }
2807 +  
2808 +  if( ctrl.debug ) {
2809 +    cout << "photon dbetaIso :: " << endl;
2810 +    cout << "\tfChargedIso: " << fChargedIso
2811 +         << "\tfGammaIso: " << fGammaIso
2812 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2813 +         << "\tfpfPU: " << fpfPU
2814 +         << endl;
2815 +  }
2816 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso - 0.5*fpfPU;
2817 +  return pfIso/photon->Pt();
2818 + }
2819 +
2820 +
2821 +
2822 +
2823 +
2824 + //--------------------------------------------------------------------------------------------------
2825 + double  nonCorrectedIsoDr03(ControlFlags & ctrl,
2826 +                            const mithep::PFCandidate * photon,
2827 +                            const mithep::Muon * lepton,
2828 +                            const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2829 + //--------------------------------------------------------------------------------------------------
2830 + {
2831 +
2832 +  //
2833 +  // final iso
2834 +  //
2835 +  Double_t fChargedIso  = 0.0;
2836 +  Double_t fGammaIso  = 0.0;
2837 +  Double_t fNeutralHadronIso  = 0.0;
2838 +  Double_t fpfPU  = 0.0;
2839 +
2840 +  //
2841 +  // Loop over PF Candidates
2842 +  //
2843 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2844 +
2845 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2846 +
2847 +    Double_t deta = (photon->Eta() - pf->Eta());
2848 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2849 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2850 +    if (dr > 0.3) continue;
2851 +
2852 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2853 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2854 +        fpfPU += pf->Pt();
2855 +      continue;
2856 +    }
2857 +    
2858 +    //
2859 +    // skip this photon
2860 +    //
2861 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2862 +        pf->Et() == photon->Et() ) continue;
2863 +    
2864 +      
2865 +    //
2866 +    // Charged Iso
2867 +    //
2868 +    if (pf->Charge() != 0 ) {
2869 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2870 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2871 +        fChargedIso += pf->Pt();
2872 +    }
2873 +    
2874 +    //
2875 +    // Gamma Iso
2876 +    //
2877 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2878 +      if( pf->Pt() > 0.5 && dr > 0.01)
2879 +        fGammaIso += pf->Pt();
2880 +    }
2881 +    
2882 +    //
2883 +    // Other Neutrals
2884 +    //
2885 +    else {
2886 +      if( pf->Pt() > 0.5 && dr > 0.01)
2887 +        fNeutralHadronIso += pf->Pt();
2888 +    }
2889 +    
2890 +  }
2891 +  
2892 +  if( ctrl.debug ) {
2893 +    cout << "photon dbetaIso :: " << endl;
2894 +    cout << "\tfChargedIso: " << fChargedIso
2895 +         << "\tfGammaIso: " << fGammaIso
2896 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2897 +         << "\tfpfPU: " << fpfPU
2898 +         << endl;
2899 +  }
2900 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso + fpfPU;
2901 +  return pfIso/photon->Pt();
2902 + }
2903 +
2904 +
2905 +
2906 + //--------------------------------------------------------------------------------------------------
2907 + double  nonCorrectedIsoDr03(ControlFlags & ctrl,
2908 +                            const mithep::PFCandidate * photon,
2909 +                            const mithep::Electron * lepton,
2910 +                            const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2911 + //--------------------------------------------------------------------------------------------------
2912 + {
2913 +
2914 +  //
2915 +  // final iso
2916 +  //
2917 +  Double_t fChargedIso  = 0.0;
2918 +  Double_t fGammaIso  = 0.0;
2919 +  Double_t fNeutralHadronIso  = 0.0;
2920 +  Double_t fpfPU  = 0.0;
2921 +
2922 +  //
2923 +  // Loop over PF Candidates
2924 +  //
2925 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2926 +
2927 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2928 +
2929 +    Double_t deta = (photon->Eta() - pf->Eta());
2930 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2931 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2932 +    if (dr > 0.3) continue;
2933 +
2934 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2935 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2936 +        fpfPU += pf->Pt();
2937 +      continue;
2938 +    }
2939 +    
2940 +    //
2941 +    // skip this photon
2942 +    //
2943 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2944 +        pf->Et() == photon->Et() ) continue;
2945 +    
2946 +      
2947 +    //
2948 +    // Charged Iso
2949 +    //
2950 +    if (pf->Charge() != 0 ) {
2951 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2952 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2953 +        fChargedIso += pf->Pt();
2954 +    }
2955 +    
2956 +    //
2957 +    // Gamma Iso
2958 +    //
2959 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2960 +      if( pf->Pt() > 0.5 && dr > 0.01)
2961 +        fGammaIso += pf->Pt();
2962 +    }
2963 +    
2964 +    //
2965 +    // Other Neutrals
2966 +    //
2967 +    else {
2968 +      if( pf->Pt() > 0.5 && dr > 0.01)
2969 +        fNeutralHadronIso += pf->Pt();
2970 +    }
2971 +    
2972 +  }
2973 +  
2974 +  if( ctrl.debug ) {
2975 +    cout << "photon dbetaIso :: " << endl;
2976 +    cout << "\tfChargedIso: " << fChargedIso
2977 +         << "\tfGammaIso: " << fGammaIso
2978 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2979 +         << "\tfpfPU: " << fpfPU
2980 +         << endl;
2981 +  }
2982 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso + fpfPU;
2983 +  return pfIso/photon->Pt();
2984 + }
2985 +
2986 +
2987 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines