33 |
|
if( (subjets[1].v4()+subjets[2].v4()).isTimelike() ) |
34 |
|
m12 = (subjets[1].v4()+subjets[2].v4()).M(); |
35 |
|
|
36 |
< |
//minimum pairwise mass > 50 GeV/c^2 |
36 |
> |
//minimum pairwise mass |
37 |
|
mmin = std::min(m01,std::min(m02,m12)); |
38 |
|
} |
39 |
|
|
46 |
|
|
47 |
|
return true; |
48 |
|
} |
49 |
+ |
|
50 |
+ |
Jet* nextJet(const Particle *p, std::vector<Jet> *jets){ |
51 |
+ |
|
52 |
+ |
double deltarmin = double_infinity(); |
53 |
+ |
Jet* nextjet=0; |
54 |
+ |
for(unsigned int i=0; i<jets->size();++i){ |
55 |
+ |
if(jets->at(i).deltaR(*p) < deltarmin){ |
56 |
+ |
deltarmin = jets->at(i).deltaR(*p); |
57 |
+ |
nextjet = &jets->at(i); |
58 |
+ |
} |
59 |
+ |
} |
60 |
+ |
|
61 |
+ |
return nextjet; |
62 |
+ |
} |
63 |
+ |
|
64 |
+ |
bool WTag(TopJet prunedjet, double& mjet, int &nsubjets, double& massdrop){ |
65 |
+ |
|
66 |
+ |
nsubjets=prunedjet.numberOfDaughters(); |
67 |
+ |
|
68 |
+ |
mjet = 0; |
69 |
+ |
if(prunedjet.v4().isTimelike()) |
70 |
+ |
mjet = prunedjet.v4().M(); |
71 |
+ |
|
72 |
+ |
//calculate mass drop for first sub-jet ordered in pt |
73 |
+ |
massdrop = 0; |
74 |
+ |
if(nsubjets>=1 && mjet>0){ |
75 |
+ |
|
76 |
+ |
std::vector< Particle > subjets = prunedjet.subjets(); |
77 |
+ |
sort(subjets.begin(), subjets.end(), HigherPt()); |
78 |
+ |
|
79 |
+ |
double m1 = 0; |
80 |
+ |
if(subjets[0].v4().isTimelike()) |
81 |
+ |
m1 = subjets[0].v4().M(); |
82 |
+ |
|
83 |
+ |
massdrop = m1/mjet; |
84 |
+ |
} |
85 |
+ |
|
86 |
+ |
//at least 2 sub-jets |
87 |
+ |
if(nsubjets<2) return false; |
88 |
+ |
//60 GeV < pruned jet mass < 100 GeV |
89 |
+ |
if(mjet <= 60 || mjet >= 100) return false; |
90 |
+ |
//mass drop < 0.4 |
91 |
+ |
if(massdrop>=0.4) return false; |
92 |
+ |
|
93 |
+ |
return true; |
94 |
+ |
|
95 |
+ |
} |
96 |
+ |
|
97 |
+ |
double pTrel(const Particle *p, std::vector<Jet> *jets){ |
98 |
+ |
|
99 |
+ |
double ptrel=0; |
100 |
+ |
|
101 |
+ |
Jet* nextjet = nextJet(p,jets); |
102 |
+ |
|
103 |
+ |
TVector3 p3(p->v4().Px(),p->v4().Py(),p->v4().Pz()); |
104 |
+ |
TVector3 jet3(nextjet->v4().Px(),nextjet->v4().Py(),nextjet->v4().Pz()); |
105 |
+ |
|
106 |
+ |
if(p3.Mag()!=0 && jet3.Mag()!=0){ |
107 |
+ |
double sin_alpha = (p3.Cross(jet3)).Mag()/p3.Mag()/jet3.Mag(); |
108 |
+ |
ptrel = p3.Mag()*sin_alpha; |
109 |
+ |
} |
110 |
+ |
else{ |
111 |
+ |
std::cout << "something strange happend in the ptrel calculation: either lepton or jet momentum is 0" <<std::endl; |
112 |
+ |
} |
113 |
+ |
|
114 |
+ |
return ptrel; |
115 |
+ |
} |
116 |
+ |
|
117 |
+ |
double deltaRmin(const Particle *p, std::vector<Jet> *jets){ |
118 |
+ |
return nextJet(p,jets)->deltaR(*p); |
119 |
+ |
} |
120 |
+ |
|
121 |
+ |
TVector3 toVector(LorentzVector v4){ |
122 |
+ |
|
123 |
+ |
TVector3 v3(0,0,0); |
124 |
+ |
v3.SetX(v4.X()); |
125 |
+ |
v3.SetY(v4.Y()); |
126 |
+ |
v3.SetZ(v4.Z()); |
127 |
+ |
return v3; |
128 |
+ |
} |
129 |
+ |
|
130 |
+ |
TVector3 toVector(LorentzVectorXYZE v4){ |
131 |
+ |
|
132 |
+ |
TVector3 v3(0,0,0); |
133 |
+ |
v3.SetX(v4.X()); |
134 |
+ |
v3.SetY(v4.Y()); |
135 |
+ |
v3.SetZ(v4.Z()); |
136 |
+ |
return v3; |
137 |
+ |
} |
138 |
+ |
|
139 |
+ |
LorentzVectorXYZE toXYZ(LorentzVector v4){ |
140 |
+ |
|
141 |
+ |
LorentzVectorXYZE v4_new(0,0,0,0); |
142 |
+ |
v4_new.SetPx(v4.Px()); |
143 |
+ |
v4_new.SetPy(v4.Py()); |
144 |
+ |
v4_new.SetPz(v4.Pz()); |
145 |
+ |
v4_new.SetE(v4.E()); |
146 |
+ |
return v4_new; |
147 |
+ |
} |
148 |
+ |
|
149 |
+ |
LorentzVector toPtEtaPhi(LorentzVectorXYZE v4){ |
150 |
+ |
|
151 |
+ |
LorentzVector v4_new(0,0,0,0); |
152 |
+ |
v4_new.SetPt(v4.Pt()); |
153 |
+ |
v4_new.SetEta(v4.Eta()); |
154 |
+ |
v4_new.SetPhi(v4.Phi()); |
155 |
+ |
v4_new.SetE(v4.E()); |
156 |
+ |
return v4_new; |
157 |
+ |
} |
158 |
+ |
|
159 |
+ |
double deltaR(LorentzVector v1, LorentzVector v2){ |
160 |
+ |
|
161 |
+ |
Particle p1; |
162 |
+ |
p1.set_v4(v1); |
163 |
+ |
Particle p2; |
164 |
+ |
p2.set_v4(v2); |
165 |
+ |
return p1.deltaR(p2); |
166 |
+ |
} |
167 |
+ |
|
168 |
+ |
double double_infinity(){ |
169 |
+ |
return std::numeric_limits<double>::infinity() ; |
170 |
+ |
} |
171 |
+ |
|
172 |
+ |
int int_infinity(){ |
173 |
+ |
return std::numeric_limits<int>::max() ; |
174 |
+ |
} |
175 |
+ |
|
176 |
+ |
int myPow(int x, unsigned int p) { |
177 |
+ |
int i = 1; |
178 |
+ |
for (unsigned int j = 1; j <= p; j++) i *= x; |
179 |
+ |
return i; |
180 |
+ |
} |