Crombie Tools
src/include/crombie/KinematicFunctions.h
Go to the documentation of this file.
1 /**
2  @file KinematicFunctions.h
3  Header file containing various functions used to do quick kinematics cuts.
4  @todo Optimize the functions here that use TLorentzVector. They are probably not needed.
5  @author Daniel Abercrombie <dabercro@mit.edu>
6  @author Zeynep Demiragli <zeynep.demiragli@cern.ch>
7 */
8 
9 #ifndef KINEMATICFUNCTIONS_H
10 #define KINEMATICFUNCTIONS_H
11 
12 #include <cmath>
13 #include "TVector2.h"
14 #include "TLorentzVector.h"
15 
16 namespace crombie {
17  const double pi = 3.14159265358979323846;
18 }
19 
20 using crombie::pi;
21 
22 /// Make phi that are from [0, 2pi) to [-pi, pi)
23 double make_pm(double phi) {
24  if (phi >= pi)
25  phi -= 2*pi;
26  return phi;
27 }
28 
29 /// Make phi that are from [-pi, pi) to [0, 2pi)
30 double make_2pi(double phi) {
31  if (phi < 0)
32  phi += 2*pi;
33  return phi;
34 }
35 
36 /// Calculate deltaPhi between two particles
37 double deltaPhi(double phi1, double phi2) {
38  // Make phi between +- pi, if -pi < phi < 3*pi
39  return std::abs(TVector2::Phi_mpi_pi(phi1 - phi2));
40 }
41 
42 /// Calculate deltaR2 between two particles
43 double deltaR2(double eta1, double phi1, double eta2, double phi2) {
44  auto d_eta = eta2 - eta1;
45  auto d_phi = deltaPhi(phi1, phi2);
46  return d_eta * d_eta + d_phi * d_phi;
47 }
48 
49 /// Calculate deltaR between two particles
50 double deltaR(double eta1, double phi1, double eta2, double phi2) {
51  return sqrt(deltaR2(eta1, phi1, eta2, phi2));
52 }
53 
54 /// Get TVector2 for vector in the transverse plane
55 TVector2 vectorSum(double pt1, double phi1, double pt2, double phi2) {
56  TVector2 vec1;
57  TVector2 vec2;
58  vec1.SetMagPhi(pt1, phi1);
59  vec2.SetMagPhi(pt2, phi2);
60  vec1 += vec2;
61  return vec1;
62 }
63 
64 /// Phi of a mother of two particles
65 double vectorSumPhi(double pt1, double phi1, double pt2, double phi2) {
66  return vectorSum(pt1, phi1, pt2, phi2).Phi();
67 }
68 
69 /// Pt of a mother of two particles
70 double vectorSumPt(double pt1, double phi1, double pt2, double phi2) {
71  return vectorSum(pt1, phi1, pt2, phi2).Mod();
72 }
73 
74 /// Pt of a mother of three particles
75 double vectorSum3Pt(double pt1, double phi1, double pt2, double phi2,double pt3, double phi3) {
76  return sqrt( pow(pt1*cos(phi1) + pt2*cos(phi2) + pt3*cos(phi3),2) +
77  pow(pt1*sin(phi1) + pt2*sin(phi2) + pt3*sin(phi3),2) );
78 }
79 
80 /// TLorentz Vector of two particles
81 TLorentzVector vectorSum(double pt1, double eta1, double phi1, double mass1, double pt2, double eta2, double phi2, double mass2) {
82  TLorentzVector vec1;
83  TLorentzVector vec2;
84  vec1.SetPtEtaPhiM(pt1,eta1,phi1,mass1);
85  vec2.SetPtEtaPhiM(pt2,eta2,phi2,mass2);
86  return vec1 + vec2;
87 }
88 
89 /// Mass of a mother of two massive particles
90 double vectorSumMass(double pt1, double eta1, double phi1, double mass1, double pt2, double eta2, double phi2, double mass2) {
91  return vectorSum(pt1, eta1, phi1, mass1, pt2, eta2, phi2, mass2).M();
92 }
93 
94 /// Mass of a mother of two massless particles
95 double vectorSumMass(double pt1, double eta1, double phi1, double pt2, double eta2, double phi2) {
96  return vectorSumMass(pt1, eta1, phi1, 0.0, pt2, eta2, phi2, 0.0);
97 }
98 
99 /// Eta of a mother of two particles
100 double vectorSumEta(double pt1, double eta1, double phi1, double mass1, double pt2, double eta2, double phi2, double mass2) {
101  return vectorSum(pt1, eta1, phi1, mass1, pt2, eta2, phi2, mass2).Eta();
102 }
103 
104 /// Calculate uPerp given reconstructed recoil and boson phi
105 double uPerp(double recoil, double recoilPhi, double zPhi) {
106  TLorentzVector recoilvec;
107  recoilvec.SetPtEtaPhiM(recoil,0,recoilPhi + TMath::Pi() - zPhi,0);
108  return recoilvec.Py();
109 }
110 
111 /// Calculate uPara given reconstructed recoil and boson phi
112 double uPara(double recoil, double recoilPhi, double zPhi) {
113  TLorentzVector recoilvec;
114  recoilvec.SetPtEtaPhiM(recoil,0,recoilPhi + TMath::Pi() - zPhi,0);
115  return recoilvec.Px();
116 }
117 
118 /// Calculate uPerp given reconstructed MET and boson pt and phi
119 double uPerp(double met, double metPhi, double zPt, double zPhi) {
120  TLorentzVector metvec;
121  metvec.SetPtEtaPhiM(vectorSumPt(met,metPhi,zPt,zPhi),0,vectorSumPhi(met,metPhi,zPt,zPhi)
122  + TMath::Pi() - zPhi,0);
123  return metvec.Py();
124 }
125 
126 /// Calculate uPara given reconstructed MET and boson pt and phi
127 double uPara(double met, double metPhi, double zPt, double zPhi) {
128  TLorentzVector metvec;
129  metvec.SetPtEtaPhiM(vectorSumPt(met,metPhi,zPt,zPhi),0,vectorSumPhi(met,metPhi,zPt,zPhi)
130  + TMath::Pi() - zPhi,0);
131  return metvec.Px();
132 }
133 
134 /// Calculates transverse mass given a lepton and MET
135 double transverseMass(double lepPt, double lepPhi, double met, double metPhi) {
136  double cosDPhi = cos(deltaPhi(lepPhi,metPhi));
137  return sqrt(2*lepPt*met*(1-cosDPhi));
138 }
139 
140 #endif