ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/ElectronIDMVA.cc
Revision: 1.11
Committed: Tue Feb 7 20:53:28 2012 UTC (13 years, 3 months ago) by sixie
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025e, Mit_025d
Changes since 1.10: +7 -6 lines
Log Message:
add internal radius parameter for isolation

File Contents

# Content
1 #include "MitPhysics/Utils/interface/ElectronIDMVA.h"
2 #include "MitPhysics/Utils/interface/ElectronTools.h"
3 #include "MitPhysics/Utils/interface/IsolationTools.h"
4 #include "MitAna/DataTree/interface/StableData.h"
5 #include <TFile.h>
6 #include <TRandom3.h>
7 #include "TMVA/Tools.h"
8 #include "TMVA/Reader.h"
9
10
11 ClassImp(mithep::ElectronIDMVA)
12
13 using namespace mithep;
14
15 //--------------------------------------------------------------------------------------------------
16 ElectronIDMVA::ElectronIDMVA() :
17 fMethodname("BDTG method"),
18 fIsInitialized(kFALSE)
19 {
20 // Constructor.
21 for(UInt_t i=0; i<6; ++i) {
22 fTMVAReader[i] = 0;
23 }
24 }
25
26
27 //--------------------------------------------------------------------------------------------------
28 ElectronIDMVA::~ElectronIDMVA()
29 {
30 for(UInt_t i=0; i<6; ++i) {
31 if (fTMVAReader[i]) delete fTMVAReader[i];
32 }
33 }
34
35 //--------------------------------------------------------------------------------------------------
36 void ElectronIDMVA::Initialize( TString methodName,
37 TString Subdet0Pt10To20Weights ,
38 TString Subdet1Pt10To20Weights ,
39 TString Subdet2Pt10To20Weights,
40 TString Subdet0Pt20ToInfWeights,
41 TString Subdet1Pt20ToInfWeights,
42 TString Subdet2Pt20ToInfWeights,
43 ElectronIDMVA::MVAType type) {
44
45 fIsInitialized = kTRUE;
46
47 fMethodname = methodName;
48
49 for(UInt_t i=0; i<6; ++i) {
50 if (fTMVAReader[i]) delete fTMVAReader[i];
51
52 fTMVAReader[i] = new TMVA::Reader( "!Color:!Silent:Error" );
53 fTMVAReader[i]->SetVerbose(kTRUE);
54
55 if (type == kBaseline) {
56 fTMVAReader[i]->AddVariable( "SigmaIEtaIEta", &fMVAVar_EleSigmaIEtaIEta );
57 fTMVAReader[i]->AddVariable( "DEtaIn", &fMVAVar_EleDEtaIn );
58 fTMVAReader[i]->AddVariable( "DPhiIn", &fMVAVar_EleDPhiIn );
59 fTMVAReader[i]->AddVariable( "FBrem", &fMVAVar_EleFBrem );
60 fTMVAReader[i]->AddVariable( "SigmaIPhiIPhi", &fMVAVar_EleSigmaIPhiIPhi );
61 fTMVAReader[i]->AddVariable( "NBrem", &fMVAVar_EleNBrem );
62 fTMVAReader[i]->AddVariable( "OneOverEMinusOneOverP", &fMVAVar_EleOneOverEMinusOneOverP );
63 }
64
65 if (type == kNoIPInfo) {
66 fTMVAReader[i]->AddVariable( "SigmaIEtaIEta", &fMVAVar_EleSigmaIEtaIEta );
67 fTMVAReader[i]->AddVariable( "DEtaIn", &fMVAVar_EleDEtaIn );
68 fTMVAReader[i]->AddVariable( "DPhiIn", &fMVAVar_EleDPhiIn );
69 fTMVAReader[i]->AddVariable( "FBrem", &fMVAVar_EleFBrem );
70 fTMVAReader[i]->AddVariable( "EOverP", &fMVAVar_EleEOverP );
71 fTMVAReader[i]->AddVariable( "ESeedClusterOverPout", &fMVAVar_EleESeedClusterOverPout );
72 fTMVAReader[i]->AddVariable( "SigmaIPhiIPhi", &fMVAVar_EleSigmaIPhiIPhi );
73 fTMVAReader[i]->AddVariable( "NBrem", &fMVAVar_EleNBrem );
74 fTMVAReader[i]->AddVariable( "OneOverEMinusOneOverP", &fMVAVar_EleOneOverEMinusOneOverP );
75 fTMVAReader[i]->AddVariable( "ESeedClusterOverPIn", &fMVAVar_EleESeedClusterOverPIn );
76 }
77 if (type == kWithIPInfo) {
78 fTMVAReader[i]->AddVariable( "SigmaIEtaIEta", &fMVAVar_EleSigmaIEtaIEta );
79 fTMVAReader[i]->AddVariable( "DEtaIn", &fMVAVar_EleDEtaIn );
80 fTMVAReader[i]->AddVariable( "DPhiIn", &fMVAVar_EleDPhiIn );
81 fTMVAReader[i]->AddVariable( "D0", &fMVAVar_EleD0 );
82 fTMVAReader[i]->AddVariable( "FBrem", &fMVAVar_EleFBrem );
83 fTMVAReader[i]->AddVariable( "EOverP", &fMVAVar_EleEOverP );
84 fTMVAReader[i]->AddVariable( "ESeedClusterOverPout", &fMVAVar_EleESeedClusterOverPout );
85 fTMVAReader[i]->AddVariable( "SigmaIPhiIPhi", &fMVAVar_EleSigmaIPhiIPhi );
86 fTMVAReader[i]->AddVariable( "NBrem", &fMVAVar_EleNBrem );
87 fTMVAReader[i]->AddVariable( "OneOverEMinusOneOverP", &fMVAVar_EleOneOverEMinusOneOverP );
88 fTMVAReader[i]->AddVariable( "ESeedClusterOverPIn", &fMVAVar_EleESeedClusterOverPIn );
89 fTMVAReader[i]->AddVariable( "IP3d", &fMVAVar_EleIP3d );
90 fTMVAReader[i]->AddVariable( "IP3dSig", &fMVAVar_EleIP3dSig );
91 }
92 if (type == kIDIsoCombined) {
93 fTMVAReader[i]->AddVariable( "SigmaIEtaIEta", &fMVAVar_EleSigmaIEtaIEta );
94 fTMVAReader[i]->AddVariable( "DEtaIn", &fMVAVar_EleDEtaIn );
95 fTMVAReader[i]->AddVariable( "DPhiIn", &fMVAVar_EleDPhiIn );
96 fTMVAReader[i]->AddVariable( "D0", &fMVAVar_EleD0 );
97 fTMVAReader[i]->AddVariable( "FBrem", &fMVAVar_EleFBrem );
98 fTMVAReader[i]->AddVariable( "EOverP", &fMVAVar_EleEOverP );
99 fTMVAReader[i]->AddVariable( "ESeedClusterOverPout", &fMVAVar_EleESeedClusterOverPout );
100 fTMVAReader[i]->AddVariable( "SigmaIPhiIPhi", &fMVAVar_EleSigmaIPhiIPhi );
101 fTMVAReader[i]->AddVariable( "OneOverEMinusOneOverP", &fMVAVar_EleOneOverEMinusOneOverP );
102 fTMVAReader[i]->AddVariable( "ESeedClusterOverPIn", &fMVAVar_EleESeedClusterOverPIn );
103 fTMVAReader[i]->AddVariable( "IP3d", &fMVAVar_EleIP3d );
104 fTMVAReader[i]->AddVariable( "IP3dSig", &fMVAVar_EleIP3dSig );
105
106 fTMVAReader[i]->AddVariable( "GsfTrackChi2OverNdof", &fMVAVar_EleGsfTrackChi2OverNdof );
107 fTMVAReader[i]->AddVariable( "dEtaCalo", &fMVAVar_EledEtaCalo );
108 fTMVAReader[i]->AddVariable( "dPhiCalo", &fMVAVar_EledPhiCalo );
109 fTMVAReader[i]->AddVariable( "R9", &fMVAVar_EleR9 );
110 fTMVAReader[i]->AddVariable( "SCEtaWidth", &fMVAVar_EleSCEtaWidth );
111 fTMVAReader[i]->AddVariable( "SCPhiWidth", &fMVAVar_EleSCPhiWidth );
112 fTMVAReader[i]->AddVariable( "CovIEtaIPhi", &fMVAVar_EleCovIEtaIPhi );
113 if (i == 2 || i == 5) {
114 fTMVAReader[i]->AddVariable( "PreShowerOverRaw", &fMVAVar_ElePreShowerOverRaw );
115 }
116 fTMVAReader[i]->AddVariable( "ChargedIso03", &fMVAVar_EleChargedIso03OverPt );
117 fTMVAReader[i]->AddVariable( "NeutralHadronIso03", &fMVAVar_EleNeutralHadronIso03OverPt );
118 fTMVAReader[i]->AddVariable( "GammaIso03", &fMVAVar_EleGammaIso03OverPt );
119 fTMVAReader[i]->AddVariable( "ChargedIso04", &fMVAVar_EleChargedIso04OverPt );
120 fTMVAReader[i]->AddVariable( "NeutralHadronIso04", &fMVAVar_EleNeutralHadronIso04OverPt );
121 fTMVAReader[i]->AddVariable( "GammaIso04", &fMVAVar_EleGammaIso04OverPt );
122
123 }
124
125 if (i==0) fTMVAReader[i]->BookMVA(fMethodname , Subdet0Pt10To20Weights );
126 if (i==1) fTMVAReader[i]->BookMVA(fMethodname , Subdet1Pt10To20Weights );
127 if (i==2) fTMVAReader[i]->BookMVA(fMethodname , Subdet2Pt10To20Weights );
128 if (i==3) fTMVAReader[i]->BookMVA(fMethodname , Subdet0Pt20ToInfWeights );
129 if (i==4) fTMVAReader[i]->BookMVA(fMethodname , Subdet1Pt20ToInfWeights );
130 if (i==5) fTMVAReader[i]->BookMVA(fMethodname , Subdet2Pt20ToInfWeights );
131
132 }
133
134 std::cout << "Electron ID MVA Initialization\n";
135 std::cout << "MethodName : " << fMethodname << " , type == " << type << std::endl;
136 std::cout << "Load weights file : " << Subdet0Pt10To20Weights << std::endl;
137 std::cout << "Load weights file : " << Subdet1Pt10To20Weights << std::endl;
138 std::cout << "Load weights file : " << Subdet2Pt10To20Weights << std::endl;
139 std::cout << "Load weights file : " << Subdet0Pt20ToInfWeights << std::endl;
140 std::cout << "Load weights file : " << Subdet1Pt20ToInfWeights << std::endl;
141 std::cout << "Load weights file : " << Subdet2Pt20ToInfWeights << std::endl;
142
143 }
144
145 //--------------------------------------------------------------------------------------------------
146 Double_t ElectronIDMVA::MVAValue(Double_t ElePt , Double_t EleEta,
147 Double_t EleSigmaIEtaIEta,
148 Double_t EleDEtaIn,
149 Double_t EleDPhiIn,
150 Double_t EleHoverE,
151 Double_t EleD0,
152 Double_t EleDZ,
153 Double_t EleFBrem,
154 Double_t EleEOverP,
155 Double_t EleESeedClusterOverPout,
156 Double_t EleSigmaIPhiIPhi,
157 Double_t EleNBrem,
158 Double_t EleOneOverEMinusOneOverP,
159 Double_t EleESeedClusterOverPIn,
160 Double_t EleIP3d,
161 Double_t EleIP3dSig
162 ) {
163
164 if (!fIsInitialized) {
165 std::cout << "Error: ElectronIDMVA not properly initialized.\n";
166 return -9999;
167 }
168
169 Int_t subdet = 0;
170 if (fabs(EleEta) < 1.0) subdet = 0;
171 else if (fabs(EleEta) < 1.479) subdet = 1;
172 else subdet = 2;
173 Int_t ptBin = 0;
174 if (ElePt > 20.0) ptBin = 1;
175
176 //set all input variables
177 fMVAVar_EleSigmaIEtaIEta = EleSigmaIEtaIEta;
178 fMVAVar_EleDEtaIn = EleDEtaIn;
179 fMVAVar_EleDPhiIn = EleDPhiIn;
180 fMVAVar_EleHoverE = EleHoverE;
181 fMVAVar_EleD0 = EleD0;
182 fMVAVar_EleDZ = EleDZ;
183 fMVAVar_EleFBrem = EleFBrem;
184 fMVAVar_EleEOverP = EleEOverP;
185 fMVAVar_EleESeedClusterOverPout = EleESeedClusterOverPout;
186 fMVAVar_EleSigmaIPhiIPhi = EleSigmaIPhiIPhi;
187 fMVAVar_EleNBrem = EleNBrem;
188 fMVAVar_EleOneOverEMinusOneOverP = EleOneOverEMinusOneOverP;
189 fMVAVar_EleESeedClusterOverPIn = EleESeedClusterOverPIn;
190 fMVAVar_EleIP3d = EleIP3d;
191 fMVAVar_EleIP3dSig = EleIP3dSig;
192
193 Double_t mva = -9999;
194 TMVA::Reader *reader = 0;
195 Int_t MVABin = -1;
196 if (subdet == 0 && ptBin == 0) MVABin = 0;
197 if (subdet == 1 && ptBin == 0) MVABin = 1;
198 if (subdet == 2 && ptBin == 0) MVABin = 2;
199 if (subdet == 0 && ptBin == 1) MVABin = 3;
200 if (subdet == 1 && ptBin == 1) MVABin = 4;
201 if (subdet == 2 && ptBin == 1) MVABin = 5;
202 assert(MVABin >= 0 && MVABin <= 5);
203 reader = fTMVAReader[MVABin];
204
205 mva = reader->EvaluateMVA( fMethodname );
206
207 return mva;
208 }
209
210 //--------------------------------------------------------------------------------------------------
211 Double_t ElectronIDMVA::MVAValue(Double_t ElePt , Double_t EleEta, Double_t PileupEnergyDensity,
212 Double_t EleSigmaIEtaIEta,
213 Double_t EleDEtaIn,
214 Double_t EleDPhiIn,
215 Double_t EleHoverE,
216 Double_t EleD0,
217 Double_t EleDZ,
218 Double_t EleFBrem,
219 Double_t EleEOverP,
220 Double_t EleESeedClusterOverPout,
221 Double_t EleSigmaIPhiIPhi,
222 Double_t EleNBrem,
223 Double_t EleOneOverEMinusOneOverP,
224 Double_t EleESeedClusterOverPIn,
225 Double_t EleIP3d,
226 Double_t EleIP3dSig,
227 Double_t EleGsfTrackChi2OverNdof,
228 Double_t EledEtaCalo,
229 Double_t EledPhiCalo,
230 Double_t EleR9,
231 Double_t EleSCEtaWidth,
232 Double_t EleSCPhiWidth,
233 Double_t EleCovIEtaIPhi,
234 Double_t ElePreShowerOverRaw,
235 Double_t EleChargedIso03,
236 Double_t EleNeutralHadronIso03,
237 Double_t EleGammaIso03,
238 Double_t EleChargedIso04,
239 Double_t EleNeutralHadronIso04,
240 Double_t EleGammaIso04,
241 Bool_t printDebug
242 ) {
243
244 if (!fIsInitialized) {
245 std::cout << "Error: ElectronIDMVA not properly initialized.\n";
246 return -9999;
247 }
248
249 Double_t Rho = 0;
250 if (!(TMath::IsNaN(PileupEnergyDensity) || isinf(PileupEnergyDensity))) Rho = PileupEnergyDensity;
251
252 Int_t subdet = 0;
253 if (fabs(EleEta) < 1.0) subdet = 0;
254 else if (fabs(EleEta) < 1.479) subdet = 1;
255 else subdet = 2;
256 Int_t ptBin = 0;
257 if (ElePt > 20.0) ptBin = 1;
258
259 //set all input variables
260 fMVAVar_EleSigmaIEtaIEta = EleSigmaIEtaIEta;
261 fMVAVar_EleDEtaIn = EleDEtaIn;
262 fMVAVar_EleDPhiIn = EleDPhiIn;
263 fMVAVar_EleHoverE = EleHoverE;
264 fMVAVar_EleD0 = EleD0;
265 fMVAVar_EleDZ = EleDZ;
266 fMVAVar_EleFBrem = EleFBrem;
267 fMVAVar_EleEOverP = EleEOverP;
268 fMVAVar_EleESeedClusterOverPout = EleESeedClusterOverPout;
269 fMVAVar_EleSigmaIPhiIPhi = EleSigmaIPhiIPhi;
270 fMVAVar_EleNBrem = EleNBrem;
271 fMVAVar_EleOneOverEMinusOneOverP = EleOneOverEMinusOneOverP;
272 fMVAVar_EleESeedClusterOverPIn = EleESeedClusterOverPIn;
273 fMVAVar_EleIP3d = EleIP3d;
274 fMVAVar_EleIP3dSig = EleIP3dSig;
275 fMVAVar_EleGsfTrackChi2OverNdof = EleGsfTrackChi2OverNdof;
276 fMVAVar_EledEtaCalo = EledEtaCalo;
277 fMVAVar_EledPhiCalo = EledPhiCalo;
278 fMVAVar_EleR9 = EleR9;
279 fMVAVar_EleSCEtaWidth = EleSCEtaWidth;
280 fMVAVar_EleSCPhiWidth = EleSCPhiWidth;
281 fMVAVar_EleCovIEtaIPhi = EleCovIEtaIPhi;
282 fMVAVar_ElePreShowerOverRaw = ElePreShowerOverRaw;
283 fMVAVar_EleChargedIso03OverPt
284 = (EleChargedIso03
285 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleChargedIso03, EleEta)) / ElePt;
286 fMVAVar_EleNeutralHadronIso03OverPt
287 = (EleNeutralHadronIso03
288 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso03, EleEta)
289 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso007,EleEta)) / ElePt;
290 fMVAVar_EleGammaIso03OverPt
291 = (EleGammaIso03
292 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIso03, EleEta)
293 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIsoVetoEtaStrip03,EleEta))/ElePt;
294 fMVAVar_EleChargedIso04OverPt
295 = (EleChargedIso04
296 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleChargedIso04, EleEta))/ElePt;
297 fMVAVar_EleNeutralHadronIso04OverPt
298 = (EleNeutralHadronIso04
299 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso04, EleEta)
300 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso007,EleEta))/ElePt;
301 fMVAVar_EleGammaIso04OverPt
302 = (EleGammaIso04
303 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIso04, EleEta)
304 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIsoVetoEtaStrip04,EleEta))/ElePt;
305
306 Double_t mva = -9999;
307 TMVA::Reader *reader = 0;
308 Int_t MVABin = -1;
309 if (subdet == 0 && ptBin == 0) MVABin = 0;
310 if (subdet == 1 && ptBin == 0) MVABin = 1;
311 if (subdet == 2 && ptBin == 0) MVABin = 2;
312 if (subdet == 0 && ptBin == 1) MVABin = 3;
313 if (subdet == 1 && ptBin == 1) MVABin = 4;
314 if (subdet == 2 && ptBin == 1) MVABin = 5;
315 assert(MVABin >= 0 && MVABin <= 5);
316 reader = fTMVAReader[MVABin];
317
318 mva = reader->EvaluateMVA( fMethodname );
319
320 if (printDebug == kTRUE) {
321 std::cout << "Debug Electron MVA: "
322 << ElePt << " " << EleEta << " " << " --> MVABin " << MVABin << " : "
323 << fMVAVar_EleSigmaIEtaIEta << " "
324 << fMVAVar_EleDEtaIn << " "
325 << fMVAVar_EleDPhiIn << " "
326 << fMVAVar_EleHoverE << " "
327 << fMVAVar_EleD0 << " "
328 << fMVAVar_EleDZ << " "
329 << fMVAVar_EleFBrem << " "
330 << fMVAVar_EleEOverP << " "
331 << fMVAVar_EleESeedClusterOverPout << " "
332 << fMVAVar_EleSigmaIPhiIPhi << " "
333 << fMVAVar_EleNBrem << " "
334 << fMVAVar_EleOneOverEMinusOneOverP << " "
335 << fMVAVar_EleESeedClusterOverPIn << " "
336 << fMVAVar_EleIP3d << " "
337 << fMVAVar_EleIP3dSig << " "
338 << fMVAVar_EleGsfTrackChi2OverNdof << " "
339 << fMVAVar_EledEtaCalo << " "
340 << fMVAVar_EledPhiCalo << " "
341 << fMVAVar_EleR9 << " "
342 << fMVAVar_EleSCEtaWidth << " "
343 << fMVAVar_EleSCPhiWidth << " "
344 << fMVAVar_EleCovIEtaIPhi << " "
345 << fMVAVar_ElePreShowerOverRaw << " "
346 << fMVAVar_EleChargedIso03OverPt << " "
347 << fMVAVar_EleNeutralHadronIso03OverPt << " "
348 << fMVAVar_EleGammaIso03OverPt << " "
349 << fMVAVar_EleChargedIso04OverPt << " "
350 << fMVAVar_EleNeutralHadronIso04OverPt << " "
351 << fMVAVar_EleGammaIso04OverPt << " "
352 << " === : === "
353 << mva
354 << std::endl;
355 }
356
357 return mva;
358 }
359
360
361 //--------------------------------------------------------------------------------------------------
362 Double_t ElectronIDMVA::MVAValue(const Electron *ele, const Vertex *vertex,
363 const PFCandidateCol *PFCands,
364 const PileupEnergyDensityCol *PileupEnergyDensity,
365 Double_t intRadius,
366 Bool_t printDebug) {
367
368 if (!fIsInitialized) {
369 std::cout << "Error: ElectronIDMVA not properly initialized.\n";
370 return -9999;
371 }
372
373 Int_t subdet = 0;
374 if (ele->SCluster()->AbsEta() < 1.0) subdet = 0;
375 else if (ele->SCluster()->AbsEta() < 1.479) subdet = 1;
376 else subdet = 2;
377 Int_t ptBin = 0;
378 if (ele->Pt() > 20.0) ptBin = 1;
379
380 Double_t Rho = 0;
381 if (!(TMath::IsNaN(PileupEnergyDensity->At(0)->Rho()) || isinf(PileupEnergyDensity->At(0)->Rho()))) Rho = PileupEnergyDensity->At(0)->Rho();
382
383 //set all input variables
384 fMVAVar_EleSigmaIEtaIEta = ele->CoviEtaiEta() ;
385 fMVAVar_EleDEtaIn = ele->DeltaEtaSuperClusterTrackAtVtx();
386 fMVAVar_EleDPhiIn = ele->DeltaPhiSuperClusterTrackAtVtx();
387 fMVAVar_EleHoverE = ele->HadronicOverEm();
388 fMVAVar_EleD0 = ele->BestTrk()->D0Corrected(*vertex);
389 fMVAVar_EleDZ = ele->BestTrk()->DzCorrected(*vertex);
390 fMVAVar_EleFBrem = ele->FBrem();
391 fMVAVar_EleEOverP = ele->ESuperClusterOverP();
392 fMVAVar_EleESeedClusterOverPout = ele->ESeedClusterOverPout();
393 if (!TMath::IsNaN(ele->SCluster()->Seed()->CoviPhiiPhi())) fMVAVar_EleSigmaIPhiIPhi = TMath::Sqrt(ele->SCluster()->Seed()->CoviPhiiPhi());
394 else fMVAVar_EleSigmaIPhiIPhi = ele->CoviEtaiEta();
395 fMVAVar_EleNBrem = ele->NumberOfClusters() - 1;
396 fMVAVar_EleOneOverEMinusOneOverP = (1.0/(ele->SCluster()->Energy())) - 1.0 / ele->BestTrk()->P();
397 fMVAVar_EleESeedClusterOverPIn = ele->ESeedClusterOverPIn();
398 fMVAVar_EleIP3d = ele->Ip3dPV();
399 fMVAVar_EleIP3dSig = ele->Ip3dPVSignificance();
400 fMVAVar_EleGsfTrackChi2OverNdof = ele->BestTrk()->Chi2() / ele->BestTrk()->Ndof();
401 fMVAVar_EledEtaCalo = ele->DeltaEtaSeedClusterTrackAtCalo();
402 fMVAVar_EledPhiCalo = ele->DeltaPhiSeedClusterTrackAtCalo();
403 fMVAVar_EleR9 = ele->SCluster()->R9();
404 fMVAVar_EleSCEtaWidth = ele->SCluster()->EtaWidth();
405 fMVAVar_EleSCPhiWidth = ele->SCluster()->PhiWidth();
406 fMVAVar_EleCovIEtaIPhi = ele->SCluster()->Seed()->CoviEtaiPhi();
407 fMVAVar_ElePreShowerOverRaw = ele->SCluster()->PreshowerEnergy() / ele->SCluster()->RawEnergy();
408 fMVAVar_EleChargedIso03OverPt
409 = (IsolationTools::PFElectronIsolation(ele, PFCands, vertex, 0.1, 99999, 0.3, intRadius)
410 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleChargedIso03, ele->SCluster()->Eta())) / ele->Pt();
411 fMVAVar_EleNeutralHadronIso03OverPt
412 = (IsolationTools::PFElectronIsolation(ele, PFCands, vertex, 0.1, 0.5, 0.3, intRadius, PFCandidate::eNeutralHadron)
413 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso03, ele->SCluster()->Eta())
414 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso007,ele->SCluster()->Eta())) / ele->Pt();
415 fMVAVar_EleGammaIso03OverPt
416 = (IsolationTools::PFElectronIsolation(ele, PFCands, vertex, 0.1, 0.5, 0.3, intRadius, PFCandidate::eGamma)
417 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIso03, ele->SCluster()->Eta())
418 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIsoVetoEtaStrip03,ele->SCluster()->Eta())) / ele->Pt();
419 fMVAVar_EleChargedIso04OverPt
420 = (IsolationTools::PFElectronIsolation(ele, PFCands, vertex, 0.1, 99999, 0.4, intRadius)
421 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleChargedIso04, ele->SCluster()->Eta())) / ele->Pt();
422 fMVAVar_EleNeutralHadronIso04OverPt
423 = (IsolationTools::PFElectronIsolation(ele, PFCands, vertex, 0.1, 0.5, 0.4, intRadius, PFCandidate::eNeutralHadron)
424 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso04, ele->SCluster()->Eta())
425 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleNeutralHadronIso007,ele->SCluster()->Eta())) / ele->Pt() ;
426 fMVAVar_EleGammaIso04OverPt
427 = (IsolationTools::PFElectronIsolation(ele, PFCands, vertex, 0.1, 0.5, 0.4, intRadius, PFCandidate::eGamma)
428 - Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIso04, ele->SCluster()->Eta())
429 + Rho * ElectronTools::ElectronEffectiveArea(ElectronTools::kEleGammaIsoVetoEtaStrip04,ele->SCluster()->Eta())) / ele->Pt();
430
431 Double_t mva = -9999;
432 TMVA::Reader *reader = 0;
433 Int_t MVABin = -1;
434 if (subdet == 0 && ptBin == 0) MVABin = 0;
435 if (subdet == 1 && ptBin == 0) MVABin = 1;
436 if (subdet == 2 && ptBin == 0) MVABin = 2;
437 if (subdet == 0 && ptBin == 1) MVABin = 3;
438 if (subdet == 1 && ptBin == 1) MVABin = 4;
439 if (subdet == 2 && ptBin == 1) MVABin = 5;
440 assert(MVABin >= 0 && MVABin <= 5);
441 reader = fTMVAReader[MVABin];
442
443 mva = reader->EvaluateMVA( fMethodname );
444
445 if (printDebug == kTRUE) {
446 std::cout << "Debug Electron MVA: "
447 << ele->Pt() << " " << ele->Eta() << " " << ele->Phi() << " : "
448 << ele->Pt() << " " << ele->SCluster()->AbsEta() << " --> MVABin " << MVABin << " : "
449 << fMVAVar_EleSigmaIEtaIEta << " "
450 << fMVAVar_EleDEtaIn << " "
451 << fMVAVar_EleDPhiIn << " "
452 << fMVAVar_EleHoverE << " "
453 << fMVAVar_EleD0 << " "
454 << fMVAVar_EleDZ << " "
455 << fMVAVar_EleFBrem << " "
456 << fMVAVar_EleEOverP << " "
457 << fMVAVar_EleESeedClusterOverPout << " "
458 << fMVAVar_EleSigmaIPhiIPhi << " "
459 << fMVAVar_EleNBrem << " "
460 << fMVAVar_EleOneOverEMinusOneOverP << " "
461 << fMVAVar_EleESeedClusterOverPIn << " "
462 << fMVAVar_EleIP3d << " "
463 << fMVAVar_EleIP3dSig << " "
464 << fMVAVar_EleGsfTrackChi2OverNdof << " "
465 << fMVAVar_EledEtaCalo << " "
466 << fMVAVar_EledPhiCalo << " "
467 << fMVAVar_EleR9 << " "
468 << fMVAVar_EleSCEtaWidth << " "
469 << fMVAVar_EleSCPhiWidth << " "
470 << fMVAVar_EleCovIEtaIPhi << " "
471 << fMVAVar_ElePreShowerOverRaw << " "
472 << fMVAVar_EleChargedIso03OverPt << " "
473 << fMVAVar_EleNeutralHadronIso03OverPt << " "
474 << fMVAVar_EleGammaIso03OverPt << " "
475 << fMVAVar_EleChargedIso04OverPt << " "
476 << fMVAVar_EleNeutralHadronIso04OverPt << " "
477 << fMVAVar_EleGammaIso04OverPt << " "
478 << " === : === "
479 << mva << " "
480 << std::endl;
481
482 }
483
484 return mva;
485 }
486
487 //--------------------------------------------------------------------------------------------------
488 Double_t ElectronIDMVA::MVAValue(const Electron *ele, const Vertex *vertex) {
489
490 if (!fIsInitialized) {
491 std::cout << "Error: ElectronIDMVA not properly initialized.\n";
492 return -9999;
493 }
494
495 Int_t subdet = 0;
496 if (ele->SCluster()->AbsEta() < 1.0) subdet = 0;
497 else if (ele->SCluster()->AbsEta() < 1.479) subdet = 1;
498 else subdet = 2;
499 Int_t ptBin = 0;
500 if (ele->Pt() > 20.0) ptBin = 1;
501
502 //set all input variables
503 fMVAVar_EleSigmaIEtaIEta = ele->CoviEtaiEta() ;
504 fMVAVar_EleDEtaIn = ele->DeltaEtaSuperClusterTrackAtVtx();
505 fMVAVar_EleDPhiIn = ele->DeltaPhiSuperClusterTrackAtVtx();
506 fMVAVar_EleHoverE = ele->HadronicOverEm();
507 fMVAVar_EleD0 = ele->BestTrk()->D0Corrected(*vertex);
508 fMVAVar_EleDZ = ele->BestTrk()->DzCorrected(*vertex);
509 fMVAVar_EleFBrem = ele->FBrem();
510 fMVAVar_EleEOverP = ele->ESuperClusterOverP();
511 fMVAVar_EleESeedClusterOverPout = ele->ESeedClusterOverPout();
512 if (!TMath::IsNaN(ele->SCluster()->Seed()->CoviPhiiPhi())) fMVAVar_EleSigmaIPhiIPhi = TMath::Sqrt(ele->SCluster()->Seed()->CoviPhiiPhi());
513 else fMVAVar_EleSigmaIPhiIPhi = ele->CoviEtaiEta();
514 fMVAVar_EleNBrem = ele->NumberOfClusters() - 1;
515 fMVAVar_EleOneOverEMinusOneOverP = (1.0/(ele->SCluster()->Energy())) - 1.0 / ele->BestTrk()->P();
516 fMVAVar_EleESeedClusterOverPIn = ele->ESeedClusterOverPIn();
517 fMVAVar_EleIP3d = ele->Ip3dPV();
518 fMVAVar_EleIP3dSig = ele->Ip3dPVSignificance();
519
520 Double_t mva = -9999;
521 TMVA::Reader *reader = 0;
522 Int_t MVABin = -1;
523 if (subdet == 0 && ptBin == 0) MVABin = 0;
524 if (subdet == 1 && ptBin == 0) MVABin = 1;
525 if (subdet == 2 && ptBin == 0) MVABin = 2;
526 if (subdet == 0 && ptBin == 1) MVABin = 3;
527 if (subdet == 1 && ptBin == 1) MVABin = 4;
528 if (subdet == 2 && ptBin == 1) MVABin = 5;
529 assert(MVABin >= 0 && MVABin <= 5);
530 reader = fTMVAReader[MVABin];
531
532 mva = reader->EvaluateMVA( fMethodname );
533
534 return mva;
535 }