ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/JetIDMVA.cc
Revision: 1.10
Committed: Sat May 12 07:26:56 2012 UTC (12 years, 11 months ago) by ceballos
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_028, Mit_027, Mit_027a
Changes since 1.9: +30 -9 lines
Log Message:
adding rho functionality

File Contents

# Content
1 #include "FWCore/PythonParameterSet/interface/MakeParameterSets.h"
2 #include "FWCore/ParameterSet/interface/ParameterSet.h"
3 #include "MitPhysics/Utils/interface/JetIDMVA.h"
4 #include "MitPhysics/Utils/interface/JetTools.h"
5 #include "MitAna/DataTree/interface/StableData.h"
6 #include <TFile.h>
7 #include <TRandom3.h>
8 #include "TMVA/Tools.h"
9 #include "TMVA/Reader.h"
10
11
12 ClassImp(mithep::JetIDMVA)
13
14 using namespace mithep;
15
16 //--------------------------------------------------------------------------------------------------
17 JetIDMVA::JetIDMVA() :
18 fJetPtMin(0.) , //We need to lower this
19 fDZCut (0.2),
20 fLowPtMethodName ("JetIDMVALowPt" ),
21 fHighPtMethodName("JetIDMVAHighPt"),
22 fIsInitialized(kFALSE),
23 fNVtx (0),
24 fJPt1 (0),
25 fJEta1 (0),
26 fJPhi1 (0),
27 fJD01 (0),
28 fJDZ1 (0),
29 fBeta (0),
30 fBetaStar (0),
31 fNCharged (0),
32 fNNeutrals(0),
33 fDRMean (0),
34 fFrac01 (0),
35 fFrac02 (0),
36 fFrac03 (0),
37 fFrac04 (0),
38 fFrac05 (0)
39 {
40 fReader = 0;
41 }
42 //--------------------------------------------------------------------------------------------------
43 JetIDMVA::~JetIDMVA() {
44
45 fReader = 0;
46 }
47
48 //--------------------------------------------------------------------------------------------------
49 void JetIDMVA::Initialize( JetIDMVA::CutType iCutType,
50 TString iLowPtWeights,
51 TString iHighPtWeights,
52 JetIDMVA::MVAType iType,
53 TString iCutFileName)
54 {
55
56 fIsInitialized = kTRUE;
57 fType = iType;
58 fCutType = iCutType;
59 fReader = 0;
60 fReader = new TMVA::Reader( "!Color:!Silent:Error" );
61 if (fType == kBaseline) {
62 fReader->AddVariable( "nvtx" , &fNVtx );
63 fReader->AddVariable( "jetPt" , &fJPt1 );
64 fReader->AddVariable( "jetEta" , &fJEta1 );
65 fReader->AddVariable( "jetPhi" , &fJPhi1 );
66 fReader->AddVariable( "dZ" , &fJDZ1 );
67 fReader->AddVariable( "d0" , &fJD01 );
68 fReader->AddVariable( "beta" , &fBeta );
69 fReader->AddVariable( "betaStar" , &fBetaStar );
70 fReader->AddVariable( "nCharged" , &fNCharged );
71 fReader->AddVariable( "nNeutrals", &fNNeutrals );
72 fReader->AddVariable( "dRMean" , &fDRMean );
73 fReader->AddVariable( "frac01" , &fFrac01 );
74 fReader->AddVariable( "frac02" , &fFrac02 );
75 fReader->AddVariable( "frac03" , &fFrac03 );
76 fReader->AddVariable( "frac04" , &fFrac04 );
77 fReader->AddVariable( "frac05" , &fFrac05 );
78 }
79 fReader->BookMVA(fLowPtMethodName , iLowPtWeights );
80 fReader->BookMVA(fHighPtMethodName , iHighPtWeights );
81 std::cout << "Jet ID MVA Initialization\n";
82 std::cout << "MethodName : " << fLowPtMethodName << " , type == " << fType << std::endl;
83
84 //Load Cut Matrix
85 edm::ParameterSet lConfig = edm::readPSetsFrom(iCutFileName.Data())->getParameter<edm::ParameterSet>("JetIdParams");
86 std::string lCutType = "Tight";
87 if(fCutType == kMedium) lCutType = "Medium";
88 if(fCutType == kLoose ) lCutType = "Loose";
89 if(fCutType == kMET ) lCutType = "MET";
90 std::vector<double> lPt010 = lConfig.getParameter<std::vector<double> >(("Pt010_" +lCutType).c_str());
91 std::vector<double> lPt1020 = lConfig.getParameter<std::vector<double> >(("Pt1020_"+lCutType).c_str());
92 std::vector<double> lPt2030 = lConfig.getParameter<std::vector<double> >(("Pt2030_"+lCutType).c_str());
93 std::vector<double> lPt3050 = lConfig.getParameter<std::vector<double> >(("Pt3050_"+lCutType).c_str());
94 for(int i0 = 0; i0 < 4; i0++) fMVACut[0][i0] = lPt010 [i0];
95 for(int i0 = 0; i0 < 4; i0++) fMVACut[1][i0] = lPt1020[i0];
96 for(int i0 = 0; i0 < 4; i0++) fMVACut[2][i0] = lPt2030[i0];
97 for(int i0 = 0; i0 < 4; i0++) fMVACut[3][i0] = lPt3050[i0];
98 //std::cout << " Working Points : << " << std::endl;
99 //for(int i0 = 0; i0 < 4; i0++) for(int i1 = 0; i1 < 4; i1++)
100 // std::cout << " ==> " << i0 << " -- " << i1 << " -- " << fMVACut[i0][i1] << std::endl;
101 }
102
103 //--------------------------------------------------------------------------------------------------
104 Double_t JetIDMVA::MVAValue(
105 Float_t iNPV ,
106 Float_t iJPt1 ,
107 Float_t iJEta1 ,
108 Float_t iJPhi1 ,
109 Float_t iJD01 ,
110 Float_t iJDZ1 ,
111 Float_t iBeta ,
112 Float_t iBetaStar,
113 Float_t iNCharged,
114 Float_t iNNeutrals,
115 Float_t iDRMean ,
116 Float_t iFrac01 ,
117 Float_t iFrac02 ,
118 Float_t iFrac03 ,
119 Float_t iFrac04 ,
120 Float_t iFrac05
121 ){
122
123 if(!fIsInitialized) {
124 std::cout << "Error: JetIDMVA not properly initialized.\n";
125 return -9999;
126 }
127
128 fNVtx = iNPV;
129 fJPt1 = iJPt1;
130 fJEta1 = iJEta1;
131 fJPhi1 = fJPhi1;
132 fJD01 = iJD01;
133 fJDZ1 = iJDZ1;
134 fBeta = iBeta;
135 fBetaStar = iBetaStar;
136 fNCharged = iNCharged;
137 fNNeutrals = iNNeutrals;
138 fDRMean = iDRMean;
139 fFrac01 = iFrac01;
140 fFrac02 = iFrac02;
141 fFrac03 = iFrac03;
142 fFrac04 = iFrac04;
143 fFrac05 = iFrac05;
144
145 Double_t lMVA = -9999;
146 if(iJPt1 < 10) lMVA = fReader->EvaluateMVA( fLowPtMethodName );
147 if(iJPt1 > 10) lMVA = fReader->EvaluateMVA( fHighPtMethodName );
148
149 return lMVA;
150 }
151 //--------------------------------------------------------------------------------------------------
152 Bool_t JetIDMVA::pass(const PFJet *iJet,const Vertex *iVertex,const VertexCol *iVertices,
153 FactorizedJetCorrector *iJetCorrector,
154 const PileupEnergyDensityCol *iPileupEnergyDensity,
155 RhoUtilities::RhoType type) {
156
157 if(!JetTools::passPFLooseId(iJet)) return false;
158 if(fabs(iJet->Eta()) > 4.99) return false;
159
160 double lMVA = MVAValue (iJet,iVertex,iVertices,iJetCorrector,iPileupEnergyDensity);
161 double lPt = correctedPt(iJet, iJetCorrector,iPileupEnergyDensity,type);
162 if(lPt < fJetPtMin) return false;
163
164 int lPtId = 0;
165 if(lPt > 10 && lPt < 20) lPtId = 1;
166 if(lPt > 20 && lPt < 30) lPtId = 2;
167 if(lPt > 30 ) lPtId = 3;
168
169 int lEtaId = 0;
170 if(fabs(iJet->Eta()) > 2.5 && fabs(iJet->Eta()) < 2.75) lEtaId = 1;
171 if(fabs(iJet->Eta()) > 2.75 && fabs(iJet->Eta()) < 3.0 ) lEtaId = 2;
172 if(fabs(iJet->Eta()) > 3.0 && fabs(iJet->Eta()) < 5.0 ) lEtaId = 3;
173
174 double lMVACut = fMVACut[lPtId][lEtaId];
175 if(lMVA < lMVACut) return false;
176 return true;
177 }
178 //--------------------------------------------------------------------------------------------------
179 Bool_t JetIDMVA::pass(const PFJet *iJet,const Vertex *iVertex,const VertexCol *iVertices) {
180 if(!JetTools::passPFLooseId(iJet)) return false;
181 if(iJet->Pt() < fJetPtMin) return false;
182 if(fabs(iJet->Eta()) > 4.99) return false;
183 double lMVA = MVAValue(iJet,iVertex,iVertices);
184
185 int lPtId = 0;
186 if(iJet->Pt() > 10 && iJet->Pt() < 20) lPtId = 1;
187 if(iJet->Pt() > 20 && iJet->Pt() < 30) lPtId = 2;
188 if(iJet->Pt() > 30 ) lPtId = 3;
189
190 int lEtaId = 0;
191 if(fabs(iJet->Eta()) > 2.5 && fabs(iJet->Eta()) < 2.75) lEtaId = 1;
192 if(fabs(iJet->Eta()) > 2.75 && fabs(iJet->Eta()) < 3.0 ) lEtaId = 2;
193 if(fabs(iJet->Eta()) > 3.0 && fabs(iJet->Eta()) < 5.0 ) lEtaId = 3;
194
195 double lMVACut = fMVACut[lPtId][lEtaId];
196 if(lMVA < lMVACut) return false;
197 return true;
198 //if(lMVA < -0.8) return false;
199 //if(lMVA < -0.5 && fabs(iJet->Eta()) > 3.0) return false;
200 //if(iJet->Pt() < fJetPtMin && iJet->TrackCountingHighEffBJetTagsDisc() == -100) return false; //This line is a bug in the Met training
201 //if( fabs(JetTools::impactParameter(iJet,iVertex,true)) < 0.2) return true;
202 }
203 //--------------------------------------------------------------------------------------------------
204 Double_t JetIDMVA::MVAValue(const PFJet *iJet,const Vertex *iVertex,const VertexCol *iVertices, //Vertex here is the PV
205 FactorizedJetCorrector *iJetCorrector,
206 const PileupEnergyDensityCol *iPileupEnergyDensity,
207 Bool_t printDebug) {
208
209 if (!fIsInitialized) {
210 std::cout << "Error: JetIDMVA not properly initialized.\n";
211 return -9999;
212 }
213 if(!JetTools::passPFLooseId(iJet)) return -2.;
214
215 //set all input variables
216 fNVtx = iVertices->GetEntries();
217 fJPt1 = correctedPt(iJet,iJetCorrector,iPileupEnergyDensity);
218 fJEta1 = iJet->RawMom().Eta();
219 fJPhi1 = iJet->RawMom().Phi();
220 fJD01 = JetTools::impactParameter(iJet,iVertex);
221 fJDZ1 = JetTools::impactParameter(iJet,iVertex,true);
222 fBeta = JetTools::Beta(iJet,iVertex,fDZCut);
223 fBetaStar = JetTools::betaStar(iJet,iVertex,iVertices,fDZCut);
224 fNCharged = iJet->ChargedMultiplicity();
225 fNNeutrals = iJet->NeutralMultiplicity();
226
227 fDRMean = JetTools::dRMean(iJet,-1);
228 fFrac01 = JetTools::frac (iJet,0.1,0. ,-1);
229 fFrac02 = JetTools::frac (iJet,0.2,0.1,-1);
230 fFrac03 = JetTools::frac (iJet,0.3,0.2,-1);
231 fFrac04 = JetTools::frac (iJet,0.4,0.3,-1);
232 fFrac05 = JetTools::frac (iJet,0.5,0.4,-1);
233
234 double lMVA = 0;
235 if(fJPt1 < 10) lMVA = fReader->EvaluateMVA( fLowPtMethodName );
236 if(fJPt1 > 10) lMVA = fReader->EvaluateMVA( fHighPtMethodName );
237 if (printDebug == kTRUE) {
238 std::cout << "Debug Jet MVA: "
239 << fNVtx << " "
240 << fJPt1 << " "
241 << fJEta1 << " "
242 << fJPhi1 << " "
243 << fJD01 << " "
244 << fJDZ1 << " "
245 << fBeta << " "
246 << fBetaStar << " "
247 << fNCharged << " "
248 << fNNeutrals << " "
249 << fDRMean << " "
250 << fFrac01 << " "
251 << fFrac02 << " "
252 << fFrac03 << " "
253 << fFrac04 << " "
254 << fFrac05
255 << " === : === "
256 << lMVA << " "
257 << std::endl;
258 }
259
260 return lMVA;
261 }
262 Double_t JetIDMVA::MVAValue(const PFJet *iJet,const Vertex *iVertex, const VertexCol *iVertices,//Vertex here is the PV
263 Bool_t printDebug) {
264
265 if (!fIsInitialized) {
266 std::cout << "Error: JetIDMVA not properly initialized.\n";
267 return -9999;
268 }
269 if(!JetTools::passPFLooseId(iJet)) return -2.;
270
271 //set all input variables
272 fNVtx = iVertices->GetEntries();
273 fJPt1 = iJet->Pt();
274 fJEta1 = iJet->RawMom().Eta();
275 fJPhi1 = iJet->RawMom().Phi();
276 fJD01 = JetTools::impactParameter(iJet,iVertex);
277 fJDZ1 = JetTools::impactParameter(iJet,iVertex,true);
278 fBeta = JetTools::Beta(iJet,iVertex,fDZCut);
279 fBetaStar = JetTools::betaStar(iJet,iVertex,iVertices,fDZCut);
280 fNCharged = iJet->ChargedMultiplicity();
281 fNNeutrals = iJet->NeutralMultiplicity();
282
283 fDRMean = JetTools::dRMean(iJet,-1);
284 fFrac01 = JetTools::frac (iJet,0.1,0. ,-1);
285 fFrac02 = JetTools::frac (iJet,0.2,0.1,-1);
286 fFrac03 = JetTools::frac (iJet,0.3,0.2,-1);
287 fFrac04 = JetTools::frac (iJet,0.4,0.3,-1);
288 fFrac05 = JetTools::frac (iJet,0.5,0.4,-1);
289
290 double lMVA = 0;
291 if(fJPt1 < 10) lMVA = fReader->EvaluateMVA( fLowPtMethodName );
292 if(fJPt1 > 10) lMVA = fReader->EvaluateMVA( fHighPtMethodName );
293
294 if (printDebug == kTRUE) {
295 std::cout << "Debug Jet MVA: "
296 << fNVtx << " "
297 << fJPt1 << " "
298 << fJEta1 << " "
299 << fJPhi1 << " "
300 << fJD01 << " "
301 << fJDZ1 << " "
302 << fBeta << " "
303 << fBetaStar << " "
304 << fNCharged << " "
305 << fNNeutrals << " "
306 << fDRMean << " "
307 << fFrac01 << " "
308 << fFrac02 << " "
309 << fFrac03 << " "
310 << fFrac04 << " "
311 << fFrac05
312 << " === : === "
313 << lMVA << " "
314 << std::endl;
315 }
316
317 return lMVA;
318 }
319 Double_t JetIDMVA::correctedPt(const PFJet *iJet, FactorizedJetCorrector *iJetCorrector,
320 const PileupEnergyDensityCol *iPUEnergyDensity,
321 RhoUtilities::RhoType type) {
322 Double_t Rho = 0.0;
323 switch(type) {
324 case RhoUtilities::MIT_RHO_VORONOI_HIGH_ETA:
325 Rho = iPUEnergyDensity->At(0)->Rho();
326 break;
327 case RhoUtilities::MIT_RHO_VORONOI_LOW_ETA:
328 Rho = iPUEnergyDensity->At(0)->RhoLowEta();
329 break;
330 case RhoUtilities::MIT_RHO_RANDOM_HIGH_ETA:
331 Rho = iPUEnergyDensity->At(0)->RhoRandom();
332 break;
333 case RhoUtilities::MIT_RHO_RANDOM_LOW_ETA:
334 Rho = iPUEnergyDensity->At(0)->RhoRandomLowEta();
335 break;
336 case RhoUtilities::CMS_RHO_RHOKT6PFJETS:
337 Rho = iPUEnergyDensity->At(0)->RhoKt6PFJets();
338 break;
339 default:
340 // use the old default
341 Rho = iPUEnergyDensity->At(0)->Rho();
342 break;
343 }
344
345 const FourVectorM rawMom = iJet->RawMom();
346 iJetCorrector->setJetEta(rawMom.Eta());
347 iJetCorrector->setJetPt (rawMom.Pt());
348 iJetCorrector->setJetPhi(rawMom.Phi());
349 iJetCorrector->setJetE (rawMom.E());
350 iJetCorrector->setRho (Rho);
351 iJetCorrector->setJetA (iJet->JetArea());
352 iJetCorrector->setJetEMF(-99.0);
353 Double_t correction = iJetCorrector->getCorrection();
354 return rawMom.Pt()*correction;
355 }