All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
EvaluateTauFinder.cc
Go to the documentation of this file.
1 #include "EvaluateTauFinder.h"
2 #include <iostream>
3 #include <iomanip>
4 
5 using namespace std;
6 
7 
8 #ifdef MARLIN_USE_AIDA
9 #include <marlin/AIDAProcessor.h>
10 #include <AIDA/IHistogramFactory.h>
11 #include <AIDA/ICloud1D.h>
12 //#include <AIDA/IHistogram1D.h>
13 #endif
14 
15 #include <EVENT/LCCollection.h>
16 #include <EVENT/LCObject.h>
17 #include <IMPL/LCCollectionVec.h>
18 #include <EVENT/LCRelation.h>
19 #include <EVENT/MCParticle.h>
20 #include <EVENT/ReconstructedParticle.h>
21 #include <IMPL/ReconstructedParticleImpl.h>
22 #include <IMPL/VertexImpl.h>
23 #include "UTIL/LCRelationNavigator.h"
24 
25 #include <gear/GEAR.h>
26 #include <gear/BField.h>
27 #include <marlin/Global.h>
28 
29 #include "HelixClass.h"
30 #include "SimpleLine.h"
31 // ----- include for verbosity dependend logging ---------
32 #include "marlin/VerbosityLevels.h"
33 
34 #define coutEv -1
35 
36 #define coutUpToEv 0
37 
38 
39 using namespace lcio ;
40 using namespace marlin ;
41 using namespace UTIL;
42 
44 
45 struct TAU { // Declare struct type
46  double E,phi,theta,D0,NQ,N,minv; // Declare member types
47 };
48 
49 bool MyAngleSort( TAU p1, TAU p2)
50 {
51  return fabs(p1.phi) > fabs(p2.phi);
52 }
53 
54 EvaluateTauFinder::EvaluateTauFinder() : Processor("EvaluateTauFinder")
55 {
56  // modify processor description
57  _description = "EvaluateTauFinder checks performance of TauFinder and writes output to root file." ;
58 
59  // register steering parameters: name, description, class-variable, default value
60 
61  registerProcessorParameter( "FileName_Signal",
62  "Name of the Signal output file " ,
64  std::string("Signal.root") ) ;
65 
66 
67 
68  registerInputCollection( LCIO::MCPARTICLE,
69  "MCCollectionName" ,
70  "Name of the MCParticle collection" ,
71  _colNameMC ,
72  std::string("MCParticlesSkimmed") ) ;
73 
74  registerInputCollection( LCIO::LCRELATION,
75  "RECOMCTRUTHCollectionName" ,
76  "Name of the MC Truth PFA collection" ,
78  std::string("RecoMCTruthLink") ) ;
79 
80  registerInputCollection( LCIO::RECONSTRUCTEDPARTICLE,
81  "TauRecCollection",
82  "Collection of Tau Candidates",
83  _incol ,
84  std::string("TauRec_PFO"));
85 
86  registerInputCollection( LCIO::LCRELATION,
87  "TauLinkCollectionName" ,
88  "Name of the link between tau and pfos" ,
90  std::string("TauRecLink_PFO") ) ;
91 
92 
93 
94 
95 
96 }
97 
98 
100 {
101  streamlog_out(DEBUG) << " init called "
102  << std::endl ;
103 
104  // usually a good idea to
105  printParameters() ;
106 
107  _nRun = 0 ;
108  _nEvt = 0 ;
109  _ntot_rec= 0;
110  _ntot_mc= 0;
111  _ntau_correct= 0;
112  _dEsum= 0;
113  _dEsumsq= 0;
114  _ndE= 0;
115  _bField = Global::GEAR->getBField().at( gear::Vector3D( 0., 0., 0.) ).z() ;
116 
117 
118  rootfile = new TFile((_OutputFile_Signal).c_str (),"RECREATE");
119 
120  evtuple=new TNtuple("evtuple","evtuple","EvID:Ntaus_mc:Ntaus_rec:missed:WpD1:WpD2:WmD1:WmD2:LD");
121  tautuple=new TNtuple("tautuple","tautuple","EvID:mcE:mcPhi:mcTheta:mcD0:recE:recPhi:recTheta:recD0:recNQ:recN:minv");
122  mcmisstuple=new TNtuple("mcmiss","mcmiss","EvID:E:pt:theta:D0:D1:D2");
123  taumatchtuple=new TNtuple("taumatch","taumatch","EvID:E:mcE:mcp:mcpt:mcPhi:mcTheta:mcD0:recE:recp:recpt:recPhi:recTheta:recD0");
124  tauexacttuple=new TNtuple("tauexact","tauexact","EvID:E:mcE:mcp:mcpt:mcD0:recE:recp:recpt:recD0:ED0seed");
125  faketuple =new TNtuple("fake","fake","EvID:parentpdg:D1:D2:recE:recp:recD0:pt:theta:N");
126  topofaketuple =new TNtuple("topofake","topofake","EvID:nfake:WpD1:WpD2:WmD1:WmD2");
127  leptons=new TNtuple("Leptons","Leptons","EvID:PDG");
128 
129 }
130 
132 {
133  _nRun++ ;
134 }
135 
136 void EvaluateTauFinder::processEvent( LCEvent * evt )
137 {
138  // this gets called for every event
139  // usually the working horse ...
140 
141  LCCollection *colMC, *colMCTruth, *colTau;
142  LCCollection *colTauRecLink;
143  try {
144  colMC = evt->getCollection( _colNameMC ) ;
145 } catch (Exception& e) {
146  colMC = 0;
147  }
148 
149  try {
150  colTau = evt->getCollection( _incol ) ;
151 } catch (Exception& e) {
152  colTau = 0;
153  }
154 
155  try {
156  colMCTruth = evt->getCollection( _colNameMCTruth ) ;
157 } catch (Exception& e) {
158  colMCTruth = 0;
159  }
160 
161  try {
162  colTauRecLink = evt->getCollection( _colNameTauRecLink ) ;
163 } catch (Exception& e) {
164  colTauRecLink = 0;
165  }
166 
167 
168 
169  _nEvt = evt->getEventNumber();
170 
171  int ntau_mc=0;
172  int ntau_rec=0;
173  int missed=0;
174 
175  LCRelationNavigator* relationNavigatorTau = 0;
176  LCRelationNavigator* relationNavigatorPFOMC = 0;
177  if( colTauRecLink != 0)
178  relationNavigatorTau = new LCRelationNavigator( colTauRecLink );
179  if( colMCTruth != 0)
180  relationNavigatorPFOMC = new LCRelationNavigator( colMCTruth );
181 
182  bool isfake=false;
183  int nfakes=0;
184  int LDev=0;
185  std::vector<TAU> rectauvec;
186  if( colTau != 0)
187  {
188  int nT = colTau->getNumberOfElements();
189  ntau_rec=nT;
190  int LD=0;
191  if(_nEvt<coutUpToEv || _nEvt==coutEv)
192  streamlog_out(DEBUG) << "EVENT "<<_nEvt<<" with "<<nT<<" taus"<<endl;
193  HelixClass *helix = new HelixClass();
194  HelixClass *mc_helix = new HelixClass();
195  for(int k=0; k < nT; k++)
196  {
197  ReconstructedParticle *tau = static_cast<ReconstructedParticle*>( colTau->getElementAt( k ) );
198  const double *pvec=tau->getMomentum();
199  double pt=sqrt(pvec[0]*pvec[0]+pvec[1]*pvec[1]);
200  double p=sqrt(pvec[0]*pvec[0]+pvec[1]*pvec[1]+pvec[2]*pvec[2]);
201  double phi=180./TMath::Pi()*atan(pvec[1]/pvec[0]);
202  double theta=180./TMath::Pi()*atan(pt/fabs(pvec[2]));
203  std::vector< ReconstructedParticle * > tauvec=tau->getParticles();
204  double Eseed=0,D0=0;
205 
206  if(tauvec.size()==1)
207  leptons->Fill(_nEvt,tauvec[0]->getType());
208  int NQ=0;
209  for(unsigned int o=0;o<tauvec.size();o++)
210  {
211  //find seed track for D0
212  if(tauvec[o]->getCharge()!=0)
213  {
214  NQ++;
215  if(tauvec[o]->getEnergy()>Eseed && tauvec[o]->getTracks().size()!=0 )
216  {
217  D0=(float)tauvec[o]->getTracks()[0]->getD0();
218  Eseed=tauvec[o]->getEnergy();
219  }
220  }
221  //check for leptonic decay
222  if(tauvec[o]->getType()==11 ||tauvec[o]->getType()==13)
223  LD=1;
224  }
225  // float mom[3];
226 // float ver[3];
227 
228 // for (int icomp=0; icomp<3; ++icomp) {
229 // mom[icomp]=(float)tau->getMomentum()[icomp];
230 // VertexImpl *vtx=static_cast<VertexImpl*>(tau->getStartVertex());
231 // if(vtx)
232 // {
233 // const float *vpos=vtx->getPosition();
234 // ver[icomp]=vpos[icomp];
235 // }
236 // else
237 // ver[icomp]=0;
238 // }
239 
240 // float charge = tau->getCharge();
241 // helix->Initialize_VP(ver,mom,charge,_bField);
242  //double D0=fabs(helix->getD0());
243  if(_nEvt<coutUpToEv || _nEvt==coutEv)
244  streamlog_out(DEBUG) <<tau->getEnergy()<<" "<<phi<<" "<<theta<<" "<<D0<<" "<<tauvec.size()<<endl;
245 
246  TAU rtau;
247  rtau.E=tau->getEnergy();
248  rtau.phi=phi;
249  rtau.theta=theta;
250  rtau.D0=D0;
251  rtau.N=tauvec.size();
252  rtau.NQ=NQ;
253  double mass_inv=0;
254  if(tau->getEnergy()*tau->getEnergy()<p*p)
255  mass_inv=tau->getEnergy()-sqrt(p*p);
256  else
257  mass_inv=sqrt(tau->getEnergy()*tau->getEnergy()-p*p);
258  rtau.minv=mass_inv;
259  rectauvec.push_back(rtau);
260  _ntot_rec++;
261 
262  //follow the chain back to mc truth
263  if(relationNavigatorTau)
264  {
265  bool istau=false;
266  bool contaminated=false;
267  MCParticle *mctau=NULL;
268  EVENT::LCObjectVec relobjFROM = relationNavigatorTau->getRelatedToObjects(tau);
269  for(unsigned int o=0;o<relobjFROM.size();o++)
270  {
271  ReconstructedParticle *rec=static_cast<ReconstructedParticle*>(relobjFROM[o]);
272  if(relationNavigatorPFOMC)
273  {
274  EVENT::LCObjectVec relobjMC = relationNavigatorPFOMC->getRelatedToObjects(rec);
275  for(unsigned int m=0;m<relobjMC.size();m++)
276  {
277  MCParticle *mc=static_cast<MCParticle*>(relobjMC[m]);
278  //check whether particles parent is really a tau:
279  MCParticle *dummy=mc;
280  MCParticle *parent=mc;
281  //need to catch broken relations in DST file for background particles
282  if(mc==0)
283  {
284  //std::cout<<"Broken Relation: "<<_nEvt<<" "<<rec->getType()<<" "<<rec->getEnergy()<<std::endl;
285  continue;
286  }
287  int size=mc->getParents().size();
288  while(size!=0)
289  {
290  dummy=parent->getParents()[0];
291  size=dummy->getParents().size();
292  parent=dummy;
293  if(fabs(parent->getPDG())==15)
294  size=0;
295  }
296  if(fabs(parent->getPDG())==15)
297  {
298  istau=true;
299  mctau=parent;
300  }
301  else
302  contaminated=true;
303  }
304  }
305  }
306 
307  //compare tau with mc truth
308  if(mctau)
309  {
310  float mc_mom[3];
311  float mc_ver[3];
312  const double *mc_pvec=mctau->getMomentum();
313  double mc_pt=sqrt(mc_pvec[0]*mc_pvec[0]+mc_pvec[1]*mc_pvec[1]);
314  double mc_phi=180./TMath::Pi()*atan(mc_pvec[1]/mc_pvec[0]);
315  double mc_theta=180./TMath::Pi()*atan(mc_pt/fabs(mc_pvec[2]));
316 
317  for (int icomp=0; icomp<3; ++icomp) {
318  mc_mom[icomp]=(float)mctau->getMomentum()[icomp];
319  mc_ver[icomp]=(float)mctau->getDaughters()[0]->getVertex()[icomp];
320  }
321  float mc_charge = mctau->getCharge();
322  mc_helix->Initialize_VP(mc_ver,mc_mom,mc_charge,_bField);
323  double mc_D0=fabs(mc_helix->getD0());
324  double Evis=0,ptvis=0,pvis=0;
325 
326  LoopDaughters(mctau,Evis,ptvis,pvis);
327 
328  taumatchtuple->Fill(_nEvt,mctau->getEnergy(),Evis,pvis,ptvis,mc_phi,mc_theta,mc_D0,tau->getEnergy(),p,pt,phi,theta,D0,LD);
329  if(!contaminated)
330  tauexacttuple->Fill(_nEvt,mctau->getEnergy(),Evis,pvis,ptvis,mc_D0,tau->getEnergy(),p,pt,D0,Eseed,LD);
331  _dEsum+=Evis-tau->getEnergy();
332  _dEsumsq+=(Evis-tau->getEnergy())*(Evis-tau->getEnergy());
333  _ndE++;
334  }
335  if(istau)
336  _ntau_correct++;
337  else
338  {
339  int d1=0,d2=0,pdg=0;
340  for(unsigned int o=0;o<relobjFROM.size();o++)
341  {
342  ReconstructedParticle *rec=static_cast<ReconstructedParticle*>(relobjFROM[o]);
343  if(relationNavigatorPFOMC)
344  {
345  EVENT::LCObjectVec relobj = relationNavigatorPFOMC->getRelatedToObjects(rec);
346  for(unsigned int m=0;m<relobj.size();m++)
347  {
348  MCParticle *mc=static_cast<MCParticle*>(relobj[m]);
349  //need to catch broken relations in DST file for background particles
350  if(mc==0)
351  continue;
352  if(mc->getCharge()==0)
353  continue;
354  MCParticle *dummy=mc;
355  MCParticle *parent=mc;
356  int size=mc->getParents().size();
357  while(size!=0)
358  {
359  dummy=parent->getParents()[0];
360  size=dummy->getParents().size();
361  parent=dummy;
362  if(parent->getGeneratorStatus()==2)
363  break;
364  }
365  pdg=parent->getPDG();
366  if(parent->getDaughters().size())
367  d1=parent->getDaughters()[0]->getPDG();
368  if(parent->getDaughters().size()>1)
369  d2=parent->getDaughters()[1]->getPDG();
370  }
371  }
372  }
373  const double *tpvec=tau->getMomentum();
374  double tpt=sqrt(tpvec[0]*tpvec[0]+tpvec[1]*tpvec[1]);
375  double ttheta=180./TMath::Pi()*atan(tpt/fabs(tpvec[2]));
376  faketuple->Fill(_nEvt,pdg,d1,d2,tau->getEnergy(),p,D0,tpt,ttheta,tau->getParticles().size());
377  isfake=true;
378  nfakes++;
379  }
380  }//relNavTau
381  }
382 
383  delete helix;
384  delete mc_helix;
385  }
386 
387  int D1=0,D2=0,D3=0,D4=0;
388  std::vector<TAU> mctauvec;
389  if( colMC != 0 )
390  {
391  int nMCP = colMC->getNumberOfElements();
392  if(_nEvt<coutUpToEv || _nEvt==coutEv)
393  streamlog_out(DEBUG) <<"MCTRUTH: "<<endl;
394  HelixClass * helix = new HelixClass();
395  for(int k=0; k < nMCP; k++)
396  {
397  MCParticle *particle = static_cast<MCParticle*>(colMC->getElementAt(k) );
398 
399  if(particle->getGeneratorStatus()==2 && fabs(particle->getPDG())==15 && particle->getDaughters().size()>1 )
400  {
401  if(fabs(particle->getDaughters()[0]->getPDG())==15)
402  continue;
403  ntau_mc++;
404  _ntot_mc++;
405  const double *pvec=particle->getMomentum();
406  double pt=sqrt(pvec[0]*pvec[0]+pvec[1]*pvec[1]);
407  double phi=180./TMath::Pi()*atan(pvec[1]/pvec[0]);
408  double theta=180./TMath::Pi()*atan(pt/fabs(pvec[2]));
409  float mom[3];
410  float ver[3];
411  for (int icomp=0; icomp<3; ++icomp) {
412  mom[icomp]=(float)particle->getMomentum()[icomp];
413  ver[icomp]=(float)particle->getDaughters()[0]->getVertex()[icomp];
414  }
415  float charge = particle->getCharge();
416  helix->Initialize_VP(ver,mom,charge,_bField);
417  double D0=fabs(helix->getD0());
418  double Evis=0,ptvis=0,pvis=0;
419  LoopDaughters(particle,Evis,ptvis,pvis);
420 
421  TAU mctau;
422  mctau.E=Evis;
423  mctau.phi=phi;
424  mctau.theta=theta;
425  mctau.D0=D0;
426  mctauvec.push_back(mctau);
427  if(_nEvt<coutUpToEv || _nEvt==coutEv)
428  streamlog_out(DEBUG) <<Evis<<" "<<phi<<" "<<theta<<" "<<D0<<endl;
429 
430  //find out which mc taus do not have a link to the rec
431  if(relationNavigatorPFOMC && relationNavigatorTau )
432  {
433  bool hasRel=false;
434  LoopDaughtersRelation(particle,relationNavigatorTau ,relationNavigatorPFOMC ,hasRel);
435  if(!hasRel)
436  {
437  missed++;
438  int d1=0,d2=0;
439  if(particle->getDaughters().size()==2)
440  {
441  d1=particle->getDaughters()[0]->getPDG();
442  d2=particle->getDaughters()[1]->getPDG();
443  }
444  mcmisstuple->Fill(_nEvt,Evis,pt,theta,D0,d1,d2);
445  if(_nEvt<coutUpToEv || _nEvt==coutEv)
446  streamlog_out(DEBUG) <<"Missed: "<<Evis<<" "<<D0<<" "<<d1<<" "<<d2<<endl;
447  }
448  }
449  }//tau
450  if(particle->getGeneratorStatus()<3 && fabs(particle->getPDG())==24)
451  {
452  if(particle->getPDG()==24 && particle->getDaughters().size()==2)
453  {
454  D1=particle->getDaughters()[0]->getPDG();
455  D2=particle->getDaughters()[1]->getPDG();
456  }
457  if(particle->getPDG()==-24 && particle->getDaughters().size()==2)
458  {
459  D3=particle->getDaughters()[0]->getPDG();
460  D4=particle->getDaughters()[1]->getPDG();
461  }
462  }
463  }
464  delete helix;
465  }
466  if(isfake)
467  topofaketuple->Fill(_nEvt,nfakes,D1,D2,D3,D4);
468  //filling the tuple
469  evtuple->Fill(_nEvt,ntau_mc,ntau_rec,missed,D1,D2,D3,D4,LDev);
470  //sort the mc t and rec taus for comparison
471  std::sort(mctauvec.begin(), mctauvec.end(), MyAngleSort);
472  std::sort(rectauvec.begin(), rectauvec.end(), MyAngleSort);
473 
474  unsigned int common=mctauvec.size();
475  if(mctauvec.size()>rectauvec.size())
476  common=rectauvec.size();
477  for(unsigned int p=0;p<common;p++)
478  tautuple->Fill(_nEvt,mctauvec[p].E,mctauvec[p].phi,mctauvec[p].theta,mctauvec[p].D0,rectauvec[p].E,rectauvec[p].phi,
479  rectauvec[p].theta,rectauvec[p].D0,rectauvec[p].NQ,rectauvec[p].N,rectauvec[p].minv);
480  if(mctauvec.size()>rectauvec.size())
481  {
482  for(unsigned int p=common;p<mctauvec.size();p++)
483  tautuple->Fill(_nEvt,mctauvec[p].E,mctauvec[p].phi,mctauvec[p].theta,mctauvec[p].D0,0,0,0,0,0,0);
484  }
485  if(mctauvec.size()<rectauvec.size())
486  {
487  for(unsigned int p=common;p<rectauvec.size();p++)
488  tautuple->Fill(_nEvt,0,0,0,0,rectauvec[p].E,rectauvec[p].phi,rectauvec[p].theta,rectauvec[p].D0,rectauvec[p].NQ,rectauvec[p].N,rectauvec[p].minv);
489  }
490 
491 
492  _nEvt ++ ;
493  //cleanup
494  delete relationNavigatorTau;
495  delete relationNavigatorPFOMC;
496 
497 }
498 
499 void EvaluateTauFinder::LoopDaughters(MCParticle *particle,double &Evis,double &ptvis,double &pvis)
500 {
501  for(unsigned int d=0;d<particle->getDaughters().size();d++)
502  {
503  MCParticle *daughter=particle->getDaughters()[d];
504  //only particles visible in the detector
505  if(daughter->hasLeftDetector()==false || fabs(daughter->getPDG())==13)
506  {
507  if (daughter->getGeneratorStatus()==1)
508  {
509  //filter out the neutrinos and other invisibles
510  if(!( fabs(daughter->getPDG())==12 || fabs(daughter->getPDG())==14 || fabs(daughter->getPDG())==16
511  || fabs(daughter->getPDG())==1000022))
512  {
513  // if(_nEvt<coutUpToEv || _nEvt==coutEv)
514  //streamlog_out(DEBUG) <<"D vis "<<d<<" "<<daughter->getPDG()<<" "<<daughter->getEnergy()<<endl;
515  Evis+=daughter->getEnergy();
516  const double *mc_pvec=daughter->getMomentum();
517  ptvis+=sqrt(mc_pvec[0]*mc_pvec[0]+mc_pvec[1]*mc_pvec[1]);
518  pvis+=sqrt(mc_pvec[0]*mc_pvec[0]+mc_pvec[1]*mc_pvec[1]+mc_pvec[2]*mc_pvec[2]);
519  }
520  }
521 
522  }
523  if(daughter->getDaughters().size())
524  LoopDaughters(daughter,Evis,ptvis,pvis);
525  }
526 }
527 
528 void EvaluateTauFinder::LoopDaughtersRelation(MCParticle *particle,LCRelationNavigator* relationNavigatorTau ,
529  LCRelationNavigator* relationNavigatorPFOMC ,bool &relToTau)
530 {
531  for(unsigned int d=0;d<particle->getDaughters().size();d++)
532  {
533  MCParticle *daughter=particle->getDaughters()[d];
534  //only particles visible in the detector
535  if(daughter->hasLeftDetector()==false || fabs(daughter->getPDG())==13)
536  {
537  if (daughter->getGeneratorStatus()==1)
538  {
539  //relation to the filled reconstructed particle
540  EVENT::LCObjectVec relobjTO = relationNavigatorPFOMC->getRelatedFromObjects(daughter);
541  for(unsigned int o=0;o<relobjTO.size();o++)
542  {
543  //relation to the reconstructed tau
544  ReconstructedParticle *rec=static_cast<ReconstructedParticle*>(relobjTO[o]);
545  EVENT::LCObjectVec relobj = relationNavigatorTau->getRelatedFromObjects(rec);
546  if(relobj.size())
547  relToTau=true;
548  }
549  }
550  }
551  if(relToTau)
552  break;
553  if(daughter->getDaughters().size())
554  LoopDaughtersRelation(daughter,relationNavigatorTau,relationNavigatorPFOMC,relToTau);
555  }
556 }
557 
558 
559 void EvaluateTauFinder::check( LCEvent* ) {
560  // nothing to check here - could be used to fill checkplots in reconstruction processor
561 }
562 
563 
565 
566 
567 
568  streamlog_out(DEBUG) << "EvaluateTauFinder::end() " << name()
569  << " processed " << _nEvt << " events in " << _nRun << " runs "<<std::endl;
570 
571 
572 // evtuple->Write();
573 // tautuple->Write();
574 // mcmisstuple->Write();
575 // taumatchtuple->Write();
576 // tauexacttuple->Write();
577 // faketuple->Write();
578 // topofaketuple->Write();
579 
580  //Close File here
581  rootfile->Write();
582  delete rootfile;
583  // rootfile->Close();
584 }
#define coutUpToEv
double minv
virtual void processRunHeader(LCRunHeader *run)
Called for every run.
double N
static const float m
virtual void end()
Called after data processing for clean up.
CLHEP::Hep3Vector Vector3D
static const float k
#define coutEv
virtual void LoopDaughtersRelation(MCParticle *particle, LCRelationNavigator *relationNavigatorTau, LCRelationNavigator *relationNavigatorMC, bool &ralToTau)
virtual void check(LCEvent *evt)
EvaluateTauFinder aEvaluateTauFinder
bool MyAngleSort(TAU p1, TAU p2)
double phi
double D0
virtual void LoopDaughters(MCParticle *particle, double &Evis, double &ptvis, double &pvis)
static const float e
std::string _colNameTauRecLink
double E
std::string _colNameMC
Input collection name.
virtual void init()
Called at the begin of the job before anything is read.
virtual void processEvent(LCEvent *evt)
Called for every event - the working horse.
Evaluation processor for TauFinder.
double theta
std::string _colNameMCTruth
double NQ
std::string _OutputFile_Signal