ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/AntiElectronIDMVA3.cc
Revision: 1.1
Committed: Fri Dec 7 14:12:47 2012 UTC (12 years, 5 months ago) by mhchan
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_029c, Mit_029b, Mit_029a, HEAD
Log Message:
Added BAMBU port of AntiElectronIDMVA3 (tau anti-electron discriminator)
http://cmssw.cvs.cern.ch/cgi-bin/cmssw.cgi/CMSSW/RecoTauTag/RecoTau/src/AntiElectronIDMVA3.cc?view=log

File Contents

# User Rev Content
1 mhchan 1.1 #include <TFile.h>
2     #include <TMath.h>
3     #include "MitPhysics/Utils/interface/AntiElectronIDMVA3.h"
4    
5     using namespace mithep;
6    
7     AntiElectronIDMVA3::AntiElectronIDMVA3()
8     : isInitialized_(kFALSE),
9     methodName_("BDTG")
10     {
11     for ( unsigned i = 0; i < 16; ++i ) {
12     fTMVAReader_[i] = 0;
13     }
14    
15     verbosity_ = 1;
16    
17     // Initalize cut values
18     cuts_.resize(4); // Rejection levels
19    
20     // Loose
21     cuts_[0].push_back(0.1816889);
22     cuts_[0].push_back(0.1538533);
23     cuts_[0].push_back(0.5605197);
24     cuts_[0].push_back(0.66321647);
25     cuts_[0].push_back(0.86337829);
26     cuts_[0].push_back(0.94084531);
27     cuts_[0].push_back(0.98025548);
28     cuts_[0].push_back(0.80039471);
29     cuts_[0].push_back(-1.0);
30     cuts_[0].push_back(0.49787951);
31     cuts_[0].push_back(0.74751109);
32     cuts_[0].push_back(0.94486511);
33     cuts_[0].push_back(0.63645148);
34     cuts_[0].push_back(0.9575507);
35     cuts_[0].push_back(0.9549247);
36     cuts_[0].push_back(0.83487612);
37     cuts_[0].push_back(-1.0);
38     cuts_[0].push_back(-1.0);
39    
40     // Medium
41     cuts_[1].push_back(0.5577119);
42     cuts_[1].push_back(0.7271899);
43     cuts_[1].push_back(0.90410149);
44     cuts_[1].push_back(0.94858187);
45     cuts_[1].push_back(0.95044029);
46     cuts_[1].push_back(0.97195327);
47     cuts_[1].push_back(0.99229473);
48     cuts_[1].push_back(0.92997772);
49     cuts_[1].push_back(-0.3049897);
50     cuts_[1].push_back(0.92191792);
51     cuts_[1].push_back(0.96017671);
52     cuts_[1].push_back(0.98126549);
53     cuts_[1].push_back(0.80912107);
54     cuts_[1].push_back(0.98326528);
55     cuts_[1].push_back(0.97490251);
56     cuts_[1].push_back(0.94708711);
57     cuts_[1].push_back(-1.0);
58     cuts_[1].push_back(-1.0);
59    
60     // Tight
61     cuts_[2].push_back(0.78914332);
62     cuts_[2].push_back(0.91818088);
63     cuts_[2].push_back(0.96754968);
64     cuts_[2].push_back(0.98437631);
65     cuts_[2].push_back(0.96684271);
66     cuts_[2].push_back(0.99065852);
67     cuts_[2].push_back(0.99797088);
68     cuts_[2].push_back(0.96952927);
69     cuts_[2].push_back(0.1180589);
70     cuts_[2].push_back(0.9714281);
71     cuts_[2].push_back(0.98451769);
72     cuts_[2].push_back(0.99372888);
73     cuts_[2].push_back(0.84681427);
74     cuts_[2].push_back(0.98940611);
75     cuts_[2].push_back(0.98308349);
76     cuts_[2].push_back(0.97482169);
77     cuts_[2].push_back(-1.0);
78     cuts_[2].push_back(-1.0);
79    
80     // Very Tight
81     cuts_[3].push_back(0.89307231);
82     cuts_[3].push_back(0.96239871);
83     cuts_[3].push_back(0.98247749);
84     cuts_[3].push_back(0.99013329);
85     cuts_[3].push_back(0.9768821);
86     cuts_[3].push_back(0.9958095);
87     cuts_[3].push_back(0.99797088);
88     cuts_[3].push_back(0.98120493);
89     cuts_[3].push_back(0.60025311);
90     cuts_[3].push_back(0.98320472);
91     cuts_[3].push_back(0.9897899);
92     cuts_[3].push_back(0.9964357);
93     cuts_[3].push_back(0.88230568);
94     cuts_[3].push_back(0.99132508);
95     cuts_[3].push_back(0.98467928);
96     cuts_[3].push_back(0.98235631);
97     cuts_[3].push_back(-1.0);
98     cuts_[3].push_back(-1.0);
99     }
100    
101     AntiElectronIDMVA3::~AntiElectronIDMVA3()
102     {
103     for ( unsigned i = 0; i < 16; ++i ) {
104     if ( fTMVAReader_[i] ) delete fTMVAReader_[i];
105     }
106     }
107    
108     enum { k_NoEleMatchwoGwoGSF_BL,
109     k_NoEleMatchwoGwGSF_BL,
110     k_NoEleMatchwGwoGSF_BL,
111     k_NoEleMatchwGwGSF_BL,
112     k_woGwoGSF_BL,
113     k_woGwGSF_BL,
114     k_wGwoGSF_BL,
115     k_wGwGSF_BL,
116     k_NoEleMatchwoGwoGSF_EC,
117     k_NoEleMatchwoGwGSF_EC,
118     k_NoEleMatchwGwoGSF_EC,
119     k_NoEleMatchwGwGSF_EC,
120     k_woGwoGSF_EC,
121     k_woGwGSF_EC,
122     k_wGwoGSF_EC,
123     k_wGwGSF_EC};
124    
125     void AntiElectronIDMVA3::Initialize_from_string(const std::string& methodName,
126     const std::string& oneProngNoEleMatch0Pi0woGSF_BL,
127     const std::string& oneProngNoEleMatch0Pi0wGSF_BL,
128     const std::string& oneProngNoEleMatch1Pi0woGSF_BL,
129     const std::string& oneProngNoEleMatch1Pi0wGSF_BL,
130     const std::string& oneProng0Pi0woGSF_BL,
131     const std::string& oneProng0Pi0wGSF_BL,
132     const std::string& oneProng1Pi0woGSF_BL,
133     const std::string& oneProng1Pi0wGSF_BL,
134     const std::string& oneProngNoEleMatch0Pi0woGSF_EC,
135     const std::string& oneProngNoEleMatch0Pi0wGSF_EC,
136     const std::string& oneProngNoEleMatch1Pi0woGSF_EC,
137     const std::string& oneProngNoEleMatch1Pi0wGSF_EC,
138     const std::string& oneProng0Pi0woGSF_EC,
139     const std::string& oneProng0Pi0wGSF_EC,
140     const std::string& oneProng1Pi0woGSF_EC,
141     const std::string& oneProng1Pi0wGSF_EC)
142     {
143     for ( unsigned i = 0; i < 16; ++i ) {
144     if ( fTMVAReader_[i] ) delete fTMVAReader_[i];
145     }
146    
147     isInitialized_ = kTRUE;
148     methodName_ = methodName;
149    
150     bookMVAs();
151    
152     fTMVAReader_[k_NoEleMatchwoGwoGSF_BL]->BookMVA("BDTG", oneProngNoEleMatch0Pi0woGSF_BL.data());
153     fTMVAReader_[k_NoEleMatchwoGwGSF_BL]->BookMVA("BDTG", oneProngNoEleMatch0Pi0wGSF_BL.data());
154     fTMVAReader_[k_NoEleMatchwGwoGSF_BL]->BookMVA("BDTG", oneProngNoEleMatch1Pi0woGSF_BL.data());
155     fTMVAReader_[k_NoEleMatchwGwGSF_BL]->BookMVA("BDTG", oneProngNoEleMatch1Pi0wGSF_BL.data());
156     fTMVAReader_[k_woGwoGSF_BL]->BookMVA("BDTG", oneProng0Pi0woGSF_BL.data());
157     fTMVAReader_[k_woGwGSF_BL]->BookMVA("BDTG", oneProng0Pi0wGSF_BL.data());
158     fTMVAReader_[k_wGwoGSF_BL]->BookMVA("BDTG", oneProng1Pi0woGSF_BL.data());
159     fTMVAReader_[k_wGwGSF_BL]->BookMVA("BDTG", oneProng1Pi0wGSF_BL.data());
160     fTMVAReader_[k_NoEleMatchwoGwoGSF_EC]->BookMVA("BDTG", oneProngNoEleMatch0Pi0woGSF_EC.data());
161     fTMVAReader_[k_NoEleMatchwoGwGSF_EC]->BookMVA("BDTG", oneProngNoEleMatch0Pi0wGSF_EC.data());
162     fTMVAReader_[k_NoEleMatchwGwoGSF_EC]->BookMVA("BDTG", oneProngNoEleMatch1Pi0woGSF_EC.data());
163     fTMVAReader_[k_NoEleMatchwGwGSF_EC]->BookMVA("BDTG", oneProngNoEleMatch1Pi0wGSF_EC.data());
164     fTMVAReader_[k_woGwoGSF_EC]->BookMVA("BDTG", oneProng0Pi0woGSF_EC.data());
165     fTMVAReader_[k_woGwGSF_EC]->BookMVA("BDTG", oneProng0Pi0wGSF_EC.data());
166     fTMVAReader_[k_wGwoGSF_EC]->BookMVA("BDTG", oneProng1Pi0woGSF_EC.data());
167     fTMVAReader_[k_wGwGSF_EC]->BookMVA("BDTG", oneProng1Pi0wGSF_EC.data());
168    
169     }
170    
171     void AntiElectronIDMVA3::bookMVAs()
172     {
173     //TMVA::Tools::Instance();
174    
175     TMVA::Reader *readerNoEleMatchwoGwoGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
176     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
177     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
178     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
179     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
180     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
181     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
182     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
183     readerNoEleMatchwoGwoGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
184     readerNoEleMatchwoGwoGSF_BL->SetVerbose(verbosity_);
185    
186     TMVA::Reader *readerNoEleMatchwoGwGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
187     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
188     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
189     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
190     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
191     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
192     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
193     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
194     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
195     readerNoEleMatchwoGwGSF_BL->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
196     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
197     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
198     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
199     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
200     readerNoEleMatchwoGwGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
201     readerNoEleMatchwoGwGSF_BL->SetVerbose(verbosity_);
202    
203     TMVA::Reader *readerNoEleMatchwGwoGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
204     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
205     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
206     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
207     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
208     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
209     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
210     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
211     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
212     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
213     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
214     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
215     readerNoEleMatchwGwoGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
216     readerNoEleMatchwGwoGSF_BL->SetVerbose(verbosity_);
217    
218     TMVA::Reader *readerNoEleMatchwGwGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
219     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
220     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
221     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
222     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
223     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
224     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
225     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
226     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
227     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
228     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
229     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
230     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
231     readerNoEleMatchwGwGSF_BL->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
232     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
233     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
234     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
235     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
236     readerNoEleMatchwGwGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
237     readerNoEleMatchwGwGSF_BL->SetVerbose(verbosity_);
238    
239     TMVA::Reader *readerwoGwoGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
240     readerwoGwoGSF_BL->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
241     readerwoGwoGSF_BL->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
242     readerwoGwoGSF_BL->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
243     readerwoGwoGSF_BL->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
244     readerwoGwoGSF_BL->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
245     readerwoGwoGSF_BL->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
246     readerwoGwoGSF_BL->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
247     readerwoGwoGSF_BL->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
248     readerwoGwoGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
249     readerwoGwoGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
250     readerwoGwoGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
251     readerwoGwoGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
252     readerwoGwoGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
253     readerwoGwoGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
254     readerwoGwoGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
255     readerwoGwoGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
256     readerwoGwoGSF_BL->SetVerbose(verbosity_);
257    
258     TMVA::Reader *readerwoGwGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
259     readerwoGwGSF_BL->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
260     readerwoGwGSF_BL->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
261     readerwoGwGSF_BL->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
262     readerwoGwGSF_BL->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
263     readerwoGwGSF_BL->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
264     readerwoGwGSF_BL->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
265     readerwoGwGSF_BL->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
266     readerwoGwGSF_BL->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
267     readerwoGwGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
268     readerwoGwGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
269     readerwoGwGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
270     readerwoGwGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
271     readerwoGwGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
272     readerwoGwGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
273     readerwoGwGSF_BL->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
274     readerwoGwGSF_BL->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
275     readerwoGwGSF_BL->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
276     readerwoGwGSF_BL->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
277     readerwoGwGSF_BL->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
278     readerwoGwGSF_BL->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
279     readerwoGwGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
280     readerwoGwGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
281     readerwoGwGSF_BL->SetVerbose(verbosity_);
282    
283     TMVA::Reader *readerwGwoGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
284     readerwGwoGSF_BL->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
285     readerwGwoGSF_BL->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
286     readerwGwoGSF_BL->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
287     readerwGwoGSF_BL->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
288     readerwGwoGSF_BL->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
289     readerwGwoGSF_BL->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
290     readerwGwoGSF_BL->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
291     readerwGwoGSF_BL->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
292     readerwGwoGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
293     readerwGwoGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
294     readerwGwoGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
295     readerwGwoGSF_BL->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
296     readerwGwoGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
297     readerwGwoGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
298     readerwGwoGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
299     readerwGwoGSF_BL->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
300     readerwGwoGSF_BL->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
301     readerwGwoGSF_BL->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
302     readerwGwoGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
303     readerwGwoGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
304     readerwGwoGSF_BL->SetVerbose(verbosity_);
305    
306     TMVA::Reader *readerwGwGSF_BL = new TMVA::Reader( "!Color:Silent:Error" );
307     readerwGwGSF_BL->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
308     readerwGwGSF_BL->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
309     readerwGwGSF_BL->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
310     readerwGwGSF_BL->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
311     readerwGwGSF_BL->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
312     readerwGwGSF_BL->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
313     readerwGwGSF_BL->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
314     readerwGwGSF_BL->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
315     readerwGwGSF_BL->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
316     readerwGwGSF_BL->AddVariable("Tau_Pt",&Tau_Pt_);
317     readerwGwGSF_BL->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
318     readerwGwGSF_BL->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
319     readerwGwGSF_BL->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
320     readerwGwGSF_BL->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
321     readerwGwGSF_BL->AddVariable("Tau_VisMass",&Tau_VisMass_);
322     readerwGwGSF_BL->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
323     readerwGwGSF_BL->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
324     readerwGwGSF_BL->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
325     readerwGwGSF_BL->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
326     readerwGwGSF_BL->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
327     readerwGwGSF_BL->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
328     readerwGwGSF_BL->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
329     readerwGwGSF_BL->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
330     readerwGwGSF_BL->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
331     readerwGwGSF_BL->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
332     readerwGwGSF_BL->AddVariable("Tau_dCrackPhi",&Tau_dCrackPhi_);
333     readerwGwGSF_BL->SetVerbose(verbosity_);
334    
335     ////////////////////////
336    
337     TMVA::Reader *readerNoEleMatchwoGwoGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
338     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
339     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
340     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
341     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
342     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
343     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
344     readerNoEleMatchwoGwoGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
345     readerNoEleMatchwoGwoGSF_EC->SetVerbose(verbosity_);
346    
347     TMVA::Reader *readerNoEleMatchwoGwGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
348     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
349     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
350     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
351     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
352     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
353     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
354     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
355     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
356     readerNoEleMatchwoGwGSF_EC->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
357     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
358     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
359     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
360     readerNoEleMatchwoGwGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
361     readerNoEleMatchwoGwGSF_EC->SetVerbose(verbosity_);
362    
363     TMVA::Reader *readerNoEleMatchwGwoGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
364     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
365     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
366     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
367     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
368     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
369     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
370     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
371     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
372     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
373     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
374     readerNoEleMatchwGwoGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
375     readerNoEleMatchwGwoGSF_EC->SetVerbose(verbosity_);
376    
377     TMVA::Reader *readerNoEleMatchwGwGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
378     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
379     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
380     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
381     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
382     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
383     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
384     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
385     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
386     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
387     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
388     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
389     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
390     readerNoEleMatchwGwGSF_EC->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
391     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
392     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
393     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
394     readerNoEleMatchwGwGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
395     readerNoEleMatchwGwGSF_EC->SetVerbose(verbosity_);
396    
397     TMVA::Reader *readerwoGwoGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
398     readerwoGwoGSF_EC->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
399     readerwoGwoGSF_EC->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
400     readerwoGwoGSF_EC->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
401     readerwoGwoGSF_EC->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
402     readerwoGwoGSF_EC->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
403     readerwoGwoGSF_EC->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
404     readerwoGwoGSF_EC->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
405     readerwoGwoGSF_EC->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
406     readerwoGwoGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
407     readerwoGwoGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
408     readerwoGwoGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
409     readerwoGwoGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
410     readerwoGwoGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
411     readerwoGwoGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
412     readerwoGwoGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
413     readerwoGwoGSF_EC->SetVerbose(verbosity_);
414    
415     TMVA::Reader *readerwoGwGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
416     readerwoGwGSF_EC->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
417     readerwoGwGSF_EC->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
418     readerwoGwGSF_EC->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
419     readerwoGwGSF_EC->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
420     readerwoGwGSF_EC->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
421     readerwoGwGSF_EC->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
422     readerwoGwGSF_EC->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
423     readerwoGwGSF_EC->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
424     readerwoGwGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
425     readerwoGwGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
426     readerwoGwGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
427     readerwoGwGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
428     readerwoGwGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
429     readerwoGwGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
430     readerwoGwGSF_EC->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
431     readerwoGwGSF_EC->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
432     readerwoGwGSF_EC->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
433     readerwoGwGSF_EC->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
434     readerwoGwGSF_EC->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
435     readerwoGwGSF_EC->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
436     readerwoGwGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
437     readerwoGwGSF_EC->SetVerbose(verbosity_);
438    
439     TMVA::Reader *readerwGwoGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
440     readerwGwoGSF_EC->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
441     readerwGwoGSF_EC->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
442     readerwGwoGSF_EC->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
443     readerwGwoGSF_EC->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
444     readerwGwoGSF_EC->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
445     readerwGwoGSF_EC->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
446     readerwGwoGSF_EC->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
447     readerwGwoGSF_EC->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
448     readerwGwoGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
449     readerwGwoGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
450     readerwGwoGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
451     readerwGwoGSF_EC->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
452     readerwGwoGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
453     readerwGwoGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
454     readerwGwoGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
455     readerwGwoGSF_EC->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
456     readerwGwoGSF_EC->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
457     readerwGwoGSF_EC->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
458     readerwGwoGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
459     readerwGwoGSF_EC->SetVerbose(verbosity_);
460    
461     TMVA::Reader *readerwGwGSF_EC = new TMVA::Reader( "!Color:Silent:Error" );
462     readerwGwGSF_EC->AddVariable("Elec_EtotOverPin",&Elec_EtotOverPin_);
463     readerwGwGSF_EC->AddVariable("Elec_EgammaOverPdif",&Elec_EgammaOverPdif_);
464     readerwGwGSF_EC->AddVariable("Elec_Fbrem",&Elec_Fbrem_);
465     readerwGwGSF_EC->AddVariable("Elec_Chi2GSF",&Elec_Chi2GSF_);
466     readerwGwGSF_EC->AddVariable("Elec_GSFNumHits",&Elec_GSFNumHits_);
467     readerwGwGSF_EC->AddVariable("Elec_GSFTrackResol",&Elec_GSFTrackResol_);
468     readerwGwGSF_EC->AddVariable("Elec_GSFTracklnPt",&Elec_GSFTracklnPt_);
469     readerwGwGSF_EC->AddVariable("Elec_GSFTrackEta",&Elec_GSFTrackEta_);
470     readerwGwGSF_EC->AddVariable("Tau_EtaAtEcalEntrance",&Tau_EtaAtEcalEntrance_);
471     readerwGwGSF_EC->AddVariable("Tau_Pt",&Tau_Pt_);
472     readerwGwGSF_EC->AddVariable("Tau_EmFraction",&Tau_EmFraction_);
473     readerwGwGSF_EC->AddVariable("Tau_NumGammaCands",&Tau_NumGammaCands_);
474     readerwGwGSF_EC->AddVariable("Tau_HadrHoP",&Tau_HadrHoP_);
475     readerwGwGSF_EC->AddVariable("Tau_HadrEoP",&Tau_HadrEoP_);
476     readerwGwGSF_EC->AddVariable("Tau_VisMass",&Tau_VisMass_);
477     readerwGwGSF_EC->AddVariable("Tau_HadrMva",&Tau_HadrMva_);
478     readerwGwGSF_EC->AddVariable("Tau_GammaEtaMom",&Tau_GammaEtaMom_);
479     readerwGwGSF_EC->AddVariable("Tau_GammaPhiMom",&Tau_GammaPhiMom_);
480     readerwGwGSF_EC->AddVariable("Tau_GammaEnFrac",&Tau_GammaEnFrac_);
481     readerwGwGSF_EC->AddVariable("Tau_GSFChi2",&Tau_GSFChi2_);
482     readerwGwGSF_EC->AddVariable("(Tau_GSFNumHits - Tau_KFNumHits)/(Tau_GSFNumHits + Tau_KFNumHits)",&Tau_NumHitsVariable_);
483     readerwGwGSF_EC->AddVariable("Tau_GSFTrackResol",&Tau_GSFTrackResol_);
484     readerwGwGSF_EC->AddVariable("Tau_GSFTracklnPt",&Tau_GSFTracklnPt_);
485     readerwGwGSF_EC->AddVariable("Tau_GSFTrackEta",&Tau_GSFTrackEta_);
486     readerwGwGSF_EC->AddVariable("Tau_dCrackEta",&Tau_dCrackEta_);
487     readerwGwGSF_EC->SetVerbose(verbosity_);
488    
489     fTMVAReader_[k_NoEleMatchwoGwoGSF_BL] = readerNoEleMatchwoGwoGSF_BL;
490     fTMVAReader_[k_NoEleMatchwoGwGSF_BL] = readerNoEleMatchwoGwGSF_BL;
491     fTMVAReader_[k_NoEleMatchwGwoGSF_BL] = readerNoEleMatchwGwoGSF_BL;
492     fTMVAReader_[k_NoEleMatchwGwGSF_BL] = readerNoEleMatchwGwGSF_BL;
493     fTMVAReader_[k_woGwoGSF_BL] = readerwoGwoGSF_BL;
494     fTMVAReader_[k_woGwGSF_BL] = readerwoGwGSF_BL;
495     fTMVAReader_[k_wGwoGSF_BL] = readerwGwoGSF_BL;
496     fTMVAReader_[k_wGwGSF_BL] = readerwGwGSF_BL;
497     fTMVAReader_[k_NoEleMatchwoGwoGSF_EC] = readerNoEleMatchwoGwoGSF_EC;
498     fTMVAReader_[k_NoEleMatchwoGwGSF_EC] = readerNoEleMatchwoGwGSF_EC;
499     fTMVAReader_[k_NoEleMatchwGwoGSF_EC] = readerNoEleMatchwGwoGSF_EC;
500     fTMVAReader_[k_NoEleMatchwGwGSF_EC] = readerNoEleMatchwGwGSF_EC;
501     fTMVAReader_[k_woGwoGSF_EC] = readerwoGwoGSF_EC;
502     fTMVAReader_[k_woGwGSF_EC] = readerwoGwGSF_EC;
503     fTMVAReader_[k_wGwoGSF_EC] = readerwGwoGSF_EC;
504     fTMVAReader_[k_wGwGSF_EC] = readerwGwGSF_EC;
505    
506     }
507    
508     double AntiElectronIDMVA3::MVAValue(Float_t TauEtaAtEcalEntrance,
509     Float_t TauPt,
510     Float_t TaudCrackEta,
511     Float_t TaudCrackPhi,
512     Float_t TauEmFraction,
513     Float_t TauSignalPFGammaCands,
514     Float_t TauLeadPFChargedHadrHoP,
515     Float_t TauLeadPFChargedHadrEoP,
516     Float_t TauVisMass,
517     Float_t TauHadrMva,
518     const std::vector<Float_t>& GammasdEta,
519     const std::vector<Float_t>& GammasdPhi,
520     const std::vector<Float_t>& GammasPt,
521     Float_t TauKFNumHits,
522     Float_t TauGSFNumHits,
523     Float_t TauGSFChi2,
524     Float_t TauGSFTrackResol,
525     Float_t TauGSFTracklnPt,
526     Float_t TauGSFTrackEta,
527     Float_t TauPhi,
528     Float_t TauSignalPFChargedCands,
529     Float_t TauHasGsf,
530     Float_t ElecEta,
531     Float_t ElecPhi,
532     Float_t ElecPt,
533     Float_t ElecEe,
534     Float_t ElecEgamma,
535     Float_t ElecPin,
536     Float_t ElecPout,
537     Float_t ElecFbrem,
538     Float_t ElecChi2GSF,
539     Float_t ElecGSFNumHits,
540     Float_t ElecGSFTrackResol,
541     Float_t ElecGSFTracklnPt,
542     Float_t ElecGSFTrackEta)
543     {
544     double sumPt = 0.;
545     double dEta = 0.;
546     double dEta2 = 0.;
547     double dPhi = 0.;
548     double dPhi2 = 0.;
549     double sumPt2 = 0.;
550     for ( unsigned int i = 0 ; i < GammasPt.size() ; ++i ) {
551     double pt_i = GammasPt[i];
552     double phi_i = GammasdPhi[i];
553     if ( GammasdPhi[i] > TMath::Pi() ) phi_i = GammasdPhi[i] - 2*TMath::Pi();
554     else if ( GammasdPhi[i] < -TMath::Pi() ) phi_i = GammasdPhi[i] + 2*TMath::Pi();
555     double eta_i = GammasdEta[i];
556     sumPt += pt_i;
557     sumPt2 += (pt_i*pt_i);
558     dEta += (pt_i*eta_i);
559     dEta2 += (pt_i*eta_i*eta_i);
560     dPhi += (pt_i*phi_i);
561     dPhi2 += (pt_i*phi_i*phi_i);
562     }
563    
564     Float_t TauGammaEnFrac = sumPt/TauPt;
565    
566     if ( sumPt > 0. ) {
567     dEta /= sumPt;
568     dPhi /= sumPt;
569     dEta2 /= sumPt;
570     dPhi2 /= sumPt;
571     }
572    
573     Float_t TauGammaEtaMom = TMath::Sqrt(dEta2)*TMath::Sqrt(TauGammaEnFrac)*TauPt;
574     Float_t TauGammaPhiMom = TMath::Sqrt(dPhi2)*TMath::Sqrt(TauGammaEnFrac)*TauPt;
575    
576     return MVAValue(TauEtaAtEcalEntrance,
577     TauPt,
578     TaudCrackEta,
579     TaudCrackPhi,
580     TauEmFraction,
581     TauSignalPFGammaCands,
582     TauLeadPFChargedHadrHoP,
583     TauLeadPFChargedHadrEoP,
584     TauVisMass,
585     TauHadrMva,
586     TauGammaEtaMom,
587     TauGammaPhiMom,
588     TauGammaEnFrac,
589     TauKFNumHits,
590     TauGSFNumHits,
591     TauGSFChi2,
592     TauGSFTrackResol,
593     TauGSFTracklnPt,
594     TauGSFTrackEta,
595     TauPhi,
596     TauSignalPFChargedCands,
597     TauHasGsf,
598     ElecEta,
599     ElecPhi,
600     ElecPt,
601     ElecEe,
602     ElecEgamma,
603     ElecPin,
604     ElecPout,
605     ElecFbrem,
606     ElecChi2GSF,
607     ElecGSFNumHits,
608     ElecGSFTrackResol,
609     ElecGSFTracklnPt,
610     ElecGSFTrackEta);
611     }
612    
613     double AntiElectronIDMVA3::MVAValue(Float_t TauEtaAtEcalEntrance,
614     Float_t TauPt,
615     Float_t TaudCrackEta,
616     Float_t TaudCrackPhi,
617     Float_t TauEmFraction,
618     Float_t TauSignalPFGammaCands,
619     Float_t TauLeadPFChargedHadrHoP,
620     Float_t TauLeadPFChargedHadrEoP,
621     Float_t TauVisMass,
622     Float_t TauHadrMva,
623     Float_t TauGammaEtaMom,
624     Float_t TauGammaPhiMom,
625     Float_t TauGammaEnFrac,
626     Float_t TauKFNumHits,
627     Float_t TauGSFNumHits,
628     Float_t TauGSFChi2,
629     Float_t TauGSFTrackResol,
630     Float_t TauGSFTracklnPt,
631     Float_t TauGSFTrackEta,
632     Float_t TauPhi,
633     Float_t TauSignalPFChargedCands,
634     Float_t TauHasGsf,
635     Float_t ElecEta,
636     Float_t ElecPhi,
637     Float_t ElecPt,
638     Float_t ElecEe,
639     Float_t ElecEgamma,
640     Float_t ElecPin,
641     Float_t ElecPout,
642     Float_t ElecFbrem,
643     Float_t ElecChi2GSF,
644     Float_t ElecGSFNumHits,
645     Float_t ElecGSFTrackResol,
646     Float_t ElecGSFTracklnPt,
647     Float_t ElecGSFTrackEta)
648     {
649    
650     if ( !isInitialized_ ) {
651     std::cout << "Error: AntiElectronMVA not properly initialized.\n";
652     return -99.;
653     }
654    
655     Tau_EtaAtEcalEntrance_ = TauEtaAtEcalEntrance;
656     Tau_Pt_ = TauPt;
657     Tau_dCrackEta_ = TaudCrackEta;
658     Tau_dCrackPhi_ = TaudCrackPhi;
659     Tau_EmFraction_ = TMath::Max(TauEmFraction,float(0.0));
660     Tau_NumGammaCands_ = TauSignalPFGammaCands;
661     Tau_HadrHoP_ = TauLeadPFChargedHadrHoP;
662     Tau_HadrEoP_ = TauLeadPFChargedHadrEoP;
663     Tau_VisMass_ = TauVisMass;
664     Tau_HadrMva_ = TauHadrMva;
665     Tau_GammaEtaMom_ = TauGammaEtaMom;
666     Tau_GammaPhiMom_ = TauGammaPhiMom;
667     Tau_GammaEnFrac_ = TauGammaEnFrac;
668     Tau_GSFChi2_ = TauGSFChi2;
669     Tau_NumHitsVariable_ = (TauGSFNumHits-TauKFNumHits)/(TauGSFNumHits+TauKFNumHits);
670     Tau_GSFTrackResol_ = TauGSFTrackResol;
671     Tau_GSFTracklnPt_ = TauGSFTracklnPt;
672     Tau_GSFTrackEta_ = TauGSFTrackEta;
673    
674     Elec_EtotOverPin_ = (ElecEe + ElecEgamma)/ElecPin;
675     Elec_EgammaOverPdif_ = ElecEgamma/(ElecPin - ElecPout);
676     Elec_Fbrem_ = ElecFbrem;
677     Elec_Chi2GSF_ = ElecChi2GSF;
678     Elec_GSFNumHits_ = ElecGSFNumHits;
679     Elec_GSFTrackResol_ = ElecGSFTrackResol;
680     Elec_GSFTracklnPt_ = ElecGSFTracklnPt;
681     Elec_GSFTrackEta_ = ElecGSFTrackEta;
682    
683     double mva = -99.;
684     if ( TauSignalPFChargedCands == 3 ) mva = 1.0;
685     else if ( MathUtils::DeltaR(TauPhi, TauEtaAtEcalEntrance, ElecPhi, ElecEta) > 0.3 && TauSignalPFGammaCands == 0 && TauHasGsf < 0.5) {
686     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_NoEleMatchwoGwoGSF_BL]->EvaluateMVA(methodName_);
687     else mva = fTMVAReader_[k_NoEleMatchwoGwoGSF_EC]->EvaluateMVA(methodName_);
688     }
689     else if ( MathUtils::DeltaR(TauPhi, TauEtaAtEcalEntrance, ElecPhi, ElecEta) > 0.3 && TauSignalPFGammaCands == 0 && TauHasGsf > 0.5) {
690     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_NoEleMatchwoGwGSF_BL]->EvaluateMVA(methodName_);
691     else mva = fTMVAReader_[k_NoEleMatchwoGwGSF_EC]->EvaluateMVA(methodName_);
692     }
693     else if ( MathUtils::DeltaR(TauPhi, TauEtaAtEcalEntrance, ElecPhi, ElecEta) > 0.3 && TauSignalPFGammaCands > 0 && TauHasGsf < 0.5) {
694     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_NoEleMatchwGwoGSF_BL]->EvaluateMVA(methodName_);
695     else mva = fTMVAReader_[k_NoEleMatchwGwoGSF_EC]->EvaluateMVA(methodName_);
696     }
697     else if ( MathUtils::DeltaR(TauPhi, TauEtaAtEcalEntrance, ElecPhi, ElecEta) > 0.3 && TauSignalPFGammaCands > 0 && TauHasGsf > 0.5) {
698     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_NoEleMatchwGwGSF_BL]->EvaluateMVA(methodName_);
699     else mva = fTMVAReader_[k_NoEleMatchwGwGSF_EC]->EvaluateMVA(methodName_);
700     }
701     else if ( TauSignalPFGammaCands == 0 && TauHasGsf < 0.5) {
702     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_woGwoGSF_BL]->EvaluateMVA(methodName_);
703     else mva = fTMVAReader_[k_woGwoGSF_EC]->EvaluateMVA(methodName_);
704     }
705     else if ( TauSignalPFGammaCands == 0 && TauHasGsf > 0.5) {
706     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_woGwGSF_BL]->EvaluateMVA(methodName_);
707     else mva = fTMVAReader_[k_woGwGSF_EC]->EvaluateMVA(methodName_);
708     }
709     else if ( TauSignalPFGammaCands > 0 && TauHasGsf < 0.5) {
710     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_wGwoGSF_BL]->EvaluateMVA(methodName_);
711     else mva = fTMVAReader_[k_wGwoGSF_EC]->EvaluateMVA(methodName_);
712     }
713     else if ( TauSignalPFGammaCands > 0 && TauHasGsf > 0.5) {
714     if ( TMath::Abs(TauEtaAtEcalEntrance) < 1.5 ) mva = fTMVAReader_[k_wGwGSF_BL]->EvaluateMVA(methodName_);
715     else mva = fTMVAReader_[k_wGwGSF_EC]->EvaluateMVA(methodName_);
716     }
717     return mva;
718     }
719    
720    
721     double AntiElectronIDMVA3::MVAValue(const PFTau& thePFTau,
722     const Electron& theGsfEle)
723    
724     {
725     Float_t TauEtaAtEcalEntrance = -99.;
726     float sumEtaTimesEnergy = 0;
727     float sumEnergy = 0;
728     for(unsigned int j = 0 ; j < thePFTau.NSignalPFCands(); j++){
729     const PFCandidate *pfcandidate = thePFTau.SignalPFCand(j);
730     sumEtaTimesEnergy += pfcandidate->EtaECal()*pfcandidate->E();
731     sumEnergy += pfcandidate->E();
732     }
733     if(sumEnergy>0)TauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
734    
735     Float_t TauPt = thePFTau.Pt();
736     Float_t TauEmFraction = TMath::Max(thePFTau.EMFraction(), (Double_t)0.);
737     Float_t TauSignalPFGammaCands = thePFTau.NSignalPFGammaCands();
738     Float_t TauLeadPFChargedHadrHoP = 0.;
739     Float_t TauLeadPFChargedHadrEoP = 0.;
740     if ( thePFTau.LeadChargedHadronPFCand()->P() > 0. ) {
741     TauLeadPFChargedHadrHoP = thePFTau.LeadChargedHadronPFCand()->EHCal()/thePFTau.LeadChargedHadronPFCand()->P();
742     TauLeadPFChargedHadrEoP = thePFTau.LeadChargedHadronPFCand()->EECal()/thePFTau.LeadChargedHadronPFCand()->P();
743     }
744     Float_t TauVisMass = thePFTau.Mass();
745     Float_t TauHadrMva = TMath::Max(thePFTau.ElectronPreIDOutput(), Double_t(-1.0));
746     std::vector<Float_t> GammasdEta;
747     std::vector<Float_t> GammasdPhi;
748     std::vector<Float_t> GammasPt;
749     for ( unsigned i = 0 ; i < thePFTau.NSignalPFGammaCands(); ++i ) {
750     const PFCandidate *gamma = thePFTau.SignalPFGammaCand(i);
751     if ( thePFTau.LeadChargedHadronPFCand() != NULL ) {
752     GammasdEta.push_back(gamma->Eta() - thePFTau.LeadChargedHadronPFCand()->Eta());
753     GammasdPhi.push_back(gamma->Phi() - thePFTau.LeadChargedHadronPFCand()->Phi());
754     } else {
755     GammasdEta.push_back(gamma->Eta() - thePFTau.Eta());
756     GammasdPhi.push_back(gamma->Phi() - thePFTau.Phi());
757     }
758     GammasPt.push_back(gamma->Pt());
759     }
760     Float_t TauKFNumHits = -99.;
761     if(thePFTau.LeadChargedHadronPFCand()->HasTrackerTrk()){
762     TauKFNumHits = thePFTau.LeadChargedHadronPFCand()->TrackerTrk()->NHits();
763     }
764     Float_t TauGSFNumHits = -99.;
765     Float_t TauGSFChi2 = -99.;
766     Float_t TauGSFTrackResol = -99.;
767     Float_t TauGSFTracklnPt = -99.;
768     Float_t TauGSFTrackEta = -99.;
769     if(thePFTau.LeadChargedHadronPFCand()->HasGsfTrk()){
770     TauGSFChi2 = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->RChi2();
771     TauGSFNumHits = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->NHits();
772     if ( thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Pt() > 0. ) {
773     TauGSFTrackResol = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->PtErr()/thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Pt();
774     TauGSFTracklnPt = log(thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Pt())*TMath::Ln10();
775     }
776     TauGSFTrackEta = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Eta();
777     }
778     Float_t TauPhi = thePFTau.Phi();
779     float sumPhiTimesEnergy = 0;
780     float sumEnergyPhi = 0;
781     for(unsigned int j = 0 ; j < thePFTau.NSignalPFCands() ; j++){
782     const PFCandidate *pfcandidate = thePFTau.SignalPFCand(j);
783     sumPhiTimesEnergy += pfcandidate->PhiECal()*pfcandidate->E();
784     sumEnergyPhi += pfcandidate->E();
785     }
786     if(sumEnergy>0)TauPhi = sumPhiTimesEnergy/sumEnergyPhi;
787     Float_t TaudCrackPhi = dCrackPhi(TauPhi,TauEtaAtEcalEntrance) ;
788     Float_t TaudCrackEta = dCrackEta(TauEtaAtEcalEntrance) ;
789     Float_t TauSignalPFChargedCands = thePFTau.NSignalPFChargedHadrCands();
790     Float_t TauHasGsf = thePFTau.LeadChargedHadronPFCand()->HasGsfTrk();
791    
792     Float_t ElecEta = theGsfEle.Eta();
793     Float_t ElecPhi = theGsfEle.Phi();
794     Float_t ElecPt = theGsfEle.Pt();
795     //Variables related to the electron Cluster
796     Float_t ElecEe = 0.;
797     Float_t ElecEgamma = 0.;
798     const SuperCluster *pfSuperCluster = theGsfEle.PFSCluster();
799     if ( pfSuperCluster != NULL) {
800     for (UInt_t i = 0; i < pfSuperCluster->NClusters(); i++) {
801     const BasicCluster *pfCluster = pfSuperCluster->Cluster(i);
802     double pfClusterEn = pfCluster->Energy();
803     if ( i == 0) ElecEe += pfClusterEn;
804     else ElecEgamma += pfClusterEn;
805     }
806     }
807     Float_t ElecPin = theGsfEle.PIn();
808     Float_t ElecPout = theGsfEle.POut();
809     Float_t ElecFbrem = theGsfEle.FBrem();
810     //Variables related to the GsfTrack
811     Float_t ElecChi2GSF = -99.;
812     Float_t ElecGSFNumHits = -99.;
813     Float_t ElecGSFTrackResol = -99.;
814     Float_t ElecGSFTracklnPt = -99.;
815     Float_t ElecGSFTrackEta = -99.;
816     if ( theGsfEle.HasGsfTrk() ) {
817     ElecChi2GSF = theGsfEle.GsfTrk()->RChi2();
818     ElecGSFNumHits = theGsfEle.GsfTrk()->NHits();
819     if ( theGsfEle.GsfTrk()->Pt() > 0. ) {
820     ElecGSFTrackResol = theGsfEle.GsfTrk()->PtErr()/theGsfEle.GsfTrk()->Pt();
821     ElecGSFTracklnPt = log(theGsfEle.GsfTrk()->Pt())*TMath::Ln10();
822     }
823     ElecGSFTrackEta = theGsfEle.GsfTrk()->Eta();
824     }
825    
826     return MVAValue(TauEtaAtEcalEntrance,
827     TauPt,
828     TaudCrackEta,
829     TaudCrackPhi,
830     TauEmFraction,
831     TauSignalPFGammaCands,
832     TauLeadPFChargedHadrHoP,
833     TauLeadPFChargedHadrEoP,
834     TauVisMass,
835     TauHadrMva,
836     GammasdEta,
837     GammasdPhi,
838     GammasPt,
839     TauKFNumHits,
840     TauGSFNumHits,
841     TauGSFChi2,
842     TauGSFTrackResol,
843     TauGSFTracklnPt,
844     TauGSFTrackEta,
845     TauPhi,
846     TauSignalPFChargedCands,
847     TauHasGsf,
848     ElecEta,
849     ElecPhi,
850     ElecPt,
851     ElecEe,
852     ElecEgamma,
853     ElecPin,
854     ElecPout,
855     ElecFbrem,
856     ElecChi2GSF,
857     ElecGSFNumHits,
858     ElecGSFTrackResol,
859     ElecGSFTracklnPt,
860     ElecGSFTrackEta);
861     }
862    
863     double AntiElectronIDMVA3::MVAValue(const PFTau& thePFTau)
864     {
865     Float_t TauEtaAtEcalEntrance = -99.;
866     float sumEtaTimesEnergy = 0;
867     float sumEnergy = 0;
868     for(unsigned int j = 0 ; j < thePFTau.NSignalPFCands() ; j++){
869     const PFCandidate *pfcandidate = thePFTau.SignalPFCand(j);
870     sumEtaTimesEnergy += pfcandidate->EtaECal()*pfcandidate->E();
871     sumEnergy += pfcandidate->E();
872     }
873     if(sumEnergy>0)TauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
874    
875     Float_t TauPt = thePFTau.Pt();
876     Float_t TauEmFraction = TMath::Max(thePFTau.EMFraction(), (Double_t)0.);
877     Float_t TauSignalPFGammaCands = thePFTau.NSignalPFGammaCands();
878     Float_t TauLeadPFChargedHadrHoP = 0.;
879     Float_t TauLeadPFChargedHadrEoP = 0.;
880     if ( thePFTau.LeadChargedHadronPFCand()->P() > 0. ) {
881     TauLeadPFChargedHadrHoP = thePFTau.LeadChargedHadronPFCand()->EHCal()/thePFTau.LeadChargedHadronPFCand()->P();
882     TauLeadPFChargedHadrEoP = thePFTau.LeadChargedHadronPFCand()->EECal()/thePFTau.LeadChargedHadronPFCand()->P();
883     }
884     Float_t TauVisMass = thePFTau.Mass();
885     Float_t TauHadrMva = TMath::Max(thePFTau.ElectronPreIDOutput(),Double_t(-1.0));
886     std::vector<Float_t> GammasdEta;
887     std::vector<Float_t> GammasdPhi;
888     std::vector<Float_t> GammasPt;
889     for ( unsigned i = 0 ; i < thePFTau.NSignalPFGammaCands(); ++i ) {
890     const PFCandidate *gamma = thePFTau.SignalPFGammaCand(i);
891     if ( thePFTau.LeadChargedHadronPFCand() != NULL ) {
892     GammasdEta.push_back(gamma->Eta() - thePFTau.LeadChargedHadronPFCand()->Eta());
893     GammasdPhi.push_back(gamma->Phi() - thePFTau.LeadChargedHadronPFCand()->Phi());
894     } else {
895     GammasdEta.push_back(gamma->Eta() - thePFTau.Eta());
896     GammasdPhi.push_back(gamma->Phi() - thePFTau.Phi());
897     }
898     GammasPt.push_back(gamma->Pt());
899     }
900     Float_t TauKFNumHits = -99.;
901     if(thePFTau.LeadChargedHadronPFCand()->HasTrackerTrk()){
902     TauKFNumHits = thePFTau.LeadChargedHadronPFCand()->TrackerTrk()->NHits();
903     }
904     Float_t TauGSFNumHits = -99.;
905     Float_t TauGSFChi2 = -99.;
906     Float_t TauGSFTrackResol = -99.;
907     Float_t TauGSFTracklnPt = -99.;
908     Float_t TauGSFTrackEta = -99.;
909     if(thePFTau.LeadChargedHadronPFCand()->HasGsfTrk()){
910     TauGSFChi2 = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->RChi2();
911     TauGSFNumHits = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->NHits();
912     if ( thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Pt() > 0. ) {
913     TauGSFTrackResol = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->PtErr()/thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Pt();
914     TauGSFTracklnPt = log(thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Pt())*TMath::Ln10();
915     }
916     TauGSFTrackEta = thePFTau.LeadChargedHadronPFCand()->GsfTrk()->Eta();
917     }
918     Float_t TauPhi = thePFTau.Phi();
919     float sumPhiTimesEnergy = 0;
920     float sumEnergyPhi = 0;
921     for(unsigned int j = 0 ; j < thePFTau.NSignalPFCands() ; j++){
922     const PFCandidate *pfcandidate = thePFTau.SignalPFCand(j);
923     sumPhiTimesEnergy += pfcandidate->PhiECal()*pfcandidate->E();
924     sumEnergyPhi += pfcandidate->E();
925     }
926     if(sumEnergy>0)TauPhi = sumPhiTimesEnergy/sumEnergyPhi;
927     Float_t TaudCrackPhi = dCrackPhi(TauPhi,TauEtaAtEcalEntrance) ;
928     Float_t TaudCrackEta = dCrackEta(TauEtaAtEcalEntrance) ;
929     Float_t TauSignalPFChargedCands = thePFTau.NSignalPFChargedHadrCands();
930     Float_t TauHasGsf = thePFTau.LeadChargedHadronPFCand()->HasGsfTrk();
931    
932     Float_t dummyElecEta = 9.9;
933    
934     return MVAValue(TauEtaAtEcalEntrance,
935     TauPt,
936     TaudCrackEta,
937     TaudCrackPhi,
938     TauEmFraction,
939     TauSignalPFGammaCands,
940     TauLeadPFChargedHadrHoP,
941     TauLeadPFChargedHadrEoP,
942     TauVisMass,
943     TauHadrMva,
944     GammasdEta,
945     GammasdPhi,
946     GammasPt,
947     TauKFNumHits,
948     TauGSFNumHits,
949     TauGSFChi2,
950     TauGSFTrackResol,
951     TauGSFTracklnPt,
952     TauGSFTrackEta,
953     TauPhi,
954     TauSignalPFChargedCands,
955     TauHasGsf,
956     dummyElecEta,
957     0.,
958     0.,
959     0.,
960     0.,
961     0.,
962     0.,
963     0.,
964     0.,
965     0.,
966     0.,
967     0.,
968     0.);
969     }
970    
971    
972     double
973     AntiElectronIDMVA3::minimum(double a,double b){
974     if(TMath::Abs(b)<TMath::Abs(a)) return b;
975     else return a;
976     }
977    
978     //compute the unsigned distance to the closest phi-crack in the barrel
979     double
980     AntiElectronIDMVA3:: dCrackPhi(double phi, double eta){
981    
982     double pi= TMath::Pi();// 3.14159265358979323846;
983    
984     //Location of the 18 phi-cracks
985     static std::vector<double> cPhi;
986     if(cPhi.size()==0)
987     {
988     cPhi.resize(18,0);
989     cPhi[0]=2.97025;
990     for(unsigned i=1;i<=17;++i) cPhi[i]=cPhi[0]-2*i*pi/18;
991     }
992    
993     //Shift of this location if eta<0
994     double delta_cPhi=0.00638;
995    
996     double m; //the result
997    
998     if (eta>=- 1.47464 && eta<= 1.47464){
999    
1000     //the location is shifted
1001     if(eta<0) phi +=delta_cPhi;
1002    
1003     if (phi>=-pi && phi<=pi){
1004    
1005     //the problem of the extrema
1006     if (phi<cPhi[17] || phi>=cPhi[0]){
1007     if (phi<0) phi+= 2*pi;
1008     m = minimum(phi -cPhi[0],phi-cPhi[17]-2*pi);
1009     }
1010    
1011     //between these extrema...
1012     else{
1013     bool OK = false;
1014     unsigned i=16;
1015     while(!OK){
1016     if (phi<cPhi[i]){
1017     m=minimum(phi-cPhi[i+1],phi-cPhi[i]);
1018     OK=true;
1019     }
1020     else i-=1;
1021     }
1022     }
1023     }
1024     else{
1025     m=0.; //if there is a problem, we assum that we are in a crack
1026     std::cout<<"Problem in dminphi"<<std::endl;
1027     }
1028     }
1029     else{
1030     return -99.;
1031     std::cout<<"Encap region"<<std::endl;
1032     }
1033    
1034     return TMath::Abs(m);
1035     }
1036    
1037     //compute the unsigned distance to the closest phi-crack in the barrel
1038     double
1039     AntiElectronIDMVA3:: dCrackEta(double eta){
1040    
1041     //Location of the eta-cracks
1042     double cracks[5] = {0, 4.44747e-01, 7.92824e-01, 1.14090e+00, 1.47464e+00};
1043    
1044     double m=99.; //the result
1045    
1046     for(int i=0;i<5;i++){
1047     double d = minimum(eta-cracks[i], eta+cracks[i]);
1048     if (TMath::Abs(d)<TMath::Abs(m)){
1049     m=d;
1050     }
1051     }
1052    
1053     return TMath::Abs(m);
1054     }
1055    
1056     bool AntiElectronIDMVA3::Pass(double mva, int category, Level level)
1057     {
1058     if(category >= 0)
1059     return mva > cuts_[level][category];
1060     else if(mva == 1)
1061     return true;
1062     else
1063     return false;
1064     }
1065    
1066     bool AntiElectronIDMVA3::Pass(const PFTau *thePFTauRef, const ElectronCol *electrons, Level level)
1067     {
1068     double dummy_mva;
1069     int dummy_category;
1070    
1071     return Pass(thePFTauRef, electrons, dummy_mva, dummy_category, level);
1072     }
1073    
1074     bool AntiElectronIDMVA3::Pass(const PFTau *thePFTauRef, const ElectronCol *electrons, double &mva, int &category, Level level)
1075     {
1076     mva = 1.;
1077     category = -1.;
1078     bool isGsfElectronMatched = false;
1079     bool ecalCrackVeto = false;
1080    
1081     //// Veto taus that go to Ecal crack
1082     if ( thePFTauRef->NSignalPFChargedHadrCands() == 1 ) {
1083     Float_t TauEtaAtEcalEntrance = -99.;
1084     float sumEtaTimesEnergy = 0;
1085     float sumEnergy = 0;
1086     for(unsigned int j = 0 ; j < thePFTauRef->NSignalPFCands() ; j++){
1087     const PFCandidate *pfcandidate = thePFTauRef->SignalPFCand(j);
1088     sumEtaTimesEnergy += pfcandidate->EtaECal()*pfcandidate->E();
1089     sumEnergy += pfcandidate->E();
1090     }
1091     if(sumEnergy>0)TauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
1092    
1093     if (isInEcalCrack(TauEtaAtEcalEntrance)) {
1094     mva = -99;
1095     category = -1;
1096     ecalCrackVeto = true;
1097     }
1098     }
1099    
1100     if(!ecalCrackVeto && thePFTauRef->LeadChargedHadronPFCand()) {
1101     for(UInt_t i = 0; i < electrons->GetEntries(); i++)
1102     {
1103     const Electron *theGsfElectron = electrons->At(i);
1104    
1105     if ( theGsfElectron->Pt() > 10. ) { // CV: only take electrons above some minimal energy/Pt into account...
1106     double deltaREleTau = MathUtils::DeltaR(theGsfElectron, thePFTauRef);
1107     //deltaRTestigo = deltaREleTau;
1108     if ( deltaREleTau < 0.3 ) {
1109     double mva_match = MVAValue(*thePFTauRef, *theGsfElectron);
1110     UInt_t numSignalPFGammaCands = thePFTauRef->NSignalPFGammaCands();
1111     bool hasGsfTrack = thePFTauRef->LeadChargedHadronPFCand()->HasGsfTrk();
1112    
1113     if ( thePFTauRef->NSignalPFChargedHadrCands() == 1 ) {
1114     if ( TMath::Abs(thePFTauRef->Eta()) < 1.5 ) { // Barrel
1115     if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
1116     category = 4.;
1117     } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
1118     category = 5.;
1119     } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
1120     category = 6.;
1121     } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
1122     category = 7.;
1123     }
1124     } else { // Endcap
1125     if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
1126     category = 12.;
1127     } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
1128     category = 13.;
1129     } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
1130     category = 14.;
1131     } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
1132     category = 15.;
1133     }
1134     }
1135     } else {
1136     category = 16.;
1137     }
1138     mva = TMath::Min(mva, mva_match);
1139     isGsfElectronMatched = true;
1140     }//deltaR<0.3
1141     }//electron pt>10
1142     }//loop electrons
1143    
1144     if ( !isGsfElectronMatched ) {
1145     mva = MVAValue(*thePFTauRef);
1146     UInt_t numSignalPFGammaCands = thePFTauRef->NSignalPFGammaCands();
1147     bool hasGsfTrack = thePFTauRef->LeadChargedHadronPFCand()->HasGsfTrk();
1148     if ( thePFTauRef->NSignalPFChargedHadrCands() == 1 ) {
1149     if ( TMath::Abs(thePFTauRef->Eta()) < 1.5 ) { // Barrel
1150     if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
1151     category = 0.;
1152     } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
1153     category = 1.;
1154     } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
1155     category = 2.;
1156     } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
1157     category = 3.;
1158     }
1159     } else { // Endcap
1160     if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
1161     category = 8.;
1162     } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
1163     category = 9.;
1164     } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
1165     category = 10.;
1166     } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
1167     category = 11.;
1168     }
1169     }
1170     } else {
1171     category = 17.;
1172     }
1173     }
1174     }
1175    
1176     return Pass(mva, category, level);
1177     }
1178    
1179     bool AntiElectronIDMVA3::isInEcalCrack(double eta) const
1180     {
1181     eta = fabs(eta);
1182     return (eta>1.460 && eta<1.558);
1183     }