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

Comparing UserCode/UHHAnalysis/SFrameTools/src/EventCalc.cxx (file contents):
Revision 1.3 by peiffer, Mon Jun 18 16:00:24 2012 UTC vs.
Revision 1.10 by peiffer, Mon Mar 25 12:22:56 2013 UTC

# Line 25 | Line 25 | EventCalc::EventCalc() : m_logger( "Even
25    m_logger << DEBUG << "Constructor called." << SLogger::endmsg;
26    m_bcc = NULL;
27    m_lumi = NULL;
28 +  m_primlep = NULL;
29 +  m_ttgen = NULL;
30   }
31  
32   EventCalc::~EventCalc()
# Line 47 | Line 49 | void EventCalc::Reset()
49    // reset booleans
50    b_HT = false;
51    b_HTlep = false;
52 +  b_Reconstruction = false;
53 +
54 +  m_TotalWeight = 1.;
55 +  
56 +  m_primlep = NULL;
57 +  delete m_ttgen;
58 +  m_ttgen = NULL;
59  
60   }
61  
# Line 128 | Line 137 | double EventCalc::GetHTlep()
137    return m_HTlep;
138   }
139  
140 + Particle* EventCalc::GetPrimaryLepton(){
141 +
142 +  if(!m_primlep){
143 +    double ptmax = -999;
144 +    for(unsigned int i=0; i<m_bcc->electrons->size(); ++i){
145 +      if(m_bcc->electrons->at(i).pt()>ptmax){
146 +        ptmax = m_bcc->electrons->at(i).pt();
147 +        m_primlep = &m_bcc->electrons->at(i);
148 +      }
149 +    }
150 +    for(unsigned int i=0; i<m_bcc->muons->size(); ++i){
151 +      if(m_bcc->muons->at(i).pt()>ptmax){
152 +        ptmax = m_bcc->muons->at(i).pt();
153 +        m_primlep = &m_bcc->muons->at(i);
154 +      }
155 +    }
156 +  }
157 +
158 +  return m_primlep;
159 + }
160 +
161 + TTbarGen* EventCalc::GetTTbarGen(){
162 +
163 +  if(!m_ttgen){
164 +    m_ttgen = new TTbarGen();
165 +  }
166 +
167 +  return m_ttgen;
168 + }
169 +
170 +
171 + std::vector<LorentzVector> EventCalc::NeutrinoReconstruction(const LorentzVector lepton, const LorentzVector met){
172 +
173 +  
174 +  TVector3 lepton_pT = toVector(lepton);
175 +  lepton_pT.SetZ(0);
176 +  
177 +  TVector3 neutrino_pT = toVector(met);
178 +  neutrino_pT.SetZ(0);
179 +  
180 +  const float mass_w = 80.399;
181 +  float mu = mass_w * mass_w / 2 + lepton_pT * neutrino_pT;
182 +  
183 +  float A = - (lepton_pT * lepton_pT);
184 +  float B = mu * lepton.pz();
185 +  float C = mu * mu - lepton.e() * lepton.e() * (neutrino_pT * neutrino_pT);
186 +  
187 +  float discriminant = B * B - A * C;
188 +  
189 +  std::vector<LorentzVector> solutions;
190 +  
191 +  if (0 >= discriminant)
192 +    {
193 +      // Take only real part of the solution
194 +      //
195 +      LorentzVectorXYZE solution (0,0,0,0);
196 +      solution.SetPx(met.Px());
197 +      solution.SetPy(met.Py());
198 +      solution.SetPz(-B / A);
199 +      solution.SetE(toVector(solution).Mag());
200 +      
201 +      solutions.push_back(toPtEtaPhi(solution));
202 +      
203 +      //_solutions = 0 > discriminant ? 0 : 1;
204 +    }
205 +  else
206 +    {
207 +      discriminant = sqrt(discriminant);
208 +      
209 +      LorentzVectorXYZE solution (0,0,0,0);
210 +      solution.SetPx(met.Px());
211 +      solution.SetPy(met.Py());
212 +      solution.SetPz((-B - discriminant) / A);
213 +      solution.SetE(toVector(solution).Mag());
214 +      
215 +      solutions.push_back(toPtEtaPhi(solution));
216 +      
217 +      LorentzVectorXYZE solution2 (0,0,0,0);
218 +      solution2.SetPx(met.Px());
219 +      solution2.SetPy(met.Py());
220 +      solution2.SetPz((-B + discriminant) / A);
221 +      solution2.SetE(toVector(solution2).Mag());
222 +      
223 +      solutions.push_back(toPtEtaPhi(solution2));
224 +      
225 +      //_solutions = 2;
226 +    }
227 +  
228 +  return solutions;
229 + }
230 +
231 + void EventCalc::FillHighMassTTbarHypotheses(){
232 +
233 +  if(b_Reconstruction) return;
234 +  b_Reconstruction=true;
235 +
236 +  //clear hypothesis list
237 +  m_bcc->recoHyps->clear();
238 +
239 +  //find primary charged lepton
240 +  Particle* lepton = GetPrimaryLepton();
241 +
242 +  //reconstruct neutrino
243 +  std::vector<LorentzVector> neutrinos = NeutrinoReconstruction( lepton->v4(), m_bcc->met->v4());
244 +  
245 +  ReconstructionHypothesis hyp;
246 +
247 +  hyp.set_lepton(*lepton);
248 +
249 +  //loop over neutrino solutions and jet assignments to fill hyotheses
250 +  for(unsigned int i=0; i< neutrinos.size();++i){
251 +
252 +    hyp.set_neutrino_v4(neutrinos[i]);
253 +    LorentzVector wlep_v4 = lepton->v4()+neutrinos[i];
254 +
255 +    unsigned int n_jets = m_bcc->jets->size();
256 +    if(n_jets>10) n_jets=10; //avoid crashes in events with many jets
257 +    unsigned int max_j = myPow(3, n_jets);
258 +    for (unsigned int j=0; j < max_j; j++) {
259 +      LorentzVector tophad_v4(0,0,0,0);
260 +      LorentzVector toplep_v4 = wlep_v4;
261 +      int hadjets=0;
262 +      int lepjets=0;
263 +      int num = j;
264 +      hyp.clear_jetindices();
265 +      for (unsigned int k=0; k<n_jets; k++) {
266 +        // num is the k-th digit of j if you
267 +        // write j in a base-3 system. According
268 +        // to the value of this digit (which takes
269 +        // values from 0 to 2,
270 +        // in all possible combinations with the other digits),
271 +        // decide how to treat the jet.
272 +        
273 +        if(num%3==0) {
274 +          tophad_v4 = tophad_v4 + m_bcc->jets->at(k).v4();
275 +          hyp.add_tophad_jet_index(k);
276 +          hadjets++;
277 +        }
278 +        
279 +        if(num%3==1) {
280 +          toplep_v4 = toplep_v4 + m_bcc->jets->at(k).v4();
281 +          hyp.add_toplep_jet_index(k);
282 +          lepjets++;
283 +        }
284 +        //if(num%3==2); //do not take this jet
285 +        
286 +        //shift the trigits of num to the right:
287 +        num /= 3;
288 +      }
289 +      
290 +      //search jet with highest pt assigned to leptonic top
291 +      float maxpt=-999;
292 +      int maxind=-1;
293 +      for(unsigned int i=0; i<hyp.toplep_jets_indices().size(); ++i){
294 +        float pt = m_bcc->jets->at(hyp.toplep_jets_indices().at(i)).pt();
295 +        if(pt>maxpt){
296 +          maxpt=pt;
297 +          maxind=hyp.toplep_jets_indices().at(i);
298 +        }
299 +      }
300 +      hyp.set_blep_index(maxind);
301 +
302 +      
303 +      //fill only hypotheses with at least one jet assigned to each top quark
304 +      if(hadjets>0 && lepjets>0){
305 +        hyp.set_tophad_v4(tophad_v4);
306 +        hyp.set_toplep_v4(toplep_v4);
307 +        m_bcc->recoHyps->push_back(hyp);
308 +      }
309 +    }
310 +  }
311 +  
312 + }
313 +
314 +
315   void EventCalc::PrintEventContent(){
316  
317    m_logger << INFO << "----------------- event content -----------------" << SLogger::endmsg;
# Line 135 | Line 319 | void EventCalc::PrintEventContent(){
319    m_logger << INFO << "MET = " << m_bcc->met->pt() << "   METphi = " << m_bcc->met->phi() <<  "   HTlep = " << GetHTlep() << SLogger::endmsg;
320    if(m_bcc->electrons){m_logger << INFO << "Electrons:" << SLogger::endmsg;
321      for(unsigned int i=0; i<m_bcc->electrons->size(); ++i){
322 <      m_logger << INFO << "     " << i+1 << " pt = " << m_bcc->electrons->at(i).pt() <<"   eta = " << m_bcc->electrons->at(i).eta() << SLogger::endmsg;
322 >      m_logger << INFO << "     " << i+1 << " pt = " << m_bcc->electrons->at(i).pt() <<"   eta = " << m_bcc->electrons->at(i).eta()
323 >               << "   supercluster eta = " <<m_bcc->electrons->at(i).supercluster_eta() << "   IP wrt bsp = " << fabs(m_bcc->electrons->at(i).gsfTrack_dxy_vertex(m_bcc->pvs->at(0).x(), m_bcc->pvs->at(0).y()))
324 >               << "   pass conv veto = " << m_bcc->electrons->at(i).passconversionveto()  << "   mvaTrigV0 = " <<  m_bcc->electrons->at(i).mvaTrigV0()
325 >               << "   dEtaIn = " << m_bcc->electrons->at(i).dEtaIn() << "   sigmaIEtaIEta = " << m_bcc->electrons->at(i).sigmaIEtaIEta()
326 >               << "   HoverE = " << m_bcc->electrons->at(i).HoverE() << "   EcalEnergy = " << m_bcc->electrons->at(i).EcalEnergy()
327 >               << "   EoverPIn = " << m_bcc->electrons->at(i).EoverPIn() << "   trackMomentumAtVtx = " << m_bcc->electrons->at(i).EcalEnergy()/m_bcc->electrons->at(i).EoverPIn()
328 >               << SLogger::endmsg;
329      }
330    }
331    if(m_bcc->muons){m_logger << INFO << "Muons:" << SLogger::endmsg;
# Line 150 | Line 340 | void EventCalc::PrintEventContent(){
340    }
341    if(m_bcc->jets){m_logger << INFO << "Jets:" << SLogger::endmsg;
342      for(unsigned int i=0; i<m_bcc->jets->size(); ++i){
343 <      m_logger << INFO << "     " << i+1 << " pt = " << m_bcc->jets->at(i).pt() <<"   eta = " << m_bcc->jets->at(i).eta() << SLogger::endmsg;
343 >      m_logger << INFO << "     " << i+1 << " pt = " << m_bcc->jets->at(i).pt() <<"   eta = " << m_bcc->jets->at(i).eta() << "   genjet_pt = " << m_bcc->jets->at(i).genjet_pt() << "   genjet_eta = " <<   m_bcc->jets->at(i).genjet_eta() <<SLogger::endmsg;
344      }
345    }
346    if(m_bcc->topjets){m_logger << INFO << "TopJets:" << SLogger::endmsg;
# Line 164 | Line 354 | void EventCalc::PrintEventContent(){
354      }
355    }
356   }
357 +
358 +
359 + void EventCalc::ProduceWeight(double weight)
360 + {
361 +  m_TotalWeight = m_TotalWeight * weight;
362 + }
363 +
364 + double EventCalc::GetWeight()
365 + {
366 +
367 + return m_TotalWeight;
368 + }
369 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines