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.7 by peiffer, Fri Dec 7 10:56:32 2012 UTC vs.
Revision 1.11 by peiffer, Wed Feb 13 16:30:24 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines