| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

PartPropSvc.cpp

Go to the documentation of this file.
00001 //Include files
00002 #include "GaudiKernel/SvcFactory.h"
00003 #include "GaudiKernel/ISvcLocator.h"
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/PathResolver.h"
00006 
00007 #include "PartPropSvc.h"
00008 
00009 #include "HepPDT/TableBuilder.hh"
00010 
00011 #include <iostream>
00012 #include <cstdlib>
00013 #include <fstream>
00014 
00015 // Instantiation of a static factory class used by clients to create
00016 //  instances of this service
00017 DECLARE_SERVICE_FACTORY(PartPropSvc)
00018 
00019 //*************************************************************************//
00020 
00021 PartPropSvc::PartPropSvc( const std::string& name, ISvcLocator* svc )
00022   : Service( name, svc ), m_pdt(0) {
00023 
00024   declareProperty( "InputType", m_inputType="PDG");
00025   declareProperty( "InputFile", m_pdtFiles);
00026 
00027   if (m_pdtFiles.empty() ) {
00028     m_pdtFiles.push_back("PDGTABLE.MeV");
00029   }
00030 
00031 }
00032 
00033 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
00034 
00035 PartPropSvc::~PartPropSvc() {
00036   if (m_pdt != 0) {
00037     delete m_pdt;
00038     m_pdt = 0;
00039   }
00040 }
00041 
00042 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
00043 
00044 const InterfaceID& PartPropSvc::type() const { 
00045   return IID_IPartPropSvc; 
00046 }
00047 
00048 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
00049 
00050 StatusCode PartPropSvc::initialize() {
00051 
00052   MsgStream log( msgSvc(), name() );
00053   std::vector<std::string>::const_iterator itr;
00054 
00055   StatusCode status = Service::initialize();
00056 
00057   log << MSG::INFO << "PDT file(s): " << endreq;
00058   for (itr=m_pdtFiles.begin(); itr!=m_pdtFiles.end(); ++itr) {
00059     log << MSG::INFO << "    " << *itr << endreq;
00060   }
00061   log << MSG::INFO << "Type:     " << m_inputType << endreq;
00062 
00063   if ( status.isFailure() ) {
00064     log << MSG::ERROR << "Could not initialize main svc" << endreq;
00065     return StatusCode::FAILURE;
00066   }
00067 
00068   bool (*pF)  (std::istream &, 
00069                HepPDT::TableBuilder &);
00070 
00071   
00072   // Determine type of input
00073   if (m_inputType == "PDG") {
00074     pF = &HepPDT::addPDGParticles;
00075   } else if (m_inputType == "Pythia") {
00076     pF = &HepPDT::addPythiaParticles;
00077   } else if (m_inputType == "EvtGen") {
00078     pF = &HepPDT::addEvtGenParticles;
00079   } else if (m_inputType == "Herwig") {
00080     pF = &HepPDT::addHerwigParticles;
00081   } else if (m_inputType == "IsaJet") {
00082     pF = &HepPDT::addIsajetParticles;
00083   } else if (m_inputType == "QQ") {
00084     pF = &HepPDT::addQQParticles;
00085   } else {
00086     log << MSG::ERROR << "Unknown Particle Data file type: \"" 
00087         << m_inputType << "\"" << endreq;
00088     return StatusCode::FAILURE;
00089   }
00090 
00091   // Make sure we have at least one file
00092   if (m_pdtFiles.size() == 0) {
00093     log << MSG::ERROR << "Need at least 1 PDT file" << endreq;
00094     log << MSG::ERROR << "Check value of property \"InputFile\"" << endreq;
00095     return StatusCode::FAILURE;
00096   }
00097 
00098   m_pdt = new HepPDT::ParticleDataTable;
00099 
00100   {
00101     // Construct table builder
00102     HepPDT::TableBuilder  tb( *m_pdt );
00103 
00104     // read the input 
00105     int good(0);
00106     for (itr=m_pdtFiles.begin(); itr!=m_pdtFiles.end(); ++itr) {
00107 
00108       std::string rfile = System::PathResolver::find_file(*itr,"DATAPATH");
00109       if (rfile == "") {
00110         log << MSG::ERROR << "Could not find PDT file: \"" << *itr
00111             << "\" in $DATAPATH" << endreq;
00112         continue;
00113       }
00114 
00115       std::ifstream pdfile( rfile.c_str() );
00116       if (!pdfile) {
00117         log << MSG::ERROR << "Could not open PDT file: \"" << rfile
00118             << "\"" << endreq;
00119         continue;
00120       }
00121 
00122       if ( ! pF(pdfile,tb) ) {
00123         log << MSG::ERROR << "Error reading PDT file: \"" << rfile
00124             << "\"" << endreq;
00125         return StatusCode::FAILURE;
00126       } 
00127       ++good;
00128     }
00129     if (0 == good) {
00130       log << MSG::ERROR << "Unable to access any PDT file" <<endreq;
00131       return StatusCode::FAILURE;
00132     }
00133 
00134   }   // the tb destructor fills datacol
00135 
00136 
00137   
00138   return status;
00139 }
00140 
00141 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
00142 
00143 StatusCode PartPropSvc::finalize() {
00144 
00145   MsgStream log( msgSvc(), name() );
00146   StatusCode status = Service::finalize();
00147 
00148   if ( status.isSuccess() )
00149     log << MSG::INFO << "Service finalised successfully" << endreq;
00150   
00151   return status;
00152 }
00153 
00154 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
00155 
00156 StatusCode PartPropSvc::queryInterface( const InterfaceID& riid, 
00157                                         void** ppvInterface ) {
00158   StatusCode sc = StatusCode::FAILURE;
00159   if ( ppvInterface ) {
00160     *ppvInterface = 0;
00161     
00162     if ( riid == IID_IPartPropSvc ) {
00163       *ppvInterface = static_cast<IPartPropSvc*>(this);
00164       sc = StatusCode::SUCCESS;
00165       addRef();
00166     }
00167     else
00168       sc = Service::queryInterface( riid, ppvInterface );    
00169   }
00170   return sc;
00171 }
00172 
00173 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
00174 //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 19:57:52 2011 for PartPropSvc by doxygen 1.4.7