ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/HbbAnalysis/src/Objects.cc
Revision: 1.5
Committed: Wed Sep 22 12:21:44 2010 UTC (14 years, 7 months ago) by amagnan
Content type: text/plain
Branch: MAIN
CVS Tags: v00-05-03, v00-05-02, v00-05-01
Changes since 1.4: +2 -2 lines
Log Message:
comment printout about mT calculation

File Contents

# User Rev Content
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