1 |
amagnan |
1.1 |
#include "UserCode/HbbAnalysis/interface/Objects.hh"
|
2 |
|
|
|
3 |
|
|
namespace HbbAnalysis {
|
4 |
|
|
|
5 |
|
|
double DeltaPhi(const double phi1, const double phi2)
|
6 |
|
|
{
|
7 |
|
|
|
8 |
|
|
double dPhi = phi1 - phi2;
|
9 |
|
|
if (dPhi<0) dPhi += 2*TMath::Pi();
|
10 |
|
|
|
11 |
|
|
return dPhi;
|
12 |
|
|
}
|
13 |
|
|
|
14 |
|
|
double DeltaR(const BaseVars & v1, const BaseVars & v2)
|
15 |
|
|
{
|
16 |
|
|
|
17 |
|
|
double dEta = v1.eta - v2.eta;
|
18 |
|
|
double dPhi = v1.phi - v2.phi;
|
19 |
|
|
if (dPhi<0) dPhi += 2*TMath::Pi();
|
20 |
|
|
|
21 |
|
|
return sqrt(dEta*dEta+dPhi*dPhi);
|
22 |
|
|
}
|
23 |
|
|
|
24 |
amagnan |
1.3 |
double DeltaR(const BaseVars & v1, const GenVars & v2)
|
25 |
|
|
{
|
26 |
|
|
|
27 |
|
|
double dEta = v1.eta - v2.eta;
|
28 |
|
|
double dPhi = v1.phi - v2.phi;
|
29 |
|
|
if (dPhi<0) dPhi += 2*TMath::Pi();
|
30 |
|
|
|
31 |
|
|
return sqrt(dEta*dEta+dPhi*dPhi);
|
32 |
|
|
}
|
33 |
|
|
|
34 |
amagnan |
1.1 |
double SameSign(const BaseVars & v1, const BaseVars & v2)
|
35 |
|
|
{
|
36 |
|
|
|
37 |
|
|
return v1.charge == v2.charge;
|
38 |
|
|
}
|
39 |
|
|
|
40 |
|
|
double OppSign(const BaseVars & v1, const BaseVars & v2)
|
41 |
|
|
{
|
42 |
|
|
|
43 |
|
|
return (v1.charge != v2.charge &&
|
44 |
|
|
v1.charge != 0 &&
|
45 |
|
|
v2.charge != 0);
|
46 |
|
|
}
|
47 |
|
|
|
48 |
|
|
TLorentzVector FourMomentum(const BaseVars & v, const double scale)
|
49 |
|
|
{
|
50 |
|
|
double lpx = v.pT*cos(v.phi);
|
51 |
|
|
double lpy = v.pT*sin(v.phi);
|
52 |
|
|
//double lp = v.pT/sin(2*atan(exp(-v.eta)));
|
53 |
|
|
//double lpz = sqrt(lp*lp - v.pT*v.pT);
|
54 |
|
|
double lpz = v.pT*sinh(v.eta);
|
55 |
|
|
double lE = v.pT*cosh(v.eta);//v.E
|
56 |
|
|
|
57 |
|
|
return TLorentzVector(lpx/scale,lpy/scale,lpz/scale,lE/scale);
|
58 |
|
|
|
59 |
|
|
}
|
60 |
|
|
|
61 |
|
|
double TransverseMass(const BaseVars & leg1,
|
62 |
|
|
const BaseVars & leg2,
|
63 |
|
|
const double mEx,
|
64 |
|
|
const double mEy)
|
65 |
|
|
{
|
66 |
|
|
double px = leg1.pT*cos(leg1.phi) + leg2.pT*cos(leg2.phi) + mEx;
|
67 |
|
|
double py = leg1.pT*sin(leg1.phi) + leg2.pT*sin(leg2.phi) + mEy;
|
68 |
|
|
double et = leg1.pT + leg2.pT + TMath::Sqrt(mEx*mEx + mEy*mEy);
|
69 |
|
|
double mt2 = et*et - (px*px + py*py);
|
70 |
|
|
if ( mt2 < 0 ) {
|
71 |
amagnan |
1.5 |
//std::cout << " --- WARNING : mt2 = " << mt2 << " is negative... Set to 0.";
|
72 |
amagnan |
1.1 |
return 0.;
|
73 |
|
|
}
|
74 |
|
|
return sqrt(mt2);
|
75 |
|
|
}
|
76 |
|
|
|
77 |
|
|
double TransverseMass(const BaseVars & leg1,
|
78 |
|
|
const double mEx,
|
79 |
|
|
const double mEy)
|
80 |
|
|
{
|
81 |
|
|
double px = leg1.pT*cos(leg1.phi) + mEx;
|
82 |
|
|
double py = leg1.pT*sin(leg1.phi) + mEy;
|
83 |
|
|
double et = leg1.pT + TMath::Sqrt(mEx*mEx + mEy*mEy);
|
84 |
|
|
double mt = et*et - (px*px + py*py);
|
85 |
|
|
if ( mt < 0 ) {
|
86 |
amagnan |
1.5 |
//std::cout << " --- WARNING : mt = " << mt << " is negative... Set to 0.";
|
87 |
amagnan |
1.1 |
return 0.;
|
88 |
|
|
}
|
89 |
|
|
return sqrt(mt);
|
90 |
|
|
}
|
91 |
|
|
|
92 |
|
|
TLorentzVector FourMomentumCDFmethod(const BaseVars & leg1,
|
93 |
|
|
const BaseVars & leg2,
|
94 |
|
|
double mEx,
|
95 |
|
|
double mEy)
|
96 |
|
|
{
|
97 |
|
|
double lpx = leg1.pT*cos(leg1.phi) + leg2.pT*cos(leg2.phi) + mEx;
|
98 |
|
|
double lpy = leg1.pT*sin(leg1.phi) + leg2.pT*sin(leg2.phi) + mEy;
|
99 |
|
|
double lpz = leg1.pT*sinh(leg1.eta) + leg2.pT*sinh(leg2.eta);
|
100 |
|
|
double le = leg1.pT*cosh(leg1.eta) + leg2.pT*cosh(leg2.eta) + TMath::Sqrt(mEx*mEx + mEy*mEy);
|
101 |
|
|
return TLorentzVector(lpx, lpy, lpz, le);
|
102 |
|
|
}
|
103 |
|
|
|
104 |
|
|
TLorentzVector FourMomentumCollinearApprox(const BaseVars & leg1,
|
105 |
|
|
const BaseVars & leg2,
|
106 |
|
|
double mEx,
|
107 |
|
|
double mEy)
|
108 |
|
|
{
|
109 |
|
|
double px1 = leg1.pT*cos(leg1.phi);
|
110 |
|
|
double px2 = leg2.pT*cos(leg2.phi);
|
111 |
|
|
double py1 = leg1.pT*sin(leg1.phi);
|
112 |
|
|
double py2 = leg2.pT*sin(leg2.phi);
|
113 |
|
|
|
114 |
|
|
double x1_numerator = px1*py2 - px2*py1;
|
115 |
|
|
double x1_denominator = py2*(px1 + mEx) - px2*(py1 + mEy);
|
116 |
|
|
double x1 = ( x1_denominator != 0. ) ? x1_numerator/x1_denominator : -1.;
|
117 |
|
|
|
118 |
|
|
double x2_numerator = x1_numerator;
|
119 |
|
|
double x2_denominator = px1*(py2 + mEy) - py1*(px2 + mEx);
|
120 |
|
|
double x2 = ( x2_denominator != 0. ) ? x2_numerator/x2_denominator : -1.;
|
121 |
|
|
|
122 |
|
|
if ( (x1 > 0. && x1 < 1.) &&
|
123 |
|
|
(x2 > 0. && x2 < 1.) ) {
|
124 |
|
|
TLorentzVector p4 = FourMomentum(leg1,1/x1) + FourMomentum(leg2,1/x2);
|
125 |
|
|
return p4;
|
126 |
|
|
} else {
|
127 |
|
|
return TLorentzVector(0,0,0,0);
|
128 |
|
|
}
|
129 |
|
|
}
|
130 |
|
|
|
131 |
amagnan |
1.4 |
|
132 |
|
|
double EtaDetector(const BaseVars & v1){
|
133 |
|
|
double pDet[3];
|
134 |
|
|
pDet[0] = v1.pT*cos(v1.phi) + v1.vx;
|
135 |
|
|
pDet[1] = v1.pT*sin(v1.phi) + v1.vy;
|
136 |
|
|
|
137 |
|
|
double theta = 2*atan(exp(-v1.eta));
|
138 |
|
|
if (pDet[1]<0) theta = TMath::Pi()+theta;
|
139 |
|
|
|
140 |
|
|
if (tan(theta)!=0) pDet[2] = v1.pT/tan(theta) + v1.vz;
|
141 |
|
|
else return -10;
|
142 |
|
|
|
143 |
|
|
double pTDet = sqrt(pDet[0]*pDet[0] + pDet[1]*pDet[1]);
|
144 |
|
|
double pDetNorm = sqrt(pDet[0]*pDet[0] + pDet[1]*pDet[1] + pDet[2]*pDet[2]);
|
145 |
|
|
double thetaDet = 0;
|
146 |
|
|
double cosThetaDet = 0;
|
147 |
|
|
if (pDetNorm!=0) cosThetaDet = pDet[2]/pDetNorm;
|
148 |
|
|
else return -10;
|
149 |
|
|
if (pDet[2]!=0) thetaDet = atan(pTDet/pDet[2]);
|
150 |
|
|
else return -10;
|
151 |
|
|
if (cosThetaDet<0) thetaDet += TMath::Pi();
|
152 |
|
|
|
153 |
|
|
return -log(tan(thetaDet/2.));
|
154 |
|
|
}
|
155 |
|
|
|
156 |
|
|
double EtaDetector(const GenVars & v1){
|
157 |
|
|
double pDet[3];
|
158 |
|
|
pDet[0] = v1.pT*cos(v1.phi) + v1.vx;
|
159 |
|
|
pDet[1] = v1.pT*sin(v1.phi) + v1.vy;
|
160 |
|
|
|
161 |
|
|
double theta = 2*atan(exp(-v1.eta));
|
162 |
|
|
if (pDet[1]<0) theta = TMath::Pi()+theta;
|
163 |
|
|
|
164 |
|
|
if (tan(theta)!=0) pDet[2] = v1.pT/tan(theta) + v1.vz;
|
165 |
|
|
else return -10;
|
166 |
|
|
|
167 |
|
|
double pTDet = sqrt(pDet[0]*pDet[0] + pDet[1]*pDet[1]);
|
168 |
|
|
double pDetNorm = sqrt(pDet[0]*pDet[0] + pDet[1]*pDet[1] + pDet[2]*pDet[2]);
|
169 |
|
|
double thetaDet = 0;
|
170 |
|
|
double cosThetaDet = 0;
|
171 |
|
|
if (pDetNorm!=0) cosThetaDet = pDet[2]/pDetNorm;
|
172 |
|
|
else return -10;
|
173 |
|
|
if (pDet[2]!=0) thetaDet = atan(pTDet/pDet[2]);
|
174 |
|
|
else return -10;
|
175 |
|
|
if (cosThetaDet<0) thetaDet += TMath::Pi();
|
176 |
|
|
|
177 |
|
|
return -log(tan(thetaDet/2.));
|
178 |
|
|
}
|
179 |
|
|
|
180 |
|
|
|
181 |
|
|
|
182 |
amagnan |
1.1 |
}//namespace
|
183 |
|
|
|