TauTagger.cxx

Go to the documentation of this file.
00001 //-----------------------------------------------------------------------
00002 //
00003 // file:     TauTagger.cxx
00004 //
00005 //-----------------------------------------------------------------------
00006 
00007 #include <fstream>
00008 #include <iostream>
00009 #include <vector>
00010 #include <string>
00011 #include <deque>
00012 
00013 #include "AtlfastAlgs/TauTagger.h"
00014 #include "AtlfastAlgs/GlobalEventData.h"
00015 
00016 #include "AtlfastEvent/Interpolator.h"
00017 
00018 #include "CLHEP/Random/JamesRandom.h"
00019 #include "CLHEP/Random/RandFlat.h"
00020 #include "CLHEP/Random/RandomEngine.h"
00021 
00022 #include "CLHEP/Units/SystemOfUnits.h"
00023 
00024 #include "PathResolver/PathResolver.h"
00025 
00026 namespace Atlfast
00027 {
00028   
00029   //------------------------------------------------------------------
00030   // Constructor
00031   //------------------------------------------------------------------
00032   TauTagger::TauTagger( const std::string& name, ISvcLocator* pSvcLocator ) 
00033     : Algorithm( name, pSvcLocator ),
00034       m_randEngine(0),
00035       m_randFlat(0),
00036       m_tesIO(0),
00037       m_tau1P_eff_interpolator(0),
00038       m_tau1P_rej_interpolator(0),
00039       m_tau2P_eff_interpolator(0),
00040       m_tau2P_rej_interpolator(0),
00041       m_tau3P_eff_interpolator(0),
00042       m_tau3P_rej_interpolator(0)
00043 
00044   {
00045     //Default private parameters
00046     
00047     m_interpolateTauIdent =  true;
00048     m_tauLocation         =  "/Event/AtlfastTaus";
00049     m_tau1P_EffFile       =  "atlfastDatafiles/tau1P_EffFile.txt";
00050     m_tau1P_RejFile       =  "atlfastDatafiles/tau1P_RejFile.txt";
00051     m_tau2P_EffFile       =  "atlfastDatafiles/tau2P_EffFile.txt";
00052     m_tau2P_RejFile       =  "atlfastDatafiles/tau2P_RejFile.txt";
00053     m_tau3P_EffFile       =  "atlfastDatafiles/tau3P_EffFile.txt";
00054     m_tau3P_RejFile       =  "atlfastDatafiles/tau3P_RejFile.txt";
00055     
00056     //Declare joboption properties here...
00057     declareProperty( "interpolateTauIdent", m_interpolateTauIdent );
00058     declareProperty( "TauLocation",         m_tauLocation );
00059     declareProperty( "tau1P_EffFile",       m_tau1P_EffFile );
00060     declareProperty( "tau1P_RejFile",       m_tau1P_RejFile );
00061     declareProperty( "tau2P_EffFile",       m_tau2P_EffFile );
00062     declareProperty( "tau2P_RejFile",       m_tau2P_RejFile );
00063     declareProperty( "tau3P_EffFile",       m_tau3P_EffFile );
00064     declareProperty( "tau3P_RejFile",       m_tau3P_RejFile );
00065   }
00066   
00067   TauTagger::~TauTagger() {
00068     
00069     if (m_tesIO) {
00070       delete m_tesIO;
00071     }
00072     
00073   }
00074   
00075   //----------------------------------------------------------------
00076   // Tool initialization
00077   //----------------------------------------------------------------
00078   StatusCode TauTagger::initialize()
00079   {
00080     MsgStream p_log( msgSvc(), name() );
00081     
00082     p_log << MSG::DEBUG << "Initialising TauTagger" << endreq;
00083     
00084     GlobalEventData* ged = GlobalEventData::Instance();
00085     int randSeed = ged->randSeed() ;
00086     m_tesIO      = new TesIO(ged->mcLocation(), ged->justHardScatter());
00087 
00088     m_randEngine = new HepJamesRandom( randSeed );
00089     m_randFlat   = new RandFlat( m_randEngine);
00090 
00091 
00092     // Create interpolator for tau efficiencies   
00093     makeInterpolator(m_tau1P_eff_interpolator, m_tau1P_EffFile , true);
00094     makeInterpolator(m_tau1P_rej_interpolator, m_tau1P_RejFile , true);
00095     makeInterpolator(m_tau2P_eff_interpolator, m_tau2P_EffFile , true);
00096     makeInterpolator(m_tau2P_rej_interpolator, m_tau2P_RejFile , true);
00097     makeInterpolator(m_tau3P_eff_interpolator, m_tau3P_EffFile , true);
00098     makeInterpolator(m_tau3P_rej_interpolator, m_tau3P_RejFile , true);
00099     
00100     return StatusCode::SUCCESS;
00101   }
00102 
00103   //-----------------------------------------------------------------
00104   // Tool execution
00105   //-----------------------------------------------------------------
00106   StatusCode TauTagger::execute()
00107   {
00108     MsgStream p_log( msgSvc(), name() );
00109         
00110     p_log << MSG::DEBUG << "Executing TauTagger" << endreq;
00111 
00112     const TauContainer* container(0);
00113     if(!m_tesIO->getDH(container, m_tauLocation)){
00114       p_log << MSG::ERROR 
00115             << "Could not get DataHandle for " << m_tauLocation 
00116             << endreq ;
00117       return StatusCode::SUCCESS ;
00118     }
00119     
00120     TauContainer::const_iterator p_iterF = container->begin();
00121     for( ; p_iterF != container->end(); p_iterF++ )
00122       {
00123                 
00124         //-------------------------------------------------
00125         // Make Identification Decision
00126         //-------------------------------------------------
00127 
00128         //long tr_NTrack = (*p_iterF)->nTrack();
00129         //int tr_IsTrueTau = (*p_iterF)->isTrueTau();
00130         int tr_Discriminant = 0;
00131         
00132         double idEff=GetIDEff(p_iterF);
00133         
00134         float rid = randFlat()->fire();
00135         if(rid<idEff) tr_Discriminant = 1;
00136         p_log << MSG::DEBUG << "Discriminant Tag = "
00137               << tr_Discriminant <<" ( rand seed = "<< rid 
00138               << " id Eff. = "<< idEff << " )" << endreq;       
00139         (*p_iterF)->setDiscriminant(tr_Discriminant);
00140       }
00141     
00142     return StatusCode::SUCCESS;
00143   }
00144 
00145 
00146   StatusCode TauTagger::finalize()
00147   {
00148     
00149     MsgStream p_log( msgSvc(), name() );        
00150     p_log << MSG::DEBUG << "TauTagger Finalize "<< endreq;
00151     
00152     //   Note from CLHEP/Random/RandFlat instructions:
00153     //   "If the engine is passed by pointer then the corresponding engine
00154     //   object will be deleted by the RandFlat destructor.If the engine is
00155     //   passed by reference then the corresponding engine object will not be
00156     //   deleted by the RandFlat destructor." 
00157     //   So don't delete the random engine after m_randflat.
00158 
00159     if (m_randFlat)      delete m_randFlat;
00160 
00161     if (m_tau1P_eff_interpolator)      delete m_tau1P_eff_interpolator;
00162     if (m_tau1P_rej_interpolator)      delete m_tau1P_rej_interpolator;
00163     if (m_tau2P_eff_interpolator)      delete m_tau2P_eff_interpolator;
00164     if (m_tau2P_rej_interpolator)      delete m_tau2P_rej_interpolator;
00165     if (m_tau3P_eff_interpolator)      delete m_tau3P_eff_interpolator;
00166     if (m_tau3P_rej_interpolator)      delete m_tau3P_rej_interpolator;
00167 
00168     return StatusCode::SUCCESS;
00169   }
00170 
00171 
00172 
00173   double TauTagger::GetIDEff(TauContainer::const_iterator p_iterF){
00174 
00175     // Find Identification efficiency for tau candidate to pass
00176     // discriminant.
00177 
00178     MsgStream p_log( msgSvc(), name() );
00179 
00180     double IDEff = 0.0;
00181 
00182     // Input to interpolators
00183     double pt_in_GeV = (*p_iterF)->pt()/GeV;
00184     double etatau = (*p_iterF)->eta();
00185     int nTrack = (int) (*p_iterF)->nTrack();
00186     deque<double> input_values;
00187     input_values.push_back( pt_in_GeV );
00188     input_values.push_back( fabs(etatau) );
00189 
00190     if (nTrack==1){
00191       if( (*p_iterF)->isTrueTau()==1 ){
00192         IDEff = m_interpolateTauIdent ?
00193           m_tau1P_eff_interpolator->interpolate(input_values) :
00194           m_tau1P_eff_interpolator->getNearestValue(input_values);
00195       } else if ( (*p_iterF)->isTrueTau()==0 ){
00196         IDEff = m_interpolateTauIdent ?
00197           m_tau1P_rej_interpolator->interpolate(input_values) :
00198           m_tau1P_rej_interpolator->getNearestValue(input_values);
00199       }
00200     }
00201     if (nTrack==2){
00202       if( (*p_iterF)->isTrueTau()==1 ){
00203         IDEff = m_interpolateTauIdent ?
00204           m_tau2P_eff_interpolator->interpolate(input_values) :
00205           m_tau2P_eff_interpolator->getNearestValue(input_values);
00206       } else if ( (*p_iterF)->isTrueTau()==0 ){
00207         IDEff = m_interpolateTauIdent ?
00208           m_tau2P_rej_interpolator->interpolate(input_values) :
00209           m_tau2P_rej_interpolator->getNearestValue(input_values);
00210       }
00211     }
00212     if (nTrack>=3){
00213       if( (*p_iterF)->isTrueTau()==1 ){
00214         IDEff = m_interpolateTauIdent ?
00215           m_tau3P_eff_interpolator->interpolate(input_values) :
00216           m_tau3P_eff_interpolator->getNearestValue(input_values);
00217       } else if ( (*p_iterF)->isTrueTau()==0 ){
00218         IDEff = m_interpolateTauIdent ?
00219           m_tau3P_rej_interpolator->interpolate(input_values) :
00220           m_tau3P_rej_interpolator->getNearestValue(input_values);
00221       }
00222     }
00223 
00224     p_log << MSG::DEBUG << "Tau"<<nTrack<<"P true="<<(*p_iterF)->isTrueTau()
00225           <<";  pT= "<<pt_in_GeV << " GeV; eta= "<<etatau 
00226           <<";\tideff= "<<IDEff <<endreq;
00227 
00228     return IDEff;
00229   }
00230 
00231 
00232   void TauTagger::makeInterpolator(Interpolator* &intptr, std::string intname, bool contbounds){
00233     MsgStream p_log( msgSvc(), name() );
00234     std::string fn = PathResolver::find_file(intname, "DATAPATH");
00235     intptr = new Interpolator(fn);
00236     p_log << MSG::DEBUG << "Made Interpolator from input file " << fn << endreq;
00237     if (contbounds) intptr->setContinuousBoundaries();
00238     return;
00239   }
00240 
00241 }

Generated on Mon Sep 24 14:19:12 2007 for AtlfastAlgs by  doxygen 1.5.1