ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/ElectronIDMVA.cc
Revision: 1.3
Committed: Sun Sep 25 15:59:20 2011 UTC (13 years, 7 months ago) by sixie
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025pre2
Changes since 1.2: +68 -0 lines
Log Message:
add mva value extraction giving all input variables

File Contents

# User Rev Content
1 sixie 1.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     fLH(0),
19     fIsInitialized(kFALSE)
20     {
21     // Constructor.
22     for(UInt_t i=0; i<6; ++i) {
23     fTMVAReader[i] = 0;
24     }
25     }
26    
27    
28     //--------------------------------------------------------------------------------------------------
29     ElectronIDMVA::~ElectronIDMVA()
30     {
31     for(UInt_t i=0; i<6; ++i) {
32     if (fTMVAReader[i]) delete fTMVAReader[i];
33     }
34     }
35    
36     //--------------------------------------------------------------------------------------------------
37     void ElectronIDMVA::Initialize( TString methodName,
38     TString Subdet0Pt10To20Weights ,
39     TString Subdet1Pt10To20Weights ,
40     TString Subdet2Pt10To20Weights,
41     TString Subdet0Pt20ToInfWeights,
42     TString Subdet1Pt20ToInfWeights,
43     TString Subdet2Pt20ToInfWeights,
44     ElectronLikelihood *LH) {
45    
46     fIsInitialized = kTRUE;
47    
48     fMethodname = methodName;
49     fLH = LH;
50     if (!fLH) { std::cout << "Error: Likelihood is not properly initialized.\n"; assert(fLH); }
51    
52     for(UInt_t i=0; i<6; ++i) {
53     if (fTMVAReader[i]) delete fTMVAReader[i];
54    
55     fTMVAReader[i] = new TMVA::Reader( "!Color:!Silent:Error" );
56     fTMVAReader[i]->SetVerbose(kTRUE);
57     fTMVAReader[i]->AddVariable( "SigmaIEtaIEta", &fMVAVar_EleSigmaIEtaIEta );
58     fTMVAReader[i]->AddVariable( "DEtaIn", &fMVAVar_EleDEtaIn );
59     fTMVAReader[i]->AddVariable( "DPhiIn", &fMVAVar_EleDPhiIn );
60     fTMVAReader[i]->AddVariable( "HoverE", &fMVAVar_EleHoverE );
61     fTMVAReader[i]->AddVariable( "D0", &fMVAVar_EleD0 );
62     fTMVAReader[i]->AddVariable( "FBrem", &fMVAVar_EleFBrem );
63     fTMVAReader[i]->AddVariable( "EOverP", &fMVAVar_EleEOverP );
64     fTMVAReader[i]->AddVariable( "ESeedClusterOverPout", &fMVAVar_EleESeedClusterOverPout );
65     fTMVAReader[i]->AddVariable( "SigmaIPhiIPhi", &fMVAVar_EleSigmaIPhiIPhi );
66     fTMVAReader[i]->AddVariable( "NBrem", &fMVAVar_EleNBrem );
67     fTMVAReader[i]->AddVariable( "OneOverEMinusOneOverP", &fMVAVar_EleOneOverEMinusOneOverP );
68     fTMVAReader[i]->AddVariable( "ESeedClusterOverPIn", &fMVAVar_EleESeedClusterOverPIn );
69     fTMVAReader[i]->AddVariable( "IP3d", &fMVAVar_EleIP3d );
70     fTMVAReader[i]->AddVariable( "IP3dSig", &fMVAVar_EleIP3dSig );
71     fTMVAReader[i]->AddVariable( "StandardLikelihood", &fMVAVar_EleStandardLikelihood );
72    
73     if (i==0) fTMVAReader[i]->BookMVA(fMethodname , Subdet0Pt10To20Weights );
74     if (i==1) fTMVAReader[i]->BookMVA(fMethodname , Subdet1Pt10To20Weights );
75     if (i==2) fTMVAReader[i]->BookMVA(fMethodname , Subdet2Pt10To20Weights );
76     if (i==3) fTMVAReader[i]->BookMVA(fMethodname , Subdet0Pt20ToInfWeights );
77     if (i==4) fTMVAReader[i]->BookMVA(fMethodname , Subdet1Pt20ToInfWeights );
78     if (i==5) fTMVAReader[i]->BookMVA(fMethodname , Subdet2Pt20ToInfWeights );
79    
80     }
81    
82     std::cout << "Electron ID MVA Initialization\n";
83     std::cout << "MethodName : " << fMethodname << std::endl;
84     std::cout << "Load weights file : " << Subdet0Pt10To20Weights << std::endl;
85     std::cout << "Load weights file : " << Subdet1Pt10To20Weights << std::endl;
86     std::cout << "Load weights file : " << Subdet2Pt10To20Weights << std::endl;
87     std::cout << "Load weights file : " << Subdet0Pt20ToInfWeights << std::endl;
88     std::cout << "Load weights file : " << Subdet1Pt20ToInfWeights << std::endl;
89     std::cout << "Load weights file : " << Subdet2Pt20ToInfWeights << std::endl;
90    
91     }
92    
93 sixie 1.3 //--------------------------------------------------------------------------------------------------
94     Double_t ElectronIDMVA::MVAValue(Double_t ElePt , Double_t EleSCEta,
95     Double_t EleSigmaIEtaIEta,
96     Double_t EleDEtaIn,
97     Double_t EleDPhiIn,
98     Double_t EleHoverE,
99     Double_t EleD0,
100     Double_t EleDZ,
101     Double_t EleFBrem,
102     Double_t EleEOverP,
103     Double_t EleESeedClusterOverPout,
104     Double_t EleSigmaIPhiIPhi,
105     Double_t EleNBrem,
106     Double_t EleOneOverEMinusOneOverP,
107     Double_t EleESeedClusterOverPIn,
108     Double_t EleIP3d,
109     Double_t EleIP3dSig,
110     Double_t EleStandardLikelihood
111     ) {
112    
113     if (!fIsInitialized) {
114     std::cout << "Error: ElectronIDMVA not properly initialized.\n";
115     return -9999;
116     }
117    
118     Int_t subdet = 0;
119     if (fabs(EleSCEta) < 1.0) subdet = 0;
120     else if (fabs(EleSCEta) < 1.479) subdet = 1;
121     else subdet = 2;
122     Int_t ptBin = 0;
123     if (ElePt > 20.0) ptBin = 1;
124    
125     //set all input variables
126     fMVAVar_EleSigmaIEtaIEta = EleSigmaIEtaIEta;
127     fMVAVar_EleDEtaIn = EleDEtaIn;
128     fMVAVar_EleDPhiIn = EleDPhiIn;
129     fMVAVar_EleHoverE = EleHoverE;
130     fMVAVar_EleD0 = EleD0;
131     fMVAVar_EleDZ = EleDZ;
132     fMVAVar_EleFBrem = EleFBrem;
133     fMVAVar_EleEOverP = EleEOverP;
134     fMVAVar_EleESeedClusterOverPout = EleESeedClusterOverPout;
135     fMVAVar_EleSigmaIPhiIPhi = EleSigmaIPhiIPhi;
136     fMVAVar_EleNBrem = EleNBrem;
137     fMVAVar_EleOneOverEMinusOneOverP = EleOneOverEMinusOneOverP;
138     fMVAVar_EleESeedClusterOverPIn = EleESeedClusterOverPIn;
139     fMVAVar_EleIP3d = EleIP3d;
140     fMVAVar_EleIP3dSig = EleIP3dSig;
141     fMVAVar_EleStandardLikelihood = EleStandardLikelihood;
142    
143     Double_t mva = -9999;
144     TMVA::Reader *reader = 0;
145     Int_t MVABin = -1;
146     if (subdet == 0 && ptBin == 0) MVABin = 0;
147     if (subdet == 1 && ptBin == 0) MVABin = 1;
148     if (subdet == 2 && ptBin == 0) MVABin = 2;
149     if (subdet == 0 && ptBin == 1) MVABin = 3;
150     if (subdet == 1 && ptBin == 1) MVABin = 4;
151     if (subdet == 2 && ptBin == 1) MVABin = 5;
152     assert(MVABin >= 0 && MVABin <= 5);
153     reader = fTMVAReader[MVABin];
154    
155     mva = reader->EvaluateMVA( fMethodname );
156    
157     return mva;
158     }
159    
160    
161 sixie 1.1
162     //--------------------------------------------------------------------------------------------------
163     Double_t ElectronIDMVA::MVAValue(const Electron *ele, const Vertex *vertex) {
164    
165     if (!fIsInitialized) {
166     std::cout << "Error: ElectronIDMVA not properly initialized.\n";
167     return -9999;
168     }
169    
170     Int_t subdet = 0;
171     if (ele->SCluster()->AbsEta() < 1.0) subdet = 0;
172     else if (ele->SCluster()->AbsEta() < 1.479) subdet = 1;
173     else subdet = 2;
174     Int_t ptBin = 0;
175     if (ele->Pt() > 20.0) ptBin = 1;
176    
177     //set all input variables
178     fMVAVar_EleSigmaIEtaIEta = ele->CoviEtaiEta() ;
179     fMVAVar_EleDEtaIn = ele->DeltaEtaSuperClusterTrackAtVtx();
180     fMVAVar_EleDPhiIn = ele->DeltaPhiSuperClusterTrackAtVtx();
181     fMVAVar_EleHoverE = ele->HadronicOverEm();
182     fMVAVar_EleD0 = ele->BestTrk()->D0Corrected(*vertex);
183     fMVAVar_EleDZ = ele->BestTrk()->DzCorrected(*vertex);
184     fMVAVar_EleFBrem = ele->FBrem();
185     fMVAVar_EleEOverP = ele->ESuperClusterOverP();
186     fMVAVar_EleESeedClusterOverPout = ele->ESeedClusterOverPout();
187     if (!TMath::IsNaN(ele->SCluster()->Seed()->CoviPhiiPhi())) fMVAVar_EleSigmaIPhiIPhi = TMath::Sqrt(ele->SCluster()->Seed()->CoviPhiiPhi());
188     else fMVAVar_EleSigmaIPhiIPhi = ele->CoviEtaiEta();
189     fMVAVar_EleNBrem = ele->NumberOfClusters() - 1;
190     fMVAVar_EleOneOverEMinusOneOverP = (1.0/(ele->ESuperClusterOverP()*ele->BestTrk()->P())) - 1.0 / ele->BestTrk()->P();
191     fMVAVar_EleESeedClusterOverPIn = ele->ESeedClusterOverPIn();
192     fMVAVar_EleIP3d = ele->Ip3dPV();
193     fMVAVar_EleIP3dSig = ele->Ip3dPVSignificance();
194     fMVAVar_EleStandardLikelihood = ElectronTools::Likelihood(fLH, ele);
195    
196     Double_t mva = -9999;
197     TMVA::Reader *reader = 0;
198     Int_t MVABin = -1;
199     if (subdet == 0 && ptBin == 0) MVABin = 0;
200     if (subdet == 1 && ptBin == 0) MVABin = 1;
201     if (subdet == 2 && ptBin == 0) MVABin = 2;
202     if (subdet == 0 && ptBin == 1) MVABin = 3;
203     if (subdet == 1 && ptBin == 1) MVABin = 4;
204     if (subdet == 2 && ptBin == 1) MVABin = 5;
205     assert(MVABin >= 0 && MVABin <= 5);
206     reader = fTMVAReader[MVABin];
207    
208     mva = reader->EvaluateMVA( fMethodname );
209    
210     return mva;
211     }