ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/MVATools.cc
Revision: 1.8
Committed: Tue Dec 13 21:13:23 2011 UTC (13 years, 4 months ago) by bendavid
Content type: text/plain
Branch: MAIN
Changes since 1.7: +4 -7 lines
Log Message:
gamma gamma Electron veto inversion, systematics mod, and macro

File Contents

# User Rev Content
1 bendavid 1.8 // $Id: MVATools.cc,v 1.7 2011/12/11 00:03:05 bendavid 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 mingyang 1.6
141     if(VariableType==6){
142     readers[i]->AddVariable( "HoE", &HoE );
143     readers[i]->AddVariable( "covIEtaIEta", &covIEtaIEta );
144     readers[i]->AddVariable( "tIso1abs", &tIso1abs );
145     readers[i]->AddVariable( "tIso3abs", &tIso3abs );
146     readers[i]->AddVariable( "tIso2abs", &tIso2abs );
147     readers[i]->AddVariable( "R9", &R9 );
148     readers[i]->AddVariable( "absIsoEcal", &absIsoEcal );
149     readers[i]->AddVariable( "absIsoHcal", &absIsoHcal );
150     readers[i]->AddVariable( "RelE5x5", &RelE5x5 );
151     readers[i]->AddVariable( "EtaWidth", &EtaWidth );
152     readers[i]->AddVariable( "PhiWidth", &PhiWidth );
153     readers[i]->AddVariable( "CoviEtaiPhi", &CoviEtaiPhi );
154     readers[i]->AddVariable( "CoviPhiiPhi", &CoviPhiiPhi );
155     readers[i]->AddVariable( "NVertexes", &NVertexes );
156     if(i==0){
157     readers[i]->AddVariable( "RelPreshowerEnergy", &RelPreshowerEnergy );
158     }
159     }
160    
161 mingyang 1.1 }
162    
163     fReaderEndcap->BookMVA("BDT method",EndcapWeights);
164     fReaderBarrel->BookMVA("BDT method",BarrelWeights);
165 mingyang 1.4
166 mingyang 1.1 assert(fReaderEndcap);
167     assert(fReaderBarrel);
168    
169     }
170    
171 bendavid 1.7 Bool_t MVATools::PassMVASelection(const Photon* p,const Vertex* vtx,const TrackCol* trackCol,const VertexCol* vtxCol,Double_t _tRho,Float_t bdtCutBarrel, Float_t bdtCutEndcap, const ElectronCol* els, Bool_t applyElectronVeto) {
172 mingyang 1.1
173     //initilize the bool value
174     PassMVA=kFALSE;
175    
176 bendavid 1.7 Float_t photon_bdt = MVATools::GetMVAbdtValue(p,vtx,trackCol,vtxCol, _tRho, els, applyElectronVeto);
177 mingyang 1.1
178 mingyang 1.4 if (isbarrel) {
179     if(bdt>bdtCutBarrel){
180     PassMVA=kTRUE;
181     }
182 mingyang 1.1 }
183 mingyang 1.4 else {
184     if(bdt>bdtCutEndcap){
185     PassMVA=kTRUE;
186 mingyang 1.1 }
187 mingyang 1.4 }
188 mingyang 1.1 return PassMVA;
189     }
190    
191     //---------------------------------------------------------------------------------
192     Int_t MVATools::PassElectronVetoInt(const Photon* p, const ElectronCol* els) {
193    
194     // these values are taken from the H2GGlobe code... (actually from Marco/s mail)
195     float cic4_allcuts_temp_sublead[] = {
196     3.8, 2.2, 1.77, 1.29,
197     11.7, 3.4, 3.9, 1.84,
198     3.5, 2.2, 2.3, 1.45,
199     0.0106, 0.0097, 0.028, 0.027,
200     0.082, 0.062, 0.065, 0.048,
201     0.94, 0.36, 0.94, 0.32,
202     1., 0.062, 0.97, 0.97,
203     1.5, 1.5, 1.5, 1.5 }; // the last line is PixelmatchVeto and un-used
204    
205     //initilize the bool value
206     PassElecVetoInt=0;
207    
208     dRTrack = PhotonTools::ElectronVetoCiC(p, els);
209    
210     ScEta_MVA=p->SCluster()->Eta();
211    
212     isbarrel = (fabs(ScEta_MVA)<1.4442);
213    
214 bendavid 1.7 //R9 = p->R9();
215     R9 = p->E33()/p->SCluster()->RawEnergy();
216 mingyang 1.1
217     // check which category it is ...
218     _tCat = 1;
219     if ( !isbarrel ) _tCat = 3;
220     if ( R9 < 0.94 ) _tCat++;
221    
222     //Electron Veto
223     if(dRTrack > cic4_allcuts_temp_sublead[_tCat-1+6*4]){
224     PassElecVetoInt=1;
225     }
226    
227     return PassElecVetoInt;
228    
229     }
230    
231     //--------------------------------------------------------------------------------------------------
232    
233 bendavid 1.7 Float_t MVATools::GetMVAbdtValue(const Photon* p,const Vertex* vtx,const TrackCol* trackCol,const VertexCol* vtxCol,Double_t _tRho, const ElectronCol* els, Bool_t applyElectronVeto) {
234 mingyang 1.1
235     //get the variables used to compute MVA variables
236     ecalIso3 = p->EcalRecHitIsoDr03();
237     ecalIso4 = p->EcalRecHitIsoDr04();
238     hcalIso4 = p->HcalTowerSumEtDr04();
239    
240     wVtxInd = 0;
241    
242 bendavid 1.7 trackIso1 = IsolationTools::CiCTrackIsolation(p,vtx, 0.3, 0.02, 0.0, 0.0, 0.1, 1.0, trackCol, NULL, NULL, (!applyElectronVeto ? els : NULL) );//Question Ming:whyfPV->At(0) instead of selected vertex using ranking method?
243 bendavid 1.8
244 mingyang 1.1 // track iso worst vtx
245 bendavid 1.7 trackIso2 = IsolationTools::CiCTrackIsolation(p,vtx, 0.4, 0.02, 0.0, 0.0, 0.1, 1.0, trackCol, &wVtxInd,vtxCol, (!applyElectronVeto ? els : NULL) );
246 mingyang 1.1
247     combIso1 = ecalIso3+hcalIso4+trackIso1 - 0.17*_tRho;
248     combIso2 = ecalIso4+hcalIso4+trackIso2 - 0.52*_tRho;
249    
250     RawEnergy = p->SCluster()->RawEnergy();
251    
252 mingyang 1.4 //mva varialbes v1 and v2
253 mingyang 1.1 tIso1 = (combIso1) *50./p->Et();
254 bendavid 1.8 tIso3 = (trackIso1)*50./p->Et();
255 mingyang 1.1 tIso2 = (combIso2) *50./(p->MomVtx(vtxCol->At(wVtxInd)->Position()).Pt());
256     RelIsoEcal=(ecalIso3-0.17*_tRho)/p->Et();
257     RelIsoHcal=(hcalIso4-0.17*_tRho)/p->Et();
258 mingyang 1.4
259     //compute mva variables for v3
260     HoE = p->HadOverEm();
261     covIEtaIEta = p->CoviEtaiEta();
262     tIso1abs = combIso1;
263 bendavid 1.8 tIso3abs = trackIso1;
264 mingyang 1.4 tIso2abs = combIso2;
265     R9 = p->R9();
266    
267     absIsoEcal=(ecalIso3-0.17*_tRho);
268     absIsoHcal=(hcalIso4-0.17*_tRho);
269 mingyang 1.1 RelEMax=p->SCluster()->Seed()->EMax()/RawEnergy;
270     RelETop=p->SCluster()->Seed()->ETop()/RawEnergy;
271     RelEBottom=p->SCluster()->Seed()->EBottom()/RawEnergy;
272     RelELeft=p->SCluster()->Seed()->ELeft()/RawEnergy;
273     RelERight=p->SCluster()->Seed()->ERight()/RawEnergy;
274     RelE2x5Max=p->SCluster()->Seed()->E2x5Max()/RawEnergy;
275     RelE2x5Top=p->SCluster()->Seed()->E2x5Top()/RawEnergy;
276     RelE2x5Bottom=p->SCluster()->Seed()->E2x5Bottom()/RawEnergy;
277     RelE2x5Left=p->SCluster()->Seed()->E2x5Left()/RawEnergy;
278     RelE2x5Right=p->SCluster()->Seed()->E2x5Right()/RawEnergy;
279     RelE5x5=p->SCluster()->Seed()->E5x5()/RawEnergy;
280    
281     EtaWidth=p->SCluster()->EtaWidth();
282     PhiWidth=p->SCluster()->PhiWidth();
283     CoviEtaiPhi=p->SCluster()->Seed()->CoviEtaiPhi();
284     CoviPhiiPhi=p->SCluster()->Seed()->CoviPhiiPhi();
285 mingyang 1.4
286 mingyang 1.1 RelPreshowerEnergy=p->SCluster()->PreshowerEnergy()/RawEnergy;
287 mingyang 1.4 NVertexes=vtxCol->GetEntries();
288 mingyang 1.1
289     //spectator variables
290     Pt_MVA=p->Pt();
291     ScEta_MVA=p->SCluster()->Eta();
292    
293     isbarrel = (fabs(ScEta_MVA)<1.4442);
294    
295     if (isbarrel) {
296     reader = fReaderBarrel;
297     }
298     else {
299     reader = fReaderEndcap;
300     }
301    
302     assert(reader);
303    
304     bdt = reader->EvaluateMVA("BDT method");
305    
306 mingyang 1.5 /* printf("HoE: %f\n",HoE);
307 mingyang 1.1 printf("covIEtaIEta: %f\n",covIEtaIEta);
308 mingyang 1.4 printf("tIso1abs: %f\n",tIso1abs);
309     printf("tIso3abs: %f\n",tIso3abs);
310     printf("tIso2abs: %f\n",tIso2abs);
311 mingyang 1.1
312 mingyang 1.4 printf("absIsoEcal: %f\n",absIsoEcal);
313     printf("absIsoHcal: %f\n",absIsoHcal);
314 mingyang 1.1 printf("RelEMax: %f\n",RelEMax);
315     printf("RelETop: %f\n",RelETop);
316     printf("RelEBottom: %f\n",RelEBottom);
317     printf("RelELeft: %f\n",RelELeft);
318     printf("RelERight: %f\n",RelERight);
319     printf("RelE2x5Max: %f\n",RelE2x5Max);
320     printf("RelE2x5Top: %f\n",RelE2x5Top);
321     printf("RelE2x5Bottom: %f\n",RelE2x5Bottom);
322     printf("RelE2x5Left: %f\n",RelE2x5Left);
323     printf("RelE2x5Right;: %f\n",RelE2x5Right);
324     printf("RelE5x5: %f\n",RelE5x5);
325    
326     printf("EtaWidth: %f\n",EtaWidth);
327     printf("PhiWidth: %f\n",PhiWidth);
328     printf("CoviEtaiPhi: %f\n",CoviEtaiPhi);
329     printf("CoviPhiiPhi: %f\n",CoviPhiiPhi);
330    
331 mingyang 1.4 if (!isbarrel) {
332 mingyang 1.1 printf("RelPreshowerEnergy: %f\n",RelPreshowerEnergy);
333 mingyang 1.5 }*/
334 mingyang 1.1
335     return bdt;
336     }