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.2 by khahn, Fri Feb 17 14:49:00 2012 UTC vs.
Revision 1.31 by khahn, Tue Jun 12 01:23:03 2012 UTC

# Line 3 | Line 3
3   #include "IsolationSelection.h"
4   #include "IsolationSelectionDefs.h"
5  
6 < bool pairwiseIsoSelection( ControlFlags &ctrl, vector<SimpleLepton> &lepvec, float rho ) {
6 > #include "MathUtils.h"
7 > #include "MuonTools.h"
8 > #include "MuonIDMVA.h"
9 > #include "ElectronTools.h"
10 > #include "ElectronIDMVA.h"
11 >
12 > using namespace mithep;
13 >
14 > mithep::MuonIDMVA     * muIsoMVA;
15 > mithep::MuonTools       muT;
16 > mithep::ElectronIDMVA * eleIsoMVA;
17 > mithep::ElectronTools   eleT;
18 >
19 > // global hack to sync
20 > double gChargedIso;
21 > double gGammaIso;
22 > double gNeutralIso;
23 >
24 > extern vector<bool> PFnoPUflag;
25 >
26 > //--------------------------------------------------------------------------------------------------
27 > Float_t computePFMuonIso(const mithep::Muon *muon,
28 >                         const mithep::Vertex * vtx,
29 >                         const mithep::Array<mithep::PFCandidate> * fPFCandidates,
30 >                         const Double_t dRMax)
31 > //--------------------------------------------------------------------------------------------------
32 > {
33 >  const Double_t dRMin    = 0;
34 >  const Double_t neuPtMin = 1.0;
35 >  const Double_t dzMax    = 0.1;
36 >    
37 >  Double_t zLepton = (muon->BestTrk()) ? muon->BestTrk()->DzCorrected(*vtx) : 0.0;
38 >  
39 >  Float_t iso=0;
40 >  for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
41 >    const PFCandidate *pfcand = fPFCandidates->At(ipf);
42 >    
43 >    if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue;  // pT cut on neutral particles
44 >    
45 >    // exclude THE muon
46 >    if(pfcand->TrackerTrk() && muon->TrackerTrk() && (pfcand->TrackerTrk()==muon->TrackerTrk())) continue;
47 >    
48 >    // dz cut
49 >    Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(*vtx) - zLepton) : 0;
50 >    if(dz >= dzMax) continue;
51 >    
52 >    // check iso cone
53 >    Double_t dr = MathUtils::DeltaR(muon->Mom(), pfcand->Mom());
54 >    if(dr<dRMax && dr>=dRMin)
55 >      iso += pfcand->Pt();
56 >  }
57 >  
58 >  return iso;
59 > }
60 >
61 > //--------------------------------------------------------------------------------------------------
62 > Float_t computePFEleIso(const mithep::Electron *electron,
63 >                        const mithep::Vertex * fVertex,
64 >                        const mithep::Array<mithep::PFCandidate> * fPFCandidates,
65 >                        const Double_t dRMax)
66 > //--------------------------------------------------------------------------------------------------
67 > {
68 >  const Double_t dRMin    = 0;
69 >  const Double_t neuPtMin = 1.0;
70 >  const Double_t dzMax    = 0.1;
71 >    
72 >  Double_t zLepton = (electron->BestTrk()) ? electron->BestTrk()->DzCorrected(*fVertex) : 0.0;
73 >  
74 >  Float_t iso=0;
75 >  for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
76 >    const PFCandidate *pfcand = (PFCandidate*)(fPFCandidates->At(ipf));
77 >    
78 >    if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue;  // pT cut on neutral particles
79 >    
80 >    // dz cut
81 >    Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(*fVertex) - zLepton) : 0;
82 >    if(dz >= dzMax) continue;
83 >    
84 >    // remove THE electron
85 >    if(pfcand->TrackerTrk() && electron->TrackerTrk() && (pfcand->TrackerTrk()==electron->TrackerTrk())) continue;
86 >    if(pfcand->GsfTrk()     && electron->GsfTrk()     && (pfcand->GsfTrk()==electron->GsfTrk()))         continue;
87 >    
88 >    // check iso cone
89 >    Double_t dr = MathUtils::DeltaR(electron->Mom(), pfcand->Mom());
90 >    if(dr<dRMax && dr>=dRMin) {
91 >      // eta-strip veto for photons
92 >      if((pfcand->PFType() == PFCandidate::eGamma) && fabs(electron->Eta() - pfcand->Eta()) < 0.025) continue;
93 >      
94 >      // Inner cone (one tower = dR < 0.07) veto for non-photon neutrals
95 >      if(!pfcand->HasTrk() && (pfcand->PFType() == PFCandidate::eNeutralHadron) &&
96 >         (MathUtils::DeltaR(electron->Mom(), pfcand->Mom()) < 0.07)) continue;
97 >      
98 >      iso += pfcand->Pt();
99 >    }
100 >  }
101 >  
102 >  return iso;
103 > };
104 >
105 > //--------------------------------------------------------------------------------------------------
106 > bool pairwiseIsoSelection( ControlFlags &ctrl,
107 >                           vector<SimpleLepton> &lepvec,
108 >                           float rho )
109 > //--------------------------------------------------------------------------------------------------
110 > {
111  
112    bool passiso=true;
113  
# Line 60 | 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 75 | Line 179 | bool pairwiseIsoSelection( ControlFlags
179    return passiso;
180   }
181  
182 <
183 < SelectionStatus passMuonIsoSelection( ControlFlags &ctrl, const mithep::TMuon * mu ) {
184 <
185 <  float reliso = mu->pfIso03/mu->pt;
186 <  bool isEB = (fabs(mu->eta) < 1.479 ? 1 : 0 );  
182 > //--------------------------------------------------------------------------------------------------
183 > SelectionStatus muonIsoSelection(ControlFlags &ctrl,
184 >                                 const mithep::Muon * mu,
185 >                                 const mithep::Vertex * vtx,
186 >                                 const mithep::Array<mithep::PFCandidate> * fPFCandidateCol   )
187 > //--------------------------------------------------------------------------------------------------
188 > {
189 >  float reliso = computePFMuonIso(mu,vtx,fPFCandidateCol,0.3)/mu->Pt();
190 >  bool isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 );  
191    bool failiso = false;
192 <  if( isEB && mu->pt > 20 && reliso > PFISO_MU_LOOSE_EB_HIGHPT ) {  
192 >  if( isEB && mu->Pt() > 20 && reliso > PFISO_MU_LOOSE_EB_HIGHPT ) {  
193      failiso = true;
194    }
195 <  if( isEB && mu->pt < 20 && reliso > PFISO_MU_LOOSE_EB_LOWPT ) {
195 >  if( isEB && mu->Pt() < 20 && reliso > PFISO_MU_LOOSE_EB_LOWPT ) {
196      failiso = true;
197    }
198 <  if( !(isEB) && mu->pt > 20 && reliso > PFISO_MU_LOOSE_EE_HIGHPT ) {
198 >  if( !(isEB) && mu->Pt() > 20 && reliso > PFISO_MU_LOOSE_EE_HIGHPT ) {
199      failiso = true;
200    }
201 <  if( !(isEB) && mu->pt < 20 && reliso > PFISO_MU_LOOSE_EE_LOWPT ) {
201 >  if( !(isEB) && mu->Pt() < 20 && reliso > PFISO_MU_LOOSE_EE_LOWPT ) {
202      failiso = true;
203    }
204  
# Line 101 | Line 209 | SelectionStatus passMuonIsoSelection( Co
209  
210   };
211  
212 <
213 < SelectionStatus failEleIso(ControlFlags &ctrl, const mithep::TElectron * ele) {
212 > //--------------------------------------------------------------------------------------------------
213 > SelectionStatus electronIsoSelection(ControlFlags &ctrl,
214 >                                     const mithep::Electron * ele,
215 >                                     const mithep::Vertex *fVertex,
216 >                                     const mithep::Array<mithep::PFCandidate> * fPFCandidates)
217 > //--------------------------------------------------------------------------------------------------
218 > {
219  
220    bool failiso=false;
221  
222 <  float reliso = ele->pfIso04/ele->pt;
223 <  bool isEB = (fabs(ele->eta) < 1.479 ? 1 : 0 );  
224 <  if( isEB && ele->pt > 20 && reliso > PFISO_ELE_LOOSE_EB_HIGHPT ) {
222 >  float reliso = computePFEleIso(ele,fVertex,fPFCandidates,0.4)/ele->Pt();
223 >
224 >  if( ele->IsEB() && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EB_HIGHPT ) {
225      failiso = true;
226    }
227 <  if( isEB && ele->pt < 20 && reliso > PFISO_ELE_LOOSE_EB_LOWPT ) {
227 >  if( ele->IsEB() && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EB_LOWPT ) {
228      failiso = true;
229    }
230 <  if(ctrl.debug) cout << "before iso check ..." << endl;
118 <  if( !(isEB) && ele->pt > 20 && reliso > PFISO_ELE_LOOSE_EE_HIGHPT ) {
119 <    if(ctrl.debug) cout << "\tit fails ..." << endl;
230 >  if( !(ele->IsEB()) && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EE_HIGHPT ) {
231      failiso = true;
232    }
233 <  if( !(isEB) && ele->pt < 20 && reliso > PFISO_ELE_LOOSE_EE_LOWPT ) {
233 >  if( !(ele->IsEB()) && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EE_LOWPT ) {
234      failiso = true;
235    }
236  
237    SelectionStatus status;
238    if( !failiso ) {
239 <    status.setStatus(SelectionStatus::LOOSEISO);
240 <    status.setStatus(SelectionStatus::TIGHTISO);
239 >    status.orStatus(SelectionStatus::LOOSEISO);
240 >    status.orStatus(SelectionStatus::TIGHTISO);
241 >  }
242 >  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
243 >  return status;
244 >
245 > }
246 >
247 >
248 > bool noIso(ControlFlags &, vector<SimpleLepton> &, float rho) {
249 >
250 >        return true;
251 > }
252 >
253 >
254 > //--------------------------------------------------------------------------------------------------
255 > SelectionStatus muonIsoMVASelection(ControlFlags &ctrl,
256 >                                    const mithep::Muon * mu,
257 >                                    const mithep::Vertex * vtx,
258 >                                    const mithep::Array<mithep::PFCandidate> * fPFCandidates,
259 >                                    const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
260 >                                    mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
261 >                                    vector<const mithep::Muon*> muonsToVeto,
262 >                                    vector<const mithep::Electron*> electronsToVeto)
263 > //--------------------------------------------------------------------------------------------------
264 > {
265 >
266 >  if( ctrl.debug ) {
267 >    cout << "muonIsoMVASelection :: muons to veto " << endl;
268 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
269 >      const mithep::Muon * vmu = muonsToVeto[i];
270 >      cout << "\tpt: " << vmu->Pt()
271 >           << "\teta: " << vmu->Eta()
272 >           << "\tphi: " << vmu->Phi()
273 >           << endl;
274 >    }
275 >    cout << "muonIsoMVASelection :: electrson to veto " << endl;
276 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
277 >      const mithep::Electron * vel = electronsToVeto[i];
278 >      cout << "\tpt: " << vel->Pt()
279 >           << "\teta: " << vel->Eta()
280 >           << "\tphi: " << vel->Phi()
281 >           << endl;
282 >    }
283 >  }
284 >  bool failiso=false;
285 >
286 >  //
287 >  // tmp iso rings
288 >  //
289 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
290 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
291 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
292 >  Double_t tmpChargedIso_DR0p3To0p4  = 0;
293 >  Double_t tmpChargedIso_DR0p4To0p5  = 0;
294 >  Double_t tmpChargedIso_DR0p5To0p7  = 0;
295 >
296 >  Double_t tmpGammaIso_DR0p0To0p1  = 0;
297 >  Double_t tmpGammaIso_DR0p1To0p2  = 0;
298 >  Double_t tmpGammaIso_DR0p2To0p3  = 0;
299 >  Double_t tmpGammaIso_DR0p3To0p4  = 0;
300 >  Double_t tmpGammaIso_DR0p4To0p5  = 0;
301 >  Double_t tmpGammaIso_DR0p5To0p7  = 0;
302 >
303 >  Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
304 >  Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
305 >  Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
306 >  Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
307 >  Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
308 >  Double_t tmpNeutralHadronIso_DR0p5To0p7  = 0;
309 >
310 >        
311 >
312 >  //
313 >  // final rings for the MVA
314 >  //
315 >  Double_t fChargedIso_DR0p0To0p1;
316 >  Double_t fChargedIso_DR0p1To0p2;
317 >  Double_t fChargedIso_DR0p2To0p3;
318 >  Double_t fChargedIso_DR0p3To0p4;
319 >  Double_t fChargedIso_DR0p4To0p5;
320 >  Double_t fChargedIso_DR0p5To0p7;
321 >
322 >  Double_t fGammaIso_DR0p0To0p1;
323 >  Double_t fGammaIso_DR0p1To0p2;
324 >  Double_t fGammaIso_DR0p2To0p3;
325 >  Double_t fGammaIso_DR0p3To0p4;
326 >  Double_t fGammaIso_DR0p4To0p5;
327 >  Double_t fGammaIso_DR0p5To0p7;
328 >
329 >  Double_t fNeutralHadronIso_DR0p0To0p1;
330 >  Double_t fNeutralHadronIso_DR0p1To0p2;
331 >  Double_t fNeutralHadronIso_DR0p2To0p3;
332 >  Double_t fNeutralHadronIso_DR0p3To0p4;
333 >  Double_t fNeutralHadronIso_DR0p4To0p5;
334 >  Double_t fNeutralHadronIso_DR0p5To0p7;
335 >
336 >
337 >  //
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());
347 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
348 >    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
349 >    if (dr > 1.0) continue;
350 >
351 >    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
352 >
353 >    //
354 >    // Lepton Footprint Removal
355 >    //
356 >    Bool_t IsLeptonFootprint = kFALSE;
357 >    if (dr < 1.0) {
358 >
359 >      //
360 >      // Check for electrons
361 >      //
362 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
363 >        const mithep::Electron *tmpele = electronsToVeto[q];
364 >        // 4l electron
365 >        if( pf->HasTrackerTrk() ) {
366 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
367 >            IsLeptonFootprint = kTRUE;
368 >        }
369 >        if( pf->HasGsfTrk() ) {
370 >          if( pf->GsfTrk() == tmpele->GsfTrk() )
371 >            IsLeptonFootprint = kTRUE;
372 >        }
373 >        // PF charged
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
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 >      //
387 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
388 >        const mithep::Muon *tmpmu = muonsToVeto[q];
389 >        // 4l muon
390 >        if( pf->HasTrackerTrk() ) {
391 >          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
392 >            IsLeptonFootprint = kTRUE;
393 >        }
394 >        // PF charged
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 >      */
399 >
400 >    if (IsLeptonFootprint)
401 >      continue;
402 >
403 >    //
404 >    // Charged Iso Rings
405 >    //
406 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
407 >
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 > //       }
423 >
424 >      // Footprint Veto
425 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
426 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
427 >      if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
428 >      if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
429 >      if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
430 >      if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
431 >    }
432 >
433 >    //
434 >    // Gamma Iso Rings
435 >    //
436 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
437 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
438 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
439 >      if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
440 >      if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
441 >      if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
442 >      if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
443 >    }
444 >
445 >    //
446 >    // Other Neutral Iso Rings
447 >    //
448 >    else {
449 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
450 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
451 >      if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
452 >      if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
453 >      if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
454 >      if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
455 >    }
456 >
457 >    }
458 >
459 >  }
460 >
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 = fmax(fmin((tmpGammaIso_DR0p0To0p1
482 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
483 >                                 ,2.5)
484 >                             ,0.0);
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 = fmax(fmin((tmpGammaIso_DR0p2To0p3
490 >                                  -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
491 >                                 ,2.5)
492 >                             ,0.0);
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 = 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 = 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 = 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 = 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 = 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 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
525 >                                          -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p4To0p5,
526 >                                                                 mu->Eta(), EffectiveAreaVersion))/mu->Pt()
527 >                                         , 2.5)
528 >                                     , 0.0);
529 >
530 >
531 >  double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
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;
554 >
555 >  pass = false;
556 >  if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
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_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_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_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 > }
594 >
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 >  }
934 >  return status;
935 >
936 > }
937 >
938 >
939 > //--------------------------------------------------------------------------------------------------
940 > void initMuonIsoMVA() {
941 > //--------------------------------------------------------------------------------------------------
942 >  muIsoMVA = new mithep::MuonIDMVA();
943 >  vector<string> weightFiles;
944 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml");
945 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml");
946 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml");
947 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml");
948 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml");
949 >  weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml");
950 >  muIsoMVA->Initialize( "MuonIsoMVA",
951 >                        mithep::MuonIDMVA::kIsoRingsV0,
952 >                        kTRUE, weightFiles);
953 > }
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,
1344 >                                        const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1345 >                                        const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1346 >                                        mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1347 >                                        vector<const mithep::Muon*> muonsToVeto,
1348 >                                        vector<const mithep::Electron*> electronsToVeto)
1349 > //--------------------------------------------------------------------------------------------------
1350 > {
1351 >
1352 >  if( ctrl.debug ) {
1353 >    cout << "electronIsoMVASelection :: muons to veto " << endl;
1354 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
1355 >      const mithep::Muon * vmu = muonsToVeto[i];
1356 >      cout << "\tpt: " << vmu->Pt()
1357 >           << "\teta: " << vmu->Eta()
1358 >           << "\tphi: " << vmu->Phi()
1359 >           << endl;
1360 >    }
1361 >    cout << "electronIsoMVASelection :: electrson to veto " << endl;
1362 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
1363 >      const mithep::Electron * vel = electronsToVeto[i];
1364 >      cout << "\tpt: " << vel->Pt()
1365 >           << "\teta: " << vel->Eta()
1366 >           << "\tphi: " << vel->Phi()
1367 >           << "\ttrk: " << vel->TrackerTrk()
1368 >           << endl;
1369 >    }
1370 >  }
1371 >
1372 >  bool failiso=false;
1373 >
1374 >  //
1375 >  // tmp iso rings
1376 >  //
1377 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
1378 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
1379 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
1380 >  Double_t tmpChargedIso_DR0p3To0p4  = 0;
1381 >  Double_t tmpChargedIso_DR0p4To0p5  = 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 >
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;
1395 >
1396 >        
1397 >
1398 >  //
1399 >  // final rings for the MVA
1400 >  //
1401 >  Double_t fChargedIso_DR0p0To0p1;
1402 >  Double_t fChargedIso_DR0p1To0p2;
1403 >  Double_t fChargedIso_DR0p2To0p3;
1404 >  Double_t fChargedIso_DR0p3To0p4;
1405 >  Double_t fChargedIso_DR0p4To0p5;
1406 >
1407 >  Double_t fGammaIso_DR0p0To0p1;
1408 >  Double_t fGammaIso_DR0p1To0p2;
1409 >  Double_t fGammaIso_DR0p2To0p3;
1410 >  Double_t fGammaIso_DR0p3To0p4;
1411 >  Double_t fGammaIso_DR0p4To0p5;
1412 >
1413 >  Double_t fNeutralHadronIso_DR0p0To0p1;
1414 >  Double_t fNeutralHadronIso_DR0p1To0p2;
1415 >  Double_t fNeutralHadronIso_DR0p2To0p3;
1416 >  Double_t fNeutralHadronIso_DR0p3To0p4;
1417 >  Double_t fNeutralHadronIso_DR0p4To0p5;
1418 >
1419 >
1420 >  //
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 > 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);
1436 >      cout << endl;
1437 >    }
1438 >
1439 >
1440 >    if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
1441 >         (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
1442 >    
1443 >
1444 >    //
1445 >    // Lepton Footprint Removal
1446 >    //
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() ) {
1462 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
1463 >            IsLeptonFootprint = kTRUE;
1464 >          }
1465 >        }
1466 >        if( pf->HasGsfTrk()  ) {
1467 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
1468 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
1469 >            IsLeptonFootprint = kTRUE;
1470 >          }
1471 >        }
1472 >        // PF charged
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 >            && tmpdr < 0.08) {
1480 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1481 >          IsLeptonFootprint = kTRUE;
1482 >        }
1483 >      } // loop over electrons
1484 >
1485 >
1486 >      /* KH - comment for sync            
1487 >      //
1488 >      // Check for muons
1489 >      //
1490 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1491 >        const mithep::Muon *tmpmu = muonsToVeto[q];
1492 >        // 4l muon
1493 >        if( pf->HasTrackerTrk() ) {
1494 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
1495 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
1496 >            IsLeptonFootprint = kTRUE;
1497 >          }
1498 >        }
1499 >        // PF charged
1500 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
1501 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
1502 >          IsLeptonFootprint = kTRUE;
1503 >        }
1504 >      } // loop over muons
1505 >      */
1506 >
1507 >    if (IsLeptonFootprint)
1508 >      continue;
1509 >
1510 >    //
1511 >    // Charged Iso Rings
1512 >    //
1513 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1514 >
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;
1523 >
1524 >      // Footprint Veto
1525 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
1526 >
1527 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
1528 >                           << "\ttype: " << pf->PFType()
1529 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
1530 >
1531 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
1532 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
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();
1536 >
1537 >    }
1538 >
1539 >    //
1540 >    // Gamma Iso Rings
1541 >    //
1542 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1543 >
1544 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.08) continue;
1545 >
1546 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
1547 >                           << dr << endl;
1548 >
1549 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
1550 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
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();
1554 >    }
1555 >
1556 >    //
1557 >    // Other Neutral Iso Rings
1558 >    //
1559 >    else {
1560 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
1561 >                           << dr << endl;
1562 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
1563 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
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();
1567 >    }
1568 >
1569 >    }
1570 >
1571 >  }
1572 >
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;
1601 >    cout << "eta: " << ele->SCluster()->Eta() << endl;
1602 >    cout << "target: " << EffectiveAreaVersion << endl;
1603 >    cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1604 >                                                       ele->SCluster()->Eta(),
1605 >                                                       EffectiveAreaVersion)
1606 >         << endl;
1607 >    cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1608 >                                                       ele->SCluster()->Eta(),
1609 >                                                       EffectiveAreaVersion)
1610 >         << endl;
1611 >    cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1612 >                                                       ele->SCluster()->Eta(),
1613 >                                                       EffectiveAreaVersion)
1614 >         << endl;
1615 >    cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1616 >                                                       ele->SCluster()->Eta(),
1617 >                                                       EffectiveAreaVersion)
1618 >         << endl;
1619 >  }
1620 >
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 = 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 = 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 = 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 = fmax(fmin((tmpGammaIso_DR0p4To0p5
1646 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
1647 >                                                              ele->SCluster()->Eta(),
1648 >                                                              EffectiveAreaVersion))/ele->Pt()
1649 >                                 ,2.5)
1650 >                             ,0.0);
1651 >
1652 >
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 = 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 = 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 = 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 = 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,
1698 >                                                fChargedIso_DR0p1To0p2,
1699 >                                                fChargedIso_DR0p2To0p3,
1700 >                                                fChargedIso_DR0p3To0p4,
1701 >                                                fChargedIso_DR0p4To0p5,
1702 >                                                fGammaIso_DR0p0To0p1,
1703 >                                                fGammaIso_DR0p1To0p2,
1704 >                                                fGammaIso_DR0p2To0p3,
1705 >                                                fGammaIso_DR0p3To0p4,
1706 >                                                fGammaIso_DR0p4To0p5,
1707 >                                                fNeutralHadronIso_DR0p0To0p1,
1708 >                                                fNeutralHadronIso_DR0p1To0p2,
1709 >                                                fNeutralHadronIso_DR0p2To0p3,
1710 >                                                fNeutralHadronIso_DR0p3To0p4,
1711 >                                                fNeutralHadronIso_DR0p4To0p5,
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;
1725 >  
1726 >  Int_t MVABin = -1;
1727 >  if (subdet == 0 && ptBin == 0) MVABin = 0;
1728 >  if (subdet == 1 && ptBin == 0) MVABin = 1;
1729 >  if (subdet == 2 && ptBin == 0) MVABin = 2;
1730 >  if (subdet == 0 && ptBin == 1) MVABin = 3;
1731 >  if (subdet == 1 && ptBin == 1) MVABin = 4;
1732 >  if (subdet == 2 && ptBin == 1) MVABin = 5;
1733 >
1734 >  pass = false;
1735 >  if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_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 >
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 >
2183 > //--------------------------------------------------------------------------------------------------
2184 > void initElectronIsoMVA() {
2185 > //--------------------------------------------------------------------------------------------------
2186 >  eleIsoMVA = new mithep::ElectronIDMVA();
2187 >  vector<string> weightFiles;
2188 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt5To10.weights.xml");
2189 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt5To10.weights.xml");
2190 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt10ToInf.weights.xml");
2191 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt10ToInf.weights.xml");
2192 >  eleIsoMVA->Initialize( "ElectronIsoMVA",
2193 >                        mithep::ElectronIDMVA::kIsoRingsV0,
2194 >                        kTRUE, weightFiles);
2195 > }
2196 >
2197 >
2198 >
2199 >
2200 > //--------------------------------------------------------------------------------------------------
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 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2301 >                           << dr << endl;
2302 >      // KH, add to sync
2303 >      //      if( pf->Pt() > 0.5 )
2304 >        fGammaIso += pf->Pt();
2305 >    }
2306 >
2307 >    //
2308 >    // Neutral Iso
2309 >    //
2310 >    else {
2311 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2312 >                           << dr << endl;
2313 >      // KH, add to sync
2314 >      //      if( pf->Pt() > 0.5 )
2315 >        fNeutralHadronIso += pf->Pt();
2316 >    }
2317 >
2318 >    }
2319 >
2320 >  }
2321 >
2322 >
2323 >  double rho=0;
2324 >  if( (EffectiveAreaVersion == mithep::ElectronTools::kEleEAFall11MC) ||
2325 >      (EffectiveAreaVersion == mithep::ElectronTools::kEleEAData2011) ) {
2326 >    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25()) ||
2327 >          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25())))
2328 >      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25();
2329 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2330 >    EffectiveAreaVersion  = mithep::ElectronTools::kEleEAData2011;
2331 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2332 >  } else {
2333 >    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJets()) ||
2334 >          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJets())))
2335 >      rho = fPUEnergyDensity->At(0)->RhoKt6PFJets();
2336 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2337 >    EffectiveAreaVersion  = mithep::ElectronTools::kEleEAData2012;
2338 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2339 >  }
2340 >  if(ctrl.debug) cout << "rho: " << rho << endl;
2341 >
2342 >  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2343 >                                        -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2344 >                                                                   ele->Eta(),EffectiveAreaVersion)));
2345 >
2346 >
2347 >  gChargedIso = fChargedIso;
2348 >  gGammaIso = fGammaIso;
2349 >  gNeutralIso = fNeutralHadronIso;  
2350 >
2351 >  if( ctrl.debug ) {
2352 >    cout << "PFiso: " << pfIso
2353 >         << "\tfChargedIso: " << fChargedIso
2354 >         << "\tfGammaIso: " << fGammaIso
2355 >         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2356 >         << endl;
2357 >  }
2358 >
2359 >  return pfIso;
2360 > }
2361 >
2362 >
2363 >
2364 > //--------------------------------------------------------------------------------------------------
2365 > // hacked version
2366 > float electronPFIso04(ControlFlags &ctrl,
2367 >                      const mithep::Electron * ele,
2368 >                      const mithep::Vertex * vtx,
2369 >                      const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2370 >                      float rho,
2371 >                      mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2372 >                      vector<const mithep::Muon*> muonsToVeto,
2373 >                      vector<const mithep::Electron*> electronsToVeto)
2374 > //--------------------------------------------------------------------------------------------------
2375 > {
2376 >
2377 >  if( ctrl.debug ) {
2378 >    cout << "electronIsoMVASelection :: muons to veto " << endl;
2379 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
2380 >      const mithep::Muon * vmu = muonsToVeto[i];
2381 >      cout << "\tpt: " << vmu->Pt()
2382 >           << "\teta: " << vmu->Eta()
2383 >           << "\tphi: " << vmu->Phi()
2384 >           << endl;
2385 >    }
2386 >    cout << "electronIsoMVASelection :: electrons to veto " << endl;
2387 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
2388 >      const mithep::Electron * vel = electronsToVeto[i];
2389 >      cout << "\tpt: " << vel->Pt()
2390 >           << "\teta: " << vel->Eta()
2391 >           << "\tphi: " << vel->Phi()
2392 >           << "\ttrk: " << vel->TrackerTrk()
2393 >           << endl;
2394 >    }
2395 >  }
2396 >
2397 >
2398 >  //
2399 >  // final iso
2400 >  //
2401 >  Double_t fChargedIso = 0.0;
2402 >  Double_t fGammaIso = 0.0;
2403 >  Double_t fNeutralHadronIso = 0.0;
2404 >
2405 >
2406 >  //
2407 >  //Loop over PF Candidates
2408 >  //
2409 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2410 >
2411 >
2412 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2413 >    Double_t deta = (ele->Eta() - pf->Eta());
2414 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2415 >    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2416 >
2417 >    if (dr > 0.4) continue;
2418 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
2419 >
2420 >    if(ctrl.debug) {
2421 >      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt() << "\tdR: " << dr;
2422 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx)
2423 >                                     << "\ttrk: " << pf->HasTrackerTrk()
2424 >                                     << "\tgsf: " << pf->HasGsfTrk();
2425 >      
2426 >      cout << endl;
2427 >    }
2428 >
2429 >
2430 >    //
2431 >    // sync : I don't think theyre doing this ...
2432 >    //
2433 >    //     if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2434 >    //   (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) {
2435 >    //       if( ctrl.debug ) cout << "\tskipping, matches to the electron ..."  << endl;
2436 >    //       continue;
2437 >    //     }
2438 >
2439 >
2440 >    //
2441 >    // Lepton Footprint Removal
2442 >    //
2443 >    Bool_t IsLeptonFootprint = kFALSE;
2444 >    if (dr < 1.0) {
2445 >
2446 >      //
2447 >      // Check for electrons
2448 >      //
2449 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
2450 >        const mithep::Electron *tmpele = electronsToVeto[q];
2451 >        /*
2452 >        // 4l electron
2453 >        if( pf->HasTrackerTrk()  ) {
2454 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
2455 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
2456 >            IsLeptonFootprint = kTRUE;
2457 >          }
2458 >        }
2459 >        if( pf->HasGsfTrk()  ) {
2460 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
2461 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
2462 >            IsLeptonFootprint = kTRUE;
2463 >          }
2464 >        }
2465 >        */
2466 >        // PF charged
2467 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
2468 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
2469 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
2470 >          IsLeptonFootprint = kTRUE;
2471 >        }
2472 >        // PF gamma
2473 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
2474 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
2475 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
2476 >          IsLeptonFootprint = kTRUE;
2477 >        }
2478 >      } // loop over electrons
2479 >
2480 >      /* KH - comment for sync            
2481 >      //
2482 >      // Check for muons
2483 >      //
2484 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
2485 >        const mithep::Muon *tmpmu = muonsToVeto[q];
2486 >        // 4l muon
2487 >        if( pf->HasTrackerTrk() ) {
2488 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
2489 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
2490 >            IsLeptonFootprint = kTRUE;
2491 >          }
2492 >        }
2493 >        // PF charged
2494 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
2495 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
2496 >          IsLeptonFootprint = kTRUE;
2497 >        }
2498 >      } // loop over muons
2499 >      */
2500 >
2501 >    if (IsLeptonFootprint)
2502 >      continue;
2503 >
2504 >    //
2505 >    // Charged Iso
2506 >    //
2507 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
2508 >
2509 > //       if( pf->HasTrackerTrk() )
2510 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2511 > //       if( pf->HasGsfTrk() )
2512 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2513 >
2514 >      // Veto any PFmuon, or PFEle
2515 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) {
2516 >        if( ctrl.debug ) cout << "\t skipping, pf is and ele or mu .." <<endl;
2517 >        continue;
2518 >      }
2519 >
2520 >      // Footprint Veto
2521 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2522 >
2523 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2524 >                           << "\ttype: " << pf->PFType()
2525 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
2526 >
2527 >      fChargedIso += pf->Pt();
2528 >    }
2529 >
2530 >    //
2531 >    // Gamma Iso
2532 >    //
2533 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2534 >
2535 >      if (fabs(ele->SCluster()->Eta()) > 1.479) {
2536 >        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2537 >      }
2538 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2539 >                           << dr << endl;
2540 >      // KH, add to sync
2541 >      //      if( pf->Pt() > 0.5 )
2542 >        fGammaIso += pf->Pt();
2543 >    }
2544 >
2545 >    //
2546 >    // Neutral Iso
2547 >    //
2548 >    else {
2549 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2550 >                           << dr << endl;
2551 >      // KH, add to sync
2552 >      //      if( pf->Pt() > 0.5 )
2553 >        fNeutralHadronIso += pf->Pt();
2554 >    }
2555 >
2556 >    }
2557 >
2558 >  }
2559 >
2560 > //   double rho = 0;
2561 > //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2562 > //     rho = fPUEnergyDensity->At(0)->Rho();
2563 >
2564 >  // WARNING!!!!  
2565 >  // hardcode for sync ...
2566 >  EffectiveAreaVersion = eleT.kEleEAData2011;
2567 >  // WARNING!!!!  
2568 >
2569 >
2570 >  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2571 >                                        -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2572 >                                                                   ele->Eta(),EffectiveAreaVersion)));
2573 >
2574 >
2575 >  gChargedIso = fChargedIso;
2576 >  gGammaIso = fGammaIso;
2577 >  gNeutralIso = fNeutralHadronIso;  
2578 >  return pfIso;
2579 > }
2580 >
2581 >
2582 > //--------------------------------------------------------------------------------------------------
2583 > SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2584 >                                              const mithep::Electron * ele,
2585 >                                              const mithep::Vertex * vtx,
2586 >                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2587 >                                              const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2588 >                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2589 >                                              vector<const mithep::PFCandidate*> photonsToVeto)
2590 > //--------------------------------------------------------------------------------------------------
2591 > {
2592 >
2593 >  SelectionStatus status;
2594 >
2595 >  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, fPUEnergyDensity,
2596 >                                  EffectiveAreaVersion, photonsToVeto);
2597 >  //  cout << "--------------> setting electron isoPF04 to " << pfIso << endl;
2598 >  status.isoPF04 = pfIso;
2599 >  status.chisoPF04 = gChargedIso;
2600 >  status.gaisoPF04 = gGammaIso;
2601 >  status.neisoPF04 = gNeutralIso;
2602 >
2603 >  bool pass = false;
2604 >  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2605 >
2606 >  if( pass ) {
2607 >    status.orStatus(SelectionStatus::LOOSEISO);
2608 >    status.orStatus(SelectionStatus::TIGHTISO);
2609 >  }
2610 >  if(ctrl.debug) {
2611 >    cout << "el relpfIso: " << pfIso/ele->Pt() << endl;
2612 >    cout << "returning status : " << hex << status.getStatus() << dec << endl;
2613 >  }
2614 >  return status;
2615 >
2616 > }
2617 >
2618 >
2619 > //--------------------------------------------------------------------------------------------------
2620 > // hacked version
2621 > SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2622 >                                              const mithep::Electron * ele,
2623 >                                              const mithep::Vertex * vtx,
2624 >                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2625 >                                              float rho,
2626 >                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2627 >                                              vector<const mithep::Muon*> muonsToVeto,
2628 >                                              vector<const mithep::Electron*> electronsToVeto)
2629 > //--------------------------------------------------------------------------------------------------
2630 > {
2631 >
2632 >  SelectionStatus status;
2633 >
2634 >  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, rho,
2635 >                                  EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
2636 >  status.isoPF04 = pfIso;
2637 >  status.chisoPF04 = gChargedIso;
2638 >  status.gaisoPF04 = gGammaIso;
2639 >  status.neisoPF04 = gNeutralIso;
2640 >  bool pass = false;
2641 >  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2642 >
2643 >  if( pass ) {
2644 >    status.orStatus(SelectionStatus::LOOSEISO);
2645 >    status.orStatus(SelectionStatus::TIGHTISO);
2646    }
2647    if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2648    return status;
2649  
2650   }
2651 +
2652 +
2653 +
2654 + //--------------------------------------------------------------------------------------------------
2655 + double  dbetaCorrectedIsoDr03(ControlFlags & ctrl,
2656 +                              const mithep::PFCandidate * photon,
2657 +                              const mithep::Muon * lepton,
2658 +                              const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2659 + //--------------------------------------------------------------------------------------------------
2660 + {
2661 +
2662 +  //
2663 +  // final iso
2664 +  //
2665 +  Double_t fChargedIso  = 0.0;
2666 +  Double_t fGammaIso  = 0.0;
2667 +  Double_t fNeutralHadronIso  = 0.0;
2668 +  Double_t fpfPU  = 0.0;
2669 +
2670 +  //
2671 +  // Loop over PF Candidates
2672 +  //
2673 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2674 +
2675 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2676 +    
2677 +    Double_t deta = (photon->Eta() - pf->Eta());
2678 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2679 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2680 +    if (dr > 0.3) continue;
2681 +
2682 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2683 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2684 +        fpfPU += pf->Pt();
2685 +      continue;
2686 +    }
2687 +    
2688 +    //
2689 +    // skip this photon
2690 +    //
2691 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2692 +        pf->Et() == photon->Et() ) continue;
2693 +    
2694 +      
2695 +    //
2696 +    // Charged Iso
2697 +    //
2698 +    if (pf->Charge() != 0 ) {
2699 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2700 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2701 +        fChargedIso += pf->Pt();
2702 +    }
2703 +    
2704 +    //
2705 +    // Gamma Iso
2706 +    //
2707 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2708 +      if( pf->Pt() > 0.5 && dr > 0.01)
2709 +        fGammaIso += pf->Pt();
2710 +    }
2711 +    
2712 +    //
2713 +    // Other Neutrals
2714 +    //
2715 +    else {
2716 +      if( pf->Pt() > 0.5 && dr > 0.01)
2717 +        fNeutralHadronIso += pf->Pt();
2718 +    }
2719 +    
2720 +  }
2721 +  
2722 +  if( ctrl.debug ) {
2723 +    cout << "photon dbetaIso :: " << endl;
2724 +    cout << "\tfChargedIso: " << fChargedIso
2725 +         << "\tfGammaIso: " << fGammaIso
2726 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2727 +         << "\tfpfPU: " << fpfPU
2728 +         << endl;
2729 +  }
2730 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso - 0.5*fpfPU;
2731 +  return pfIso/photon->Pt();
2732 + }
2733 +
2734 +
2735 + //--------------------------------------------------------------------------------------------------
2736 + double  dbetaCorrectedIsoDr03(ControlFlags & ctrl,
2737 +                              const mithep::PFCandidate * photon,
2738 +                              const mithep::Electron * lepton,
2739 +                              const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2740 + //--------------------------------------------------------------------------------------------------
2741 + {
2742 +
2743 +  //
2744 +  // final iso
2745 +  //
2746 +  Double_t fChargedIso  = 0.0;
2747 +  Double_t fGammaIso  = 0.0;
2748 +  Double_t fNeutralHadronIso  = 0.0;
2749 +  Double_t fpfPU  = 0.0;
2750 +
2751 +  //
2752 +  // Loop over PF Candidates
2753 +  //
2754 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2755 +
2756 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2757 +    
2758 +    Double_t deta = (photon->Eta() - pf->Eta());
2759 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2760 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2761 +    if (dr > 0.3) continue;
2762 +
2763 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2764 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2765 +        fpfPU += pf->Pt();
2766 +      continue;
2767 +    }
2768 +    
2769 +    //
2770 +    // skip this photon
2771 +    //
2772 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2773 +        pf->Et() == photon->Et() ) continue;
2774 +    
2775 +      
2776 +    //
2777 +    // Charged Iso
2778 +    //
2779 +    if (pf->Charge() != 0 ) {
2780 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2781 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2782 +        fChargedIso += pf->Pt();
2783 +    }
2784 +    
2785 +    //
2786 +    // Gamma Iso
2787 +    //
2788 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2789 +      if( pf->Pt() > 0.5 && dr > 0.01)
2790 +        fGammaIso += pf->Pt();
2791 +    }
2792 +    
2793 +    //
2794 +    // Other Neutrals
2795 +    //
2796 +    else {
2797 +      if( pf->Pt() > 0.5 && dr > 0.01)
2798 +        fNeutralHadronIso += pf->Pt();
2799 +    }
2800 +    
2801 +  }
2802 +  
2803 +  if( ctrl.debug ) {
2804 +    cout << "photon dbetaIso :: " << endl;
2805 +    cout << "\tfChargedIso: " << fChargedIso
2806 +         << "\tfGammaIso: " << fGammaIso
2807 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2808 +         << "\tfpfPU: " << fpfPU
2809 +         << endl;
2810 +  }
2811 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso - 0.5*fpfPU;
2812 +  return pfIso/photon->Pt();
2813 + }
2814 +
2815 +
2816 +
2817 +
2818 +
2819 + //--------------------------------------------------------------------------------------------------
2820 + double  nonCorrectedIsoDr03(ControlFlags & ctrl,
2821 +                            const mithep::PFCandidate * photon,
2822 +                            const mithep::Muon * lepton,
2823 +                            const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2824 + //--------------------------------------------------------------------------------------------------
2825 + {
2826 +
2827 +  //
2828 +  // final iso
2829 +  //
2830 +  Double_t fChargedIso  = 0.0;
2831 +  Double_t fGammaIso  = 0.0;
2832 +  Double_t fNeutralHadronIso  = 0.0;
2833 +  Double_t fpfPU  = 0.0;
2834 +
2835 +  //
2836 +  // Loop over PF Candidates
2837 +  //
2838 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2839 +
2840 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2841 +
2842 +    Double_t deta = (photon->Eta() - pf->Eta());
2843 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2844 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2845 +    if (dr > 0.3) continue;
2846 +
2847 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2848 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2849 +        fpfPU += pf->Pt();
2850 +      continue;
2851 +    }
2852 +    
2853 +    //
2854 +    // skip this photon
2855 +    //
2856 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2857 +        pf->Et() == photon->Et() ) continue;
2858 +    
2859 +      
2860 +    //
2861 +    // Charged Iso
2862 +    //
2863 +    if (pf->Charge() != 0 ) {
2864 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2865 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2866 +        fChargedIso += pf->Pt();
2867 +    }
2868 +    
2869 +    //
2870 +    // Gamma Iso
2871 +    //
2872 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2873 +      if( pf->Pt() > 0.5 && dr > 0.01)
2874 +        fGammaIso += pf->Pt();
2875 +    }
2876 +    
2877 +    //
2878 +    // Other Neutrals
2879 +    //
2880 +    else {
2881 +      if( pf->Pt() > 0.5 && dr > 0.01)
2882 +        fNeutralHadronIso += pf->Pt();
2883 +    }
2884 +    
2885 +  }
2886 +  
2887 +  if( ctrl.debug ) {
2888 +    cout << "photon dbetaIso :: " << endl;
2889 +    cout << "\tfChargedIso: " << fChargedIso
2890 +         << "\tfGammaIso: " << fGammaIso
2891 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2892 +         << "\tfpfPU: " << fpfPU
2893 +         << endl;
2894 +  }
2895 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso + fpfPU;
2896 +  return pfIso/photon->Pt();
2897 + }
2898 +
2899 +
2900 +
2901 + //--------------------------------------------------------------------------------------------------
2902 + double  nonCorrectedIsoDr03(ControlFlags & ctrl,
2903 +                            const mithep::PFCandidate * photon,
2904 +                            const mithep::Electron * lepton,
2905 +                            const mithep::Array<mithep::PFCandidate> * fPFCandidates)
2906 + //--------------------------------------------------------------------------------------------------
2907 + {
2908 +
2909 +  //
2910 +  // final iso
2911 +  //
2912 +  Double_t fChargedIso  = 0.0;
2913 +  Double_t fGammaIso  = 0.0;
2914 +  Double_t fNeutralHadronIso  = 0.0;
2915 +  Double_t fpfPU  = 0.0;
2916 +
2917 +  //
2918 +  // Loop over PF Candidates
2919 +  //
2920 +  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2921 +
2922 +    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2923 +
2924 +    Double_t deta = (photon->Eta() - pf->Eta());
2925 +    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(photon->Phi()),Double_t(pf->Phi()));
2926 +    Double_t dr = mithep::MathUtils::DeltaR(photon->Phi(),photon->Eta(), pf->Phi(), pf->Eta());
2927 +    if (dr > 0.3) continue;
2928 +
2929 +    if( !(PFnoPUflag[k]) && pf->Charge() != 0 ) {
2930 +      if( pf->Pt() >= 0.2 && dr > 0.01 )
2931 +        fpfPU += pf->Pt();
2932 +      continue;
2933 +    }
2934 +    
2935 +    //
2936 +    // skip this photon
2937 +    //
2938 +    if( abs(pf->PFType()) == mithep::PFCandidate::eGamma &&
2939 +        pf->Et() == photon->Et() ) continue;
2940 +    
2941 +      
2942 +    //
2943 +    // Charged Iso
2944 +    //
2945 +    if (pf->Charge() != 0 ) {
2946 +      if( dr > 0.01 && pf->Pt() >= 0.2 &&
2947 +          !(pf->TrackerTrk() == lepton->TrackerTrk()) )
2948 +        fChargedIso += pf->Pt();
2949 +    }
2950 +    
2951 +    //
2952 +    // Gamma Iso
2953 +    //
2954 +    else if (abs(pf->PFType()) == mithep::PFCandidate::eGamma) {
2955 +      if( pf->Pt() > 0.5 && dr > 0.01)
2956 +        fGammaIso += pf->Pt();
2957 +    }
2958 +    
2959 +    //
2960 +    // Other Neutrals
2961 +    //
2962 +    else {
2963 +      if( pf->Pt() > 0.5 && dr > 0.01)
2964 +        fNeutralHadronIso += pf->Pt();
2965 +    }
2966 +    
2967 +  }
2968 +  
2969 +  if( ctrl.debug ) {
2970 +    cout << "photon dbetaIso :: " << endl;
2971 +    cout << "\tfChargedIso: " << fChargedIso
2972 +         << "\tfGammaIso: " << fGammaIso
2973 +         << "\tfNeutralHadronIso: " << fNeutralHadronIso
2974 +         << "\tfpfPU: " << fpfPU
2975 +         << endl;
2976 +  }
2977 +  double pfIso = fChargedIso + fGammaIso + fNeutralHadronIso + fpfPU;
2978 +  return pfIso/photon->Pt();
2979 + }
2980 +
2981 +
2982 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines