ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/LeptonSelection/src/IsolationSelection.cc
Revision: 1.9
Committed: Thu May 3 22:06:47 2012 UTC (13 years ago) by khahn
Content type: text/plain
Branch: MAIN
Changes since 1.8: +2 -3 lines
Log Message:
eta -> rapidity in kin, muon tweaks

File Contents

# User Rev Content
1 khahn 1.1 #include <math.h>
2    
3     #include "IsolationSelection.h"
4     #include "IsolationSelectionDefs.h"
5    
6 khahn 1.4 #include "MathUtils.h"
7     #include "MuonTools.h"
8     #include "MuonIDMVA.h"
9     #include "ElectronTools.h"
10     #include "ElectronIDMVA.h"
11    
12     using namespace mithep;
13    
14     mithep::MuonIDMVA * muIsoMVA;
15     mithep::MuonTools muT;
16     mithep::ElectronIDMVA * eleIsoMVA;
17     mithep::ElectronTools eleT;
18    
19     //--------------------------------------------------------------------------------------------------
20     Float_t computePFMuonIso(const mithep::Muon *muon,
21     const mithep::Vertex & vtx,
22     const mithep::Array<mithep::PFCandidate> * fPFCandidates,
23     const Double_t dRMax)
24     //--------------------------------------------------------------------------------------------------
25     {
26     const Double_t dRMin = 0;
27     const Double_t neuPtMin = 1.0;
28     const Double_t dzMax = 0.1;
29    
30     Double_t zLepton = (muon->BestTrk()) ? muon->BestTrk()->DzCorrected(vtx) : 0.0;
31    
32     Float_t iso=0;
33     for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
34     const PFCandidate *pfcand = fPFCandidates->At(ipf);
35    
36     if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue; // pT cut on neutral particles
37    
38     // exclude THE muon
39     if(pfcand->TrackerTrk() && muon->TrackerTrk() && (pfcand->TrackerTrk()==muon->TrackerTrk())) continue;
40    
41     // dz cut
42     Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(vtx) - zLepton) : 0;
43     if(dz >= dzMax) continue;
44    
45     // check iso cone
46     Double_t dr = MathUtils::DeltaR(muon->Mom(), pfcand->Mom());
47     if(dr<dRMax && dr>=dRMin)
48     iso += pfcand->Pt();
49     }
50    
51     return iso;
52     }
53    
54     //--------------------------------------------------------------------------------------------------
55     Float_t computePFEleIso(const mithep::Electron *electron,
56     const mithep::Vertex & fVertex,
57     const mithep::Array<mithep::PFCandidate> * fPFCandidates,
58     const Double_t dRMax)
59     //--------------------------------------------------------------------------------------------------
60     {
61     const Double_t dRMin = 0;
62     const Double_t neuPtMin = 1.0;
63     const Double_t dzMax = 0.1;
64    
65     Double_t zLepton = (electron->BestTrk()) ? electron->BestTrk()->DzCorrected(fVertex) : 0.0;
66    
67     Float_t iso=0;
68     for(UInt_t ipf=0; ipf<fPFCandidates->GetEntries(); ipf++) {
69     const PFCandidate *pfcand = (PFCandidate*)(fPFCandidates->At(ipf));
70    
71     if(!pfcand->HasTrk() && (pfcand->Pt()<=neuPtMin)) continue; // pT cut on neutral particles
72    
73     // dz cut
74     Double_t dz = (pfcand->BestTrk()) ? fabs(pfcand->BestTrk()->DzCorrected(fVertex) - zLepton) : 0;
75     if(dz >= dzMax) continue;
76    
77     // remove THE electron
78     if(pfcand->TrackerTrk() && electron->TrackerTrk() && (pfcand->TrackerTrk()==electron->TrackerTrk())) continue;
79     if(pfcand->GsfTrk() && electron->GsfTrk() && (pfcand->GsfTrk()==electron->GsfTrk())) continue;
80    
81     // check iso cone
82     Double_t dr = MathUtils::DeltaR(electron->Mom(), pfcand->Mom());
83     if(dr<dRMax && dr>=dRMin) {
84     // eta-strip veto for photons
85     if((pfcand->PFType() == PFCandidate::eGamma) && fabs(electron->Eta() - pfcand->Eta()) < 0.025) continue;
86    
87     // Inner cone (one tower = dR < 0.07) veto for non-photon neutrals
88     if(!pfcand->HasTrk() && (pfcand->PFType() == PFCandidate::eNeutralHadron) &&
89     (MathUtils::DeltaR(electron->Mom(), pfcand->Mom()) < 0.07)) continue;
90    
91     iso += pfcand->Pt();
92     }
93     }
94    
95     return iso;
96     };
97    
98     //--------------------------------------------------------------------------------------------------
99     bool pairwiseIsoSelection( ControlFlags &ctrl,
100     vector<SimpleLepton> &lepvec,
101     float rho )
102     //--------------------------------------------------------------------------------------------------
103     {
104 khahn 1.2
105     bool passiso=true;
106    
107     for( int i=0; i<lepvec.size(); i++ )
108     {
109    
110     if( !(lepvec[i].is4l) ) continue;
111    
112     float effArea_ecal_i, effArea_hcal_i;
113     if( lepvec[i].isEB ) {
114     if( lepvec[i].type == 11 ) {
115     effArea_ecal_i = 0.101;
116     effArea_hcal_i = 0.021;
117     } else {
118     effArea_ecal_i = 0.074;
119     effArea_hcal_i = 0.022;
120     }
121     } else {
122     if( lepvec[i].type == 11 ) {
123     effArea_ecal_i = 0.046;
124     effArea_hcal_i = 0.040;
125     } else {
126     effArea_ecal_i = 0.045;
127     effArea_hcal_i = 0.030;
128     }
129     }
130    
131     float isoEcal_corr_i = lepvec[i].isoEcal - (effArea_ecal_i*rho);
132     float isoHcal_corr_i = lepvec[i].isoHcal - (effArea_hcal_i*rho);
133    
134     for( int j=i+1; j<lepvec.size(); j++ )
135     {
136    
137     if( !(lepvec[j].is4l) ) continue;
138    
139     float effArea_ecal_j, effArea_hcal_j;
140     if( lepvec[j].isEB ) {
141     if( lepvec[j].type == 11 ) {
142     effArea_ecal_j = 0.101;
143     effArea_hcal_j = 0.021;
144     } else {
145     effArea_ecal_j = 0.074;
146     effArea_hcal_j = 0.022;
147     }
148     } else {
149     if( lepvec[j].type == 11 ) {
150     effArea_ecal_j = 0.046;
151     effArea_hcal_j = 0.040;
152     } else {
153     effArea_ecal_j = 0.045;
154     effArea_hcal_j = 0.030;
155     }
156     }
157    
158     float isoEcal_corr_j = lepvec[j].isoEcal - (effArea_ecal_j*rho);
159     float isoHcal_corr_j = lepvec[j].isoHcal - (effArea_hcal_j*rho);
160     float RIso_i = (lepvec[i].isoTrk+isoEcal_corr_i+isoHcal_corr_i)/lepvec[i].vec->Pt();
161     float RIso_j = (lepvec[j].isoTrk+isoEcal_corr_j+isoHcal_corr_j)/lepvec[j].vec->Pt();
162     float comboIso = RIso_i + RIso_j;
163    
164     if( comboIso > 0.35 ) {
165     if( ctrl.debug ) cout << "combo failing for indices: " << i << "," << j << endl;
166     passiso = false;
167     return passiso;
168     }
169     }
170     }
171    
172     return passiso;
173     }
174    
175 khahn 1.4 //--------------------------------------------------------------------------------------------------
176     SelectionStatus muonIsoSelection(ControlFlags &ctrl,
177     const mithep::Muon * mu,
178     const mithep::Vertex & vtx,
179     const mithep::Array<mithep::PFCandidate> * fPFCandidateCol )
180     //--------------------------------------------------------------------------------------------------
181     {
182     float reliso = computePFMuonIso(mu,vtx,fPFCandidateCol,0.3)/mu->Pt();
183     bool isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 );
184 khahn 1.1 bool failiso = false;
185 khahn 1.4 if( isEB && mu->Pt() > 20 && reliso > PFISO_MU_LOOSE_EB_HIGHPT ) {
186 khahn 1.1 failiso = true;
187     }
188 khahn 1.4 if( isEB && mu->Pt() < 20 && reliso > PFISO_MU_LOOSE_EB_LOWPT ) {
189 khahn 1.1 failiso = true;
190     }
191 khahn 1.4 if( !(isEB) && mu->Pt() > 20 && reliso > PFISO_MU_LOOSE_EE_HIGHPT ) {
192 khahn 1.1 failiso = true;
193     }
194 khahn 1.4 if( !(isEB) && mu->Pt() < 20 && reliso > PFISO_MU_LOOSE_EE_LOWPT ) {
195 khahn 1.1 failiso = true;
196     }
197    
198     SelectionStatus status;
199     if( !failiso ) status.setStatus(SelectionStatus::LOOSEISO);
200     if( !failiso ) status.setStatus(SelectionStatus::TIGHTISO);
201     return status;
202    
203     };
204    
205 khahn 1.4 //--------------------------------------------------------------------------------------------------
206     SelectionStatus electronIsoSelection(ControlFlags &ctrl,
207     const mithep::Electron * ele,
208     const mithep::Vertex &fVertex,
209     const mithep::Array<mithep::PFCandidate> * fPFCandidates)
210     //--------------------------------------------------------------------------------------------------
211     {
212 khahn 1.1
213 khahn 1.4 bool failiso=false;
214 khahn 1.1
215 khahn 1.4 float reliso = computePFEleIso(ele,fVertex,fPFCandidates,0.4)/ele->Pt();
216 khahn 1.1
217 khahn 1.4 if( ele->IsEB() && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EB_HIGHPT ) {
218 khahn 1.1 failiso = true;
219     }
220 khahn 1.4 if( ele->IsEB() && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EB_LOWPT ) {
221 khahn 1.1 failiso = true;
222     }
223     if(ctrl.debug) cout << "before iso check ..." << endl;
224 khahn 1.4 if( !(ele->IsEB()) && ele->Pt() > 20 && reliso > PFISO_ELE_LOOSE_EE_HIGHPT ) {
225 khahn 1.1 if(ctrl.debug) cout << "\tit fails ..." << endl;
226     failiso = true;
227     }
228 khahn 1.4 if( !(ele->IsEB()) && ele->Pt() < 20 && reliso > PFISO_ELE_LOOSE_EE_LOWPT ) {
229 khahn 1.1 failiso = true;
230     }
231    
232     SelectionStatus status;
233     if( !failiso ) {
234 khahn 1.4 status.orStatus(SelectionStatus::LOOSEISO);
235     status.orStatus(SelectionStatus::TIGHTISO);
236 khahn 1.1 }
237     if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
238     return status;
239    
240     }
241 anlevin 1.3
242 khahn 1.4
243 anlevin 1.3 bool noIso(ControlFlags &, vector<SimpleLepton> &, float rho) {
244    
245     return true;
246     }
247 khahn 1.4
248     //--------------------------------------------------------------------------------------------------
249     SelectionStatus muonIsoMVASelection(ControlFlags &ctrl,
250     const mithep::Muon * mu,
251     const mithep::Vertex & vtx,
252     const mithep::Array<mithep::PFCandidate> * fPFCandidates,
253     const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
254     mithep::MuonTools::EMuonEffectiveAreaTarget EffectiveAreaVersion,
255     vector<const mithep::Muon*> muonsToVeto,
256     vector<const mithep::Electron*> electronsToVeto)
257     //--------------------------------------------------------------------------------------------------
258     {
259    
260 khahn 1.7 if( ctrl.debug ) {
261     cout << "muonIsoMVASelection :: muons to veto " << endl;
262     for( int i=0; i<muonsToVeto.size(); i++ ) {
263     const mithep::Muon * vmu = muonsToVeto[i];
264     cout << "\tpt: " << vmu->Pt()
265     << "\teta: " << vmu->Eta()
266     << "\tphi: " << vmu->Phi()
267     << endl;
268     }
269     cout << "muonIsoMVASelection :: electrson to veto " << endl;
270     for( int i=0; i<electronsToVeto.size(); i++ ) {
271     const mithep::Electron * vel = electronsToVeto[i];
272     cout << "\tpt: " << vel->Pt()
273     << "\teta: " << vel->Eta()
274     << "\tphi: " << vel->Phi()
275     << endl;
276     }
277     }
278 khahn 1.4 bool failiso=false;
279    
280     //
281     // tmp iso rings
282     //
283 khahn 1.7 Double_t tmpChargedIso_DR0p0To0p1 = 0;
284     Double_t tmpChargedIso_DR0p1To0p2 = 0;
285     Double_t tmpChargedIso_DR0p2To0p3 = 0;
286 khahn 1.4 Double_t tmpChargedIso_DR0p3To0p4 = 0;
287     Double_t tmpChargedIso_DR0p4To0p5 = 0;
288 khahn 1.7 Double_t tmpChargedIso_DR0p5To0p7 = 0;
289 khahn 1.4
290 khahn 1.7 Double_t tmpGammaIso_DR0p0To0p1 = 0;
291     Double_t tmpGammaIso_DR0p1To0p2 = 0;
292     Double_t tmpGammaIso_DR0p2To0p3 = 0;
293 khahn 1.4 Double_t tmpGammaIso_DR0p3To0p4 = 0;
294     Double_t tmpGammaIso_DR0p4To0p5 = 0;
295 khahn 1.7 Double_t tmpGammaIso_DR0p5To0p7 = 0;
296 khahn 1.4
297 khahn 1.7 Double_t tmpNeutralHadronIso_DR0p0To0p1 = 0;
298     Double_t tmpNeutralHadronIso_DR0p1To0p2 = 0;
299     Double_t tmpNeutralHadronIso_DR0p2To0p3 = 0;
300 khahn 1.4 Double_t tmpNeutralHadronIso_DR0p3To0p4 = 0;
301     Double_t tmpNeutralHadronIso_DR0p4To0p5 = 0;
302 khahn 1.7 Double_t tmpNeutralHadronIso_DR0p5To0p7 = 0;
303    
304 khahn 1.4
305    
306     //
307     // final rings for the MVA
308     //
309     Double_t fChargedIso_DR0p0To0p1;
310     Double_t fChargedIso_DR0p1To0p2;
311     Double_t fChargedIso_DR0p2To0p3;
312     Double_t fChargedIso_DR0p3To0p4;
313     Double_t fChargedIso_DR0p4To0p5;
314 khahn 1.7 Double_t fChargedIso_DR0p5To0p7;
315 khahn 1.4
316     Double_t fGammaIso_DR0p0To0p1;
317     Double_t fGammaIso_DR0p1To0p2;
318     Double_t fGammaIso_DR0p2To0p3;
319     Double_t fGammaIso_DR0p3To0p4;
320     Double_t fGammaIso_DR0p4To0p5;
321 khahn 1.7 Double_t fGammaIso_DR0p5To0p7;
322 khahn 1.4
323     Double_t fNeutralHadronIso_DR0p0To0p1;
324     Double_t fNeutralHadronIso_DR0p1To0p2;
325     Double_t fNeutralHadronIso_DR0p2To0p3;
326     Double_t fNeutralHadronIso_DR0p3To0p4;
327     Double_t fNeutralHadronIso_DR0p4To0p5;
328 khahn 1.7 Double_t fNeutralHadronIso_DR0p5To0p7;
329 khahn 1.4
330    
331     //
332     //Loop over PF Candidates
333     //
334     for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
335     const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
336    
337     Double_t deta = (mu->Eta() - pf->Eta());
338     Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(mu->Phi()),Double_t(pf->Phi()));
339     Double_t dr = mithep::MathUtils::DeltaR(mu->Phi(),mu->Eta(), pf->Phi(), pf->Eta());
340     if (dr > 1.0) continue;
341    
342 khahn 1.7 if (pf->HasTrackerTrk() && (pf->TrackerTrk() == mu->TrackerTrk()) ) continue;
343 khahn 1.4
344     //
345     // Lepton Footprint Removal
346     //
347     Bool_t IsLeptonFootprint = kFALSE;
348     if (dr < 1.0) {
349    
350     //
351     // Check for electrons
352     //
353     for (Int_t q=0; q < electronsToVeto.size(); ++q) {
354     const mithep::Electron *tmpele = electronsToVeto[q];
355 khahn 1.7 // 4l electron
356     if( pf->HasTrackerTrk() ) {
357     if( pf->TrackerTrk() == tmpele->TrackerTrk() )
358     IsLeptonFootprint = kTRUE;
359     }
360     if( pf->HasGsfTrk() ) {
361     if( pf->GsfTrk() == tmpele->GsfTrk() )
362     IsLeptonFootprint = kTRUE;
363     }
364 khahn 1.4 // PF charged
365     if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
366     && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015)
367     IsLeptonFootprint = kTRUE;
368     // PF gamma
369 khahn 1.7 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
370 khahn 1.4 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08)
371     IsLeptonFootprint = kTRUE;
372     } // loop over electrons
373    
374     //
375     // Check for muons
376     //
377     for (Int_t q=0; q < muonsToVeto.size(); ++q) {
378     const mithep::Muon *tmpmu = muonsToVeto[q];
379 khahn 1.7 // 4l muon
380     if( pf->HasTrackerTrk() ) {
381     if( pf->TrackerTrk() == tmpmu->TrackerTrk() )
382     IsLeptonFootprint = kTRUE;
383     }
384 khahn 1.4 // PF charged
385     if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01)
386     IsLeptonFootprint = kTRUE;
387     } // loop over muons
388    
389    
390     if (IsLeptonFootprint)
391     continue;
392    
393     //
394     // Charged Iso Rings
395     //
396 khahn 1.7 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
397    
398     if( dr < 0.01 ) continue; // only for muon iso mva?
399     if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
400 khahn 1.4
401 khahn 1.7 if( pf->HasTrackerTrk() ) {
402     if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
403     if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
404     << abs(pf->TrackerTrk()->DzCorrected(vtx)) << " "
405     << dr << endl;
406     }
407     if( pf->HasGsfTrk() ) {
408     if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
409     if( ctrl.debug ) cout << "charged:: " << pf->PFType() << " " << pf->Pt() << " "
410     << abs(pf->GsfTrk()->DzCorrected(vtx)) << " "
411     << dr << endl;
412     }
413 khahn 1.4
414     // Footprint Veto
415 khahn 1.7 if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
416     if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
417     if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
418     if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
419     if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
420     if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
421 khahn 1.4 }
422    
423     //
424     // Gamma Iso Rings
425     //
426 khahn 1.7 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
427     if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
428     if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
429     if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
430     if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
431     if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
432     if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
433 khahn 1.4 }
434    
435     //
436     // Other Neutral Iso Rings
437     //
438     else {
439 khahn 1.7 if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
440     if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
441     if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
442     if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
443     if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
444     if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
445 khahn 1.4 }
446    
447     }
448    
449     }
450    
451 khahn 1.7 fChargedIso_DR0p0To0p1 = min((tmpChargedIso_DR0p0To0p1)/mu->Pt(), 2.5);
452     fChargedIso_DR0p1To0p2 = min((tmpChargedIso_DR0p1To0p2)/mu->Pt(), 2.5);
453     fChargedIso_DR0p2To0p3 = min((tmpChargedIso_DR0p2To0p3)/mu->Pt(), 2.5);
454 khahn 1.4 fChargedIso_DR0p3To0p4 = min((tmpChargedIso_DR0p3To0p4)/mu->Pt(), 2.5);
455     fChargedIso_DR0p4To0p5 = min((tmpChargedIso_DR0p4To0p5)/mu->Pt(), 2.5);
456    
457 khahn 1.7
458 khahn 1.4 double rho = 0;
459     if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
460     rho = fPUEnergyDensity->At(0)->Rho();
461    
462    
463 khahn 1.7 fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p1
464 khahn 1.4 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p0To0p1,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
465     ,2.5)
466     ,0.0);
467 khahn 1.7 fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p2
468 khahn 1.4 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p1To0p2,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
469     ,2.5)
470     ,0.0);
471 khahn 1.7 fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p3
472 khahn 1.4 -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p2To0p3,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
473     ,2.5)
474     ,0.0);
475     fGammaIso_DR0p3To0p4 = max(min((tmpGammaIso_DR0p3To0p4
476     -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p3To0p4,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
477     ,2.5)
478     ,0.0);
479     fGammaIso_DR0p4To0p5 = max(min((tmpGammaIso_DR0p4To0p5
480     -rho*muT.MuonEffectiveArea(muT.kMuGammaIsoDR0p4To0p5,mu->Eta(),EffectiveAreaVersion))/mu->Pt()
481     ,2.5)
482     ,0.0);
483    
484    
485 khahn 1.7
486     fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p1
487 khahn 1.4 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p0To0p1,
488     mu->Eta(),EffectiveAreaVersion))/mu->Pt()
489     , 2.5)
490     , 0.0);
491 khahn 1.7 fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p2
492 khahn 1.4 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p1To0p2,
493     mu->Eta(),EffectiveAreaVersion))/mu->Pt()
494     , 2.5)
495     , 0.0);
496 khahn 1.7 fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p3
497 khahn 1.4 -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p2To0p3,
498     mu->Eta(),EffectiveAreaVersion))/mu->Pt()
499     , 2.5)
500     , 0.0);
501     fNeutralHadronIso_DR0p3To0p4 = max(min((tmpNeutralHadronIso_DR0p3To0p4
502     -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p3To0p4,
503     mu->Eta(), EffectiveAreaVersion))/mu->Pt()
504     , 2.5)
505     , 0.0);
506     fNeutralHadronIso_DR0p4To0p5 = max(min((tmpNeutralHadronIso_DR0p4To0p5
507     -rho*muT.MuonEffectiveArea(muT.kMuNeutralHadronIsoDR0p4To0p5,
508     mu->Eta(), EffectiveAreaVersion))/mu->Pt()
509     , 2.5)
510     , 0.0);
511    
512 khahn 1.7
513 khahn 1.4 double mvaval = muIsoMVA->MVAValue_IsoRings( mu->Pt(),
514     mu->Eta(),
515     fChargedIso_DR0p0To0p1,
516     fChargedIso_DR0p1To0p2,
517     fChargedIso_DR0p2To0p3,
518     fChargedIso_DR0p3To0p4,
519     fChargedIso_DR0p4To0p5,
520     fGammaIso_DR0p0To0p1,
521     fGammaIso_DR0p1To0p2,
522     fGammaIso_DR0p2To0p3,
523     fGammaIso_DR0p3To0p4,
524     fGammaIso_DR0p4To0p5,
525     fNeutralHadronIso_DR0p0To0p1,
526     fNeutralHadronIso_DR0p1To0p2,
527     fNeutralHadronIso_DR0p2To0p3,
528     fNeutralHadronIso_DR0p3To0p4,
529     fNeutralHadronIso_DR0p4To0p5,
530     ctrl.debug);
531    
532     SelectionStatus status;
533     bool pass = false;
534    
535     if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
536 khahn 1.8 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN0) pass = true;
537 khahn 1.4 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
538 khahn 1.8 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN1) pass = true;
539 khahn 1.4 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
540 khahn 1.8 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN2) pass = true;
541 khahn 1.4 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
542 khahn 1.8 && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN3) pass = true;
543 khahn 1.9 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN4) pass = true;
544     else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_ISOMVA_FORPFID_CUT_BIN5) pass = true;
545 khahn 1.4
546    
547 khahn 1.7 pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
548    
549 khahn 1.4 if( pass ) {
550     status.orStatus(SelectionStatus::LOOSEISO);
551     status.orStatus(SelectionStatus::TIGHTISO);
552     }
553     if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
554     return status;
555    
556     }
557    
558     //--------------------------------------------------------------------------------------------------
559     void initMuonIsoMVA() {
560     //--------------------------------------------------------------------------------------------------
561     muIsoMVA = new mithep::MuonIDMVA();
562     vector<string> weightFiles;
563 khahn 1.6 weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_lowpt.weights.xml");
564     weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_barrel_highpt.weights.xml");
565     weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_lowpt.weights.xml");
566     weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_endcap_highpt.weights.xml");
567     weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_tracker.weights.xml");
568     weightFiles.push_back("./data/MuonIsoMVAWeights/MuonIsoMVA_BDTG_V0_global.weights.xml");
569 khahn 1.4 muIsoMVA->Initialize( "MuonIsoMVA",
570     mithep::MuonIDMVA::kIsoRingsV0,
571     kTRUE, weightFiles);
572     }
573    
574    
575    
576     //--------------------------------------------------------------------------------------------------
577     SelectionStatus electronIsoMVASelection(ControlFlags &ctrl,
578     const mithep::Electron * ele,
579     const mithep::Vertex & vtx,
580     const mithep::Array<mithep::PFCandidate> * fPFCandidates,
581     const mithep::Array<mithep::PileupEnergyDensity> * fPUEnergyDensity,
582     mithep::ElectronTools::EElectronEffectiveAreaTarget EffectiveAreaVersion,
583     vector<const mithep::Muon*> muonsToVeto,
584     vector<const mithep::Electron*> electronsToVeto)
585     //--------------------------------------------------------------------------------------------------
586     {
587    
588 khahn 1.7 if( ctrl.debug ) {
589     cout << "electronIsoMVASelection :: muons to veto " << endl;
590     for( int i=0; i<muonsToVeto.size(); i++ ) {
591     const mithep::Muon * vmu = muonsToVeto[i];
592     cout << "\tpt: " << vmu->Pt()
593     << "\teta: " << vmu->Eta()
594     << "\tphi: " << vmu->Phi()
595     << endl;
596     }
597     cout << "electronIsoMVASelection :: electrson to veto " << endl;
598     for( int i=0; i<electronsToVeto.size(); i++ ) {
599     const mithep::Electron * vel = electronsToVeto[i];
600     cout << "\tpt: " << vel->Pt()
601     << "\teta: " << vel->Eta()
602     << "\tphi: " << vel->Phi()
603     << "\ttrk: " << vel->TrackerTrk()
604     << endl;
605     }
606     }
607    
608 khahn 1.4 bool failiso=false;
609    
610     //
611     // tmp iso rings
612     //
613 khahn 1.7 Double_t tmpChargedIso_DR0p0To0p1 = 0;
614     Double_t tmpChargedIso_DR0p1To0p2 = 0;
615     Double_t tmpChargedIso_DR0p2To0p3 = 0;
616 khahn 1.4 Double_t tmpChargedIso_DR0p3To0p4 = 0;
617     Double_t tmpChargedIso_DR0p4To0p5 = 0;
618 khahn 1.7 Double_t tmpChargedIso_DR0p5To0p7 = 0;
619 khahn 1.4
620 khahn 1.7 Double_t tmpGammaIso_DR0p0To0p1 = 0;
621     Double_t tmpGammaIso_DR0p1To0p2 = 0;
622     Double_t tmpGammaIso_DR0p2To0p3 = 0;
623 khahn 1.4 Double_t tmpGammaIso_DR0p3To0p4 = 0;
624     Double_t tmpGammaIso_DR0p4To0p5 = 0;
625 khahn 1.7 Double_t tmpGammaIso_DR0p5To0p7 = 0;
626 khahn 1.4
627 khahn 1.7 Double_t tmpNeutralHadronIso_DR0p0To0p1 = 0;
628     Double_t tmpNeutralHadronIso_DR0p1To0p2 = 0;
629     Double_t tmpNeutralHadronIso_DR0p2To0p3 = 0;
630 khahn 1.4 Double_t tmpNeutralHadronIso_DR0p3To0p4 = 0;
631     Double_t tmpNeutralHadronIso_DR0p4To0p5 = 0;
632 khahn 1.7 Double_t tmpNeutralHadronIso_DR0p5To0p7 = 0;
633    
634 khahn 1.4
635    
636     //
637     // final rings for the MVA
638     //
639     Double_t fChargedIso_DR0p0To0p1;
640     Double_t fChargedIso_DR0p1To0p2;
641     Double_t fChargedIso_DR0p2To0p3;
642     Double_t fChargedIso_DR0p3To0p4;
643     Double_t fChargedIso_DR0p4To0p5;
644    
645     Double_t fGammaIso_DR0p0To0p1;
646     Double_t fGammaIso_DR0p1To0p2;
647     Double_t fGammaIso_DR0p2To0p3;
648     Double_t fGammaIso_DR0p3To0p4;
649     Double_t fGammaIso_DR0p4To0p5;
650    
651     Double_t fNeutralHadronIso_DR0p0To0p1;
652     Double_t fNeutralHadronIso_DR0p1To0p2;
653     Double_t fNeutralHadronIso_DR0p2To0p3;
654     Double_t fNeutralHadronIso_DR0p3To0p4;
655     Double_t fNeutralHadronIso_DR0p4To0p5;
656    
657    
658     //
659     //Loop over PF Candidates
660     //
661     for(int k=0; k<fPFCandidates->GetEntries(); ++k) {
662     const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*fPFCandidates)[k]);
663     Double_t deta = (ele->Eta() - pf->Eta());
664     Double_t dphi = mithep::MathUtils::DeltaPhi(Double_t(ele->Phi()),Double_t(pf->Phi()));
665     Double_t dr = mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta());
666 khahn 1.7 if (dr >= 0.5) continue;
667     if(ctrl.debug) {
668     cout << "pf :: type: " << pf->PFType() << "\tpt: " << pf->Pt();
669     if( pf->HasTrackerTrk() ) cout << "\tdZ: " << pf->TrackerTrk()->DzCorrected(vtx);
670     cout << endl;
671     }
672    
673 khahn 1.4
674 khahn 1.7 if ( (pf->HasTrackerTrk() && (pf->TrackerTrk() == ele->TrackerTrk())) ||
675     (pf->HasGsfTrk() && (pf->GsfTrk() == ele->GsfTrk()))) continue;
676    
677 khahn 1.4
678     //
679     // Lepton Footprint Removal
680     //
681     Bool_t IsLeptonFootprint = kFALSE;
682     if (dr < 1.0) {
683    
684     //
685     // Check for electrons
686     //
687     for (Int_t q=0; q < electronsToVeto.size(); ++q) {
688     const mithep::Electron *tmpele = electronsToVeto[q];
689 khahn 1.7 // 4l electron
690     if( pf->HasTrackerTrk() ) {
691     if( pf->TrackerTrk() == tmpele->TrackerTrk() ) {
692     if( ctrl.debug) cout << "\tcharged tktrk, matches 4L ele ..." << endl;
693     IsLeptonFootprint = kTRUE;
694     }
695     }
696     if( pf->HasGsfTrk() ) {
697     if( pf->GsfTrk() == tmpele->GsfTrk() ) {
698     if( ctrl.debug) cout << "\tcharged gsftrk, matches 4L ele ..." << endl;
699     IsLeptonFootprint = kTRUE;
700     }
701     }
702 khahn 1.4 // PF charged
703     if (pf->Charge() != 0 && fabs(tmpele->SCluster()->Eta()) > 1.479
704 khahn 1.7 && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.015) {
705     if( ctrl.debug) cout << "\tcharged trk, dR matches 4L ele ..." << endl;
706 khahn 1.4 IsLeptonFootprint = kTRUE;
707 khahn 1.7 }
708 khahn 1.4 // PF gamma
709 khahn 1.7 if (abs(pf->PFType()) == PFCandidate::eGamma && fabs(tmpele->SCluster()->Eta()) > 1.479
710     && mithep::MathUtils::DeltaR(tmpele->Phi(),tmpele->Eta(), pf->Phi(), pf->Eta()) < 0.08) {
711     if( ctrl.debug) cout << "\tPF gamma, matches 4L ele ..." << endl;
712 khahn 1.4 IsLeptonFootprint = kTRUE;
713 khahn 1.7 }
714 khahn 1.4 } // loop over electrons
715    
716     //
717     // Check for muons
718     //
719     for (Int_t q=0; q < muonsToVeto.size(); ++q) {
720     const mithep::Muon *tmpmu = muonsToVeto[q];
721 khahn 1.7 // 4l muon
722     if( pf->HasTrackerTrk() ) {
723     if (pf->TrackerTrk() == tmpmu->TrackerTrk() ){
724     if( ctrl.debug) cout << "\tmatches 4L mu ..." << endl;
725     IsLeptonFootprint = kTRUE;
726     }
727     }
728 khahn 1.4 // PF charged
729 khahn 1.7 if (pf->Charge() != 0 && mithep::MathUtils::DeltaR(tmpmu->Phi(),tmpmu->Eta(), pf->Phi(), pf->Eta()) < 0.01) {
730     if( ctrl.debug) cout << "\tcharged trk, dR matches 4L mu ..." << endl;
731 khahn 1.4 IsLeptonFootprint = kTRUE;
732 khahn 1.7 }
733 khahn 1.4 } // loop over muons
734    
735    
736     if (IsLeptonFootprint)
737     continue;
738    
739     //
740     // Charged Iso Rings
741     //
742 khahn 1.7 if (pf->Charge() != 0 && (pf->HasTrackerTrk()||pf->HasGsfTrk()) ) {
743    
744     if( pf->HasTrackerTrk() )
745     if (abs(pf->TrackerTrk()->DzCorrected(vtx)) > 0.2) continue;
746     if( pf->HasGsfTrk() )
747     if (abs(pf->GsfTrk()->DzCorrected(vtx)) > 0.2) continue;
748 khahn 1.4
749     // Veto any PFmuon, or PFEle
750 khahn 1.7 if (abs(pf->PFType()) == PFCandidate::eElectron || abs(pf->PFType()) == PFCandidate::eMuon) continue;
751 khahn 1.4
752     // Footprint Veto
753 khahn 1.7 if (fabs(ele->SCluster()->Eta()) > 1.479 && dr < 0.015) continue;
754    
755     if( ctrl.debug) cout << "charged:: pt: " << pf->Pt()
756     << "\ttype: " << pf->PFType()
757     << "\ttrk: " << pf->TrackerTrk() << endl;
758    
759     if (dr < 0.1) tmpChargedIso_DR0p0To0p1 += pf->Pt();
760     if (dr >= 0.1 && dr < 0.2) tmpChargedIso_DR0p1To0p2 += pf->Pt();
761     if (dr >= 0.2 && dr < 0.3) tmpChargedIso_DR0p2To0p3 += pf->Pt();
762     if (dr >= 0.3 && dr < 0.4) tmpChargedIso_DR0p3To0p4 += pf->Pt();
763     if (dr >= 0.4 && dr < 0.5) tmpChargedIso_DR0p4To0p5 += pf->Pt();
764     if (dr >= 0.5 && dr < 0.7) tmpChargedIso_DR0p5To0p7 += pf->Pt();
765 khahn 1.4
766     }
767    
768     //
769     // Gamma Iso Rings
770     //
771 khahn 1.7 else if (abs(pf->PFType()) == PFCandidate::eGamma) {
772    
773     if (fabs(ele->SCluster()->Eta()) > 1.479) {
774     if (mithep::MathUtils::DeltaR(ele->Phi(),ele->Eta(), pf->Phi(), pf->Eta()) < 0.08) continue;
775     }
776    
777     if( ctrl.debug) cout << "gamma:: " << pf->Pt() << " "
778     << dr << endl;
779    
780     if (dr < 0.1) tmpGammaIso_DR0p0To0p1 += pf->Pt();
781     if (dr >= 0.1 && dr < 0.2) tmpGammaIso_DR0p1To0p2 += pf->Pt();
782     if (dr >= 0.2 && dr < 0.3) tmpGammaIso_DR0p2To0p3 += pf->Pt();
783     if (dr >= 0.3 && dr < 0.4) tmpGammaIso_DR0p3To0p4 += pf->Pt();
784     if (dr >= 0.4 && dr < 0.5) tmpGammaIso_DR0p4To0p5 += pf->Pt();
785     if (dr >= 0.5 && dr < 0.7) tmpGammaIso_DR0p5To0p7 += pf->Pt();
786 khahn 1.4
787     }
788    
789     //
790     // Other Neutral Iso Rings
791     //
792     else {
793 khahn 1.7 if( ctrl.debug) cout << "neutral:: " << pf->Pt() << " "
794     << dr << endl;
795     if (dr < 0.1) tmpNeutralHadronIso_DR0p0To0p1 += pf->Pt();
796     if (dr >= 0.1 && dr < 0.2) tmpNeutralHadronIso_DR0p1To0p2 += pf->Pt();
797     if (dr >= 0.2 && dr < 0.3) tmpNeutralHadronIso_DR0p2To0p3 += pf->Pt();
798     if (dr >= 0.3 && dr < 0.4) tmpNeutralHadronIso_DR0p3To0p4 += pf->Pt();
799     if (dr >= 0.4 && dr < 0.5) tmpNeutralHadronIso_DR0p4To0p5 += pf->Pt();
800     if (dr >= 0.5 && dr < 0.7) tmpNeutralHadronIso_DR0p5To0p7 += pf->Pt();
801 khahn 1.4 }
802    
803     }
804    
805     }
806    
807 khahn 1.7 fChargedIso_DR0p0To0p1 = min((tmpChargedIso_DR0p0To0p1)/ele->Pt(), 2.5);
808     fChargedIso_DR0p1To0p2 = min((tmpChargedIso_DR0p1To0p2)/ele->Pt(), 2.5);
809     fChargedIso_DR0p2To0p3 = min((tmpChargedIso_DR0p2To0p3)/ele->Pt(), 2.5);
810 khahn 1.4 fChargedIso_DR0p3To0p4 = min((tmpChargedIso_DR0p3To0p4)/ele->Pt(), 2.5);
811     fChargedIso_DR0p4To0p5 = min((tmpChargedIso_DR0p4To0p5)/ele->Pt(), 2.5);
812    
813     double rho = 0;
814     if (!(isnan(fPUEnergyDensity->At(0)->Rho()) || isinf(fPUEnergyDensity->At(0)->Rho())))
815     rho = fPUEnergyDensity->At(0)->Rho();
816 khahn 1.7
817     if( ctrl.debug) {
818     cout << "RHO: " << rho << endl;
819     cout << "eta: " << ele->SCluster()->Eta() << endl;
820     cout << "target: " << EffectiveAreaVersion << endl;
821     cout << "effA 0-1: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
822     ele->SCluster()->Eta(),
823     EffectiveAreaVersion)
824     << endl;
825     cout << "effA 1-2: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
826     ele->SCluster()->Eta(),
827     EffectiveAreaVersion)
828     << endl;
829     cout << "effA 2-3: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
830     ele->SCluster()->Eta(),
831     EffectiveAreaVersion)
832     << endl;
833     cout << "effA 3-4: " << eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
834     ele->SCluster()->Eta(),
835     EffectiveAreaVersion)
836     << endl;
837     }
838    
839     fGammaIso_DR0p0To0p1 = max(min((tmpGammaIso_DR0p0To0p1
840 khahn 1.4 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p0To0p1,
841 khahn 1.7 ele->SCluster()->Eta(),
842 khahn 1.4 EffectiveAreaVersion))/ele->Pt()
843     ,2.5)
844     ,0.0);
845 khahn 1.7 fGammaIso_DR0p1To0p2 = max(min((tmpGammaIso_DR0p1To0p2
846 khahn 1.4 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p1To0p2,
847 khahn 1.7 ele->SCluster()->Eta(),
848 khahn 1.4 EffectiveAreaVersion))/ele->Pt()
849     ,2.5)
850     ,0.0);
851 khahn 1.7 fGammaIso_DR0p2To0p3 = max(min((tmpGammaIso_DR0p2To0p3
852 khahn 1.4 -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p2To0p3,
853 khahn 1.7 ele->SCluster()->Eta()
854 khahn 1.4 ,EffectiveAreaVersion))/ele->Pt()
855     ,2.5)
856     ,0.0);
857     fGammaIso_DR0p3To0p4 = max(min((tmpGammaIso_DR0p3To0p4
858     -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p3To0p4,
859 khahn 1.7 ele->SCluster()->Eta(),
860 khahn 1.4 EffectiveAreaVersion))/ele->Pt()
861     ,2.5)
862     ,0.0);
863     fGammaIso_DR0p4To0p5 = max(min((tmpGammaIso_DR0p4To0p5
864     -rho*eleT.ElectronEffectiveArea(eleT.kEleGammaIsoDR0p4To0p5,
865 khahn 1.7 ele->SCluster()->Eta(),
866 khahn 1.4 EffectiveAreaVersion))/ele->Pt()
867     ,2.5)
868     ,0.0);
869    
870    
871 khahn 1.7 fNeutralHadronIso_DR0p0To0p1 = max(min((tmpNeutralHadronIso_DR0p0To0p1
872 khahn 1.4 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p0To0p1,
873 khahn 1.7 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
874 khahn 1.4 , 2.5)
875     , 0.0);
876 khahn 1.7 fNeutralHadronIso_DR0p1To0p2 = max(min((tmpNeutralHadronIso_DR0p1To0p2
877 khahn 1.4 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p1To0p2,
878 khahn 1.7 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
879 khahn 1.4 , 2.5)
880     , 0.0);
881 khahn 1.7 fNeutralHadronIso_DR0p2To0p3 = max(min((tmpNeutralHadronIso_DR0p2To0p3
882 khahn 1.4 -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p2To0p3,
883 khahn 1.7 ele->SCluster()->Eta(),EffectiveAreaVersion))/ele->Pt()
884 khahn 1.4 , 2.5)
885     , 0.0);
886     fNeutralHadronIso_DR0p3To0p4 = max(min((tmpNeutralHadronIso_DR0p3To0p4
887     -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p3To0p4,
888 khahn 1.7 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
889 khahn 1.4 , 2.5)
890     , 0.0);
891     fNeutralHadronIso_DR0p4To0p5 = max(min((tmpNeutralHadronIso_DR0p4To0p5
892     -rho*eleT.ElectronEffectiveArea(eleT.kEleNeutralHadronIsoDR0p4To0p5,
893 khahn 1.7 ele->SCluster()->Eta(), EffectiveAreaVersion))/ele->Pt()
894 khahn 1.4 , 2.5)
895     , 0.0);
896    
897     double mvaval = eleIsoMVA->MVAValue_IsoRings( ele->Pt(),
898 khahn 1.7 ele->SCluster()->Eta(),
899     fChargedIso_DR0p0To0p1,
900     fChargedIso_DR0p1To0p2,
901     fChargedIso_DR0p2To0p3,
902     fChargedIso_DR0p3To0p4,
903     fChargedIso_DR0p4To0p5,
904     fGammaIso_DR0p0To0p1,
905     fGammaIso_DR0p1To0p2,
906     fGammaIso_DR0p2To0p3,
907     fGammaIso_DR0p3To0p4,
908     fGammaIso_DR0p4To0p5,
909     fNeutralHadronIso_DR0p0To0p1,
910     fNeutralHadronIso_DR0p1To0p2,
911     fNeutralHadronIso_DR0p2To0p3,
912     fNeutralHadronIso_DR0p3To0p4,
913     fNeutralHadronIso_DR0p4To0p5,
914     ctrl.debug);
915 khahn 1.4
916     SelectionStatus status;
917     bool pass = false;
918    
919     Int_t subdet = 0;
920     if (fabs(ele->SCluster()->Eta()) < 0.8) subdet = 0;
921     else if (fabs(ele->SCluster()->Eta()) < 1.479) subdet = 1;
922     else subdet = 2;
923     Int_t ptBin = 0;
924     if (ele->Pt() > 10.0) ptBin = 1;
925    
926     Int_t MVABin = -1;
927     if (subdet == 0 && ptBin == 0) MVABin = 0;
928     if (subdet == 1 && ptBin == 0) MVABin = 1;
929     if (subdet == 2 && ptBin == 0) MVABin = 2;
930     if (subdet == 0 && ptBin == 1) MVABin = 3;
931     if (subdet == 1 && ptBin == 1) MVABin = 4;
932     if (subdet == 2 && ptBin == 1) MVABin = 5;
933    
934     if( MVABin == 0 && mvaval > ELECTRON_ISOMVA_CUT_BIN0 ) pass = true;
935     if( MVABin == 1 && mvaval > ELECTRON_ISOMVA_CUT_BIN1 ) pass = true;
936     if( MVABin == 2 && mvaval > ELECTRON_ISOMVA_CUT_BIN2 ) pass = true;
937     if( MVABin == 3 && mvaval > ELECTRON_ISOMVA_CUT_BIN3 ) pass = true;
938     if( MVABin == 4 && mvaval > ELECTRON_ISOMVA_CUT_BIN4 ) pass = true;
939     if( MVABin == 5 && mvaval > ELECTRON_ISOMVA_CUT_BIN5 ) pass = true;
940    
941 khahn 1.7 // pre-selection iso ...
942     pass &= (fChargedIso_DR0p0To0p1 + fChargedIso_DR0p1To0p2 + fChargedIso_DR0p2To0p3 < 0.7);
943    
944 khahn 1.4 if( pass ) {
945     status.orStatus(SelectionStatus::LOOSEISO);
946     status.orStatus(SelectionStatus::TIGHTISO);
947     }
948     if(ctrl.debug) cout << "returning status : " << hex << status.getStatus() << dec << endl;
949     return status;
950    
951     }
952    
953    
954     //--------------------------------------------------------------------------------------------------
955     void initElectronIsoMVA() {
956     //--------------------------------------------------------------------------------------------------
957     eleIsoMVA = new mithep::ElectronIDMVA();
958     vector<string> weightFiles;
959     weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt5To10.weights.xml");
960     weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt5To10.weights.xml");
961     weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_BarrelPt10ToInf.weights.xml");
962     weightFiles.push_back("../MitPhysics/data/ElectronMVAWeights/ElectronIso_BDTG_V0_EndcapPt10ToInf.weights.xml");
963     eleIsoMVA->Initialize( "ElectronIsoMVA",
964     mithep::ElectronIDMVA::kIsoRingsV0,
965     kTRUE, weightFiles);
966     }