ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/src/MVAMet.cc
Revision: 1.30
Committed: Sat Jan 12 11:49:50 2013 UTC (12 years, 3 months ago) by pharris
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_029c, Mit_029b, Mit_029a
Changes since 1.29: +84 -2 lines
Log Message:
Updated MVA Met and Jet ID

File Contents

# Content
1 #include "MitPhysics/Utils/interface/MVAMet.h"
2 #include "MitPhysics/Utils/interface/MetLeptonTools.h"
3 #include "MitPhysics/Utils/interface/JetTools.h"
4 #include "MitPhysics/Utils/interface/RecoilTools.h"
5 #include "MitAna/DataTree/interface/StableData.h"
6 #include <TFile.h>
7 #include <TRandom3.h>
8 #include "CondFormats/EgammaObjects/interface/GBRForest.h"
9 #include "Cintex/Cintex.h"
10 #include <utility>
11
12 ClassImp(mithep::MVAMet)
13
14 using namespace mithep;
15
16 //--------------------------------------------------------------------------------------------------
17 MVAMet::MVAMet() :
18 fRecoilTools(0),
19 fPhiMethodName ("PhiCorrection"),
20 fU1MethodName ("U1Correction"),
21 fCovU1MethodName ("CovU1"),
22 fCovU2MethodName ("CovU2"),
23 fIsInitialized(kFALSE),
24 fU (0),
25 fUPhi (0),
26 fTKSumEt(0),
27 fTKU (0),
28 fTKUPhi (0),
29 fNPSumEt(0),
30 fNPU (0),
31 fNPUPhi (0),
32 fPUSumEt(0),
33 fPUMet (0),
34 fPUMetPhi(0),
35 fPCSumEt(0),
36 fPCU (0),
37 fPCUPhi (0),
38 fJSPt1 (0),
39 fJSEta1 (0),
40 fJSPhi1 (0),
41 fJSPt2 (0),
42 fJSEta2 (0),
43 fJSPhi2 (0),
44 fNJet (0),
45 fNAllJet(0),
46 fNPV (0),
47 fPhiReader(0),
48 fU1Reader(0),
49 fCovU1Reader(0),
50 fCovU2Reader(0),
51 fMetLeptonTools(0) { }
52 //--------------------------------------------------------------------------------------------------
53 MVAMet::~MVAMet()
54 {
55 delete fPhiReader;
56 delete fU1Reader;
57 delete fCovU1Reader;
58 delete fCovU2Reader;
59
60 }
61 //--------------------------------------------------------------------------------------------------
62 /*
63 void MVAMet::setVariables(TMVA::Reader *iReader,bool iScale) {
64 iReader->AddVariable( "npv" , &fNPV );
65 iReader->AddVariable( "u" , &fU );
66 iReader->AddVariable( "uphi" , &fUPhi );
67 iReader->AddVariable( "chsumet/sumet" , &fTKSumEt );
68 iReader->AddVariable( "tku" , &fTKU );
69 iReader->AddVariable( "tkuphi" , &fTKUPhi );
70 iReader->AddVariable( "nopusumet/sumet" , &fNPSumEt );
71 iReader->AddVariable( "nopuu" , &fNPU );
72 iReader->AddVariable( "nopuuphi" , &fNPUPhi );
73 iReader->AddVariable( "pusumet/sumet" , &fPUSumEt );
74 iReader->AddVariable( "pumet" , &fPUMet );
75 iReader->AddVariable( "pumetphi" , &fPUMetPhi);
76 iReader->AddVariable( "pucsumet/sumet" , &fPCSumEt );
77 iReader->AddVariable( "pucu" , &fPCU );
78 iReader->AddVariable( "pucuphi" , &fPCUPhi );
79 iReader->AddVariable( "jspt_1" , &fJSPt1 );
80 iReader->AddVariable( "jseta_1" , &fJSEta1 );
81 iReader->AddVariable( "jsphi_1" , &fJSPhi1 );
82 iReader->AddVariable( "jspt_2" , &fJSPt2 );
83 iReader->AddVariable( "jseta_2" , &fJSEta2 );
84 iReader->AddVariable( "jsphi_2" , &fJSPhi2 );
85 iReader->AddVariable( "nalljet" , &fNAllJet );
86 iReader->AddVariable( "njet" , &fNJet );
87 if(iScale) iReader->AddVariable( "uphi_mva" , &fUPhiMVA );
88 }
89 //--------------------------------------------------------------------------------------------------
90 void MVAMet::Initialize( TString iU1MethodName,
91 TString iPhiMethodName,
92 TString iJetMVAFile,
93 TString iU1Weights,
94 TString iPhiWeights,
95 MVAMet::MVAType iType) {
96
97 fIsInitialized = kTRUE;
98 fRecoilTools = new RecoilTools(iJetMVAFile);
99
100 fU1MethodName = iU1MethodName;
101 fPhiMethodName = iPhiMethodName;
102 fType = iType;
103 fPhiReader = new TMVA::Reader( "!Color:!Silent:Error" );
104 fU1Reader = new TMVA::Reader( "!Color:!Silent:Error" );
105 if (fType == kBaseline) {
106 setVariables(fPhiReader,false);
107 setVariables(fU1Reader ,true);
108 }
109 fPhiReader->BookMVA(fPhiMethodName , iPhiWeights );
110 fU1Reader ->BookMVA(fU1MethodName , iU1Weights );
111
112 std::cout << "Jet ID MVA Initialization\n";
113 std::cout << "Phi Method Name : " << fPhiMethodName << " , type == " << iType << std::endl;
114 std::cout << "U1 Method Name : " << fU1MethodName << " , type == " << iType << std::endl;
115
116
117 }
118 */
119 //--------------------------------------------------------------------------------------------------
120 void MVAMet::Initialize(TString iJetLowPtFile,
121 TString iJetHighPtFile,
122 TString iJetCutFile,
123 TString iU1Weights,
124 TString iPhiWeights,
125 TString iCovU1Weights,
126 TString iCovU2Weights,
127 JetIDMVA::MVAType iType) {
128
129 fIsInitialized = kTRUE;
130 fType = iType;
131 f42 = iU1Weights.Contains("42");
132
133 fRecoilTools = new RecoilTools(iJetLowPtFile,iJetHighPtFile,iJetCutFile,f42,fType);
134 if(f42) fRecoilTools->fJetIDMVA->fJetPtMin = 1.;
135
136 ROOT::Cintex::Cintex::Enable();
137
138 TFile *lPhiForest = new TFile(iPhiWeights,"READ");
139 fPhiReader = (GBRForest*)lPhiForest->Get(fPhiMethodName);
140 lPhiForest->Close();
141
142 TFile *lU1Forest = new TFile(iU1Weights,"READ");
143 fU1Reader = (GBRForest*)lU1Forest->Get(fU1MethodName);
144 lU1Forest->Close();
145
146 TFile *lCovU1Forest = new TFile(iCovU1Weights,"READ");
147 fCovU1Reader = (GBRForest*)lCovU1Forest->Get(fCovU1MethodName);
148 lCovU1Forest->Close();
149
150 TFile *lCovU2Forest = new TFile(iCovU2Weights,"READ");
151 fCovU2Reader = (GBRForest*)lCovU2Forest->Get(fCovU2MethodName);
152 lCovU2Forest->Close();
153
154 fCov = new TMatrixD(2,2);
155 fPhiVals = new Float_t[23];
156 fU1Vals = new Float_t[25];
157 fCovVals = new Float_t[26];
158
159
160 fMetLeptonTools = new MetLeptonTools();
161 }
162 //--------------------------------------------------------------------------------------------------
163 Float_t* MVAMet::getVals() {
164 fU1Vals[0] = fSumEt ;
165 fU1Vals[1] = fNPV ;
166 fU1Vals[2] = fU ;
167 fU1Vals[3] = fUPhi ;
168 fU1Vals[4] = fTKSumEt ;
169 fU1Vals[5] = fTKU ;
170 fU1Vals[6] = fTKUPhi ;
171 fU1Vals[7] = fNPSumEt ;
172 fU1Vals[8] = fNPU ;
173 fU1Vals[9] = fNPUPhi ;
174 fU1Vals[10] = fPUSumEt ;
175 fU1Vals[11] = fPUMet ;
176 fU1Vals[12] = fPUMetPhi;
177 fU1Vals[13] = fPCSumEt ;
178 fU1Vals[14] = fPCU ;
179 fU1Vals[15] = fPCUPhi ;
180 fU1Vals[16] = fJSPt1 ;
181 fU1Vals[17] = fJSEta1 ;
182 fU1Vals[18] = fJSPhi1 ;
183 fU1Vals[19] = fJSPt2 ;
184 fU1Vals[20] = fJSEta2 ;
185 fU1Vals[21] = fJSPhi2 ;
186 fU1Vals[22] = fNAllJet ;
187 fU1Vals[23] = fNJet ;
188 fU1Vals[24] = fUPhiMVA ;
189 return fU1Vals;
190 }
191 //--------------------------------------------------------------------------------------------------
192 Double_t MVAMet::evaluatePhi() {
193 fPhiVals[0] = fNPV ;
194 fPhiVals[1] = fU ;
195 fPhiVals[2] = fUPhi ;
196 fPhiVals[3] = fTKSumEt ;
197 fPhiVals[4] = fTKU ;
198 fPhiVals[5] = fTKUPhi ;
199 fPhiVals[6] = fNPSumEt ;
200 fPhiVals[7] = fNPU ;
201 fPhiVals[8] = fNPUPhi ;
202 fPhiVals[9] = fPUSumEt ;
203 fPhiVals[10] = fPUMet ;
204 fPhiVals[11] = fPUMetPhi;
205 fPhiVals[12] = fPCSumEt ;
206 fPhiVals[13] = fPCU ;
207 fPhiVals[14] = fPCUPhi ;
208 fPhiVals[15] = fJSPt1 ;
209 fPhiVals[16] = fJSEta1 ;
210 fPhiVals[17] = fJSPhi1 ;
211 fPhiVals[18] = fJSPt2 ;
212 fPhiVals[19] = fJSEta2 ;
213 fPhiVals[20] = fJSPhi2 ;
214 fPhiVals[21] = fNAllJet ;
215 fPhiVals[22] = fNJet ;
216 return fPhiReader->GetResponse(fPhiVals);
217 }
218 //--------------------------------------------------------------------------------------------------
219 Double_t MVAMet::evaluateU1() {
220 fU1Vals[0] = fSumEt ;
221 fU1Vals[1] = fNPV ;
222 fU1Vals[2] = fU ;
223 fU1Vals[3] = fUPhi ;
224 fU1Vals[4] = fTKSumEt ;
225 fU1Vals[5] = fTKU ;
226 fU1Vals[6] = fTKUPhi ;
227 fU1Vals[7] = fNPSumEt ;
228 fU1Vals[8] = fNPU ;
229 fU1Vals[9] = fNPUPhi ;
230 fU1Vals[10] = fPUSumEt ;
231 fU1Vals[11] = fPUMet ;
232 fU1Vals[12] = fPUMetPhi;
233 fU1Vals[13] = fPCSumEt ;
234 fU1Vals[14] = fPCU ;
235 fU1Vals[15] = fPCUPhi ;
236 fU1Vals[16] = fJSPt1 ;
237 fU1Vals[17] = fJSEta1 ;
238 fU1Vals[18] = fJSPhi1 ;
239 fU1Vals[19] = fJSPt2 ;
240 fU1Vals[20] = fJSEta2 ;
241 fU1Vals[21] = fJSPhi2 ;
242 fU1Vals[22] = fNAllJet ;
243 fU1Vals[23] = fNJet ;
244 fU1Vals[24] = fUPhiMVA ;
245 return fU1Reader->GetResponse(fU1Vals);
246 }
247 //--------------------------------------------------------------------------------------------------
248 Double_t MVAMet::evaluateCovU1() {
249 fCovVals[0] = fSumEt ;
250 fCovVals[1] = fNPV ;
251 fCovVals[2] = fU ;
252 fCovVals[3] = fUPhi ;
253 fCovVals[4] = fTKSumEt ;
254 fCovVals[5] = fTKU ;
255 fCovVals[6] = fTKUPhi ;
256 fCovVals[7] = fNPSumEt ;
257 fCovVals[8] = fNPU ;
258 fCovVals[9] = fNPUPhi ;
259 fCovVals[10] = fPUSumEt ;
260 fCovVals[11] = fPUMet ;
261 fCovVals[12] = fPUMetPhi;
262 fCovVals[13] = fPCSumEt ;
263 fCovVals[14] = fPCU ;
264 fCovVals[15] = fPCUPhi ;
265 fCovVals[16] = fJSPt1 ;
266 fCovVals[17] = fJSEta1 ;
267 fCovVals[18] = fJSPhi1 ;
268 fCovVals[19] = fJSPt2 ;
269 fCovVals[20] = fJSEta2 ;
270 fCovVals[21] = fJSPhi2 ;
271 fCovVals[22] = fNAllJet ;
272 fCovVals[23] = fNJet ;
273 fCovVals[24] = fUPhiMVA ;
274 fCovVals[25] = fUMVA ;
275 double lCovU1 = fCovU1Reader->GetResponse(fCovVals);
276 if(!f42) lCovU1 = lCovU1*lCovU1*fUMVA*fUMVA;
277 return lCovU1;
278 }
279 //--------------------------------------------------------------------------------------------------
280 Double_t MVAMet::evaluateCovU2() {
281 fCovVals[0] = fSumEt ;
282 fCovVals[1] = fNPV ;
283 fCovVals[2] = fU ;
284 fCovVals[3] = fUPhi ;
285 fCovVals[4] = fTKSumEt ;
286 fCovVals[5] = fTKU ;
287 fCovVals[6] = fTKUPhi ;
288 fCovVals[7] = fNPSumEt ;
289 fCovVals[8] = fNPU ;
290 fCovVals[9] = fNPUPhi ;
291 fCovVals[10] = fPUSumEt ;
292 fCovVals[11] = fPUMet ;
293 fCovVals[12] = fPUMetPhi;
294 fCovVals[13] = fPCSumEt ;
295 fCovVals[14] = fPCU ;
296 fCovVals[15] = fPCUPhi ;
297 fCovVals[16] = fJSPt1 ;
298 fCovVals[17] = fJSEta1 ;
299 fCovVals[18] = fJSPhi1 ;
300 fCovVals[19] = fJSPt2 ;
301 fCovVals[20] = fJSEta2 ;
302 fCovVals[21] = fJSPhi2 ;
303 fCovVals[22] = fNAllJet ;
304 fCovVals[23] = fNJet ;
305 fCovVals[24] = fUPhiMVA ;
306 fCovVals[25] = fUMVA ;
307 double lCovU2 = fCovU2Reader->GetResponse(fCovVals);
308 if(!f42) lCovU2 = lCovU2*lCovU2*fUMVA*fUMVA;
309 return lCovU2;
310 }
311 //--------------------------------------------------------------------------------------------------
312 Double_t MVAMet::MVAValue( Bool_t iPhi,
313 Float_t iPFSumEt,
314 Float_t iU ,
315 Float_t iUPhi ,
316 Float_t iTKSumEt,
317 Float_t iTKU ,
318 Float_t iTKUPhi ,
319 Float_t iNPSumEt,
320 Float_t iNPU ,
321 Float_t iNPUPhi ,
322 Float_t iPUSumEt,
323 Float_t iPUMet ,
324 Float_t iPUMetPhi,
325 Float_t iPCSumEt,
326 Float_t iPCU ,
327 Float_t iPCUPhi ,
328 Float_t iJSPt1 ,
329 Float_t iJSEta1 ,
330 Float_t iJSPhi1 ,
331 Float_t iJSPt2 ,
332 Float_t iJSEta2 ,
333 Float_t iJSPhi2 ,
334 Float_t iNAllJet,
335 Float_t iNJet ,
336 Float_t iNPV
337 ){
338
339 if (!fIsInitialized) {
340 std::cout << "Error: MVA Met not properly initialized.\n";
341 return -9999;
342 }
343
344 fSumEt = iPFSumEt;
345 fU = iU ;
346 fUPhi = iUPhi ;
347 fTKSumEt = iTKSumEt/iPFSumEt;
348 fTKU = iTKU ;
349 fTKUPhi = iTKUPhi ;
350 fNPSumEt = iNPSumEt/iPFSumEt;
351 fNPU = iNPU ;
352 fNPUPhi = iNPUPhi ;
353 fPUSumEt = iPUSumEt/iPFSumEt;
354 fPUMet = iPUMet ;
355 fPUMetPhi = iPUMetPhi;
356 fPCSumEt = iPCSumEt/iPFSumEt;
357 fPCU = iPCU ;
358 fPCUPhi = iPCUPhi ;
359 fJSPt1 = iJSPt1 ;
360 fJSEta1 = iJSEta1 ;
361 fJSPhi1 = iJSPhi1 ;
362 fJSPt2 = iJSPt2 ;
363 fJSEta2 = iJSEta2 ;
364 fJSPhi2 = iJSPhi2 ;
365 fNAllJet = iNAllJet;
366 fNJet = iNJet ;
367 fNPV = iNPV ;
368
369 Double_t lMVA = -9999;
370 lMVA = evaluatePhi();
371 if(!iPhi) fUPhiMVA = iUPhi+lMVA;
372 //Not no nice feature of the training
373 //fTKSumEt /= iPFSumEt;
374 //fNPSumEt /= iPFSumEt;
375 //fPUSumEt /= iPFSumEt;
376 //fPCSumEt /= iPFSumEt;
377 if(!iPhi) lMVA = evaluateU1();
378 return lMVA;
379 }
380 //--------------------------------------------------------------------------------------------------
381 //====> Please not that the jet collection must be cleaned => all jets near leptons must be removed
382 Met MVAMet::GetMet( Bool_t iPhi,
383 Float_t iPtVis,Float_t iPhiVis,Float_t iSumEtVis,
384 Float_t iPtQ ,Float_t iPhiQ ,Float_t iSumEtQ,
385 const PFMet *iMet ,
386 const PFCandidateCol *iCands,
387 const Vertex *iVertex,const VertexCol *iVertices,
388 const PFJetCol *iJets ,
389 FactorizedJetCorrector *iJetCorrector,
390 const PileupEnergyDensityCol *iPUEnergyDensity,
391 int iNPV,
392 Bool_t printDebug) {
393
394 int lNPV = 0;
395 for(unsigned int i0 = 0; i0 < iVertices->GetEntries(); i0++) {
396 const Vertex *lPV = iVertices->At(i0);
397 if(lPV->Ndof() < 4.0) continue;
398 if(fabs(lPV->Z()) > 24.) continue;
399 if(lPV->Position().Rho() > 2.) continue;
400 lNPV++;
401 }
402
403 Met lPFRec = fRecoilTools->pfRecoil (iPtVis,iPhiVis,iSumEtVis,iCands);
404 Met lTKRec = fRecoilTools->trackRecoil(iPtQ ,iPhiQ ,iSumEtQ ,iCands,iVertex);
405 Met lNPRec = fRecoilTools->NoPURecoil (iPtQ ,iPhiQ ,iSumEtQ ,iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices);
406 Met lPCRec = fRecoilTools->PUCRecoil (iPtVis,iPhiVis,iSumEtVis,iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices);
407 Met lPUMet = fRecoilTools->PUMet (iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices);
408
409
410 Double_t lPt0 = 0; const PFJet *lLead = 0;
411 Double_t lPt1 = 0; const PFJet *l2nd = 0;
412 int lNAllJet = 0;
413 int lNJet = 0;
414 for(unsigned int i0 = 0; i0 < iJets->GetEntries(); i0++) {
415 const PFJet *pJet = iJets->At(i0);
416 Double_t pPt = fRecoilTools->fJetIDMVA->correctedPt(pJet,iJetCorrector,iPUEnergyDensity);
417 //if(pPt < 0) continue;
418 if(!JetTools::passPFLooseId(pJet)) continue;
419 if(f42 && pPt > 1.) lNAllJet++;
420 if(!f42) lNAllJet++;
421 if(pPt > 30) lNJet++;
422 if(lPt0 < pPt) {lPt1 = lPt0; lPt0 = pPt; l2nd = lLead; lLead = pJet; continue;}
423 if(lPt1 < pPt) {lPt1 = pPt; l2nd = pJet; continue;}
424 }
425
426 fSumEt = lPFRec.SumEt();
427 fU = lPFRec.Pt();
428 fUPhi = lPFRec.Phi();
429 fTKSumEt = lTKRec.SumEt()/lPFRec.SumEt();
430 fTKU = lTKRec.Pt();
431 fTKUPhi = lTKRec.Phi();
432 fNPSumEt = lNPRec.SumEt()/lPFRec.SumEt();
433 fNPU = lNPRec.Pt();
434 fNPUPhi = lNPRec.Phi();
435 fPUSumEt = lPUMet.SumEt()/lPFRec.SumEt();
436 fPUMet = lPUMet.Pt();
437 fPUMetPhi = lPUMet.Phi();
438 fPCSumEt = lPCRec.SumEt()/lPFRec.SumEt();
439 fPCU = lPCRec.Pt() ;
440 fPCUPhi = lPCRec.Phi() ;
441 fJSPt1 = lPt0;
442 fJSEta1 = 0; if(lLead != 0) fJSEta1 = lLead->Eta();
443 fJSPhi1 = 0; if(lLead != 0) fJSPhi1 = lLead->Phi();
444 fJSPt2 = lPt1;
445 fJSEta2 = 0; if(l2nd != 0) fJSEta2 = l2nd ->Eta();
446 fJSPhi2 = 0; if(l2nd != 0) fJSPhi2 = l2nd ->Phi();
447 fNJet = lNJet ;
448 fNAllJet = lNAllJet;
449 fNPV = lNPV ;
450 Float_t lMVA = evaluatePhi();
451 if(!iPhi) fUPhiMVA = fUPhi + lMVA;
452 //Not no nice feature of teh training
453 //fTKSumEt /= lPFRec.SumEt();
454 //fNPSumEt /= lPFRec.SumEt();
455 //fPUSumEt /= lPFRec.SumEt();
456 //fPCSumEt /= lPFRec.SumEt();
457 if(!iPhi) lMVA = evaluateU1();//fU1Reader ->EvaluateMVA( fU1MethodName );
458 fUMVA = fU*lMVA;
459
460 TLorentzVector lUVec(0,0,0,0); lUVec .SetPtEtaPhiM(fUMVA,0,fUPhiMVA,0);
461 TLorentzVector lVVec(0,0,0,0); lVVec .SetPtEtaPhiM(iPtVis ,0,iPhiVis ,0);
462 if(lMVA < 0) lUVec .RotateZ(TMath::Pi());
463 lUVec -= lVVec;
464 Met lMet(lUVec.Px(),lUVec.Py());
465
466 //TMatrixD lCov(2,2);
467 //Covariance matrix perpendicular and parallel to the recoil (sort of correct)
468 double lCovU1 = evaluateCovU1();
469 double lCovU2 = evaluateCovU2();
470
471 double lCos2 = cos(fUPhiMVA)*cos(fUPhiMVA);
472 double lSin2 = sin(fUPhiMVA)*sin(fUPhiMVA);
473
474 //Now Compute teh covariance matrix in X and Y
475 (*fCov)(0,0) = lCovU1*lCos2+lCovU2*lSin2;
476 (*fCov)(1,0) = -lCovU1*sin(fUPhiMVA)*cos(fUPhiMVA)+lCovU2*sin(fUPhiMVA)*cos(fUPhiMVA);
477 (*fCov)(0,1) = (*fCov)(1,0);
478 (*fCov)(1,1) = lCovU1*lSin2+lCovU2*lCos2;
479 TMatrixD lInv(2,2);
480 lInv(0,0) = (*fCov)(0,0); lInv(1,1) = (*fCov)(1,1); lInv(1,0) = (*fCov)(1,0); lInv(0,1) = (*fCov)(0,1);
481 if(lInv.Determinant() != 0) lInv.Invert();
482 fSignificance = TMath::Sqrt(lUVec.Px()*lUVec.Px()*(lInv)(0,0) + 2.*lUVec.Px()*lUVec.Py()*(lInv)(1,0) + lUVec.Py()*lUVec.Py()*(lInv)(1,1));
483 fUncertainty = sqrt(lCovU1+lCovU2);
484
485 if (printDebug == kTRUE) {
486 std::cout << "Debug Met MVA: "
487 << fU << " : "
488 << fUPhi << " : "
489 << fTKSumEt << " : "
490 << fTKU << " : "
491 << fTKUPhi << " : "
492 << fNPSumEt << " : "
493 << fNPU << " : "
494 << fNPUPhi << " : "
495 << fPUSumEt << " : "
496 << fPUMet << " : "
497 << fPUMetPhi << " : "
498 << fPCUPhi << " : "
499 << fPCSumEt << " : "
500 << fPCU << " : "
501 << fPCUPhi << " : "
502 << fJSPt1 << " : "
503 << fJSEta1 << " : "
504 << fJSPhi1 << " : "
505 << fJSPt2 << " : "
506 << fJSEta2 << " : "
507 << fJSPhi2 << " : "
508 << fNJet << " : "
509 << fNAllJet << " : "
510 << fNPV << " : "
511 << " === : === "
512 << lMet.Pt() << " : "
513 << lMet.Phi() << " : "
514 << std::endl;
515 }
516
517 return lMet;
518 }
519 //--------------------------------------------------------------------------------------------------
520 //====> Please not that the jet collection must be cleaned => all jets near leptons must be removed
521 //====> Corrected Jets
522 Met MVAMet::GetMet( Bool_t iPhi,
523 Float_t iPtVis,Float_t iPhiVis,Float_t iSumEtVis,
524 Float_t iPtQ ,Float_t iPhiQ ,Float_t iSumEtQ , //Charged components
525 const PFMet *iMet ,
526 const PFCandidateCol *iCands,
527 const Vertex *iVertex ,const VertexCol *iVertices,Double_t iRho,
528 const PFJetCol *iJets ,
529 int iNPV,
530 Bool_t printDebug) {
531
532 int lNPV = 0;
533 for(unsigned int i0 = 0; i0 < iVertices->GetEntries(); i0++) {
534 const Vertex *lPV = iVertices->At(i0);
535 if(lPV->Ndof() < 4.0) continue;
536 if(fabs(lPV->Z()) > 24.) continue;
537 if(lPV->Position().Rho() > 2.) continue;
538 lNPV++;
539 }
540 Met lPFRec = fRecoilTools->pfRecoil (iPtVis,iPhiVis,iSumEtVis,iCands);
541 Met lTKRec = fRecoilTools->trackRecoil(iPtQ ,iPhiQ ,iSumEtQ , iCands,iVertex);
542 Met lNPRec = fRecoilTools->NoPURecoil (iPtQ ,iPhiQ ,iSumEtQ ,iJets,iCands,iVertex,iVertices,iRho);
543 Met lPCRec = fRecoilTools->PUCRecoil (iPtVis,iPhiVis,iSumEtVis,iJets,iCands,iVertex,iVertices,iRho);
544 Met lPUMet = fRecoilTools->PUMet ( iJets,iCands,iVertex,iVertices,iRho);
545
546 Double_t lPt0 = 0; const PFJet *lLead = 0;
547 Double_t lPt1 = 0; const PFJet *l2nd = 0;
548 int lNAllJet = 0;
549 int lNJet = 0;
550 for(unsigned int i0 = 0; i0 < iJets->GetEntries(); i0++) {
551 const PFJet *pJet = iJets->At(i0);
552 Double_t pPt = pJet->Pt();
553 if(!JetTools::passPFLooseId(pJet)) continue;
554 if(f42 && pPt > 1.) lNAllJet++;
555 if(!f42) lNAllJet++;
556 if(pPt > 30.) lNJet++;
557 if(lPt0 < pPt) {lPt1 = lPt0; lPt0 = pPt; l2nd = lLead; lLead = pJet; continue;}
558 if(lPt1 < pPt) {lPt1 = pPt; l2nd = pJet; continue;}
559 }
560
561 fSumEt = lPFRec.SumEt();
562 fU = lPFRec.Pt();
563 fUPhi = lPFRec.Phi();
564 fTKSumEt = lTKRec.SumEt()/lPFRec.SumEt();
565 fTKU = lTKRec.Pt();
566 fTKUPhi = lTKRec.Phi();
567 fNPSumEt = lNPRec.SumEt()/lPFRec.SumEt();
568 fNPU = lNPRec.Pt();
569 fNPUPhi = lNPRec.Phi();
570 fPUSumEt = lPUMet.SumEt()/lPFRec.SumEt();
571 fPUMet = lPUMet.Pt();
572 fPUMetPhi = lPUMet.Phi();
573 fPCSumEt = lPCRec.SumEt()/lPFRec.SumEt();
574 fPCU = lPCRec.Pt() ;
575 fPCUPhi = lPCRec.Phi() ;
576 fJSPt1 = lPt0;
577 fJSEta1 = 0; if(lLead != 0) fJSEta1 = lLead->Eta();
578 fJSPhi1 = 0; if(lLead != 0) fJSPhi1 = lLead->Phi();
579 fJSPt2 = lPt1;
580 fJSEta2 = 0; if(l2nd != 0) fJSEta2 = l2nd ->Eta();
581 fJSPhi2 = 0; if(l2nd != 0) fJSPhi2 = l2nd ->Phi();
582 fNJet = lNJet ;
583 fNAllJet = lNAllJet;
584 fNPV = lNPV ;
585
586 Float_t lMVA = evaluatePhi();
587
588 if(!iPhi) fUPhiMVA = fUPhi + lMVA;
589 //Not no nice feature of teh training
590 //fTKSumEt /= lPFRec.SumEt();
591 //fNPSumEt /= lPFRec.SumEt();
592 //fPUSumEt /= lPFRec.SumEt();
593 //fPCSumEt /= lPFRec.SumEt();
594 if(!iPhi) lMVA = evaluateU1();//fU1Reader ->EvaluateMVA( fU1MethodName );
595 fUMVA = lMVA*fU;
596
597 TLorentzVector lUVec(0,0,0,0); lUVec .SetPtEtaPhiM(fUMVA ,0,fUPhiMVA,0);
598 TLorentzVector lVVec(0,0,0,0); lVVec .SetPtEtaPhiM(iPtVis ,0,iPhiVis ,0);
599 if(lMVA < 0) lUVec .RotateZ(TMath::Pi());
600 lUVec -= lVVec;
601 Met lMet(lUVec.Px(),lUVec.Py());
602 //Cov matrix
603 double lCovU1 = evaluateCovU1();
604 double lCovU2 = evaluateCovU2();
605
606 double lCos2 = cos(fUPhiMVA)*cos(fUPhiMVA);
607 double lSin2 = sin(fUPhiMVA)*sin(fUPhiMVA);
608
609 //Now Compute teh covariance matrix in X and Y
610 (*fCov)(0,0) = lCovU1*lCos2+lCovU2*lSin2;
611 (*fCov)(1,0) = -lCovU1*sin(fUPhiMVA)*cos(fUPhiMVA)+lCovU2*sin(fUPhiMVA)*cos(fUPhiMVA);
612 (*fCov)(0,1) = (*fCov)(1,0);
613 (*fCov)(1,1) = lCovU1*lSin2+lCovU2*lCos2;
614 TMatrixD lInv(2,2);
615 lInv(0,0) = (*fCov)(0,0); lInv(1,1) = (*fCov)(1,1); lInv(1,0) = (*fCov)(1,0); lInv(0,1) = (*fCov)(0,1);
616 if(lInv.Determinant() != 0) lInv.Invert();
617 fSignificance = TMath::Sqrt(lUVec.Px()*lUVec.Px()*(lInv)(0,0) + 2.*lUVec.Px()*lUVec.Py()*(lInv)(1,0) + lUVec.Py()*lUVec.Py()*(lInv)(1,1));
618 fUncertainty = sqrt(lCovU1+lCovU2);
619
620 if (printDebug == kTRUE) {
621 std::cout << "Debug Met MVA: "
622 << fU << " : "
623 << fUPhi << " : "
624 << fTKSumEt << " : "
625 << fTKU << " : "
626 << fTKUPhi << " : "
627 << fNPSumEt << " : "
628 << fNPU << " : "
629 << fNPUPhi << " : "
630 << fPUSumEt << " : "
631 << fPUMet << " : "
632 << fPUMetPhi << " : "
633 << fPCUPhi << " : "
634 << fPCSumEt << " : "
635 << fPCU << " : "
636 << fPCUPhi << " : "
637 << fJSPt1 << " : "
638 << fJSEta1 << " : "
639 << fJSPhi1 << " : "
640 << fJSPt2 << " : "
641 << fJSEta2 << " : "
642 << fJSPhi2 << " : "
643 << fNJet << " : "
644 << fNAllJet << " : "
645 << fNPV << " : "
646 << " === : === "
647 << lMet.Pt() << " : "
648 << lMet.Phi() << " : "
649 << std::endl;
650 }
651
652 return lMet;
653 }
654 //--------------------------------------------------------------------------------------------------
655 //Interms of the two candidates
656 Met MVAMet::GetMet( bool iPhi,
657 Float_t iPt1,Float_t iPhi1,Float_t iEta1,Float_t iChargedFrac1,
658 Float_t iPt2,Float_t iPhi2,Float_t iEta2,Float_t iChargedFrac2,
659 const PFMet *iMet ,
660 const PFCandidateCol *iCands,
661 const Vertex *iVertex,const VertexCol *iVertices,
662 const PFJetCol *iJets ,
663 FactorizedJetCorrector *iJetCorrector,
664 const PileupEnergyDensityCol *iPUEnergyDensity,
665 int iNPV,
666 Bool_t printDebug) {
667
668 int lNPV = 0;
669 for(unsigned int i0 = 0; i0 < iVertices->GetEntries(); i0++) {
670 const Vertex *lPV = iVertices->At(i0);
671 if(lPV->Ndof() < 4.0) continue;
672 if(fabs(lPV->Z()) > 24.) continue;
673 if(lPV->Position().Rho() > 2.) continue;
674 lNPV++;
675 }
676 //Met lMVec1 = fRecoilTools->pfCone(iPhi1,iEta1,iCands);
677 //Met lMVec2 = fRecoilTools->pfCone(iPhi2,iEta2,iCands);
678 //double lChargedFrac1 = 1.;
679 //double lChargedFrac2 = 1.;
680 //if(iId == MVAMet::TauTau){
681 // lChargedFrac1 = chargedFracTau(
682 // }
683
684 TLorentzVector lVVec1 (0,0,0,0); lVVec1 .SetPtEtaPhiM(iPt1,0 ,iPhi1,0);
685 TLorentzVector lVVec2 (0,0,0,0); lVVec2 .SetPtEtaPhiM(iPt2,0 ,iPhi2,0);
686 TLorentzVector lVVec1Q (0,0,0,0); lVVec1Q .SetPtEtaPhiM(iPt1*iChargedFrac1,0,iPhi1,0);
687 TLorentzVector lVVec2Q (0,0,0,0); lVVec2Q .SetPtEtaPhiM(iPt2*iChargedFrac2,0,iPhi2,0);
688
689 if(iChargedFrac1 < 0 ) {
690 Met lQ1Cone = fRecoilTools->pfCone(iPhi1,iEta1,iCands,iVertex,true);
691 lVVec1Q.SetPtEtaPhiM(lQ1Cone.Pt(),0,lQ1Cone.Phi(),0);
692 }
693 if(iChargedFrac2 < 0 ) {
694 Met lQ2Cone = fRecoilTools->pfCone(iPhi2,iEta2,iCands,iVertex,true);
695 lVVec2Q.SetPtEtaPhiM(lQ2Cone.Pt(),0,lQ2Cone.Phi(),0);
696 }
697 //Met lPFRec = fRecoilTools->pfRecoil (iPhi1,iEta1,iPhi2,iEta2, iCands);
698 //Met lTKRec = fRecoilTools->trackRecoil(iPhi1,iEta1,iPhi2,iEta2, iCands,iVertex);
699 //Met lNPRec = fRecoilTools->NoPURecoil (iPhi1,iEta1,iPhi2,iEta2,iJets,iCands,iVertex,iVertices,iJetCorrector,iPUEnergyDensity);
700 //Met lPCRec = fRecoilTools->PUCRecoil (iPhi1,iEta1,iPhi2,iEta2,iJets,iCands,iVertex,iVertices,iJetCorrector,iPUEnergyDensity);
701 //Met lPUMet = fRecoilTools->PUMet (iPhi1,iEta1,iPhi2,iEta2,iJets,iCands,iVertex,iVertices,iJetCorrector,iPUEnergyDensity);
702
703 //Met lNPMet = fRecoilTools->NoPUMet (iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices,iPhi1,iEta1,iPhi2,iEta2);
704 //std::cout << "===> " << lNPMet.Pt() << " -- " << lNPMet.Phi() << std::endl;
705 //std::cout << "===> " << lVVec1.Pt() << " -- " << lVVec1.Phi() << " -- " << iPt1 << " -- " << iPhi1 << std::endl;
706 //std::cout << "===> " << lVVec2.Pt() << " -- " << lVVec2.Phi() << " -- " << iPt2 << " -- " << iPhi2 << std::endl;
707 //std::cout << "===> " << lNPRec.Pt() << " -- " << lNPRec.Phi() << std::endl;
708
709 Float_t lSumEtVis = lVVec1.Pt() + lVVec2.Pt();
710 lVVec1+=lVVec2;
711 Float_t lPtVis = lVVec1.Pt();
712 Float_t lPhiVis = lVVec1.Phi();
713
714 Float_t lSumEtQ = lVVec1Q.Pt() + lVVec2Q.Pt();
715 lVVec1Q+=lVVec2Q;
716 Float_t lPtVisQ = lVVec1Q.Pt();
717 Float_t lPhiVisQ = lVVec1Q.Phi();
718
719 Met lPFRec = fRecoilTools->pfRecoil (lPtVis ,lPhiVis, lSumEtVis,iCands);
720 Met lTKRec = fRecoilTools->trackRecoil(lPtVisQ ,lPhiVisQ ,lSumEtQ ,iCands,iVertex);
721 Met lNPRec = fRecoilTools->NoPURecoil (lPtVisQ ,lPhiVisQ ,lSumEtQ ,iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices,iPhi1,iEta1,iPhi2,iEta2);
722 Met lPCRec = fRecoilTools->PUCRecoil (lPtVis ,lPhiVis ,lSumEtVis,iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices,iPhi1,iEta1,iPhi2,iEta2);
723 Met lPUMet = fRecoilTools->PUMet ( iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices,iPhi1,iEta1,iPhi2,iEta2);
724
725 //Met lNPRec1 = fRecoilTools->NoPUMet (iJets,iJetCorrector,iPUEnergyDensity,iCands,iVertex,iVertices,0,0,0,0);
726 //std::cout << " ====> PF => " << lPFRec.Pt() << " -- " << lPFRec1.Pt() << std::endl;
727 //std::cout << " ====> TK => " << lTKRec.Pt() << " -- " << lTKRec1.Pt() << std::endl;
728 //std::cout << " ====> NP => " << lNPRec.Pt() << " -- " << lNPRec1.Pt() << std::endl;
729 //std::cout << " ====> PC => " << lPCRec.Pt() << " -- " << lPCRec1.Pt() << std::endl;
730
731 Double_t lPt0 = 0; const PFJet *lLead = 0;
732 Double_t lPt1 = 0; const PFJet *l2nd = 0;
733 int lNAllJet = 0;
734 int lNJet = 0;
735 for(unsigned int i0 = 0; i0 < iJets->GetEntries(); i0++) {
736 const PFJet *pJet = iJets->At(i0);
737 Double_t pPt = fRecoilTools->fJetIDMVA->correctedPt(pJet,iJetCorrector,iPUEnergyDensity);
738 double pDEta1 = pJet->Eta() - iEta1;
739 double pDPhi1 = fabs(pJet->Phi() - iPhi1); if(pDPhi1 > 2.*TMath::Pi()-pDPhi1) pDPhi1 = 2.*TMath::Pi()-pDPhi1;
740 double pDR1 = sqrt(pDEta1*pDEta1 + pDPhi1*pDPhi1);
741 if(pDR1 < 0.5) continue;
742 double pDEta2 = pJet->Eta() - iEta2;
743 double pDPhi2 = fabs(pJet->Phi() - iPhi2); if(pDPhi2 > 2.*TMath::Pi()-pDPhi2) pDPhi2 = 2.*TMath::Pi()-pDPhi2;
744 double pDR2 = sqrt(pDEta2*pDEta2 + pDPhi2*pDPhi2);
745 if(pDR2 < 0.5) continue;
746 if(!JetTools::passPFLooseId(pJet)) continue;
747 if(f42 && pPt > 1.) lNAllJet++;
748 if(!f42) lNAllJet++;
749 if(pPt > 30.) lNJet++;
750 if(lPt0 < pPt) {lPt1 = lPt0; lPt0 = pPt; l2nd = lLead; lLead = pJet; continue;}
751 if(lPt1 < pPt) {lPt1 = pPt; l2nd = pJet; continue;}
752 }
753
754 fSumEt = lPFRec.SumEt();
755 fU = lPFRec.Pt();
756 fUPhi = lPFRec.Phi();
757 fTKSumEt = lTKRec.SumEt()/lPFRec.SumEt();
758 fTKU = lTKRec.Pt();
759 fTKUPhi = lTKRec.Phi();
760 fNPSumEt = lNPRec.SumEt()/lPFRec.SumEt();
761 fNPU = lNPRec.Pt();
762 fNPUPhi = lNPRec.Phi();
763 fPUSumEt = lPUMet.SumEt()/lPFRec.SumEt();
764 fPUMet = lPUMet.Pt();
765 fPUMetPhi= lPUMet.Phi();
766 fPCSumEt = lPCRec.SumEt()/lPFRec.SumEt();
767 fPCU = lPCRec.Pt() ;
768 fPCUPhi = lPCRec.Phi() ;
769 fJSPt1 = lPt0;
770 fJSEta1 = 0; if(lLead != 0) fJSEta1 = lLead->Eta();
771 fJSPhi1 = 0; if(lLead != 0) fJSPhi1 = lLead->Phi();
772 fJSPt2 = lPt1;
773 fJSEta2 = 0; if(l2nd != 0) fJSEta2 = l2nd ->Eta();
774 fJSPhi2 = 0; if(l2nd != 0) fJSPhi2 = l2nd ->Phi();
775 fNJet = lNJet ;
776 fNAllJet = lNAllJet;
777 fNPV = lNPV ;
778
779 Float_t lMVA = evaluatePhi();//fPhiReader ->EvaluateMVA( fPhiMethodName );
780 if(!iPhi) fUPhiMVA = fUPhi + lMVA;
781 //fTKSumEt /= lPFRec.SumEt();
782 //fNPSumEt /= lPFRec.SumEt();
783 //fPUSumEt /= lPFRec.SumEt();
784 //fPCSumEt /= lPFRec.SumEt();
785 if(!iPhi) lMVA = evaluateU1();//fU1Reader ->EvaluateMVA( fU1MethodName );
786 fUMVA = fU*lMVA;
787
788 TLorentzVector lUVec (0,0,0,0); lUVec .SetPtEtaPhiM(fUMVA ,0,fUPhiMVA,0);
789 TLorentzVector lVVec (0,0,0,0); lVVec .SetPtEtaPhiM(lPtVis ,0,lPhiVis ,0);
790 if(lMVA < 0) lUVec .RotateZ(TMath::Pi());
791 lUVec -= lVVec;
792 Met lMet(lUVec.Px(),lUVec.Py());
793 //Cov matrix
794 double lCovU1 = evaluateCovU1();
795 double lCovU2 = evaluateCovU2();
796
797 double lCos2 = cos(fUPhiMVA)*cos(fUPhiMVA);
798 double lSin2 = sin(fUPhiMVA)*sin(fUPhiMVA);
799
800 //Now Compute teh covariance matrix in X and Y
801 (*fCov)(0,0) = lCovU1*lCos2+lCovU2*lSin2;
802 (*fCov)(1,0) = -lCovU1*sin(fUPhiMVA)*cos(fUPhiMVA)+lCovU2*sin(fUPhiMVA)*cos(fUPhiMVA);
803 (*fCov)(0,1) = (*fCov)(1,0);
804 (*fCov)(1,1) = lCovU1*lSin2+lCovU2*lCos2;
805 TMatrixD lInv(2,2);
806 lInv(0,0) = (*fCov)(0,0); lInv(1,1) = (*fCov)(1,1); lInv(1,0) = (*fCov)(1,0); lInv(0,1) = (*fCov)(0,1);
807 if(lInv.Determinant() != 0) lInv.Invert();
808 fSignificance = TMath::Sqrt(lUVec.Px()*lUVec.Px()*(lInv)(0,0) + 2.*lUVec.Px()*lUVec.Py()*(lInv)(1,0) + lUVec.Py()*lUVec.Py()*(lInv)(1,1));
809 fUncertainty = sqrt(lCovU1+lCovU2);
810
811
812 if (printDebug == kTRUE) {
813 std::cout << "Debug Met MVA: "
814 << fSumEt << " : "
815 << fU << " : "
816 << fUPhi << " : "
817 << fTKSumEt << " : "
818 << fTKU << " : "
819 << fTKUPhi << " : "
820 << fNPSumEt << " : "
821 << fNPU << " : "
822 << fNPUPhi << " : "
823 << fPUSumEt << " : "
824 << fPUMet << " : "
825 << fPUMetPhi << " : "
826 << fPCSumEt << " : "
827 << fPCU << " : "
828 << fPCUPhi << " : "
829 << fJSPt1 << " : "
830 << fJSEta1 << " : "
831 << fJSPhi1 << " : "
832 << fJSPt2 << " : "
833 << fJSEta2 << " : "
834 << fJSPhi2 << " : "
835 << fNJet << " : "
836 << fNAllJet << " : "
837 << fNPV << " : "
838 << " === : === "
839 << lMet.Pt() << " : "
840 << lMet.Phi() << " : "
841 << std::endl;
842 }
843
844 return lMet;
845 }
846 //--------------------------------------------------------------------------------------------------
847 //Interms of the two candidates => corrected Jets
848 Met MVAMet::GetMet( Bool_t iPhi,
849 Float_t iPt1,Float_t iPhi1,Float_t iEta1,Float_t iChargedFrac1,
850 Float_t iPt2,Float_t iPhi2,Float_t iEta2,Float_t iChargedFrac2,
851 const PFMet *iMet ,
852 const PFCandidateCol *iCands,
853 const Vertex *iVertex,const VertexCol *iVertices,Double_t iRho,
854 const PFJetCol *iJets ,
855 int iNPV,
856 Bool_t printDebug) {
857 int lNPV = 0;
858 for(unsigned int i0 = 0; i0 < iVertices->GetEntries(); i0++) {
859 const Vertex *lPV = iVertices->At(i0);
860 if(lPV->Ndof() < 4.0) continue;
861 if(fabs(lPV->Z()) > 24.) continue;
862 if(lPV->Position().Rho() > 2.) continue;
863 lNPV++;
864 }
865
866 TLorentzVector lVVec1(0,0,0,0); lVVec1.SetPtEtaPhiM(iPt1,0,iPhi1 ,0);
867 TLorentzVector lVVec2(0,0,0,0); lVVec2.SetPtEtaPhiM(iPt2,0,iPhi2 ,0);
868 TLorentzVector lVVec1Q (0,0,0,0); lVVec1Q .SetPtEtaPhiM(iPt1*iChargedFrac1,0,iPhi1,0);
869 TLorentzVector lVVec2Q (0,0,0,0); lVVec2Q .SetPtEtaPhiM(iPt2*iChargedFrac2,0,iPhi2,0);
870
871 if(iChargedFrac1 < 0 ) {
872 Met lQ1Cone = fRecoilTools->pfCone(iPhi1,iEta1,iCands,iVertex,true);
873 lVVec1Q.SetPtEtaPhiM(lQ1Cone.Pt(),0,lQ1Cone.Phi(),0);
874 }
875 if(iChargedFrac2 < 0 ) {
876 Met lQ2Cone = fRecoilTools->pfCone(iPhi2,iEta2,iCands,iVertex,true);
877 lVVec2Q.SetPtEtaPhiM(lQ2Cone.Pt(),0,lQ2Cone.Phi(),0);
878 }
879
880 Float_t lSumEtVis = lVVec1.Pt() + lVVec2.Pt();
881 lVVec1+=lVVec2;
882 Float_t lPtVis = lVVec1.Pt();
883 Float_t lPhiVis = lVVec1.Phi();
884
885 Float_t lSumEtQ = lVVec1Q.Pt() + lVVec2Q.Pt();
886 lVVec1Q+=lVVec2Q;
887 Float_t lPtVisQ = lVVec1Q.Pt();
888 Float_t lPhiVisQ = lVVec1Q.Phi();
889
890 Met lPFRec = fRecoilTools->pfRecoil (lPtVis ,lPhiVis, lSumEtVis,iCands);
891 Met lTKRec = fRecoilTools->trackRecoil(lPtVisQ ,lPhiVisQ ,lSumEtQ ,iCands,iVertex);
892 Met lNPRec = fRecoilTools->NoPURecoil (lPtVisQ ,lPhiVisQ ,lSumEtQ ,iJets,iCands,iVertex,iVertices,1.,iPhi1,iEta1,iPhi2,iEta2);
893 Met lPCRec = fRecoilTools->PUCRecoil (lPtVis ,lPhiVis ,lSumEtVis,iJets,iCands,iVertex,iVertices,1.,iPhi1,iEta1,iPhi2,iEta2);
894 Met lPUMet = fRecoilTools->PUMet ( iJets,iCands,iVertex,iVertices,1.,iPhi1,iEta1,iPhi2,iEta2);
895
896 //Met lPFRec = fRecoilTools->pfRecoil (iPhi1,iEta1,iPhi2,iEta2, iCands);
897 //Met lTKRec = fRecoilTools->trackRecoil(iPhi1,iEta1,iPhi2,iEta2, iCands,iVertex);
898 //Met lNPRec = fRecoilTools->NoPURecoil (iPhi1,iEta1,iPhi2,iEta2,iJets,iCands,iVertex,iVertices); //Not using rho
899 //Met lPCRec = fRecoilTools->PUCRecoil (iPhi1,iEta1,iPhi2,iEta2,iJets,iCands,iVertex,iVertices);
900 //Met lPUMet = fRecoilTools->PUMet (iPhi1,iEta1,iPhi2,iEta2,iJets,iCands,iVertex,iVertices);
901
902 Double_t lPt0 = 0; const PFJet *lLead = 0;
903 Double_t lPt1 = 0; const PFJet *l2nd = 0;
904 int lNAllJet = 0;
905 int lNJet = 0;
906 for(unsigned int i0 = 0; i0 < iJets->GetEntries(); i0++) {
907 const PFJet *pJet = iJets->At(i0);
908 Double_t pPt = pJet->Pt();
909 double pDEta1 = pJet->Eta() - iEta1;
910 double pDPhi1 = fabs(pJet->Phi() - iPhi1); if(pDPhi1 > 2.*TMath::Pi()-pDPhi1) pDPhi1 = 2.*TMath::Pi()-pDPhi1;
911 double pDR1 = sqrt(pDEta1*pDEta1 + pDPhi1*pDPhi1);
912 if(pDR1 < 0.5) continue;
913 double pDEta2 = pJet->Eta() - iEta2;
914 double pDPhi2 = fabs(pJet->Phi() - iPhi2); if(pDPhi2 > 2.*TMath::Pi()-pDPhi2) pDPhi2 = 2.*TMath::Pi()-pDPhi2;
915 double pDR2 = sqrt(pDEta2*pDEta2 + pDPhi2*pDPhi2);
916 if(pDR2 < 0.5) continue;
917 if(!JetTools::passPFLooseId(pJet)) continue;
918 if(f42 && pPt > 1.) lNAllJet++;
919 if(!f42) lNAllJet++;
920 if(pPt > 30.) lNJet++;
921 if(lPt0 < pPt) {lPt1 = lPt0; lPt0 = pPt; l2nd = lLead; lPt1 = l2nd->Pt(); lLead = pJet; continue;}
922 if(lPt1 < pPt) {lPt1 = pPt; l2nd = pJet; continue;}
923 }
924 fSumEt = lPFRec.SumEt();
925 fU = lPFRec.Pt();
926 fUPhi = lPFRec.Phi();
927 fTKSumEt = lTKRec.SumEt()/lPFRec.SumEt();
928 fTKU = lTKRec.Pt();
929 fTKUPhi = lTKRec.Phi();
930 fNPSumEt = lNPRec.SumEt()/lPFRec.SumEt();
931 fNPU = lNPRec.Pt();
932 fNPUPhi = lNPRec.Phi();
933 fPUSumEt = lPUMet.SumEt()/lPFRec.SumEt();
934 fPUMet = lPUMet.Pt();
935 fPUMetPhi= lPUMet.Phi();
936 fPCSumEt = lPCRec.SumEt()/lPFRec.SumEt();
937 fPCU = lPCRec.Pt() ;
938 fPCUPhi = lPCRec.Phi() ;
939 fJSPt1 = lPt0;
940 fJSEta1 = 0; if(lLead != 0) fJSEta1 = lLead->Eta();
941 fJSPhi1 = 0; if(lLead != 0) fJSPhi1 = lLead->Phi();
942 fJSPt2 = lPt1;
943 fJSEta2 = 0; if(l2nd != 0) fJSEta2 = l2nd ->Eta();
944 fJSPhi2 = 0; if(l2nd != 0) fJSPhi2 = l2nd ->Phi();
945 fNJet = lNJet ;
946 fNAllJet = lNAllJet;
947 fNPV = lNPV ;
948
949 Float_t lMVA = evaluatePhi();//fPhiReader ->EvaluateMVA( fPhiMethodName );
950
951 if(!iPhi) fUPhiMVA = fUPhi + lMVA;
952 //fTKSumEt /= lPFRec.SumEt();
953 //fNPSumEt /= lPFRec.SumEt();
954 //fPUSumEt /= lPFRec.SumEt();
955 //fPCSumEt /= lPFRec.SumEt();
956 if(!iPhi) lMVA = evaluateU1();//fU1Reader ->EvaluateMVA( fU1MethodName );
957 fUMVA = lMVA*fU;
958
959 TLorentzVector lUVec (0,0,0,0); lUVec .SetPtEtaPhiM(fUMVA ,0,fUPhiMVA,0);
960 TLorentzVector lVVec (0,0,0,0); lVVec .SetPtEtaPhiM(lPtVis ,0,lPhiVis ,0);
961 if(lMVA < 0) lUVec .RotateZ(TMath::Pi());
962 lUVec -= lVVec;
963 Met lMet(lUVec.Px(),lUVec.Py());
964 //Cov matrix
965 double lCovU1 = evaluateCovU1();
966 double lCovU2 = evaluateCovU2();
967
968 double lCos2 = cos(fUPhiMVA)*cos(fUPhiMVA);
969 double lSin2 = sin(fUPhiMVA)*sin(fUPhiMVA);
970 //Now Compute teh covariance matrix in X and Y
971 (*fCov)(0,0) = lCovU1*lCos2+lCovU2*lSin2;
972 (*fCov)(1,0) = -lCovU1*sin(fUPhiMVA)*cos(fUPhiMVA)+lCovU2*sin(fUPhiMVA)*cos(fUPhiMVA);
973 (*fCov)(0,1) = (*fCov)(1,0);
974 (*fCov)(1,1) = lCovU1*lSin2+lCovU2*lCos2;
975 TMatrixD lInv(2,2);
976 lInv(0,0) = (*fCov)(0,0); lInv(1,1) = (*fCov)(1,1); lInv(1,0) = (*fCov)(1,0); lInv(0,1) = (*fCov)(0,1);
977 if(lInv.Determinant() != 0) lInv.Invert();
978 fSignificance = TMath::Sqrt(lUVec.Px()*lUVec.Px()*(lInv)(0,0) + 2.*lUVec.Px()*lUVec.Py()*(lInv)(1,0) + lUVec.Py()*lUVec.Py()*(lInv)(1,1));
979 fUncertainty = sqrt(lCovU1+lCovU2);
980
981 if (printDebug == kTRUE) {
982 std::cout << "Debug Met MVA: "
983 << fU << " : "
984 << fUPhi << " : "
985 << fTKSumEt << " : "
986 << fTKU << " : "
987 << fTKUPhi << " : "
988 << fNPSumEt << " : "
989 << fNPU << " : "
990 << fNPUPhi << " : "
991 << fPUSumEt << " : "
992 << fPUMet << " : "
993 << fPUMetPhi << " : "
994 << fPCSumEt << " : "
995 << fPCU << " : "
996 << fPCUPhi << " : "
997 << fJSPt1 << " : "
998 << fJSEta1 << " : "
999 << fJSPhi1 << " : "
1000 << fJSPt2 << " : "
1001 << fJSEta2 << " : "
1002 << fJSPhi2 << " : "
1003 << fNJet << " : "
1004 << fNAllJet << " : "
1005 << fNPV << " : "
1006 << " === : === "
1007 << lMet.Pt() << " : "
1008 << lMet.Phi() << " : "
1009 << std::endl;
1010 }
1011
1012 return lMet;
1013 }
1014 //--------------------------------------------------------------------------------------------------
1015 Met MVAMet::GetMet(const MuonCol *iMuons,const ElectronCol *iElectrons,const PFTauCol *iTaus,
1016 const PFCandidateCol *iCands,const PFJetCol *iJets,const Vertex *iPV,const VertexCol *iVertices,const PFMetCol *iPFMet,
1017 FactorizedJetCorrector *iJetCorrector,const PileupEnergyDensityCol* iPUEnergyDensity) {
1018 const Vertex *lPV = iPV; if(iPV == 0 && iVertices->GetEntries() > 0) lPV = iVertices->At(0);
1019 FourVectorM lTotVec(0,0,0,0); double lTotSumEt = 0;
1020 FourVectorM lVisVec(0,0,0,0); double lVisSumEt = 0;
1021 std::vector<std::pair<FourVectorM,FourVectorM> > lDecay; std::vector<int> lId;
1022 fNMuons = 0;
1023 for(UInt_t i0 = 0; i0 < iMuons->GetEntries(); i0++) {
1024 const Muon *pMu = iMuons->At(i0);
1025 if(!MetLeptonTools::looseMuId(pMu,iCands,lPV,iVertices)) continue;
1026 std::pair<FourVectorM,FourVectorM> pVec(pMu->Mom(),pMu->Mom());
1027 lDecay .push_back(pVec);
1028 lId .push_back(0);
1029 fNMuons++;
1030 }
1031 fNElectrons=0;
1032 for(UInt_t i0 = 0; i0 < iElectrons->GetEntries(); i0++) {
1033 const Electron *pElectron = iElectrons->At(i0);
1034 if(!MetLeptonTools::looseEleId(pElectron,iPUEnergyDensity,iCands,lPV,iVertices)) continue;
1035 std::pair<FourVectorM,FourVectorM> pVec(pElectron->Mom(),pElectron->Mom());
1036 lDecay .push_back(pVec);
1037 lId .push_back(1);
1038 fNElectrons++;
1039 }
1040 fNTaus = 0;
1041 for(UInt_t i0 = 0; i0 < iTaus->GetEntries(); i0++) {
1042 const PFTau *pTau = iTaus->At(i0);
1043 if(!fMetLeptonTools->looseTauId(pTau,iPUEnergyDensity)) continue;
1044 FourVectorM pVis(0,0,0,0); pVis.SetCoordinates(pTau->Pt()*MetLeptonTools::vis(pTau),pTau->Eta(),pTau->Phi(),pTau->Mass()*MetLeptonTools::vis(pTau));
1045 std::pair<FourVectorM,FourVectorM> pVec(pTau->Mom(),pVis);
1046 lDecay .push_back(pVec);
1047 lId .push_back(2);
1048 fNTaus++;
1049 }
1050 std::vector<std::pair<FourVectorM,FourVectorM> > lFinalDecay;
1051 std::vector<int> lFinalId;
1052 for(unsigned int i0 = 0; i0 < lDecay.size(); i0++) {
1053 bool pAdd = true;
1054 for(unsigned int i1 = 0; i1 < lDecay.size(); i1++) {
1055 if(i0 == i1) continue;
1056 if(MathUtils::DeltaR(lDecay[i0].first,lDecay[i1].first) < 0.5) pAdd = false;
1057 if(!pAdd && lId[i0] != 2 && lId[i1] == 2) pAdd = true;
1058 if(!pAdd && ((lId[i0] != 2 && lId[i1] != 2) || (lId[i0] == 2 && lId[i1] == 2))
1059 && lDecay[i0].first.pt() > lDecay[i1].first.pt()) pAdd = true;
1060 if(MathUtils::DeltaR(lDecay[i0].first,lDecay[i1].first) < 0.5 && lDecay[i0].first.pt() == lDecay[i1].first.pt()) { pAdd = true;
1061 for(unsigned int i2 = 0; i2 < lFinalDecay.size(); i2++) if(fabs(lFinalDecay[i2].first.pt() - lDecay[i0].first.pt()) < 0.1) pAdd = false;
1062 }
1063 if(!pAdd) break;
1064 //if(!pAdd && lId[i2] == 2 && lId[i1] != 2) pAdd = true;
1065 }
1066 if(pAdd) lFinalDecay.push_back(lDecay[i0]);
1067 if(pAdd) lFinalId .push_back(lId [i0]);
1068 }
1069 for(unsigned int i0 = 0; i0 < lFinalDecay.size(); i0++) {
1070 lTotVec += lFinalDecay[i0].first;
1071 lVisVec += lFinalDecay[i0].second;
1072 lTotSumEt += lFinalDecay[i0].first.pt();
1073 lVisSumEt += lFinalDecay[i0].second.pt();
1074 }
1075 PFJetOArr *lCleanJets = new PFJetOArr();
1076 for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
1077 const PFJet *pJet = iJets->At(i0);
1078 bool pClean = false;
1079 for(unsigned int i1 = 0; i1 < lFinalDecay.size(); i1++) {
1080 if(MathUtils::DeltaR(pJet->Mom(),lFinalDecay[i1].first) < 0.5) pClean = true;
1081 }
1082 if(!pClean) lCleanJets->Add(pJet);
1083 }
1084 //for(unsigned int i0 = 0; i0 < lFinalDecay.size(); i0++) std::cout << "----> " << lFinalDecay[i0].first.pt() << " -- " << lFinalDecay[i0].first.phi() << " -- " << lFinalDecay[i0].first.eta() << " -- " << lFinalId[i0] << " -- " << MathUtils::DeltaR(lFinalDecay[i0].first,lFinalDecay[0].first)<< std::endl;
1085 Met lMVAMet = GetMet( false,
1086 lTotVec.Pt(),lTotVec.Phi(),lTotSumEt,
1087 lVisVec.Pt(),lVisVec.Phi(),lVisSumEt,
1088 iPFMet->At(0),
1089 iCands,lPV,iVertices,
1090 lCleanJets,
1091 iJetCorrector,
1092 iPUEnergyDensity,
1093 int(iVertices->GetEntries()));//,true);
1094 return lMVAMet;
1095 }
1096 Met MVAMet::GetMet(const PhotonCol *iPhotons,
1097 const PFCandidateCol *iCands,const PFJetCol *iJets,const Vertex *iPV,const VertexCol *iVertices,const PFMetCol *iPFMet,
1098 FactorizedJetCorrector *iJetCorrector,const PileupEnergyDensityCol* iPUEnergyDensity) {
1099 const Vertex *lPV = iPV; if(iPV == 0 && iVertices->GetEntries() > 0) lPV = iVertices->At(0);
1100 FourVectorM lTotVec(0,0,0,0); double lTotSumEt = 0;
1101 FourVectorM lVisVec(0,0,0,0); double lVisSumEt = 0;
1102 std::vector<std::pair<FourVectorM,FourVectorM> > lDecay; std::vector<int> lId;
1103 fNPhotons = 0;
1104 for(UInt_t i0 = 0; i0 < iPhotons->GetEntries(); i0++) {
1105 const Photon *pPhoton = iPhotons->At(i0);
1106 if(!MetLeptonTools::loosePhotonId(pPhoton)) continue;
1107 FourVectorM pVis(0,0,0,0); pVis.SetCoordinates(0.,pPhoton->Eta(),pPhoton->Phi(),0);
1108 std::pair<FourVectorM,FourVectorM> pVec(pPhoton->Mom(),pVis);
1109 lDecay .push_back(pVec);
1110 lId .push_back(0);
1111 fNPhotons++;
1112 }
1113 std::vector<std::pair<FourVectorM,FourVectorM> > lFinalDecay;
1114 std::vector<int> lFinalId;
1115 for(unsigned int i0 = 0; i0 < lDecay.size(); i0++) {
1116 bool pAdd = true;
1117 for(unsigned int i1 = 0; i1 < lDecay.size(); i1++) {
1118 if(i0 == i1) continue;
1119 if(MathUtils::DeltaR(lDecay[i0].first,lDecay[i1].first) < 0.5) pAdd = false;
1120 if(!pAdd && lId[i0] != 2 && lId[i1] == 2) pAdd = true;
1121 if(!pAdd && ((lId[i0] != 2 && lId[i1] != 2) || (lId[i0] == 2 && lId[i1] == 2))
1122 && lDecay[i0].first.pt() > lDecay[i1].first.pt()) pAdd = true;
1123 if(MathUtils::DeltaR(lDecay[i0].first,lDecay[i1].first) < 0.5 && lDecay[i0].first.pt() == lDecay[i1].first.pt()) { pAdd = true;
1124 for(unsigned int i2 = 0; i2 < lFinalDecay.size(); i2++) if(fabs(lFinalDecay[i2].first.pt() - lDecay[i0].first.pt()) < 0.1) pAdd = false;
1125 }
1126 if(!pAdd) break;
1127 //if(!pAdd && lId[i2] == 2 && lId[i1] != 2) pAdd = true;
1128 }
1129 if(pAdd) lFinalDecay.push_back(lDecay[i0]);
1130 if(pAdd) lFinalId .push_back(lId [i0]);
1131 }
1132 for(unsigned int i0 = 0; i0 < lFinalDecay.size(); i0++) {
1133 lTotVec += lFinalDecay[i0].first;
1134 lVisVec += lFinalDecay[i0].second;
1135 lTotSumEt += lFinalDecay[i0].first.pt();
1136 lVisSumEt += lFinalDecay[i0].second.pt();
1137 }
1138 PFJetOArr *lCleanJets = new PFJetOArr();
1139 for(UInt_t i0 = 0; i0 < iJets->GetEntries(); i0++) {
1140 const PFJet *pJet = iJets->At(i0);
1141 bool pClean = false;
1142 for(unsigned int i1 = 0; i1 < lFinalDecay.size(); i1++) {
1143 if(MathUtils::DeltaR(pJet->Mom(),lFinalDecay[i1].first) < 0.5) pClean = true;
1144 }
1145 if(!pClean) lCleanJets->Add(pJet);
1146 }
1147 //for(unsigned int i0 = 0; i0 < lFinalDecay.size(); i0++) std::cout << "----> " << lFinalDecay[i0].first.pt() << " -- " << lFinalDecay[i0].first.phi() << " -- " << lFinalDecay[i0].first.eta() << " -- " << lFinalId[i0] << " -- " << MathUtils::DeltaR(lFinalDecay[i0].first,lFinalDecay[0].first)<< std::endl;
1148 Met lMVAMet = GetMet( false,
1149 lTotVec.Pt(),lTotVec.Phi(),lTotSumEt,
1150 lVisVec.Pt(),lVisVec.Phi(),lVisSumEt,
1151 iPFMet->At(0),
1152 iCands,lPV,iVertices,
1153 lCleanJets,
1154 iJetCorrector,
1155 iPUEnergyDensity,
1156 int(iVertices->GetEntries()));//,true);
1157 return lMVAMet;
1158 }
1159
1160