ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/MVATools.cc
Revision: 1.4
Committed: Mon Dec 5 00:47:46 2011 UTC (13 years, 5 months ago) by mingyang
Content type: text/plain
Branch: MAIN
Changes since 1.3: +87 -148 lines
Log Message:
set bdt function and pass mva function changed

File Contents

# User Rev Content
1 mingyang 1.4 // $Id: MVATools.cc,v 1.3 2011/10/18 11:27:19 fabstoec Exp $
2 mingyang 1.1
3     #include "MitPhysics/Utils/interface/PhotonTools.h"
4     #include "MitPhysics/Utils/interface/MVATools.h"
5     #include "MitPhysics/Utils/interface/ElectronTools.h"
6     #include "MitPhysics/Utils/interface/IsolationTools.h"
7     #include "MitAna/DataTree/interface/StableData.h"
8     #include <TFile.h>
9     #include <TRandom3.h>
10     #include "TMVA/Tools.h"//MVA
11     #include "TMVA/Reader.h"//MVA
12    
13     ClassImp(mithep::MVATools)
14    
15     using namespace mithep;
16    
17    
18     //--------------------------------------------------------------------------------------------------
19     MVATools::MVATools():
20     fReaderEndcap(0),
21     fReaderBarrel(0),
22    
23 mingyang 1.4 //MVA Variables v4
24 mingyang 1.1 HoE(0),
25     covIEtaIEta(0),
26 mingyang 1.4 tIso1abs(0),
27     tIso3abs(0),
28     tIso2abs(0),
29 mingyang 1.1 R9(0),
30    
31 mingyang 1.4 absIsoEcal(0),
32     absIsoHcal(0),
33 mingyang 1.1 RelEMax(0),
34     RelETop(0),
35     RelEBottom(0),
36     RelELeft(0),
37     RelERight(0),
38     RelE2x5Max(0),
39     RelE2x5Top(0),
40     RelE2x5Bottom(0),
41     RelE2x5Left(0),
42     RelE2x5Right(0),
43     RelE5x5(0),
44    
45     EtaWidth(0),
46     PhiWidth(0),
47 mingyang 1.4 CoviEtaiPhi(0),
48 mingyang 1.1 CoviPhiiPhi(0),
49    
50 mingyang 1.4 NVertexes(0),
51     RelPreshowerEnergy(0),
52    
53     //MVA v2 and v1
54     RelIsoEcal(0),
55     RelIsoHcal(0),
56     tIso1(0),
57     tIso3(0),
58     tIso2(0)
59 mingyang 1.1 {
60     // Constructor.
61     }
62    
63     //--------------------------------------------------------------------------------------------------
64     void MVATools::InitializeMVA(int VariableType, TString EndcapWeights,TString BarrelWeights) {
65    
66     if (fReaderEndcap) delete fReaderEndcap;
67     if (fReaderBarrel) delete fReaderBarrel;
68    
69     fReaderEndcap = new TMVA::Reader( "!Color:!Silent:Error" );
70     fReaderBarrel = new TMVA::Reader( "!Color:!Silent:Error" );
71    
72     TMVA::Reader *readers[2];
73     readers[0] = fReaderEndcap;
74     readers[1] = fReaderBarrel;
75    
76     for (UInt_t i=0; i<2; ++i) {
77 mingyang 1.4
78 mingyang 1.1 if(VariableType==0||VariableType==1||VariableType==2){
79     readers[i]->AddVariable( "HoE", &HoE );
80     readers[i]->AddVariable( "covIEtaIEta", &covIEtaIEta );
81     readers[i]->AddVariable( "tIso1", &tIso1 );
82     readers[i]->AddVariable( "tIso3", &tIso3 );
83     readers[i]->AddVariable( "tIso2", &tIso2 );
84     readers[i]->AddVariable( "R9", &R9 );
85     }
86    
87 mingyang 1.4 if(VariableType==3||VariableType==4){
88     readers[i]->AddVariable( "HoE", &HoE );
89     readers[i]->AddVariable( "covIEtaIEta", &covIEtaIEta );
90     readers[i]->AddVariable( "tIso1abs", &tIso1abs );
91     readers[i]->AddVariable( "tIso3abs", &tIso3abs );
92     readers[i]->AddVariable( "tIso2abs", &tIso2abs );
93     readers[i]->AddVariable( "R9", &R9 );
94     }
95    
96 mingyang 1.1 if(VariableType==1||VariableType==2){
97 mingyang 1.4 readers[i]->AddVariable( "RelIsoEcal", &RelIsoEcal );
98     readers[i]->AddVariable( "RelIsoHcal", &RelIsoHcal );
99     readers[i]->AddVariable( "RelEMax", &RelEMax );
100     readers[i]->AddVariable( "RelETop", &RelETop );
101     readers[i]->AddVariable( "RelEBottom", &RelEBottom );
102     readers[i]->AddVariable( "RelELeft", &RelELeft );
103     readers[i]->AddVariable( "RelERight", &RelERight );
104     readers[i]->AddVariable( "RelE2x5Max", &RelE2x5Max );
105     readers[i]->AddVariable( "RelE2x5Top", &RelE2x5Top );
106     readers[i]->AddVariable( "RelE2x5Bottom", &RelE2x5Bottom );
107     readers[i]->AddVariable( "RelE2x5Left", &RelE2x5Left );
108     readers[i]->AddVariable( "RelE2x5Right", &RelE2x5Right );
109     readers[i]->AddVariable( "RelE5x5", &RelE5x5 );
110     }
111    
112     if(VariableType==3||VariableType==4){
113     readers[i]->AddVariable( "absIsoEcal", &absIsoEcal );
114     readers[i]->AddVariable( "absIsoHcal", &absIsoHcal );
115     readers[i]->AddVariable( "RelEMax", &RelEMax );
116     readers[i]->AddVariable( "RelETop", &RelEBottom);
117     readers[i]->AddVariable( "RelEBottom", &RelEBottom );
118 mingyang 1.1 readers[i]->AddVariable( "RelELeft", &RelELeft );
119 mingyang 1.4 readers[i]->AddVariable( "RelERight", &RelERight );
120 mingyang 1.1 readers[i]->AddVariable( "RelE2x5Max", &RelE2x5Max );
121     readers[i]->AddVariable( "RelE2x5Top", &RelE2x5Top );
122     readers[i]->AddVariable( "RelE2x5Bottom", &RelE2x5Bottom );
123     readers[i]->AddVariable( "RelE2x5Left", &RelE2x5Left );
124     readers[i]->AddVariable( "RelE2x5Right", &RelE2x5Right );
125     readers[i]->AddVariable( "RelE5x5", &RelE5x5 );
126     }
127    
128 mingyang 1.4 if(VariableType==2||VariableType==3||VariableType==4){
129 mingyang 1.1 readers[i]->AddVariable( "EtaWidth", &EtaWidth );
130     readers[i]->AddVariable( "PhiWidth", &PhiWidth );
131     readers[i]->AddVariable( "CoviEtaiPhi", &CoviEtaiPhi );
132     readers[i]->AddVariable( "CoviPhiiPhi", &CoviPhiiPhi );
133 mingyang 1.4 if(VariableType==4){
134     readers[i]->AddVariable( "NVertexes", &NVertexes );
135     }
136 mingyang 1.1 if(i==0){
137     readers[i]->AddVariable( "RelPreshowerEnergy", &RelPreshowerEnergy );
138     }
139     }
140     }
141    
142     fReaderEndcap->BookMVA("BDT method",EndcapWeights);
143     fReaderBarrel->BookMVA("BDT method",BarrelWeights);
144 mingyang 1.4
145 mingyang 1.1 assert(fReaderEndcap);
146     assert(fReaderBarrel);
147    
148     }
149    
150 mingyang 1.4 Bool_t MVATools::PassMVASelection(const Photon* p,const Vertex* vtx,const TrackCol* trackCol,const VertexCol* vtxCol,Double_t _tRho,const ElectronCol* els,Float_t bdtCutBarrel, Float_t bdtCutEndcap) {
151 mingyang 1.1
152     //initilize the bool value
153     PassMVA=kFALSE;
154    
155 mingyang 1.4 Float_t photon_bdt = MVATools::GetMVAbdtValue(p,vtx,trackCol,vtxCol, _tRho,els);
156 mingyang 1.1
157 mingyang 1.4 if (isbarrel) {
158     if(bdt>bdtCutBarrel){
159     PassMVA=kTRUE;
160     }
161 mingyang 1.1 }
162 mingyang 1.4 else {
163     if(bdt>bdtCutEndcap){
164     PassMVA=kTRUE;
165 mingyang 1.1 }
166 mingyang 1.4 }
167 mingyang 1.1 return PassMVA;
168     }
169    
170     //---------------------------------------------------------------------------------
171     Int_t MVATools::PassElectronVetoInt(const Photon* p, const ElectronCol* els) {
172    
173     // these values are taken from the H2GGlobe code... (actually from Marco/s mail)
174     float cic4_allcuts_temp_sublead[] = {
175     3.8, 2.2, 1.77, 1.29,
176     11.7, 3.4, 3.9, 1.84,
177     3.5, 2.2, 2.3, 1.45,
178     0.0106, 0.0097, 0.028, 0.027,
179     0.082, 0.062, 0.065, 0.048,
180     0.94, 0.36, 0.94, 0.32,
181     1., 0.062, 0.97, 0.97,
182     1.5, 1.5, 1.5, 1.5 }; // the last line is PixelmatchVeto and un-used
183    
184     //initilize the bool value
185     PassElecVetoInt=0;
186    
187     dRTrack = PhotonTools::ElectronVetoCiC(p, els);
188    
189     ScEta_MVA=p->SCluster()->Eta();
190    
191     isbarrel = (fabs(ScEta_MVA)<1.4442);
192    
193     R9 = p->R9();
194    
195     // check which category it is ...
196     _tCat = 1;
197     if ( !isbarrel ) _tCat = 3;
198     if ( R9 < 0.94 ) _tCat++;
199    
200     //Electron Veto
201     if(dRTrack > cic4_allcuts_temp_sublead[_tCat-1+6*4]){
202     PassElecVetoInt=1;
203     }
204    
205     return PassElecVetoInt;
206    
207     }
208    
209     //--------------------------------------------------------------------------------------------------
210    
211     Float_t MVATools::GetMVAbdtValue(const Photon* p,const Vertex* vtx,const TrackCol* trackCol,const VertexCol* vtxCol,Double_t _tRho,const ElectronCol* els) {
212    
213     //get the variables used to compute MVA variables
214     ecalIso3 = p->EcalRecHitIsoDr03();
215     ecalIso4 = p->EcalRecHitIsoDr04();
216     hcalIso4 = p->HcalTowerSumEtDr04();
217    
218     wVtxInd = 0;
219    
220     trackIso1 = IsolationTools::CiCTrackIsolation(p,vtx, 0.3, 0.02, 0.0, 0.0, 0.1, 1.0, trackCol);//Question Ming:whyfPV->At(0) instead of selected vertex using ranking method?
221    
222     // track iso only
223     trackIso3 = IsolationTools::CiCTrackIsolation(p,vtx, 0.3, 0.02, 0.0, 0.0, 0.1, 1.0, trackCol);
224    
225     // track iso worst vtx
226     trackIso2 = IsolationTools::CiCTrackIsolation(p,vtx, 0.4, 0.02, 0.0, 0.0, 0.1, 1.0, trackCol, &wVtxInd,vtxCol);
227    
228     combIso1 = ecalIso3+hcalIso4+trackIso1 - 0.17*_tRho;
229     combIso2 = ecalIso4+hcalIso4+trackIso2 - 0.52*_tRho;
230    
231     RawEnergy = p->SCluster()->RawEnergy();
232    
233     dRTrack = PhotonTools::ElectronVetoCiC(p, els);
234 mingyang 1.4
235     //mva varialbes v1 and v2
236 mingyang 1.1 tIso1 = (combIso1) *50./p->Et();
237     tIso3 = (trackIso3)*50./p->Et();
238     tIso2 = (combIso2) *50./(p->MomVtx(vtxCol->At(wVtxInd)->Position()).Pt());
239     RelIsoEcal=(ecalIso3-0.17*_tRho)/p->Et();
240     RelIsoHcal=(hcalIso4-0.17*_tRho)/p->Et();
241 mingyang 1.4
242     //compute mva variables for v3
243     HoE = p->HadOverEm();
244     covIEtaIEta = p->CoviEtaiEta();
245     tIso1abs = combIso1;
246     tIso3abs = trackIso3;
247     tIso2abs = combIso2;
248     R9 = p->R9();
249    
250     absIsoEcal=(ecalIso3-0.17*_tRho);
251     absIsoHcal=(hcalIso4-0.17*_tRho);
252 mingyang 1.1 RelEMax=p->SCluster()->Seed()->EMax()/RawEnergy;
253     RelETop=p->SCluster()->Seed()->ETop()/RawEnergy;
254     RelEBottom=p->SCluster()->Seed()->EBottom()/RawEnergy;
255     RelELeft=p->SCluster()->Seed()->ELeft()/RawEnergy;
256     RelERight=p->SCluster()->Seed()->ERight()/RawEnergy;
257     RelE2x5Max=p->SCluster()->Seed()->E2x5Max()/RawEnergy;
258     RelE2x5Top=p->SCluster()->Seed()->E2x5Top()/RawEnergy;
259     RelE2x5Bottom=p->SCluster()->Seed()->E2x5Bottom()/RawEnergy;
260     RelE2x5Left=p->SCluster()->Seed()->E2x5Left()/RawEnergy;
261     RelE2x5Right=p->SCluster()->Seed()->E2x5Right()/RawEnergy;
262     RelE5x5=p->SCluster()->Seed()->E5x5()/RawEnergy;
263    
264     EtaWidth=p->SCluster()->EtaWidth();
265     PhiWidth=p->SCluster()->PhiWidth();
266     CoviEtaiPhi=p->SCluster()->Seed()->CoviEtaiPhi();
267     CoviPhiiPhi=p->SCluster()->Seed()->CoviPhiiPhi();
268 mingyang 1.4
269 mingyang 1.1 RelPreshowerEnergy=p->SCluster()->PreshowerEnergy()/RawEnergy;
270 mingyang 1.4 NVertexes=vtxCol->GetEntries();
271 mingyang 1.1
272     //spectator variables
273     Pt_MVA=p->Pt();
274     ScEta_MVA=p->SCluster()->Eta();
275    
276     isbarrel = (fabs(ScEta_MVA)<1.4442);
277    
278     if (isbarrel) {
279     reader = fReaderBarrel;
280     }
281     else {
282     reader = fReaderEndcap;
283     }
284    
285     assert(reader);
286    
287     bdt = reader->EvaluateMVA("BDT method");
288    
289 mingyang 1.4 printf("HoE: %f\n",HoE);
290 mingyang 1.1 printf("covIEtaIEta: %f\n",covIEtaIEta);
291 mingyang 1.4 printf("tIso1abs: %f\n",tIso1abs);
292     printf("tIso3abs: %f\n",tIso3abs);
293     printf("tIso2abs: %f\n",tIso2abs);
294 mingyang 1.1
295 mingyang 1.4 printf("absIsoEcal: %f\n",absIsoEcal);
296     printf("absIsoHcal: %f\n",absIsoHcal);
297 mingyang 1.1 printf("RelEMax: %f\n",RelEMax);
298     printf("RelETop: %f\n",RelETop);
299     printf("RelEBottom: %f\n",RelEBottom);
300     printf("RelELeft: %f\n",RelELeft);
301     printf("RelERight: %f\n",RelERight);
302     printf("RelE2x5Max: %f\n",RelE2x5Max);
303     printf("RelE2x5Top: %f\n",RelE2x5Top);
304     printf("RelE2x5Bottom: %f\n",RelE2x5Bottom);
305     printf("RelE2x5Left: %f\n",RelE2x5Left);
306     printf("RelE2x5Right;: %f\n",RelE2x5Right);
307     printf("RelE5x5: %f\n",RelE5x5);
308    
309     printf("EtaWidth: %f\n",EtaWidth);
310     printf("PhiWidth: %f\n",PhiWidth);
311     printf("CoviEtaiPhi: %f\n",CoviEtaiPhi);
312     printf("CoviPhiiPhi: %f\n",CoviPhiiPhi);
313    
314 mingyang 1.4 if (!isbarrel) {
315 mingyang 1.1 printf("RelPreshowerEnergy: %f\n",RelPreshowerEnergy);
316 mingyang 1.4 }
317 mingyang 1.1
318     return bdt;
319     }