1 |
|
#include "MitPhysics/Utils/interface/JetTools.h" |
2 |
+ |
#include <algorithm> |
3 |
+ |
#include <vector> |
4 |
|
|
5 |
|
ClassImp(mithep::JetTools) |
6 |
|
|
7 |
|
using namespace mithep; |
8 |
+ |
|
9 |
|
|
10 |
|
JetTools::JetTools() |
11 |
|
{ |
18 |
|
} |
19 |
|
|
20 |
|
//Remember to remove the signal from particles before inputting into the function |
21 |
< |
Double_t JetTools::NJettiness(const ParticleOArr *particles, const JetOArr *jets, bool UseQ, Double_t Y){ |
21 |
> |
Double_t JetTools::NJettiness(const ParticleOArr *particles, const JetOArr *jets, double Q, double Y){ |
22 |
|
if(particles->GetEntries() <= 0) return 0.0; |
23 |
|
|
24 |
|
Double_t fval = 0.0; |
35 |
|
fval = fval + fvalpart; |
36 |
|
} |
37 |
|
|
38 |
< |
if(UseQ == kTRUE) fval = fval / particles->At(0)->Pt(); |
38 |
> |
fval = fval / Q; |
39 |
|
|
40 |
|
return fval; |
41 |
|
} |
42 |
|
|
43 |
< |
Double_t JetTools::NJettiness(const TrackOArr *tracks, const JetOArr *jets, bool UseQ, Double_t Y){ |
43 |
> |
Double_t JetTools::NJettiness(const PFCandidateOArr *pfCandidates, const JetOArr *jets, double Q, double Y){ |
44 |
> |
if(pfCandidates->GetEntries() <= 0) return 0.0; |
45 |
> |
|
46 |
> |
Double_t fval = 0.0; |
47 |
> |
Double_t fvalpart; |
48 |
> |
|
49 |
> |
for(int i=0;i<int(pfCandidates->GetEntries());i++){ |
50 |
> |
fvalpart = (pfCandidates->At(i)->Pt()) * TMath::Exp(-TMath::Abs(pfCandidates->At(i)->Eta()-Y)); |
51 |
> |
|
52 |
> |
for(int j=0;j<int(jets->GetEntries());j++){ |
53 |
> |
fvalpart = TMath::Min(fvalpart,(jets->At(j)->Pt()) * |
54 |
> |
(2 * TMath::CosH(TMath::Abs(jets->At(j)->Eta()-pfCandidates->At(i)->Eta())) |
55 |
> |
- 2 * TMath::Cos(MathUtils::DeltaPhi(jets->At(j)->Phi(),pfCandidates->At(i)->Phi())))); |
56 |
> |
} |
57 |
> |
fval = fval + fvalpart; |
58 |
> |
} |
59 |
> |
|
60 |
> |
fval = fval / Q; |
61 |
> |
|
62 |
> |
return fval; |
63 |
> |
} |
64 |
> |
|
65 |
> |
Double_t JetTools::NJettiness(const TrackOArr *tracks, const JetOArr *jets, double Q, double Y){ |
66 |
|
if(tracks->GetEntries() <= 0) return 0.0; |
67 |
|
|
68 |
|
Double_t fval = 0.0; |
79 |
|
fval = fval + fvalpart; |
80 |
|
} |
81 |
|
|
82 |
< |
if(UseQ == kTRUE) fval = fval / tracks->At(0)->Pt(); |
82 |
> |
fval = fval / Q; |
83 |
|
|
84 |
|
return fval; |
85 |
|
} |
86 |
|
|
87 |
< |
Double_t JetTools::NJettiness(const JetOArr *jetsS, const JetOArr *jets, bool UseQ, Double_t Y){ |
87 |
> |
Double_t JetTools::NJettiness(const JetOArr *jetsS, const JetOArr *jets, double Q, double Y){ |
88 |
|
if(jetsS->GetEntries() <= 0) return 0.0; |
89 |
|
|
90 |
|
Double_t fval = 0.0; |
101 |
|
fval = fval + fvalpart; |
102 |
|
} |
103 |
|
|
104 |
< |
if(UseQ == kTRUE) fval = fval / jetsS->At(0)->Pt(); |
104 |
> |
fval = fval / Q; |
105 |
|
|
106 |
|
return fval; |
107 |
|
} |
108 |
|
|
109 |
< |
Double_t JetTools::NJettiness(const CaloTowerOArr *calos, const JetOArr *jets, bool UseQ, Double_t Y){ |
109 |
> |
Double_t JetTools::NJettiness(const CaloTowerOArr *calos, const JetOArr *jets, double Q, double Y){ |
110 |
|
if(calos->GetEntries() <= 0) return 0.0; |
111 |
|
|
112 |
|
Double_t fval = 0.0; |
123 |
|
fval = fval + fvalpart; |
124 |
|
} |
125 |
|
|
126 |
< |
if(UseQ == kTRUE) fval = fval / calos->At(0)->Pt(); |
126 |
> |
fval = fval / Q; |
127 |
|
|
128 |
|
return fval; |
129 |
|
} |
209 |
|
|
210 |
|
//Transverse Higgs mass |
211 |
|
Double_t JetTools::MtHiggs(const ParticleOArr * leptons, |
212 |
< |
const Met *met, int nsel){ |
212 |
> |
const Met *met, double metFraction[2], int nsel){ |
213 |
|
if(leptons->Entries() < 2) return -999.0; |
214 |
|
|
215 |
|
double mtHiggs = -999.0; |
255 |
|
mll = dilepton->Mass(); |
256 |
|
mnu = 0.0; |
257 |
|
} |
258 |
< |
else if(nsel == 4){ // Use the formula from hep-ph:1006.4998 |
258 |
> |
else if(nsel == 4){ // Use of Mt mass and replacing mnu using the met optimal |
259 |
> |
enell = TMath::Sqrt(dilepton->Pt()*dilepton->Pt() + dilepton->Mt()*dilepton->Mt()); |
260 |
> |
enenn = TMath::Sqrt(met->Pt() *met->Pt() + 0.0*0.0); |
261 |
> |
enex = dilepton->Px() + met->Px(); |
262 |
> |
eney = dilepton->Py() + met->Py(); |
263 |
> |
mll = dilepton->Mass(); |
264 |
> |
double metAuxPx[2] = {met->Px() * metFraction[0], |
265 |
> |
met->Px() * (1.0 - metFraction[0])}; |
266 |
> |
double metAuxPy[2] = {met->Py() * metFraction[1], |
267 |
> |
met->Py() * (1.0 - metFraction[1])}; |
268 |
> |
double ene = TMath::Sqrt(metAuxPx[0]*metAuxPx[0]+metAuxPy[0]*metAuxPy[0]) + |
269 |
> |
TMath::Sqrt(metAuxPx[1]*metAuxPx[1]+metAuxPy[1]*metAuxPy[1]); |
270 |
> |
double px = metAuxPx[0] + metAuxPx[1]; |
271 |
> |
double py = metAuxPy[0] + metAuxPy[1]; |
272 |
> |
mnu = TMath::Sqrt(ene*ene - px*px - py*py); |
273 |
> |
} |
274 |
> |
else if(nsel == 5){ // Using the optimal met value |
275 |
> |
double metAuxPx[2] = {met->Px() * metFraction[0], |
276 |
> |
met->Px() * (1.0 - metFraction[0])}; |
277 |
> |
double metAuxPy[2] = {met->Py() * metFraction[1], |
278 |
> |
met->Py() * (1.0 - metFraction[1])}; |
279 |
> |
double ene = leptons->At(0)->Pt() + leptons->At(1)->Pt() + |
280 |
> |
TMath::Sqrt(metAuxPx[0]*metAuxPx[0]+metAuxPy[0]*metAuxPy[0]) + |
281 |
> |
TMath::Sqrt(metAuxPx[1]*metAuxPx[1]+metAuxPy[1]*metAuxPy[1]); |
282 |
> |
double px = leptons->At(0)->Px() + leptons->At(1)->Px() + |
283 |
> |
metAuxPx[0] + metAuxPx[1]; |
284 |
> |
double py = leptons->At(0)->Py() + leptons->At(1)->Py() + |
285 |
> |
metAuxPy[0] + metAuxPy[1]; |
286 |
> |
mtHiggs = ene*ene - px*px - py*py; |
287 |
> |
} |
288 |
> |
else if(nsel == 6){ // Use the formula from hep-ph:1006.4998 |
289 |
|
mtHiggs = 2*leptons->At(0)->Pt()*leptons->At(0)->Pt() + 2*leptons->At(1)->Pt()*leptons->At(1)->Pt() + 3 * ( |
290 |
|
leptons->At(0)->Pt()*leptons->At(1)->Pt() + met->Pt()*(leptons->At(0)->Pt()+leptons->At(1)->Pt()) |
291 |
|
- met->Px()*dilepton->Px() - met->Py()*dilepton->Py() |
292 |
|
- leptons->At(0)->Px()*leptons->At(1)->Px() - leptons->At(0)->Py()*leptons->At(1)->Py()); |
293 |
|
} |
294 |
+ |
else if(nsel == 7){ // Use of M mass and mnu == 0 |
295 |
+ |
double deltaPhiDileptonMet = MathUtils::DeltaPhi(dilepton->Phi(), |
296 |
+ |
met->Phi()); |
297 |
+ |
mtHiggs = 2.0*dilepton->Pt()*met->Pt()*(1.0 - cos(deltaPhiDileptonMet)); |
298 |
+ |
} |
299 |
|
|
300 |
< |
if(nsel >= 0 && nsel <= 3){ |
300 |
> |
if(nsel >= 0 && nsel <= 4){ |
301 |
|
mtHiggs = mll*mll + mnu*mnu + 2.0*(enell*enenn - enex*enex - eney*eney); |
302 |
|
} |
303 |
+ |
|
304 |
|
if(mtHiggs <= 0) mtHiggs = 0.0; |
305 |
|
else mtHiggs = TMath::Sqrt(mtHiggs); |
306 |
|
|
308 |
|
|
309 |
|
return mtHiggs; |
310 |
|
} |
311 |
+ |
|
312 |
+ |
Double_t JetTools::Beta(const TrackCol *tracks, Jet *jet, const Vertex *vertex, Double_t delta_z, Double_t delta_cone){ |
313 |
+ |
|
314 |
+ |
if(tracks->GetEntries() <= 0) return 1.0; |
315 |
+ |
|
316 |
+ |
double Pt_jets_X = 0. ; |
317 |
+ |
double Pt_jets_Y = 0. ; |
318 |
+ |
double Pt_jets_X_tot = 0. ; |
319 |
+ |
double Pt_jets_Y_tot = 0. ; |
320 |
+ |
|
321 |
+ |
for(int i=0;i<int(tracks->GetEntries());i++){ |
322 |
+ |
if(MathUtils::DeltaR(tracks->At(i)->Mom(),jet->Mom()) < delta_cone){ |
323 |
+ |
Pt_jets_X_tot += tracks->At(i)->Px(); |
324 |
+ |
Pt_jets_Y_tot += tracks->At(i)->Py(); |
325 |
+ |
double pDz = TMath::Abs(tracks->At(i)->DzCorrected(*vertex)); |
326 |
+ |
if(pDz < delta_z){ |
327 |
+ |
Pt_jets_X += tracks->At(i)->Px(); |
328 |
+ |
Pt_jets_Y += tracks->At(i)->Py(); |
329 |
+ |
} |
330 |
+ |
} |
331 |
+ |
} |
332 |
+ |
|
333 |
+ |
if(sqrt(Pt_jets_X_tot*Pt_jets_X_tot + Pt_jets_Y_tot*Pt_jets_Y_tot) > 0) |
334 |
+ |
return sqrt(Pt_jets_X*Pt_jets_X + Pt_jets_Y*Pt_jets_Y) / sqrt(Pt_jets_X_tot*Pt_jets_X_tot + Pt_jets_Y_tot*Pt_jets_Y_tot); |
335 |
+ |
|
336 |
+ |
return 1.0; |
337 |
+ |
} |
338 |
+ |
|
339 |
+ |
|
340 |
+ |
Double_t JetTools::Beta(const PFJet *jet, const Vertex *vertex, Double_t delta_z){ |
341 |
+ |
double Pt_jets= 0. ; |
342 |
+ |
double Pt_jetsTot = 0. ; |
343 |
+ |
|
344 |
+ |
for(UInt_t i=0;i<jet->NPFCands();i++){ |
345 |
+ |
if(jet->PFCand(i)->BestTrk()){ |
346 |
+ |
Pt_jetsTot += jet->PFCand(i)->BestTrk()->Pt(); |
347 |
+ |
double pDz = TMath::Abs(jet->PFCand(i)->BestTrk()->DzCorrected(*vertex)); |
348 |
+ |
if(pDz < delta_z){ |
349 |
+ |
Pt_jets += jet->PFCand(i)->BestTrk()->Pt(); |
350 |
+ |
} |
351 |
+ |
} |
352 |
+ |
} |
353 |
+ |
|
354 |
+ |
Double_t beta = 1.0; |
355 |
+ |
if (Pt_jetsTot > 0) |
356 |
+ |
beta = Pt_jets/Pt_jetsTot; |
357 |
+ |
|
358 |
+ |
return beta; |
359 |
+ |
} |
360 |
+ |
|
361 |
+ |
Double_t JetTools::Beta2(const PFJet *jet, const Vertex *vertex, Double_t delta_z){ |
362 |
+ |
double Pt_jets= 0. ; |
363 |
+ |
double Pt_jetsTot = 0. ; |
364 |
+ |
|
365 |
+ |
for(UInt_t i=0;i<jet->NPFCands();i++){ |
366 |
+ |
if(jet->PFCand(i)->BestTrk()){ |
367 |
+ |
Pt_jetsTot += jet->PFCand(i)->BestTrk()->Pt()*jet->PFCand(i)->BestTrk()->Pt(); |
368 |
+ |
double pDz = TMath::Abs(jet->PFCand(i)->BestTrk()->DzCorrected(*vertex)); |
369 |
+ |
if(pDz < delta_z){ |
370 |
+ |
Pt_jets += jet->PFCand(i)->BestTrk()->Pt()*jet->PFCand(i)->BestTrk()->Pt(); |
371 |
+ |
} |
372 |
+ |
} |
373 |
+ |
} |
374 |
+ |
|
375 |
+ |
Double_t beta = 1.0; |
376 |
+ |
if (Pt_jetsTot > 0) |
377 |
+ |
beta = Pt_jets/Pt_jetsTot; |
378 |
+ |
return beta; |
379 |
+ |
} |
380 |
+ |
|
381 |
+ |
|
382 |
+ |
Bool_t JetTools::PassBetaVertexAssociationCut(const PFJet *jet, const Vertex *referenceVertex, const VertexCol *vertices, Double_t delta_z) { |
383 |
+ |
|
384 |
+ |
Bool_t passBetaCut = kTRUE; |
385 |
+ |
if(vertices->GetEntries() > 0) { |
386 |
+ |
Double_t Beta = JetTools::Beta(jet, referenceVertex, 0.2); |
387 |
+ |
Double_t Beta_other = 0.0; |
388 |
+ |
for(UInt_t nv=0; nv<vertices->GetEntries(); nv++){ |
389 |
+ |
if (referenceVertex == vertices->At(nv)) continue; |
390 |
+ |
Double_t BetaAux = JetTools::Beta(jet, vertices->At(nv), 0.2); |
391 |
+ |
if(BetaAux > Beta_other) Beta_other = BetaAux; |
392 |
+ |
} |
393 |
+ |
if(Beta_other > Beta) passBetaCut = kFALSE; |
394 |
+ |
} |
395 |
+ |
|
396 |
+ |
return passBetaCut; |
397 |
+ |
|
398 |
+ |
} |
399 |
+ |
|
400 |
+ |
Bool_t JetTools::PassBeta2VertexAssociationCut(const PFJet *jet, const Vertex *referenceVertex, const VertexCol *vertices, Double_t delta_z) { |
401 |
+ |
|
402 |
+ |
Bool_t passBetaCut = kTRUE; |
403 |
+ |
if(vertices->GetEntries() > 0) { |
404 |
+ |
Double_t Beta = JetTools::Beta2(jet, referenceVertex, 0.2); |
405 |
+ |
Double_t Beta_other = 0.0; |
406 |
+ |
for(UInt_t nv=0; nv<vertices->GetEntries(); nv++){ |
407 |
+ |
if (referenceVertex == vertices->At(nv)) continue; |
408 |
+ |
Double_t BetaAux = JetTools::Beta2(jet, vertices->At(nv), 0.2); |
409 |
+ |
if(BetaAux > Beta_other) Beta_other = BetaAux; |
410 |
+ |
} |
411 |
+ |
if(Beta_other > Beta) passBetaCut = kFALSE; |
412 |
+ |
} |
413 |
+ |
|
414 |
+ |
return passBetaCut; |
415 |
+ |
|
416 |
+ |
} |
417 |
+ |
|
418 |
+ |
|
419 |
+ |
Int_t JetTools::MaxBetaVertexIndex(const PFJet *jet, const VertexCol *vertices, Double_t delta_z=0.2){ |
420 |
+ |
|
421 |
+ |
Int_t vertexIndex = -1; |
422 |
+ |
double beta = -0.1; |
423 |
+ |
for (UInt_t v=0; v < vertices->GetEntries(); v++){ |
424 |
+ |
Double_t betaTmp = JetTools::Beta(jet, vertices->At(v), delta_z); |
425 |
+ |
if (betaTmp > beta) { |
426 |
+ |
beta = betaTmp; |
427 |
+ |
vertexIndex = v; |
428 |
+ |
} |
429 |
+ |
} |
430 |
+ |
return vertexIndex; |
431 |
+ |
|
432 |
+ |
} |
433 |
+ |
|
434 |
+ |
Int_t JetTools::MaxBeta2VertexIndex(const PFJet *jet, const VertexCol *vertices, Double_t delta_z=0.2){ |
435 |
+ |
|
436 |
+ |
Int_t vertexIndex = -1; |
437 |
+ |
double beta = -0.1; |
438 |
+ |
for (UInt_t v=0; v < vertices->GetEntries(); v++){ |
439 |
+ |
Double_t betaTmp = JetTools::Beta2(jet, vertices->At(v), delta_z); |
440 |
+ |
if (betaTmp > beta) { |
441 |
+ |
beta = betaTmp; |
442 |
+ |
vertexIndex = v; |
443 |
+ |
} |
444 |
+ |
} |
445 |
+ |
return vertexIndex; |
446 |
+ |
|
447 |
+ |
} |
448 |
+ |
|
449 |
+ |
|
450 |
+ |
Int_t JetTools::JetToPVAssociation(const PFJet *jet, const VertexCol *vertices, Double_t delta_z=0.2){ |
451 |
+ |
|
452 |
+ |
std::vector<float> verticesPt2(vertices->GetEntries()); |
453 |
+ |
for(UInt_t i=0;i<jet->NPFCands();i++){ |
454 |
+ |
if(jet->PFCand(i)->BestTrk()){ |
455 |
+ |
double minDZ = delta_z; |
456 |
+ |
int trackVertexIndex = -1; |
457 |
+ |
for (UInt_t v=0; v < vertices->GetEntries(); v++){ |
458 |
+ |
if (minDZ > TMath::Abs(jet->PFCand(i)->BestTrk()->DzCorrected(*vertices->At(v)))) { |
459 |
+ |
minDZ = TMath::Abs(jet->PFCand(i)->BestTrk()->DzCorrected(*vertices->At(v))); |
460 |
+ |
trackVertexIndex = v; |
461 |
+ |
} |
462 |
+ |
} |
463 |
+ |
if (trackVertexIndex < 0) continue; |
464 |
+ |
verticesPt2[trackVertexIndex]+= jet->PFCand(i)->BestTrk()->Pt()*jet->PFCand(i)->BestTrk()->Pt(); |
465 |
+ |
} |
466 |
+ |
} |
467 |
+ |
|
468 |
+ |
Int_t vertexIndex = 0; |
469 |
+ |
float pt2Max = 0; |
470 |
+ |
for (uint i=0; i < verticesPt2.size(); ++i){ |
471 |
+ |
if (pt2Max < verticesPt2[i]) { |
472 |
+ |
pt2Max = verticesPt2[i]; |
473 |
+ |
vertexIndex = i; |
474 |
+ |
} |
475 |
+ |
} |
476 |
+ |
return vertexIndex; |
477 |
+ |
} |