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.1 by khahn, Mon Feb 13 09:35:20 2012 UTC vs.
Revision 1.27 by khahn, Mon May 28 16:34:44 2012 UTC

# Line 3 | Line 3
3   #include "IsolationSelection.h"
4   #include "IsolationSelectionDefs.h"
5  
6 < SelectionStatus passMuonIsoSelection( ControlFlags &ctrl, const mithep::TMuon * mu ) {
6 > #include "MathUtils.h"
7 > #include "MuonTools.h"
8 > #include "MuonIDMVA.h"
9 > #include "ElectronTools.h"
10 > #include "ElectronIDMVA.h"
11  
12 <  float reliso = mu->pfIso03/mu->pt;
13 <  bool isEB = (fabs(mu->eta) < 1.479 ? 1 : 0 );  
12 > using namespace mithep;
13 >
14 > mithep::MuonIDMVA     * muIsoMVA;
15 > mithep::MuonTools       muT;
16 > mithep::ElectronIDMVA * eleIsoMVA;
17 > mithep::ElectronTools   eleT;
18 >
19 > // global hack to sync
20 > double gChargedIso;
21 > double gGammaIso;
22 > double gNeutralIso;
23 >
24 > extern vector<bool> PFnoPUflag;
25 >
26 > //--------------------------------------------------------------------------------------------------
27 > Float_t computePFMuonIso(const mithep::Muon *muon,
28 >                         const mithep::Vertex * vtx,
29 >                         const mithep::Array<mithep::PFCandidate> * fPFCandidates,
30 >                         const Double_t dRMax)
31 > //--------------------------------------------------------------------------------------------------
32 > {
33 >  const Double_t dRMin    = 0;
34 >  const Double_t neuPtMin = 1.0;
35 >  const Double_t dzMax    = 0.1;
36 >    
37 >  Double_t zLepton = (muon->BestTrk()) ? muon->BestTrk()->DzCorrected(*vtx) : 0.0;
38 >  
39 >  Float_t iso=0;
40 >  for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
41 >    const PFCandidate *pfcand = fPFCandidates->At(ipf);
42 >    
43 >    if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue;  // pT cut on neutral particles
44 >    
45 >    // exclude THE muon
46 >    if(pfcand->TrackerTrk() && muon->TrackerTrk() && (pfcand->TrackerTrk()==muon->TrackerTrk())) continue;
47 >    
48 >    // dz cut
49 >    Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(*vtx) - zLepton) : 0;
50 >    if(dz >= dzMax) continue;
51 >    
52 >    // check iso cone
53 >    Double_t dr = MathUtils::DeltaR(muon->Mom(), pfcand->Mom());
54 >    if(dr<dRMax && dr>=dRMin)
55 >      iso += pfcand->Pt();
56 >  }
57 >  
58 >  return iso;
59 > }
60 >
61 > //--------------------------------------------------------------------------------------------------
62 > Float_t computePFEleIso(const mithep::Electron *electron,
63 >                        const mithep::Vertex * fVertex,
64 >                        const mithep::Array<mithep::PFCandidate> * fPFCandidates,
65 >                        const Double_t dRMax)
66 > //--------------------------------------------------------------------------------------------------
67 > {
68 >  const Double_t dRMin    = 0;
69 >  const Double_t neuPtMin = 1.0;
70 >  const Double_t dzMax    = 0.1;
71 >    
72 >  Double_t zLepton = (electron->BestTrk()) ? electron->BestTrk()->DzCorrected(*fVertex) : 0.0;
73 >  
74 >  Float_t iso=0;
75 >  for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
76 >    const PFCandidate *pfcand = (PFCandidate*)(fPFCandidates->At(ipf));
77 >    
78 >    if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue;  // pT cut on neutral particles
79 >    
80 >    // dz cut
81 >    Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(*fVertex) - zLepton) : 0;
82 >    if(dz >= dzMax) continue;
83 >    
84 >    // remove THE electron
85 >    if(pfcand->TrackerTrk() && electron->TrackerTrk() && (pfcand->TrackerTrk()==electron->TrackerTrk())) continue;
86 >    if(pfcand->GsfTrk()     && electron->GsfTrk()     && (pfcand->GsfTrk()==electron->GsfTrk()))         continue;
87 >    
88 >    // check iso cone
89 >    Double_t dr = MathUtils::DeltaR(electron->Mom(), pfcand->Mom());
90 >    if(dr<dRMax && dr>=dRMin) {
91 >      // eta-strip veto for photons
92 >      if((pfcand->PFType() == PFCandidate::eGamma) && fabs(electron->Eta() - pfcand->Eta()) < 0.025) continue;
93 >      
94 >      // Inner cone (one tower = dR < 0.07) veto for non-photon neutrals
95 >      if(!pfcand->HasTrk() && (pfcand->PFType() == PFCandidate::eNeutralHadron) &&
96 >         (MathUtils::DeltaR(electron->Mom(), pfcand->Mom()) < 0.07)) continue;
97 >      
98 >      iso += pfcand->Pt();
99 >    }
100 >  }
101 >  
102 >  return iso;
103 > };
104 >
105 > //--------------------------------------------------------------------------------------------------
106 > bool pairwiseIsoSelection( ControlFlags &ctrl,
107 >                           vector<SimpleLepton> &lepvec,
108 >                           float rho )
109 > //--------------------------------------------------------------------------------------------------
110 > {
111 >
112 >  bool passiso=true;
113 >
114 >  for( int i=0; i<lepvec.size(); i++ )
115 >    {
116 >      
117 >      if( !(lepvec[i].is4l) ) continue;
118 >      
119 >      float effArea_ecal_i, effArea_hcal_i;
120 >      if( lepvec[i].isEB ) {
121 >        if( lepvec[i].type == 11 ) {
122 >          effArea_ecal_i = 0.101;
123 >          effArea_hcal_i = 0.021;
124 >        } else {
125 >          effArea_ecal_i = 0.074;
126 >          effArea_hcal_i = 0.022;
127 >        }
128 >      } else {
129 >        if( lepvec[i].type == 11 ) {
130 >          effArea_ecal_i = 0.046;
131 >          effArea_hcal_i = 0.040;
132 >        } else {
133 >          effArea_ecal_i = 0.045;
134 >          effArea_hcal_i = 0.030;
135 >        }
136 >      }
137 >      
138 >      float isoEcal_corr_i = lepvec[i].isoEcal - (effArea_ecal_i*rho);
139 >      float isoHcal_corr_i = lepvec[i].isoHcal - (effArea_hcal_i*rho);
140 >
141 >      for( int j=i+1; j<lepvec.size(); j++ )
142 >        {
143 >
144 >          if( !(lepvec[j].is4l) ) continue;
145 >
146 >          float effArea_ecal_j, effArea_hcal_j;
147 >          if( lepvec[j].isEB ) {
148 >            if( lepvec[j].type == 11 ) {
149 >              effArea_ecal_j = 0.101;
150 >              effArea_hcal_j = 0.021;
151 >            } else {
152 >              effArea_ecal_j = 0.074;
153 >              effArea_hcal_j = 0.022;
154 >            }
155 >          } else {
156 >            if( lepvec[j].type == 11 ) {
157 >              effArea_ecal_j = 0.046;
158 >              effArea_hcal_j = 0.040;
159 >            } else {
160 >              effArea_ecal_j = 0.045;
161 >              effArea_hcal_j = 0.030;
162 >            }
163 >          }
164 >
165 >          float isoEcal_corr_j = lepvec[j].isoEcal - (effArea_ecal_j*rho);
166 >          float isoHcal_corr_j = lepvec[j].isoHcal - (effArea_hcal_j*rho);
167 >          float RIso_i = (lepvec[i].isoTrk+isoEcal_corr_i+isoHcal_corr_i)/lepvec[i].vec.Pt();
168 >          float RIso_j = (lepvec[j].isoTrk+isoEcal_corr_j+isoHcal_corr_j)/lepvec[j].vec.Pt();      
169 >          float comboIso = RIso_i + RIso_j;
170 >          
171 >          if( comboIso > 0.35 ) {
172 >            if( ctrl.debug ) cout << "combo failing for indices: " << i << "," << j << endl;
173 >            passiso = false;
174 >            return passiso;
175 >          }
176 >        }
177 >    }
178 >  
179 >  return passiso;
180 > }
181 >
182 > //--------------------------------------------------------------------------------------------------
183 > SelectionStatus muonIsoSelection(ControlFlags &ctrl,
184 >                                 const mithep::Muon * mu,
185 >                                 const mithep::Vertex * vtx,
186 >                                 const mithep::Array<mithep::PFCandidate> * fPFCandidateCol   )
187 > //--------------------------------------------------------------------------------------------------
188 > {
189 >  float reliso = computePFMuonIso(mu,vtx,fPFCandidateCol,0.3)/mu->Pt();
190 >  bool isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 );  
191    bool failiso = false;
192 <  if( isEB && mu->pt > 20 && reliso > PFISO_MU_LOOSE_EB_HIGHPT ) {  
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 28 | 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;
45 <  if( !(isEB) && ele->pt > 20 && reliso > PFISO_ELE_LOOSE_EE_HIGHPT ) {
46 <    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::Muon*> muonsToVeto,
966 >                    vector<const mithep::Electron*> electronsToVeto)
967 > //--------------------------------------------------------------------------------------------------
968 > {
969 >
970 >  extern double gChargedIso;  
971 >  extern double  gGammaIso;      
972 >  extern double  gNeutralIso;
973 >  
974 >  if( ctrl.debug ) {
975 >    cout << "muonIsoMVASelection :: muons to veto " << endl;
976 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
977 >      const mithep::Muon * vmu = muonsToVeto[i];
978 >      cout << "\tpt: " << vmu->Pt()
979 >           << "\teta: " << vmu->Eta()
980 >           << "\tphi: " << vmu->Phi()
981 >           << endl;
982 >    }
983 >    cout << "muonIsoMVASelection :: electrson to veto " << endl;
984 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
985 >      const mithep::Electron * vel = electronsToVeto[i];
986 >      cout << "\tpt: " << vel->Pt()
987 >           << "\teta: " << vel->Eta()
988 >           << "\tphi: " << vel->Phi()
989 >           << endl;
990 >    }
991 >  }
992 >
993 >  //
994 >  // final iso
995 >  //
996 >  Double_t fChargedIso  = 0.0;
997 >  Double_t fGammaIso  = 0.0;
998 >  Double_t fNeutralHadronIso  = 0.0;
999 >
1000 >  //
1001 >  //Loop over PF Candidates
1002 >  //
1003 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1004 >
1005 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1006 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1007 >
1008 >    Double_t deta = (mu->Eta() - pf->Eta());
1009 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
1010 >    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
1011 >    if (dr > 0.4) continue;
1012 >
1013 >    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
1014 >
1015 >    //
1016 >    // Lepton Footprint Removal
1017 >    //
1018 >    Bool_t IsLeptonFootprint = kFALSE;
1019 >    if (dr < 1.0) {
1020 >
1021 >      //
1022 >      // Check for electrons
1023 >      //
1024 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1025 >        const mithep::Electron *tmpele = electronsToVeto[q];
1026 >        // 4l electron
1027 >        if( pf->HasTrackerTrk() ) {
1028 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
1029 >            IsLeptonFootprint = kTRUE;
1030 >        }
1031 >        if( pf->HasGsfTrk() ) {
1032 >          if( pf->GsfTrk() == tmpele->GsfTrk() )
1033 >            IsLeptonFootprint = kTRUE;
1034 >        }
1035 >        // PF charged
1036 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
1037 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
1038 >          if( ctrl.debug) cout << "\tcharged trk, dR ("
1039 >                               << mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta())
1040 >                               << " matches 4L ele ..." << endl;
1041 >          IsLeptonFootprint = kTRUE;
1042 >        }
1043 >        // PF gamma
1044 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1045 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
1046 >          IsLeptonFootprint = kTRUE;
1047 >      } // loop over electrons
1048 >
1049 >      /* KH - comment for sync      
1050 >      //
1051 >      // Check for muons
1052 >      //
1053 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1054 >        const mithep::Muon *tmpmu = muonsToVeto[q];
1055 >        // 4l muon
1056 >        if( pf->HasTrackerTrk() ) {
1057 >          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
1058 >            IsLeptonFootprint = kTRUE;
1059 >        }
1060 >        // PF charged
1061 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
1062 >          IsLeptonFootprint = kTRUE;
1063 >      } // loop over muons
1064 >      */
1065 >
1066 >    if (IsLeptonFootprint)
1067 >      continue;
1068 >
1069 >    //
1070 >    // Charged Iso
1071 >    //
1072 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1073 >
1074 >      //if( dr < 0.01 ) continue; // only for muon iso mva?
1075 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1076 >
1077 >
1078 > //       if( pf->HasTrackerTrk() ) {
1079 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1080 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1081 > //                            << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
1082 > //                            << dr << endl;
1083 > //       }
1084 > //       if( pf->HasGsfTrk() ) {
1085 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1086 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1087 > //                            << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
1088 > //                            << dr << endl;
1089 > //       }
1090 >
1091 >
1092 >      fChargedIso += pf->Pt();
1093 >    }
1094 >
1095 >    //
1096 >    // Gamma Iso
1097 >    //
1098 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1099 >      // KH, add to sync
1100 >      if( pf->Pt() > 0.5 )
1101 >      fGammaIso += pf->Pt();
1102 >    }
1103 >
1104 >    //
1105 >    // Other Neutrals
1106 >    //
1107 >    else {
1108 >      // KH, add to sync
1109 >      if( pf->Pt() > 0.5 )
1110 >        fNeutralHadronIso += pf->Pt();
1111 >    }
1112 >    
1113 >    }
1114 >    
1115 >  }
1116 >
1117 >  double rho=0;
1118 >  if( (EffectiveAreaVersion == mithep::MuonTools::kMuEAFall11MC) ||
1119 >      (EffectiveAreaVersion == mithep::MuonTools::kMuEAData2011) ) {
1120 >    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25()) ||
1121 >          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25())))
1122 >      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25();
1123 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1124 >    EffectiveAreaVersion  = mithep::MuonTools::kMuEAData2011;
1125 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1126 >  } else {
1127 >    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsCentralNeutral()) ||
1128 >          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsCentralNeutral())))
1129 >      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsCentralNeutral();
1130 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1131 >    EffectiveAreaVersion  = mithep::MuonTools::kMuEAData2011;
1132 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
1133 >  }
1134 >  if(ctrl.debug) cout << "rho: " << rho << endl;
1135 >
1136 >  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
1137 >                                        -rho*muT.MuonEffectiveArea(muT.kMuGammaAndNeutralHadronIso04,
1138 >                                                                   mu->Eta(),EffectiveAreaVersion)));
1139 >  gChargedIso = fChargedIso;
1140 >  gGammaIso   = fGammaIso;
1141 >  gNeutralIso = fNeutralHadronIso;
1142 >  
1143 >  return pfIso;
1144 > }
1145 >
1146 >
1147 >
1148 >
1149 > //--------------------------------------------------------------------------------------------------
1150 > // hacked version
1151 > double  muonPFIso04(ControlFlags &ctrl,
1152 >                    const mithep::Muon * mu,
1153 >                    const mithep::Vertex * vtx,
1154 >                    const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1155 >                    float rho,
1156 >                    mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1157 >                    vector<const mithep::Muon*> muonsToVeto,
1158 >                    vector<const mithep::Electron*> electronsToVeto)
1159 > //--------------------------------------------------------------------------------------------------
1160 > {
1161 >
1162 >  extern double gChargedIso;  
1163 >  extern double  gGammaIso;      
1164 >  extern double  gNeutralIso;
1165 >  
1166 >  if( ctrl.debug ) {
1167 >    cout << "muonIsoMVASelection :: muons to veto " << endl;
1168 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
1169 >      const mithep::Muon * vmu = muonsToVeto[i];
1170 >      cout << "\tpt: " << vmu->Pt()
1171 >           << "\teta: " << vmu->Eta()
1172 >           << "\tphi: " << vmu->Phi()
1173 >           << endl;
1174 >    }
1175 >    cout << "muonIsoMVASelection :: electrson to veto " << endl;
1176 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
1177 >      const mithep::Electron * vel = electronsToVeto[i];
1178 >      cout << "\tpt: " << vel->Pt()
1179 >           << "\teta: " << vel->Eta()
1180 >           << "\tphi: " << vel->Phi()
1181 >           << endl;
1182 >    }
1183 >  }
1184 >
1185 >  //
1186 >  // final iso
1187 >  //
1188 >  Double_t fChargedIso  = 0.0;
1189 >  Double_t fGammaIso  = 0.0;
1190 >  Double_t fNeutralHadronIso  = 0.0;
1191 >
1192 >  //
1193 >  //Loop over PF Candidates
1194 >  //
1195 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1196 >
1197 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1198 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1199 >
1200 >    Double_t deta = (mu->Eta() - pf->Eta());
1201 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
1202 >    Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
1203 >    if (dr > 0.4) continue;
1204 >
1205 >    if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
1206 >
1207 >    //
1208 >    // Lepton Footprint Removal
1209 >    //
1210 >    Bool_t IsLeptonFootprint = kFALSE;
1211 >    if (dr < 1.0) {
1212 >
1213 >      //
1214 >      // Check for electrons
1215 >      //
1216 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1217 >        const mithep::Electron *tmpele = electronsToVeto[q];
1218 >        // 4l electron
1219 >        if( pf->HasTrackerTrk() ) {
1220 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() )
1221 >            IsLeptonFootprint = kTRUE;
1222 >        }
1223 >        if( pf->HasGsfTrk() ) {
1224 >          if( pf->GsfTrk() == tmpele->GsfTrk() )
1225 >            IsLeptonFootprint = kTRUE;
1226 >        }
1227 >        // PF charged
1228 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
1229 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
1230 >          IsLeptonFootprint = kTRUE;
1231 >        // PF gamma
1232 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
1233 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
1234 >          IsLeptonFootprint = kTRUE;
1235 >      } // loop over electrons
1236 >
1237 >      /* KH - comment for sync      
1238 >      //
1239 >      // Check for muons
1240 >      //
1241 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1242 >        const mithep::Muon *tmpmu = muonsToVeto[q];
1243 >        // 4l muon
1244 >        if( pf->HasTrackerTrk() ) {
1245 >          if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
1246 >            IsLeptonFootprint = kTRUE;
1247 >        }
1248 >        // PF charged
1249 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
1250 >          IsLeptonFootprint = kTRUE;
1251 >      } // loop over muons
1252 >      */
1253 >
1254 >    if (IsLeptonFootprint)
1255 >      continue;
1256 >
1257 >    //
1258 >    // Charged Iso
1259 >    //
1260 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1261 >
1262 >      //if( dr < 0.01 ) continue; // only for muon iso mva?
1263 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1264 >
1265 >
1266 > //       if( pf->HasTrackerTrk() ) {
1267 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1268 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1269 > //                            << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
1270 > //                            << dr << endl;
1271 > //       }
1272 > //       if( pf->HasGsfTrk() ) {
1273 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1274 > //      if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
1275 > //                            << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
1276 > //                            << dr << endl;
1277 > //       }
1278 >
1279 >
1280 >      fChargedIso += pf->Pt();
1281 >    }
1282 >
1283 >    //
1284 >    // Gamma Iso
1285 >    //
1286 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1287 >      // KH, add to sync
1288 >      if( pf->Pt() > 0.5 )
1289 >      fGammaIso += pf->Pt();
1290 >    }
1291 >
1292 >    //
1293 >    // Other Neutrals
1294 >    //
1295 >    else {
1296 >      // KH, add to sync
1297 >      if( pf->Pt() > 0.5 )
1298 >        fNeutralHadronIso += pf->Pt();
1299 >    }
1300 >    
1301 >    }
1302 >    
1303 >  }
1304 >  
1305 > //   double rho = 0;
1306 > //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1307 > //     rho = fPUEnergyDensity->At(0)->Rho();
1308 >
1309 >  // WARNING!!!!  
1310 >  // hardcode for sync ...
1311 >  EffectiveAreaVersion = muT.kMuEAData2011;
1312 >  // WARNING!!!!  
1313 >
1314 >
1315 >  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
1316 >                                        -rho*muT.MuonEffectiveArea(muT.kMuGammaAndNeutralHadronIso04,
1317 >                                                                   mu->Eta(),EffectiveAreaVersion)));
1318 >  gChargedIso = fChargedIso;
1319 >  gGammaIso   = fGammaIso;
1320 >  gNeutralIso = fNeutralHadronIso;
1321 >  
1322 >  return pfIso;
1323 > }
1324 >
1325 >
1326 > //--------------------------------------------------------------------------------------------------
1327 > SelectionStatus muonReferenceIsoSelection(ControlFlags &ctrl,
1328 >                                          const mithep::Muon * mu,
1329 >                                          const mithep::Vertex * vtx,
1330 >                                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1331 >                                          const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1332 >                                          mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1333 >                                          vector<const mithep::Muon*> muonsToVeto,
1334 >                                          vector<const mithep::Electron*> electronsToVeto)
1335 > //--------------------------------------------------------------------------------------------------
1336 > {
1337 >  
1338 >  SelectionStatus status;
1339 >
1340 >  double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, fPUEnergyDensity,
1341 >                              EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
1342 >  //  cout << "--------------> setting muon isoPF04 to" << pfIso << endl;
1343 >  status.isoPF04 = pfIso;
1344 >  status.chisoPF04 = gChargedIso;
1345 >  status.gaisoPF04 = gGammaIso;
1346 >  status.neisoPF04 = gNeutralIso;
1347 >
1348 >  bool pass = false;
1349 >  if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
1350 >  
1351 >  if( pass ) {
1352 >    status.orStatus(SelectionStatus::LOOSEISO);
1353 >    status.orStatus(SelectionStatus::TIGHTISO);
1354 >  }
1355 >  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1356 >  return status;
1357 >  
1358 > }
1359 >
1360 >
1361 > //--------------------------------------------------------------------------------------------------
1362 > // hacked version
1363 > SelectionStatus muonReferenceIsoSelection(ControlFlags &ctrl,
1364 >                                          const mithep::Muon * mu,
1365 >                                          const mithep::Vertex * vtx,
1366 >                                          const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1367 >                                          float rho,
1368 >                                          mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
1369 >                                          vector<const mithep::Muon*> muonsToVeto,
1370 >                                          vector<const mithep::Electron*> electronsToVeto)
1371 > //--------------------------------------------------------------------------------------------------
1372 > {
1373 >  
1374 >  SelectionStatus status;
1375 >  
1376 >  double pfIso = muonPFIso04( ctrl, mu, vtx, fPFCandidates, rho,
1377 >                              EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
1378 >
1379 >  status.isoPF04 = pfIso;
1380 >  status.chisoPF04 = gChargedIso;
1381 >  status.gaisoPF04 = gGammaIso;
1382 >  status.neisoPF04 = gNeutralIso;
1383 >
1384 >  bool pass = false;
1385 >  if( (pfIso/mu->Pt()) < MUON_REFERENCE_PFISO_CUT ) pass = true;
1386 >  
1387 >  if( pass ) {
1388 >    status.orStatus(SelectionStatus::LOOSEISO);
1389 >    status.orStatus(SelectionStatus::TIGHTISO);
1390 >  }
1391 >  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1392 >  return status;
1393 >  
1394 > }
1395 >
1396 >
1397 >
1398 >
1399 > //--------------------------------------------------------------------------------------------------
1400 > SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
1401 >                                        const mithep::Electron * ele,
1402 >                                        const mithep::Vertex * vtx,
1403 >                                        const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1404 >                                        const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1405 >                                        mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1406 >                                        vector<const mithep::Muon*> muonsToVeto,
1407 >                                        vector<const mithep::Electron*> electronsToVeto)
1408 > //--------------------------------------------------------------------------------------------------
1409 > {
1410 >
1411 >  if( ctrl.debug ) {
1412 >    cout << "electronIsoMVASelection :: muons to veto " << endl;
1413 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
1414 >      const mithep::Muon * vmu = muonsToVeto[i];
1415 >      cout << "\tpt: " << vmu->Pt()
1416 >           << "\teta: " << vmu->Eta()
1417 >           << "\tphi: " << vmu->Phi()
1418 >           << endl;
1419 >    }
1420 >    cout << "electronIsoMVASelection :: electrson to veto " << endl;
1421 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
1422 >      const mithep::Electron * vel = electronsToVeto[i];
1423 >      cout << "\tpt: " << vel->Pt()
1424 >           << "\teta: " << vel->Eta()
1425 >           << "\tphi: " << vel->Phi()
1426 >           << "\ttrk: " << vel->TrackerTrk()
1427 >           << endl;
1428 >    }
1429 >  }
1430 >
1431 >  bool failiso=false;
1432 >
1433 >  //
1434 >  // tmp iso rings
1435 >  //
1436 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
1437 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
1438 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
1439 >  Double_t tmpChargedIso_DR0p3To0p4  = 0;
1440 >  Double_t tmpChargedIso_DR0p4To0p5  = 0;
1441 >
1442 >  Double_t tmpGammaIso_DR0p0To0p1  = 0;
1443 >  Double_t tmpGammaIso_DR0p1To0p2  = 0;
1444 >  Double_t tmpGammaIso_DR0p2To0p3  = 0;
1445 >  Double_t tmpGammaIso_DR0p3To0p4  = 0;
1446 >  Double_t tmpGammaIso_DR0p4To0p5  = 0;
1447 >
1448 >
1449 >  Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
1450 >  Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
1451 >  Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
1452 >  Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
1453 >  Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
1454 >
1455 >        
1456 >
1457 >  //
1458 >  // final rings for the MVA
1459 >  //
1460 >  Double_t fChargedIso_DR0p0To0p1;
1461 >  Double_t fChargedIso_DR0p1To0p2;
1462 >  Double_t fChargedIso_DR0p2To0p3;
1463 >  Double_t fChargedIso_DR0p3To0p4;
1464 >  Double_t fChargedIso_DR0p4To0p5;
1465 >
1466 >  Double_t fGammaIso_DR0p0To0p1;
1467 >  Double_t fGammaIso_DR0p1To0p2;
1468 >  Double_t fGammaIso_DR0p2To0p3;
1469 >  Double_t fGammaIso_DR0p3To0p4;
1470 >  Double_t fGammaIso_DR0p4To0p5;
1471 >
1472 >  Double_t fNeutralHadronIso_DR0p0To0p1;
1473 >  Double_t fNeutralHadronIso_DR0p1To0p2;
1474 >  Double_t fNeutralHadronIso_DR0p2To0p3;
1475 >  Double_t fNeutralHadronIso_DR0p3To0p4;
1476 >  Double_t fNeutralHadronIso_DR0p4To0p5;
1477 >
1478 >
1479 >  //
1480 >  //Loop over PF Candidates
1481 >  //
1482 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1483 >
1484 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1485 >
1486 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1487 >    Double_t deta = (ele->Eta() - pf->Eta());
1488 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
1489 >    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
1490 >    if (dr > 1.0) continue;
1491 >
1492 >    if(ctrl.debug) {
1493 >      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
1494 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx);
1495 >      cout << endl;
1496 >    }
1497 >
1498 >
1499 >    if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
1500 >         (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
1501 >    
1502 >
1503 >    //
1504 >    // Lepton Footprint Removal
1505 >    //
1506 >    Bool_t IsLeptonFootprint = kFALSE;
1507 >    if (dr < 1.0) {
1508 >
1509 >
1510 >      //
1511 >      // Check for electrons
1512 >      //
1513 >
1514 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1515 >        const mithep::Electron *tmpele = electronsToVeto[q];
1516 >        double tmpdr = mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta());
1517 >
1518 >        // 4l electron
1519 >        if( pf->HasTrackerTrk()  ) {
1520 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
1521 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
1522 >            IsLeptonFootprint = kTRUE;
1523 >          }
1524 >        }
1525 >        if( pf->HasGsfTrk()  ) {
1526 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
1527 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
1528 >            IsLeptonFootprint = kTRUE;
1529 >          }
1530 >        }
1531 >        // PF charged
1532 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479 && tmpdr < 0.015) {
1533 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
1534 >          IsLeptonFootprint = kTRUE;
1535 >        }
1536 >        // PF gamma
1537 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
1538 >            && tmpdr < 0.08) {
1539 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1540 >          IsLeptonFootprint = kTRUE;
1541 >        }
1542 >      } // loop over electrons
1543 >
1544 >
1545 >      /* KH - comment for sync            
1546 >      //
1547 >      // Check for muons
1548 >      //
1549 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1550 >        const mithep::Muon *tmpmu = muonsToVeto[q];
1551 >        // 4l muon
1552 >        if( pf->HasTrackerTrk() ) {
1553 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
1554 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
1555 >            IsLeptonFootprint = kTRUE;
1556 >          }
1557 >        }
1558 >        // PF charged
1559 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
1560 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
1561 >          IsLeptonFootprint = kTRUE;
1562 >        }
1563 >      } // loop over muons
1564 >      */
1565 >
1566 >    if (IsLeptonFootprint)
1567 >      continue;
1568 >
1569 >    //
1570 >    // Charged Iso Rings
1571 >    //
1572 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1573 >
1574 > //       if( pf->HasGsfTrk() ) {
1575 > //       if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
1576 > //       } else if( pf->HasTrackerTrk() ){
1577 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
1578 > //       }
1579 >
1580 >      // Veto any PFmuon, or PFEle
1581 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
1582 >
1583 >      // Footprint Veto
1584 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
1585 >
1586 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
1587 >                           << "\ttype: " << pf->PFType()
1588 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
1589 >
1590 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
1591 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
1592 >      if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
1593 >      if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
1594 >      if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
1595 >
1596 >    }
1597 >
1598 >    //
1599 >    // Gamma Iso Rings
1600 >    //
1601 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
1602 >
1603 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.08) continue;
1604 >
1605 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
1606 >                           << dr << endl;
1607 >
1608 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
1609 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
1610 >      if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
1611 >      if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
1612 >      if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
1613 >    }
1614 >
1615 >    //
1616 >    // Other Neutral Iso Rings
1617 >    //
1618 >    else {
1619 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
1620 >                           << dr << endl;
1621 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
1622 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
1623 >      if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
1624 >      if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
1625 >      if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
1626 >    }
1627 >
1628 >    }
1629 >
1630 >  }
1631 >
1632 >  fChargedIso_DR0p0To0p1   = fmin((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
1633 >  fChargedIso_DR0p1To0p2   = fmin((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
1634 >  fChargedIso_DR0p2To0p3   = fmin((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
1635 >  fChargedIso_DR0p3To0p4   = fmin((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
1636 >  fChargedIso_DR0p4To0p5   = fmin((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
1637 >
1638 >  if(ctrl.debug) {
1639 >    cout << "fChargedIso_DR0p0To0p1 : " << fChargedIso_DR0p0To0p1  << endl;
1640 >    cout << "fChargedIso_DR0p1To0p2 : " << fChargedIso_DR0p1To0p2  << endl;
1641 >    cout << "fChargedIso_DR0p2To0p3 : " << fChargedIso_DR0p2To0p3  << endl;
1642 >    cout << "fChargedIso_DR0p3To0p4 : " << fChargedIso_DR0p3To0p4  << endl;
1643 >    cout << "fChargedIso_DR0p4To0p5 : " << fChargedIso_DR0p4To0p5  << endl;
1644 >  }
1645 >
1646 >
1647 >  double rho = 0;
1648 >  if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
1649 >    rho = fPUEnergyDensity->At(0)->Rho();
1650 >  //   if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
1651 >  //     rho = fPUEnergyDensity->At(0)->RhoLowEta();
1652 >  
1653 >  // WARNING!!!!  
1654 >  // hardcode for sync ...
1655 >  EffectiveAreaVersion = eleT.kEleEAData2011;
1656 >  // WARNING!!!!  
1657 >
1658 >  if( ctrl.debug) {
1659 >    cout << "RHO: " << rho << endl;
1660 >    cout << "eta: " << ele->SCluster()->Eta() << endl;
1661 >    cout << "target: " << EffectiveAreaVersion << endl;
1662 >    cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1663 >                                                       ele->SCluster()->Eta(),
1664 >                                                       EffectiveAreaVersion)
1665 >         << endl;
1666 >    cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1667 >                                                       ele->SCluster()->Eta(),
1668 >                                                       EffectiveAreaVersion)
1669 >         << endl;
1670 >    cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1671 >                                                       ele->SCluster()->Eta(),
1672 >                                                       EffectiveAreaVersion)
1673 >         << endl;
1674 >    cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1675 >                                                       ele->SCluster()->Eta(),
1676 >                                                       EffectiveAreaVersion)
1677 >         << endl;
1678 >  }
1679 >
1680 >  fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
1681 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
1682 >                                                              ele->SCluster()->Eta(),
1683 >                                                              EffectiveAreaVersion))/ele->Pt()
1684 >                                 ,2.5)
1685 >                             ,0.0);
1686 >  fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
1687 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
1688 >                                                              ele->SCluster()->Eta(),
1689 >                                                              EffectiveAreaVersion))/ele->Pt()
1690 >                                 ,2.5)
1691 >                             ,0.0);
1692 >  fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
1693 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
1694 >                                                              ele->SCluster()->Eta()
1695 >                                                              ,EffectiveAreaVersion))/ele->Pt()
1696 >                                 ,2.5)
1697 >                             ,0.0);
1698 >  fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
1699 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
1700 >                                                              ele->SCluster()->Eta(),
1701 >                                                              EffectiveAreaVersion))/ele->Pt()
1702 >                                 ,2.5)
1703 >                             ,0.0);
1704 >  fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
1705 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
1706 >                                                              ele->SCluster()->Eta(),
1707 >                                                              EffectiveAreaVersion))/ele->Pt()
1708 >                                 ,2.5)
1709 >                             ,0.0);
1710 >
1711 >
1712 >  if( ctrl.debug) {
1713 >    cout << "fGammaIso_DR0p0To0p1: " << fGammaIso_DR0p0To0p1 << endl;
1714 >    cout << "fGammaIso_DR0p1To0p2: " << fGammaIso_DR0p1To0p2 << endl;
1715 >    cout << "fGammaIso_DR0p2To0p3: " << fGammaIso_DR0p2To0p3 << endl;
1716 >    cout << "fGammaIso_DR0p3To0p4: " << fGammaIso_DR0p3To0p4 << endl;
1717 >    cout << "fGammaIso_DR0p4To0p5: " << fGammaIso_DR0p4To0p5 << endl;
1718 >  }
1719 >
1720 >  fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
1721 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
1722 >                                                                 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1723 >                                         , 2.5)
1724 >                                     , 0.0);
1725 >  fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
1726 >                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
1727 >                                                                   ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1728 >                                           , 2.5)
1729 >                                       , 0.0);
1730 >  fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
1731 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
1732 >                                                                 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
1733 >                                         , 2.5)
1734 >                                     , 0.0);
1735 >  fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
1736 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
1737 >                                                                 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1738 >                                         , 2.5)
1739 >                                     , 0.0);
1740 >  fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
1741 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
1742 >                                                                 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
1743 >                                         , 2.5)
1744 >                                     , 0.0);
1745 >
1746 >  if( ctrl.debug) {
1747 >    cout << "fNeutralHadronIso_DR0p0To0p1: " << fNeutralHadronIso_DR0p0To0p1 << endl;
1748 >    cout << "fNeutralHadronIso_DR0p1To0p2: " << fNeutralHadronIso_DR0p1To0p2 << endl;
1749 >    cout << "fNeutralHadronIso_DR0p2To0p3: " << fNeutralHadronIso_DR0p2To0p3 << endl;
1750 >    cout << "fNeutralHadronIso_DR0p3To0p4: " << fNeutralHadronIso_DR0p3To0p4 << endl;
1751 >    cout << "fNeutralHadronIso_DR0p4To0p5: " << fNeutralHadronIso_DR0p4To0p5 << endl;
1752 >  }
1753 >
1754 >  double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
1755 >                                                ele->SCluster()->Eta(),
1756 >                                                fChargedIso_DR0p0To0p1,
1757 >                                                fChargedIso_DR0p1To0p2,
1758 >                                                fChargedIso_DR0p2To0p3,
1759 >                                                fChargedIso_DR0p3To0p4,
1760 >                                                fChargedIso_DR0p4To0p5,
1761 >                                                fGammaIso_DR0p0To0p1,
1762 >                                                fGammaIso_DR0p1To0p2,
1763 >                                                fGammaIso_DR0p2To0p3,
1764 >                                                fGammaIso_DR0p3To0p4,
1765 >                                                fGammaIso_DR0p4To0p5,
1766 >                                                fNeutralHadronIso_DR0p0To0p1,
1767 >                                                fNeutralHadronIso_DR0p1To0p2,
1768 >                                                fNeutralHadronIso_DR0p2To0p3,
1769 >                                                fNeutralHadronIso_DR0p3To0p4,
1770 >                                                fNeutralHadronIso_DR0p4To0p5,
1771 >                                                ctrl.debug);
1772 >
1773 >  SelectionStatus status;
1774 >  status.isoMVA = mvaval;
1775 >  bool pass = false;
1776 >
1777 >  Int_t subdet = 0;
1778 >  if (fabs(ele->SCluster()->Eta()) < 0.8) subdet = 0;
1779 >  else if (fabs(ele->SCluster()->Eta()) < 1.479) subdet = 1;
1780 >  else subdet = 2;
1781 >
1782 >  Int_t ptBin = 0;
1783 >  if (ele->Pt() >= 10.0) ptBin = 1;
1784 >  
1785 >  Int_t MVABin = -1;
1786 >  if (subdet == 0 && ptBin == 0) MVABin = 0;
1787 >  if (subdet == 1 && ptBin == 0) MVABin = 1;
1788 >  if (subdet == 2 && ptBin == 0) MVABin = 2;
1789 >  if (subdet == 0 && ptBin == 1) MVABin = 3;
1790 >  if (subdet == 1 && ptBin == 1) MVABin = 4;
1791 >  if (subdet == 2 && ptBin == 1) MVABin = 5;
1792 >
1793 >  pass = false;
1794 >  if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN0 ) pass = true;
1795 >  if( MVABin == 1 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN1 ) pass = true;
1796 >  if( MVABin == 2 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN2 ) pass = true;
1797 >  if( MVABin == 3 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN3 ) pass = true;
1798 >  if( MVABin == 4 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN4 ) pass = true;
1799 >  if( MVABin == 5 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_OPT_BIN5 ) pass = true;
1800 >  //  pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
1801 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
1802 >
1803 > //   pass = false;
1804 > //   if( MVABin == 0 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN0 ) pass = true;
1805 > //   if( MVABin == 1 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN1 ) pass = true;
1806 > //   if( MVABin == 2 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN2 ) pass = true;
1807 > //   if( MVABin == 3 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN3 ) pass = true;
1808 > //   if( MVABin == 4 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN4 ) pass = true;
1809 > //   if( MVABin == 5 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN5 ) pass = true;
1810 > //   if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
1811 >
1812 >  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
1813 >  return status;
1814 >  
1815 > }
1816 >
1817 >
1818 > //--------------------------------------------------------------------------------------------------
1819 > SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
1820 >                                        const mithep::Electron * ele,
1821 >                                        const mithep::Vertex * vtx,
1822 >                                        const mithep::Array<mithep::PFCandidate> * fPFCandidates,
1823 >                                        float rho,
1824 >                                        //const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
1825 >                                        mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
1826 >                                        vector<const mithep::Muon*> muonsToVeto,
1827 >                                        vector<const mithep::Electron*> electronsToVeto)
1828 > //--------------------------------------------------------------------------------------------------
1829 > // hacked version
1830 > {
1831 >  if( ctrl.debug ) {
1832 >    cout << "================> hacked ele Iso MVA <======================" << endl;
1833 >  }
1834 >
1835 >  if( ctrl.debug ) {
1836 >    cout << "electronIsoMVASelection :: muons to veto " << endl;
1837 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
1838 >      const mithep::Muon * vmu = muonsToVeto[i];
1839 >      cout << "\tpt: " << vmu->Pt()
1840 >           << "\teta: " << vmu->Eta()
1841 >           << "\tphi: " << vmu->Phi()
1842 >           << endl;
1843 >    }
1844 >    cout << "electronIsoMVASelection :: electrson to veto " << endl;
1845 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
1846 >      const mithep::Electron * vel = electronsToVeto[i];
1847 >      cout << "\tpt: " << vel->Pt()
1848 >           << "\teta: " << vel->Eta()
1849 >           << "\tphi: " << vel->Phi()
1850 >           << "\ttrk: " << vel->TrackerTrk()
1851 >           << endl;
1852 >    }
1853 >  }
1854 >
1855 >  bool failiso=false;
1856 >
1857 >  //
1858 >  // tmp iso rings
1859 >  //
1860 >  Double_t tmpChargedIso_DR0p0To0p1  = 0;
1861 >  Double_t tmpChargedIso_DR0p1To0p2  = 0;
1862 >  Double_t tmpChargedIso_DR0p2To0p3  = 0;
1863 >  Double_t tmpChargedIso_DR0p3To0p4  = 0;
1864 >  Double_t tmpChargedIso_DR0p4To0p5  = 0;
1865 >
1866 >  Double_t tmpGammaIso_DR0p0To0p1  = 0;
1867 >  Double_t tmpGammaIso_DR0p1To0p2  = 0;
1868 >  Double_t tmpGammaIso_DR0p2To0p3  = 0;
1869 >  Double_t tmpGammaIso_DR0p3To0p4  = 0;
1870 >  Double_t tmpGammaIso_DR0p4To0p5  = 0;
1871 >
1872 >
1873 >  Double_t tmpNeutralHadronIso_DR0p0To0p1  = 0;
1874 >  Double_t tmpNeutralHadronIso_DR0p1To0p2  = 0;
1875 >  Double_t tmpNeutralHadronIso_DR0p2To0p3  = 0;
1876 >  Double_t tmpNeutralHadronIso_DR0p3To0p4  = 0;
1877 >  Double_t tmpNeutralHadronIso_DR0p4To0p5  = 0;
1878 >
1879 >        
1880 >
1881 >  //
1882 >  // final rings for the MVA
1883 >  //
1884 >  Double_t fChargedIso_DR0p0To0p1;
1885 >  Double_t fChargedIso_DR0p1To0p2;
1886 >  Double_t fChargedIso_DR0p2To0p3;
1887 >  Double_t fChargedIso_DR0p3To0p4;
1888 >  Double_t fChargedIso_DR0p4To0p5;
1889 >
1890 >  Double_t fGammaIso_DR0p0To0p1;
1891 >  Double_t fGammaIso_DR0p1To0p2;
1892 >  Double_t fGammaIso_DR0p2To0p3;
1893 >  Double_t fGammaIso_DR0p3To0p4;
1894 >  Double_t fGammaIso_DR0p4To0p5;
1895 >
1896 >  Double_t fNeutralHadronIso_DR0p0To0p1;
1897 >  Double_t fNeutralHadronIso_DR0p1To0p2;
1898 >  Double_t fNeutralHadronIso_DR0p2To0p3;
1899 >  Double_t fNeutralHadronIso_DR0p3To0p4;
1900 >  Double_t fNeutralHadronIso_DR0p4To0p5;
1901 >
1902 >
1903 >  //
1904 >  //Loop over PF Candidates
1905 >  //
1906 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
1907 >
1908 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
1909 >
1910 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
1911 >    Double_t deta = (ele->Eta() - pf->Eta());
1912 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
1913 >    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
1914 >    if (dr > 1.0) continue;
1915 >
1916 >    if(ctrl.debug) {
1917 >      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
1918 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx);
1919 >      cout << endl;
1920 >    }
1921 >
1922 >
1923 >    if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
1924 >         (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
1925 >    
1926 >
1927 >    //
1928 >    // Lepton Footprint Removal
1929 >    //
1930 >    Bool_t IsLeptonFootprint = kFALSE;
1931 >    if (dr < 1.0) {
1932 >
1933 >
1934 >      //
1935 >      // Check for electrons
1936 >      //
1937 >
1938 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
1939 >        const mithep::Electron *tmpele = electronsToVeto[q];
1940 >        double tmpdr = mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta());
1941 >
1942 >        // 4l electron
1943 >        if( pf->HasTrackerTrk()  ) {
1944 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
1945 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
1946 >            IsLeptonFootprint = kTRUE;
1947 >          }
1948 >        }
1949 >        if( pf->HasGsfTrk()  ) {
1950 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
1951 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
1952 >            IsLeptonFootprint = kTRUE;
1953 >          }
1954 >        }
1955 >        // PF charged
1956 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) >= 1.479 && tmpdr < 0.015) {
1957 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
1958 >          IsLeptonFootprint = kTRUE;
1959 >        }
1960 >        // PF gamma
1961 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) >= 1.479
1962 >            && tmpdr < 0.08) {
1963 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
1964 >          IsLeptonFootprint = kTRUE;
1965 >        }
1966 >      } // loop over electrons
1967 >
1968 >
1969 >      /* KH - comment for sync            
1970 >      //
1971 >      // Check for muons
1972 >      //
1973 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
1974 >        const mithep::Muon *tmpmu = muonsToVeto[q];
1975 >        // 4l muon
1976 >        if( pf->HasTrackerTrk() ) {
1977 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
1978 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
1979 >            IsLeptonFootprint = kTRUE;
1980 >          }
1981 >        }
1982 >        // PF charged
1983 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
1984 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
1985 >          IsLeptonFootprint = kTRUE;
1986 >        }
1987 >      } // loop over muons
1988 >      */
1989 >
1990 >    if (IsLeptonFootprint)
1991 >      continue;
1992 >
1993 >    //
1994 >    // Charged Iso Rings
1995 >    //
1996 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
1997 >
1998 > //       if( pf->HasGsfTrk() ) {
1999 > //       if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2000 > //       } else if( pf->HasTrackerTrk() ){
2001 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2002 > //       }
2003 >
2004 >      // Veto any PFmuon, or PFEle
2005 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
2006 >
2007 >      // Footprint Veto
2008 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2009 >
2010 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2011 >                           << "\ttype: " << pf->PFType()
2012 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
2013 >
2014 >      if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
2015 >      if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
2016 >      if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
2017 >      if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
2018 >      if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
2019 >
2020 >    }
2021 >
2022 >    //
2023 >    // Gamma Iso Rings
2024 >    //
2025 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2026 >
2027 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.08) continue;
2028 >
2029 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2030 >                           << dr << endl;
2031 >
2032 >      if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
2033 >      if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
2034 >      if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
2035 >      if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
2036 >      if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
2037 >    }
2038 >
2039 >    //
2040 >    // Other Neutral Iso Rings
2041 >    //
2042 >    else {
2043 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2044 >                           << dr << endl;
2045 >      if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
2046 >      if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
2047 >      if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
2048 >      if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
2049 >      if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
2050 >    }
2051 >
2052 >    }
2053 >
2054 >  }
2055 >
2056 >  fChargedIso_DR0p0To0p1   = fmin((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
2057 >  fChargedIso_DR0p1To0p2   = fmin((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
2058 >  fChargedIso_DR0p2To0p3   = fmin((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
2059 >  fChargedIso_DR0p3To0p4   = fmin((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
2060 >  fChargedIso_DR0p4To0p5   = fmin((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
2061 >
2062 >  if(ctrl.debug) {
2063 >    cout << "fChargedIso_DR0p0To0p1 : " << fChargedIso_DR0p0To0p1  << endl;
2064 >    cout << "fChargedIso_DR0p1To0p2 : " << fChargedIso_DR0p1To0p2  << endl;
2065 >    cout << "fChargedIso_DR0p2To0p3 : " << fChargedIso_DR0p2To0p3  << endl;
2066 >    cout << "fChargedIso_DR0p3To0p4 : " << fChargedIso_DR0p3To0p4  << endl;
2067 >    cout << "fChargedIso_DR0p4To0p5 : " << fChargedIso_DR0p4To0p5  << endl;
2068 >  }
2069 >
2070 >
2071 >  //  rho=0;
2072 >  //  double rho = 0;
2073 >  //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2074 >  //     rho = fPUEnergyDensity->At(0)->Rho();
2075 >  //   if (!(isnan(fPUEnergyDensity->At(0)->RhoLowEta()) || isinf(fPUEnergyDensity->At(0)->RhoLowEta())))
2076 >  //     rho = fPUEnergyDensity->At(0)->RhoLowEta();
2077 >  
2078 >  // WARNING!!!!  
2079 >  // hardcode for sync ...
2080 >  EffectiveAreaVersion = eleT.kEleEAData2011;
2081 >  // WARNING!!!!  
2082 >
2083 >  if( ctrl.debug) {
2084 >    cout << "RHO: " << rho << endl;
2085 >    cout << "eta: " << ele->SCluster()->Eta() << endl;
2086 >    cout << "target: " << EffectiveAreaVersion << endl;
2087 >    cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
2088 >                                                       ele->SCluster()->Eta(),
2089 >                                                       EffectiveAreaVersion)
2090 >         << endl;
2091 >    cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
2092 >                                                       ele->SCluster()->Eta(),
2093 >                                                       EffectiveAreaVersion)
2094 >         << endl;
2095 >    cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
2096 >                                                       ele->SCluster()->Eta(),
2097 >                                                       EffectiveAreaVersion)
2098 >         << endl;
2099 >    cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
2100 >                                                       ele->SCluster()->Eta(),
2101 >                                                       EffectiveAreaVersion)
2102 >         << endl;
2103 >  }
2104 >
2105 >  fGammaIso_DR0p0To0p1 = fmax(fmin((tmpGammaIso_DR0p0To0p1
2106 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
2107 >                                                              ele->SCluster()->Eta(),
2108 >                                                              EffectiveAreaVersion))/ele->Pt()
2109 >                                 ,2.5)
2110 >                             ,0.0);
2111 >  fGammaIso_DR0p1To0p2 = fmax(fmin((tmpGammaIso_DR0p1To0p2
2112 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
2113 >                                                              ele->SCluster()->Eta(),
2114 >                                                              EffectiveAreaVersion))/ele->Pt()
2115 >                                 ,2.5)
2116 >                             ,0.0);
2117 >  fGammaIso_DR0p2To0p3 = fmax(fmin((tmpGammaIso_DR0p2To0p3
2118 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
2119 >                                                              ele->SCluster()->Eta()
2120 >                                                              ,EffectiveAreaVersion))/ele->Pt()
2121 >                                 ,2.5)
2122 >                             ,0.0);
2123 >  fGammaIso_DR0p3To0p4 = fmax(fmin((tmpGammaIso_DR0p3To0p4
2124 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
2125 >                                                              ele->SCluster()->Eta(),
2126 >                                                              EffectiveAreaVersion))/ele->Pt()
2127 >                                 ,2.5)
2128 >                             ,0.0);
2129 >  fGammaIso_DR0p4To0p5 = fmax(fmin((tmpGammaIso_DR0p4To0p5
2130 >                                  -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
2131 >                                                              ele->SCluster()->Eta(),
2132 >                                                              EffectiveAreaVersion))/ele->Pt()
2133 >                                 ,2.5)
2134 >                             ,0.0);
2135 >
2136 >
2137 >  if( ctrl.debug) {
2138 >    cout << "fGammaIso_DR0p0To0p1: " << fGammaIso_DR0p0To0p1 << endl;
2139 >    cout << "fGammaIso_DR0p1To0p2: " << fGammaIso_DR0p1To0p2 << endl;
2140 >    cout << "fGammaIso_DR0p2To0p3: " << fGammaIso_DR0p2To0p3 << endl;
2141 >    cout << "fGammaIso_DR0p3To0p4: " << fGammaIso_DR0p3To0p4 << endl;
2142 >    cout << "fGammaIso_DR0p4To0p5: " << fGammaIso_DR0p4To0p5 << endl;
2143 >  }
2144 >
2145 >  fNeutralHadronIso_DR0p0To0p1 = fmax(fmin((tmpNeutralHadronIso_DR0p0To0p1
2146 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
2147 >                                                                 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
2148 >                                         , 2.5)
2149 >                                     , 0.0);
2150 >  fNeutralHadronIso_DR0p1To0p2 = fmax(fmin((tmpNeutralHadronIso_DR0p1To0p2
2151 >                                            -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
2152 >                                                                   ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
2153 >                                           , 2.5)
2154 >                                       , 0.0);
2155 >  fNeutralHadronIso_DR0p2To0p3 = fmax(fmin((tmpNeutralHadronIso_DR0p2To0p3
2156 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
2157 >                                                                 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
2158 >                                         , 2.5)
2159 >                                     , 0.0);
2160 >  fNeutralHadronIso_DR0p3To0p4 = fmax(fmin((tmpNeutralHadronIso_DR0p3To0p4
2161 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
2162 >                                                                 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
2163 >                                         , 2.5)
2164 >                                     , 0.0);
2165 >  fNeutralHadronIso_DR0p4To0p5 = fmax(fmin((tmpNeutralHadronIso_DR0p4To0p5
2166 >                                          -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
2167 >                                                                 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
2168 >                                         , 2.5)
2169 >                                     , 0.0);
2170 >
2171 >  if( ctrl.debug) {
2172 >    cout << "fNeutralHadronIso_DR0p0To0p1: " << fNeutralHadronIso_DR0p0To0p1 << endl;
2173 >    cout << "fNeutralHadronIso_DR0p1To0p2: " << fNeutralHadronIso_DR0p1To0p2 << endl;
2174 >    cout << "fNeutralHadronIso_DR0p2To0p3: " << fNeutralHadronIso_DR0p2To0p3 << endl;
2175 >    cout << "fNeutralHadronIso_DR0p3To0p4: " << fNeutralHadronIso_DR0p3To0p4 << endl;
2176 >    cout << "fNeutralHadronIso_DR0p4To0p5: " << fNeutralHadronIso_DR0p4To0p5 << endl;
2177 >  }
2178 >
2179 >  double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
2180 >                                                ele->SCluster()->Eta(),
2181 >                                                fChargedIso_DR0p0To0p1,
2182 >                                                fChargedIso_DR0p1To0p2,
2183 >                                                fChargedIso_DR0p2To0p3,
2184 >                                                fChargedIso_DR0p3To0p4,
2185 >                                                fChargedIso_DR0p4To0p5,
2186 >                                                fGammaIso_DR0p0To0p1,
2187 >                                                fGammaIso_DR0p1To0p2,
2188 >                                                fGammaIso_DR0p2To0p3,
2189 >                                                fGammaIso_DR0p3To0p4,
2190 >                                                fGammaIso_DR0p4To0p5,
2191 >                                                fNeutralHadronIso_DR0p0To0p1,
2192 >                                                fNeutralHadronIso_DR0p1To0p2,
2193 >                                                fNeutralHadronIso_DR0p2To0p3,
2194 >                                                fNeutralHadronIso_DR0p3To0p4,
2195 >                                                fNeutralHadronIso_DR0p4To0p5,
2196 >                                                ctrl.debug);
2197 >
2198 >  SelectionStatus status;
2199 >  status.isoMVA = mvaval;
2200 >  bool pass = false;
2201 >
2202 >  Int_t subdet = 0;
2203 >  if (fabs(ele->SCluster()->Eta()) < 0.8) subdet = 0;
2204 >  else if (fabs(ele->SCluster()->Eta()) < 1.479) subdet = 1;
2205 >  else subdet = 2;
2206 >
2207 >  Int_t ptBin = 0;
2208 >  if (ele->Pt() >= 10.0) ptBin = 1;
2209 >  
2210 >  Int_t MVABin = -1;
2211 >  if (subdet == 0 && ptBin == 0) MVABin = 0;
2212 >  if (subdet == 1 && ptBin == 0) MVABin = 1;
2213 >  if (subdet == 2 && ptBin == 0) MVABin = 2;
2214 >  if (subdet == 0 && ptBin == 1) MVABin = 3;
2215 >  if (subdet == 1 && ptBin == 1) MVABin = 4;
2216 >  if (subdet == 2 && ptBin == 1) MVABin = 5;
2217 >
2218 >  pass = false;
2219 >  if( MVABin == 0 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN0 ) pass = true;
2220 >  if( MVABin == 1 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN1 ) pass = true;
2221 >  if( MVABin == 2 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN2 ) pass = true;
2222 >  if( MVABin == 3 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN3 ) pass = true;
2223 >  if( MVABin == 4 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN4 ) pass = true;
2224 >  if( MVABin == 5 && mvaval > ELECTRON_LOOSE_ISOMVA_CUT_BIN5 ) pass = true;
2225 >  if( pass ) status.orStatus(SelectionStatus::LOOSEISO);
2226 >
2227 > //   pass = false;
2228 > //   if( MVABin == 0 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN0 ) pass = true;
2229 > //   if( MVABin == 1 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN1 ) pass = true;
2230 > //   if( MVABin == 2 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN2 ) pass = true;
2231 > //   if( MVABin == 3 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN3 ) pass = true;
2232 > //   if( MVABin == 4 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN4 ) pass = true;
2233 > //   if( MVABin == 5 && mvaval > ELECTRON_TIGHT_ISOMVA_CUT_BIN5 ) pass = true;
2234 > //   if( pass ) status.orStatus(SelectionStatus::TIGHTISO);
2235 >
2236 >  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2237 >  return status;
2238 >  
2239 > }
2240 >
2241 >
2242 > //--------------------------------------------------------------------------------------------------
2243 > void initElectronIsoMVA() {
2244 > //--------------------------------------------------------------------------------------------------
2245 >  eleIsoMVA = new mithep::ElectronIDMVA();
2246 >  vector<string> weightFiles;
2247 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt5To10.weights.xml");
2248 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt5To10.weights.xml");
2249 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt10ToInf.weights.xml");
2250 >  weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt10ToInf.weights.xml");
2251 >  eleIsoMVA->Initialize( "ElectronIsoMVA",
2252 >                        mithep::ElectronIDMVA::kIsoRingsV0,
2253 >                        kTRUE, weightFiles);
2254 > }
2255 >
2256 >
2257 >
2258 >
2259 > //--------------------------------------------------------------------------------------------------
2260 > float electronPFIso04(ControlFlags &ctrl,
2261 >                      const mithep::Electron * ele,
2262 >                      const mithep::Vertex * vtx,
2263 >                      const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2264 >                      const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2265 >                      mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2266 >                      vector<const mithep::Muon*> muonsToVeto,
2267 >                      vector<const mithep::Electron*> electronsToVeto)
2268 > //--------------------------------------------------------------------------------------------------
2269 > {
2270 >  /*
2271 >  if( ctrl.debug ) {
2272 >    cout << "electronIsoMVASelection :: muons to veto " << endl;
2273 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
2274 >      const mithep::Muon * vmu = muonsToVeto[i];
2275 >      cout << "\tpt: " << vmu->Pt()
2276 >           << "\teta: " << vmu->Eta()
2277 >           << "\tphi: " << vmu->Phi()
2278 >           << endl;
2279 >    }
2280 >    cout << "electronIsoMVASelection :: electrons to veto " << endl;
2281 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
2282 >      const mithep::Electron * vel = electronsToVeto[i];
2283 >      cout << "\tpt: " << vel->Pt()
2284 >           << "\teta: " << vel->Eta()
2285 >           << "\tphi: " << vel->Phi()
2286 >           << "\ttrk: " << vel->TrackerTrk()
2287 >           << endl;
2288 >    }
2289 >  }
2290 >  */
2291 >
2292 >  //
2293 >  // final iso
2294 >  //
2295 >  Double_t fChargedIso = 0.0;
2296 >  Double_t fGammaIso = 0.0;
2297 >  Double_t fNeutralHadronIso = 0.0;
2298 >
2299 >
2300 >  //
2301 >  //Loop over PF Candidates
2302 >  //
2303 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2304 >
2305 >
2306 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2307 >    Double_t deta = (ele->Eta() - pf->Eta());
2308 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2309 >    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2310 >
2311 >    if (dr > 0.4) continue;
2312 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
2313 >
2314 >    if(ctrl.debug) {
2315 >      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt() << "\tdR: " << dr;
2316 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx)
2317 >                                     << "\ttrk: " << pf->HasTrackerTrk()
2318 >                                     << "\tgsf: " << pf->HasGsfTrk();
2319 >      
2320 >      cout << endl;
2321 >    }
2322 >
2323 >
2324 >    //
2325 >    // sync : I don't think theyre doing this ...
2326 >    //
2327 >    //     if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2328 >    //   (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) {
2329 >    //       if( ctrl.debug ) cout << "\tskipping, matches to the electron ..."  << endl;
2330 >    //       continue;
2331 >    //     }
2332 >
2333 >
2334 >    //
2335 >    // Lepton Footprint Removal
2336 >    //
2337 >    Bool_t IsLeptonFootprint = kFALSE;
2338 >    if (dr < 1.0) {
2339 >
2340 >      //
2341 >      // Check for electrons
2342 >      //
2343 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
2344 >        const mithep::Electron *tmpele = electronsToVeto[q];
2345 >        /*
2346 >        // 4l electron
2347 >        if( pf->HasTrackerTrk()  ) {
2348 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
2349 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
2350 >            IsLeptonFootprint = kTRUE;
2351 >          }
2352 >        }
2353 >        if( pf->HasGsfTrk()  ) {
2354 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
2355 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
2356 >            IsLeptonFootprint = kTRUE;
2357 >          }
2358 >        }
2359 >        */
2360 >        // PF charged
2361 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
2362 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
2363 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
2364 >          IsLeptonFootprint = kTRUE;
2365 >        }
2366 >        // PF gamma
2367 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
2368 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
2369 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
2370 >          IsLeptonFootprint = kTRUE;
2371 >        }
2372 >      } // loop over electrons
2373 >
2374 >      /* KH - comment for sync            
2375 >      //
2376 >      // Check for muons
2377 >      //
2378 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
2379 >        const mithep::Muon *tmpmu = muonsToVeto[q];
2380 >        // 4l muon
2381 >        if( pf->HasTrackerTrk() ) {
2382 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
2383 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
2384 >            IsLeptonFootprint = kTRUE;
2385 >          }
2386 >        }
2387 >        // PF charged
2388 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
2389 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
2390 >          IsLeptonFootprint = kTRUE;
2391 >        }
2392 >      } // loop over muons
2393 >      */
2394 >
2395 >    if (IsLeptonFootprint)
2396 >      continue;
2397 >
2398 >    //
2399 >    // Charged Iso
2400 >    //
2401 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
2402 >
2403 > //       if( pf->HasTrackerTrk() )
2404 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2405 > //       if( pf->HasGsfTrk() )
2406 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2407 >
2408 >      // Veto any PFmuon, or PFEle
2409 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) {
2410 >        if( ctrl.debug ) cout << "\t skipping, pf is and ele or mu .." <<endl;
2411 >        continue;
2412 >      }
2413 >
2414 >      // Footprint Veto
2415 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2416 >
2417 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2418 >                           << "\ttype: " << pf->PFType()
2419 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
2420 >
2421 >      fChargedIso += pf->Pt();
2422 >    }
2423 >
2424 >    //
2425 >    // Gamma Iso
2426 >    //
2427 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2428 >
2429 >      if (fabs(ele->SCluster()->Eta()) > 1.479) {
2430 >        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2431 >      }
2432 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2433 >                           << dr << endl;
2434 >      // KH, add to sync
2435 >      //      if( pf->Pt() > 0.5 )
2436 >        fGammaIso += pf->Pt();
2437 >    }
2438 >
2439 >    //
2440 >    // Neutral Iso
2441 >    //
2442 >    else {
2443 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2444 >                           << dr << endl;
2445 >      // KH, add to sync
2446 >      //      if( pf->Pt() > 0.5 )
2447 >        fNeutralHadronIso += pf->Pt();
2448 >    }
2449 >
2450 >    }
2451 >
2452 >  }
2453 >
2454 >
2455 >  double rho=0;
2456 >  if( (EffectiveAreaVersion == mithep::ElectronTools::kEleEAFall11MC) ||
2457 >      (EffectiveAreaVersion == mithep::ElectronTools::kEleEAData2011) ) {
2458 >    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25()) ||
2459 >          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25())))
2460 >      rho = fPUEnergyDensity->At(0)->RhoKt6PFJetsForIso25();
2461 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2462 >    EffectiveAreaVersion  = mithep::ElectronTools::kEleEAData2011;
2463 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2464 >  } else {
2465 >    if (!(isnan(fPUEnergyDensity->At(0)->RhoKt6PFJets()) ||
2466 >          isinf(fPUEnergyDensity->At(0)->RhoKt6PFJets())))
2467 >      rho = fPUEnergyDensity->At(0)->RhoKt6PFJets();
2468 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2469 >    EffectiveAreaVersion  = mithep::ElectronTools::kEleEAData2011;
2470 >    // !!!!!!!!!!!!! TMP HACK FOR SYNC !!!!!!!!!!!!!!!!!!!!!
2471 >  }
2472 >  if(ctrl.debug) cout << "rho: " << rho << endl;
2473 >
2474 >  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2475 >                                        -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2476 >                                                                   ele->Eta(),EffectiveAreaVersion)));
2477 >
2478 >
2479 >  gChargedIso = fChargedIso;
2480 >  gGammaIso = fGammaIso;
2481 >  gNeutralIso = fNeutralHadronIso;  
2482 >  return pfIso;
2483 > }
2484 >
2485 >
2486 >
2487 > //--------------------------------------------------------------------------------------------------
2488 > // hacked version
2489 > float electronPFIso04(ControlFlags &ctrl,
2490 >                      const mithep::Electron * ele,
2491 >                      const mithep::Vertex * vtx,
2492 >                      const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2493 >                      float rho,
2494 >                      mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2495 >                      vector<const mithep::Muon*> muonsToVeto,
2496 >                      vector<const mithep::Electron*> electronsToVeto)
2497 > //--------------------------------------------------------------------------------------------------
2498 > {
2499 >
2500 >  if( ctrl.debug ) {
2501 >    cout << "electronIsoMVASelection :: muons to veto " << endl;
2502 >    for( int i=0; i<muonsToVeto.size(); i++ ) {
2503 >      const mithep::Muon * vmu = muonsToVeto[i];
2504 >      cout << "\tpt: " << vmu->Pt()
2505 >           << "\teta: " << vmu->Eta()
2506 >           << "\tphi: " << vmu->Phi()
2507 >           << endl;
2508 >    }
2509 >    cout << "electronIsoMVASelection :: electrons to veto " << endl;
2510 >    for( int i=0; i<electronsToVeto.size(); i++ ) {
2511 >      const mithep::Electron * vel = electronsToVeto[i];
2512 >      cout << "\tpt: " << vel->Pt()
2513 >           << "\teta: " << vel->Eta()
2514 >           << "\tphi: " << vel->Phi()
2515 >           << "\ttrk: " << vel->TrackerTrk()
2516 >           << endl;
2517 >    }
2518 >  }
2519 >
2520 >
2521 >  //
2522 >  // final iso
2523 >  //
2524 >  Double_t fChargedIso = 0.0;
2525 >  Double_t fGammaIso = 0.0;
2526 >  Double_t fNeutralHadronIso = 0.0;
2527 >
2528 >
2529 >  //
2530 >  //Loop over PF Candidates
2531 >  //
2532 >  for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
2533 >
2534 >
2535 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
2536 >    Double_t deta = (ele->Eta() - pf->Eta());
2537 >    Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
2538 >    Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
2539 >
2540 >    if (dr > 0.4) continue;
2541 >    if( !(PFnoPUflag[k]) ) continue; // my PF no PU hack
2542 >
2543 >    if(ctrl.debug) {
2544 >      cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt() << "\tdR: " << dr;
2545 >      if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(*vtx)
2546 >                                     << "\ttrk: " << pf->HasTrackerTrk()
2547 >                                     << "\tgsf: " << pf->HasGsfTrk();
2548 >      
2549 >      cout << endl;
2550 >    }
2551 >
2552 >
2553 >    //
2554 >    // sync : I don't think theyre doing this ...
2555 >    //
2556 >    //     if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
2557 >    //   (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) {
2558 >    //       if( ctrl.debug ) cout << "\tskipping, matches to the electron ..."  << endl;
2559 >    //       continue;
2560 >    //     }
2561 >
2562 >
2563 >    //
2564 >    // Lepton Footprint Removal
2565 >    //
2566 >    Bool_t IsLeptonFootprint = kFALSE;
2567 >    if (dr < 1.0) {
2568 >
2569 >      //
2570 >      // Check for electrons
2571 >      //
2572 >      for (Int_t q=0; q < electronsToVeto.size(); ++q) {
2573 >        const mithep::Electron *tmpele = electronsToVeto[q];
2574 >        /*
2575 >        // 4l electron
2576 >        if( pf->HasTrackerTrk()  ) {
2577 >          if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
2578 >            if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
2579 >            IsLeptonFootprint = kTRUE;
2580 >          }
2581 >        }
2582 >        if( pf->HasGsfTrk()  ) {
2583 >          if( pf->GsfTrk() == tmpele->GsfTrk() ) {
2584 >            if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
2585 >            IsLeptonFootprint = kTRUE;
2586 >          }
2587 >        }
2588 >        */
2589 >        // PF charged
2590 >        if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
2591 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
2592 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
2593 >          IsLeptonFootprint = kTRUE;
2594 >        }
2595 >        // PF gamma
2596 >        if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
2597 >            && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
2598 >          if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
2599 >          IsLeptonFootprint = kTRUE;
2600 >        }
2601 >      } // loop over electrons
2602 >
2603 >      /* KH - comment for sync            
2604 >      //
2605 >      // Check for muons
2606 >      //
2607 >      for (Int_t q=0; q < muonsToVeto.size(); ++q) {
2608 >        const mithep::Muon *tmpmu = muonsToVeto[q];
2609 >        // 4l muon
2610 >        if( pf->HasTrackerTrk() ) {
2611 >          if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
2612 >            if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
2613 >            IsLeptonFootprint = kTRUE;
2614 >          }
2615 >        }
2616 >        // PF charged
2617 >        if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
2618 >          if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
2619 >          IsLeptonFootprint = kTRUE;
2620 >        }
2621 >      } // loop over muons
2622 >      */
2623 >
2624 >    if (IsLeptonFootprint)
2625 >      continue;
2626 >
2627 >    //
2628 >    // Charged Iso
2629 >    //
2630 >    if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
2631 >
2632 > //       if( pf->HasTrackerTrk() )
2633 > //      if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
2634 > //       if( pf->HasGsfTrk() )
2635 > //      if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
2636 >
2637 >      // Veto any PFmuon, or PFEle
2638 >      if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) {
2639 >        if( ctrl.debug ) cout << "\t skipping, pf is and ele or mu .." <<endl;
2640 >        continue;
2641 >      }
2642 >
2643 >      // Footprint Veto
2644 >      if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
2645 >
2646 >      if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
2647 >                           << "\ttype: " << pf->PFType()
2648 >                           << "\ttrk: " << pf->TrackerTrk() << endl;
2649 >
2650 >      fChargedIso += pf->Pt();
2651 >    }
2652 >
2653 >    //
2654 >    // Gamma Iso
2655 >    //
2656 >    else if (abs(pf->PFType()) == PFCandidate::eGamma) {
2657 >
2658 >      if (fabs(ele->SCluster()->Eta()) > 1.479) {
2659 >        if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
2660 >      }
2661 >      if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
2662 >                           << dr << endl;
2663 >      // KH, add to sync
2664 >      //      if( pf->Pt() > 0.5 )
2665 >        fGammaIso += pf->Pt();
2666 >    }
2667 >
2668 >    //
2669 >    // Neutral Iso
2670 >    //
2671 >    else {
2672 >      if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
2673 >                           << dr << endl;
2674 >      // KH, add to sync
2675 >      //      if( pf->Pt() > 0.5 )
2676 >        fNeutralHadronIso += pf->Pt();
2677 >    }
2678 >
2679 >    }
2680 >
2681 >  }
2682 >
2683 > //   double rho = 0;
2684 > //   if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
2685 > //     rho = fPUEnergyDensity->At(0)->Rho();
2686 >
2687 >  // WARNING!!!!  
2688 >  // hardcode for sync ...
2689 >  EffectiveAreaVersion = eleT.kEleEAData2011;
2690 >  // WARNING!!!!  
2691 >
2692 >
2693 >  double pfIso = fChargedIso + fmax(0.0,(fGammaIso + fNeutralHadronIso
2694 >                                        -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaAndNeutralHadronIso04,
2695 >                                                                   ele->Eta(),EffectiveAreaVersion)));
2696 >
2697 >
2698 >  gChargedIso = fChargedIso;
2699 >  gGammaIso = fGammaIso;
2700 >  gNeutralIso = fNeutralHadronIso;  
2701 >  return pfIso;
2702 > }
2703 >
2704 >
2705 > //--------------------------------------------------------------------------------------------------
2706 > SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2707 >                                              const mithep::Electron * ele,
2708 >                                              const mithep::Vertex * vtx,
2709 >                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2710 >                                              const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
2711 >                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2712 >                                              vector<const mithep::Muon*> muonsToVeto,
2713 >                                              vector<const mithep::Electron*> electronsToVeto)
2714 > //--------------------------------------------------------------------------------------------------
2715 > {
2716 >
2717 >  SelectionStatus status;
2718 >
2719 >  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, fPUEnergyDensity,
2720 >                                  EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
2721 >  //  cout << "--------------> setting electron isoPF04 to " << pfIso << endl;
2722 >  status.isoPF04 = pfIso;
2723 >  status.chisoPF04 = gChargedIso;
2724 >  status.gaisoPF04 = gGammaIso;
2725 >  status.neisoPF04 = gNeutralIso;
2726 >
2727 >  bool pass = false;
2728 >  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2729 >
2730 >  if( pass ) {
2731 >    status.orStatus(SelectionStatus::LOOSEISO);
2732 >    status.orStatus(SelectionStatus::TIGHTISO);
2733 >  }
2734 >  if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2735 >  return status;
2736 >
2737 > }
2738 >
2739 >
2740 > //--------------------------------------------------------------------------------------------------
2741 > // hacked version
2742 > SelectionStatus electronReferenceIsoSelection(ControlFlags &ctrl,
2743 >                                              const mithep::Electron * ele,
2744 >                                              const mithep::Vertex * vtx,
2745 >                                              const mithep::Array<mithep::PFCandidate> * fPFCandidates,
2746 >                                              float rho,
2747 >                                              mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
2748 >                                              vector<const mithep::Muon*> muonsToVeto,
2749 >                                              vector<const mithep::Electron*> electronsToVeto)
2750 > //--------------------------------------------------------------------------------------------------
2751 > {
2752 >
2753 >  SelectionStatus status;
2754 >
2755 >  double pfIso = electronPFIso04( ctrl, ele, vtx, fPFCandidates, rho,
2756 >                                  EffectiveAreaVersion, muonsToVeto ,electronsToVeto );
2757 >  status.isoPF04 = pfIso;
2758 >  status.chisoPF04 = gChargedIso;
2759 >  status.gaisoPF04 = gGammaIso;
2760 >  status.neisoPF04 = gNeutralIso;
2761 >  bool pass = false;
2762 >  if( (pfIso/ele->Pt()) < ELECTRON_REFERENCE_PFISO_CUT ) pass = true;
2763 >
2764 >  if( pass ) {
2765 >    status.orStatus(SelectionStatus::LOOSEISO);
2766 >    status.orStatus(SelectionStatus::TIGHTISO);
2767    }
2768    if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
2769    return status;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines