ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/UHHAnalysis/SFrameTools/src/Utils.cxx
(Generate patch)

Comparing UserCode/UHHAnalysis/SFrameTools/src/Utils.cxx (file contents):
Revision 1.3 by peiffer, Wed Jun 13 14:37:59 2012 UTC vs.
Revision 1.9 by peiffer, Fri Feb 1 14:28:07 2013 UTC

# Line 1 | Line 1
1   #include "../include/Utils.h"
2  
3  
4 < bool TopTag(TopJet topjet,  double &mjet, int &nsubjets, double &mmin){
5 <
6 <  nsubjets=topjet.numberOfDaughters();
4 > // global function to define a tagged jet
5  
6 <  LorentzVector allsubjets(0,0,0,0);
7 <  
8 <  for(int j=0; j<topjet.numberOfDaughters(); ++j){
9 <    allsubjets += topjet.subjets()[j].v4();
10 <  }
11 <  if(!allsubjets.isTimelike()){
12 <    mjet=0;
13 <    mmin=0;
6 > bool IsTagged(Jet & jet, E_BtagType type)
7 > {
8 >    if(type==e_CSVL && jet.btag_combinedSecondaryVertex()>0.244) return true;
9 >    if(type==e_CSVM && jet.btag_combinedSecondaryVertex()>0.679) return true;
10 >    if(type==e_CSVT && jet.btag_combinedSecondaryVertex()>0.898) return true;
11 >    if(type==e_JPL && jet.btag_jetProbability()>0.275) return true;
12 >    if(type==e_JPM && jet.btag_jetProbability()>0.545) return true;
13 >    if(type==e_JPT && jet.btag_jetProbability()>0.790) return true;      
14 >    
15      return false;
16 <  }
16 > }
17  
18 <  mjet = allsubjets.M();
19 <  
20 <  if(nsubjets>=3) {
21 <
22 <    std::vector<Particle> subjets = topjet.subjets();
23 <    sort(subjets.begin(), subjets.end(), HigherPt());
24 <
25 <    double m01 = 0;
26 <    if( (subjets[0].v4()+subjets[1].v4()).isTimelike())
27 <      m01=(subjets[0].v4()+subjets[1].v4()).M();
28 <    double m02 = 0;
29 <    if( (subjets[0].v4()+subjets[2].v4()).isTimelike() )
30 <      m02=(subjets[0].v4()+subjets[2].v4()).M();
31 <    double m12 = 0;
32 <    if( (subjets[1].v4()+subjets[2].v4()).isTimelike()  )
33 <      m12 = (subjets[1].v4()+subjets[2].v4()).M();
34 <    
18 > //variable HEP Tagger from Rebekka
19 >
20 > bool variableHepTopTag(TopJet topjet, double ptJetMin, double massWindowLower, double massWindowUpper, double cutCondition2, double cutCondition3)
21 > {
22 >    double mjet;
23 >    double ptjet;
24 >    int nsubjets;
25 >
26 >    double topmass=172.3;
27 >    double wmass=80.4;
28 >
29 >    nsubjets=topjet.numberOfDaughters();
30 >
31 >    LorentzVector allsubjets(0,0,0,0);
32 >
33 >    for(int j=0; j<topjet.numberOfDaughters(); ++j) {
34 >        allsubjets += topjet.subjets()[j].v4();
35 >    }
36 >    if(!allsubjets.isTimelike()) {
37 >        mjet=0;
38 >        return false;
39 >    }
40 >
41 >    mjet = allsubjets.M();
42 >    ptjet= allsubjets.Pt();
43 >
44 >    double m12, m13, m23;
45 >
46 >    //The subjetcs have to be three
47 >    if(nsubjets==3) {
48 >
49 >        std::vector<Particle> subjets = topjet.subjets();
50 >        sort(subjets.begin(), subjets.end(), HigherPt());
51 >
52 >        m12 = 0;
53 >        if( (subjets[0].v4()+subjets[1].v4()).isTimelike())
54 >            m12=(subjets[0].v4()+subjets[1].v4()).M();
55 >        m13 = 0;
56 >        if( (subjets[0].v4()+subjets[2].v4()).isTimelike() )
57 >            m13=(subjets[0].v4()+subjets[2].v4()).M();
58 >        m23 = 0;
59 >        if( (subjets[1].v4()+subjets[2].v4()).isTimelike()  )
60 >            m23 = (subjets[1].v4()+subjets[2].v4()).M();
61 >
62 >    } else {
63 >        return false;
64 >    }
65 >
66 >    double rmin=massWindowLower*wmass/topmass;
67 >    double rmax=massWindowUpper*wmass/topmass;
68 >
69 >    int keep=0;
70 >
71 >    //Conditions on the subjects: at least one has to be true
72 >    //1 condition
73 >    if(atan(m13/m12)>0.2 && atan(m13/m12)<1.3 && m23/mjet>rmin && m23/mjet<rmax) keep=1;
74 >
75 >    //2 condition
76 >    double cond2left=pow(rmin,2)*(1+pow((m13/m12),2));
77 >    double cond2cent=1-pow(m23/mjet,2);
78 >    double cond2right=pow(rmax,2)*(1+pow(m13/m12,2));
79 >
80 >    if(cond2left<cond2cent && cond2cent<cond2right && m23/mjet>cutCondition2) keep=1;
81 >
82 >    //3 condition
83 >    double cond3left=pow(rmin,2)*(1+pow((m12/m13),2));
84 >    double cond3cent=1-pow(m23/mjet,2);
85 >    double cond3right=pow(rmax,2)*(1+pow(m12/m13,2));
86 >
87 >    if(cond3left<cond3cent && cond3cent<cond3right && m23/mjet>cutCondition3) keep=1;
88 >
89 >    //Final requirement: at least one of the three subjets conditions and total pt
90 >    if(keep==1 && ptjet>ptJetMin) {
91 >        return true;
92 >    } else {
93 >        return false;
94 >    }
95 >
96 > }
97 >
98 >
99 > //HEP Tagger from Ivan
100 >
101 > bool HepTopTag(TopJet topjet)
102 > {
103 >  //call variable tagger with default parameters
104 >  return variableHepTopTag(topjet);
105 >
106 > }
107 >
108 > //default values (mminLower=50., mjetLower=140, mjetUpper=250.) defined in Utils.h
109 > bool variableTopTag(TopJet topjet, double &mjet, int &nsubjets, double &mmin, double mminLower, double mjetLower, double mjetUpper)
110 > {
111 >
112 >    nsubjets=topjet.numberOfDaughters();
113 >
114 >    LorentzVector allsubjets(0,0,0,0);
115 >
116 >    for(int j=0; j<topjet.numberOfDaughters(); ++j) {
117 >        allsubjets += topjet.subjets()[j].v4();
118 >    }
119 >    if(!allsubjets.isTimelike()) {
120 >        mjet=0;
121 >        mmin=0;
122 > //  mminLower=50;
123 > //   mjetLower=140;
124 > //   mjetUpper=250;
125 >        return false;
126 >    }
127 >
128 >    mjet = allsubjets.M();
129 >
130 >    if(nsubjets>=3) {
131 >
132 >        std::vector<Particle> subjets = topjet.subjets();
133 >        sort(subjets.begin(), subjets.end(), HigherPt());
134 >
135 >        double m01 = 0;
136 >        if( (subjets[0].v4()+subjets[1].v4()).isTimelike())
137 >            m01=(subjets[0].v4()+subjets[1].v4()).M();
138 >        double m02 = 0;
139 >        if( (subjets[0].v4()+subjets[2].v4()).isTimelike() )
140 >            m02=(subjets[0].v4()+subjets[2].v4()).M();
141 >        double m12 = 0;
142 >        if( (subjets[1].v4()+subjets[2].v4()).isTimelike() )
143 >            m12 = (subjets[1].v4()+subjets[2].v4()).M();
144 >
145 >        //minimum pairwise mass
146 >        mmin = std::min(m01,std::min(m02,m12));
147 >    }
148 >
149 >    //at least 3 sub-jets
150 >    if(nsubjets<3) return false;
151      //minimum pairwise mass > 50 GeV/c^2
152 <    mmin = std::min(m01,std::min(m02,m12));
153 <  }
152 >    if(mmin<mminLower) return false;
153 >    //jet mass between 140 and 250 GeV/c^2
154 >    if(mjet<mjetLower || mjet>mjetUpper) return false;
155  
156 <  //at least 3 sub-jets
41 <  if(nsubjets<3) return false;
42 <  //minimum pairwise mass > 50 GeV/c^2
43 <  if(mmin<50) return false;
44 <  //jet mass between 140 and 250 GeV/c^2
45 <  if(mjet<140 || mjet>250) return false;
46 <  
47 <  return true;
156 >    return true;
157   }
158  
50 Jet* nextJet(const Particle *p, std::vector<Jet> *jets){
159  
160 <  double deltarmin = double_infinity();
161 <  Jet* nextjet=0;
162 <  for(unsigned int i=0; i<jets->size();++i){
163 <    if(jets->at(i).deltaR(*p) < deltarmin){
164 <      deltarmin = jets->at(i).deltaR(*p);
165 <      nextjet = &jets->at(i);
160 > bool TopTag(TopJet topjet,  double &mjet, int &nsubjets, double &mmin)
161 > {
162 >  //call variable tagger with default parameters
163 >  return variableTopTag(topjet, mjet, nsubjets, mmin);
164 >
165 > }
166 >
167 > Jet* nextJet(const Particle *p, std::vector<Jet> *jets)
168 > {
169 >
170 >    double deltarmin = double_infinity();
171 >    Jet* nextjet=0;
172 >    for(unsigned int i=0; i<jets->size(); ++i) {
173 >        if(jets->at(i).deltaR(*p) < deltarmin) {
174 >            deltarmin = jets->at(i).deltaR(*p);
175 >            nextjet = &jets->at(i);
176 >        }
177      }
59  }
178  
179 <  return nextjet;
179 >    return nextjet;
180   }
181  
182 < double pTrel(const Particle *p, std::vector<Jet> *jets){
182 > bool WTag(TopJet prunedjet,  double& mjet, int &nsubjets, double& massdrop)
183 > {
184  
185 <  double ptrel=0;
185 >    nsubjets=prunedjet.numberOfDaughters();
186  
187 <  Jet* nextjet =  nextJet(p,jets);
187 >    mjet = 0;
188 >    if(prunedjet.v4().isTimelike())
189 >        mjet = prunedjet.v4().M();
190  
191 <  TVector3 p3(p->v4().Px(),p->v4().Py(),p->v4().Pz());
192 <  TVector3 jet3(nextjet->v4().Px(),nextjet->v4().Py(),nextjet->v4().Pz());
191 >    //calculate mass drop for first sub-jet ordered in pt
192 >    massdrop = 0;
193 >    if(nsubjets>=1 && mjet>0) {
194  
195 <  if(p3.Mag()!=0 && jet3.Mag()!=0){
196 <    double sin_alpha = (p3.Cross(jet3)).Mag()/p3.Mag()/jet3.Mag();
197 <    ptrel = p3.Mag()*sin_alpha;
198 <  }
199 <  else{
200 <    std::cout << "something strange happend in the ptrel calculation: either lepton or jet momentum is 0" <<std::endl;
201 <  }
195 >        std::vector< Particle > subjets = prunedjet.subjets();
196 >        sort(subjets.begin(), subjets.end(), HigherPt());
197 >
198 >        double m1 = 0;
199 >        if(subjets[0].v4().isTimelike())
200 >            m1 = subjets[0].v4().M();
201 >
202 >        massdrop = m1/mjet;
203 >    }
204 >
205 >    //at least 2 sub-jets
206 >    if(nsubjets<2) return false;
207 >    //60 GeV < pruned jet mass < 100 GeV
208 >    if(mjet <= 60 || mjet >= 100) return false;
209 >    //mass drop < 0.4
210 >    if(massdrop>=0.4) return false;
211 >
212 >    return true;
213  
81  return ptrel;
214   }
215  
216 < double deltaRmin(const Particle *p, std::vector<Jet> *jets){
217 <  return nextJet(p,jets)->deltaR(*p);
216 > double pTrel(const Particle *p, std::vector<Jet> *jets)
217 > {
218 >
219 >    double ptrel=0;
220 >
221 >    Jet* nextjet =  nextJet(p,jets);
222 >
223 >    TVector3 p3(p->v4().Px(),p->v4().Py(),p->v4().Pz());
224 >    TVector3 jet3(nextjet->v4().Px(),nextjet->v4().Py(),nextjet->v4().Pz());
225 >
226 >    if(p3.Mag()!=0 && jet3.Mag()!=0) {
227 >        double sin_alpha = (p3.Cross(jet3)).Mag()/p3.Mag()/jet3.Mag();
228 >        ptrel = p3.Mag()*sin_alpha;
229 >    } else {
230 >        std::cout << "something strange happend in the ptrel calculation: either lepton or jet momentum is 0" <<std::endl;
231 >    }
232 >
233 >    return ptrel;
234 > }
235 >
236 > double deltaRmin(const Particle *p, std::vector<Jet> *jets)
237 > {
238 >    return nextJet(p,jets)->deltaR(*p);
239   }
240  
241 + TVector3 toVector(LorentzVector v4)
242 + {
243  
244 < double double_infinity(){
245 <  return std::numeric_limits<double>::infinity() ;
244 >    TVector3 v3(0,0,0);
245 >    v3.SetX(v4.X());
246 >    v3.SetY(v4.Y());
247 >    v3.SetZ(v4.Z());
248 >    return v3;
249   }
250  
251 < int int_infinity(){
252 <  return std::numeric_limits<int>::max() ;
251 > TVector3 toVector(LorentzVectorXYZE v4)
252 > {
253 >
254 >    TVector3 v3(0,0,0);
255 >    v3.SetX(v4.X());
256 >    v3.SetY(v4.Y());
257 >    v3.SetZ(v4.Z());
258 >    return v3;
259 > }
260 >
261 > LorentzVectorXYZE toXYZ(LorentzVector v4)
262 > {
263 >
264 >    LorentzVectorXYZE v4_new(0,0,0,0);
265 >    v4_new.SetPx(v4.Px());
266 >    v4_new.SetPy(v4.Py());
267 >    v4_new.SetPz(v4.Pz());
268 >    v4_new.SetE(v4.E());
269 >    return v4_new;
270 > }
271 >
272 > LorentzVector toPtEtaPhi(LorentzVectorXYZE v4)
273 > {
274 >
275 >    LorentzVector v4_new(0,0,0,0);
276 >    v4_new.SetPt(v4.Pt());
277 >    v4_new.SetEta(v4.Eta());
278 >    v4_new.SetPhi(v4.Phi());
279 >    v4_new.SetE(v4.E());
280 >    return v4_new;
281 > }
282 >
283 > double deltaR(LorentzVector v1, LorentzVector v2)
284 > {
285 >
286 >    Particle p1;
287 >    p1.set_v4(v1);
288 >    Particle p2;
289 >    p2.set_v4(v2);
290 >    return p1.deltaR(p2);
291 > }
292 >
293 > double double_infinity()
294 > {
295 >    return std::numeric_limits<double>::infinity() ;
296 > }
297 >
298 > int int_infinity()
299 > {
300 >    return std::numeric_limits<int>::max() ;
301 > }
302 >
303 > int myPow(int x, unsigned int p)
304 > {
305 >    int i = 1;
306 >    for (unsigned int j = 1; j <= p; j++)  i *= x;
307 >    return i;
308 > }
309 >
310 > int JetFlavor(Jet *jet)
311 > {
312 >
313 >    EventCalc* calc = EventCalc::Instance();
314 >
315 >    std::vector< GenParticle >* genparticles = calc->GetGenParticles();
316 >    if(genparticles) {
317 >
318 >        //fill pdg IDs of all matched GenParticles
319 >        std::vector<int> matched_genparticle_ids;
320 >        for(unsigned int i=0; i<genparticles->size(); ++i) {
321 >
322 >            GenParticle genp = genparticles->at(i);
323 >
324 >            //only take status 3 particles into account
325 >            if(genp.status()!=3) continue;
326 >
327 >            if(jet->deltaR(genp)<0.5)
328 >                matched_genparticle_ids.push_back(genp.pdgId());
329 >        }
330 >
331 >        //search for b quarks first
332 >        for(unsigned int i=0; i<matched_genparticle_ids.size(); ++i) {
333 >            if(abs(matched_genparticle_ids[i])==5) return matched_genparticle_ids[i];
334 >        }
335 >        //no b quark -> search for c quarks
336 >        for(unsigned int i=0; i<matched_genparticle_ids.size(); ++i) {
337 >            if(abs(matched_genparticle_ids[i])==4) return matched_genparticle_ids[i];
338 >        }
339 >        for(unsigned int i=0; i<matched_genparticle_ids.size(); ++i) {
340 >            if(abs(matched_genparticle_ids[i])==3) return matched_genparticle_ids[i];
341 >        }
342 >        for(unsigned int i=0; i<matched_genparticle_ids.size(); ++i) {
343 >            if(abs(matched_genparticle_ids[i])==2) return matched_genparticle_ids[i];
344 >        }
345 >        for(unsigned int i=0; i<matched_genparticle_ids.size(); ++i) {
346 >            if(abs(matched_genparticle_ids[i])==1) return matched_genparticle_ids[i];
347 >        }
348 >        for(unsigned int i=0; i<matched_genparticle_ids.size(); ++i) {
349 >            if(abs(matched_genparticle_ids[i])==21) return matched_genparticle_ids[i];
350 >        }
351 >
352 >    }
353 >
354 >    //no matched GenParticle -> return default value 0
355 >    return 0;
356 >
357   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines