PartPropSvc.cpp
Go to the documentation of this file.00001
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
00016
00017 DECLARE_SERVICE_FACTORY(PartPropSvc)
00018
00019
00020
00021 PartPropSvc::PartPropSvc( const std::string& name, ISvcLocator* svc )
00022 : base_class( 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 StatusCode PartPropSvc::initialize() {
00045
00046 MsgStream log( msgSvc(), name() );
00047 std::vector<std::string>::const_iterator itr;
00048
00049 StatusCode status = Service::initialize();
00050
00051 log << MSG::INFO << "PDT file(s): " << endmsg;
00052 for (itr=m_pdtFiles.begin(); itr!=m_pdtFiles.end(); ++itr) {
00053 log << MSG::INFO << " " << *itr << endmsg;
00054 }
00055 log << MSG::INFO << "Type: " << m_inputType << endmsg;
00056
00057 if ( status.isFailure() ) {
00058 log << MSG::ERROR << "Could not initialize main svc" << endmsg;
00059 return StatusCode::FAILURE;
00060 }
00061
00062 bool (*pF) (std::istream &,
00063 HepPDT::TableBuilder &);
00064
00065
00066
00067 if (m_inputType == "PDG") {
00068 pF = &HepPDT::addPDGParticles;
00069 } else if (m_inputType == "Pythia") {
00070 pF = &HepPDT::addPythiaParticles;
00071 } else if (m_inputType == "EvtGen") {
00072 pF = &HepPDT::addEvtGenParticles;
00073 } else if (m_inputType == "Herwig") {
00074 pF = &HepPDT::addHerwigParticles;
00075 } else if (m_inputType == "IsaJet") {
00076 pF = &HepPDT::addIsajetParticles;
00077 } else if (m_inputType == "QQ") {
00078 pF = &HepPDT::addQQParticles;
00079 } else {
00080 log << MSG::ERROR << "Unknown Particle Data file type: \""
00081 << m_inputType << "\"" << endmsg;
00082 return StatusCode::FAILURE;
00083 }
00084
00085
00086 if (m_pdtFiles.size() == 0) {
00087 log << MSG::ERROR << "Need at least 1 PDT file" << endmsg;
00088 log << MSG::ERROR << "Check value of property \"InputFile\"" << endmsg;
00089 return StatusCode::FAILURE;
00090 }
00091
00092 m_pdt = new HepPDT::ParticleDataTable;
00093
00094 {
00095
00096 HepPDT::TableBuilder tb( *m_pdt );
00097
00098
00099 int good(0);
00100 for (itr=m_pdtFiles.begin(); itr!=m_pdtFiles.end(); ++itr) {
00101
00102 std::string rfile = System::PathResolver::find_file(*itr,"DATAPATH");
00103 if (rfile == "") {
00104 log << MSG::ERROR << "Could not find PDT file: \"" << *itr
00105 << "\" in $DATAPATH" << endmsg;
00106 continue;
00107 }
00108
00109 std::ifstream pdfile( rfile.c_str() );
00110 if (!pdfile) {
00111 log << MSG::ERROR << "Could not open PDT file: \"" << rfile
00112 << "\"" << endmsg;
00113 continue;
00114 }
00115
00116 if ( ! pF(pdfile,tb) ) {
00117 log << MSG::ERROR << "Error reading PDT file: \"" << rfile
00118 << "\"" << endmsg;
00119 return StatusCode::FAILURE;
00120 }
00121 ++good;
00122 }
00123 if (0 == good) {
00124 log << MSG::ERROR << "Unable to access any PDT file" <<endmsg;
00125 return StatusCode::FAILURE;
00126 }
00127
00128 }
00129
00130
00131
00132 return status;
00133 }
00134
00135
00136
00137 StatusCode PartPropSvc::finalize() {
00138
00139 MsgStream log( msgSvc(), name() );
00140 StatusCode status = Service::finalize();
00141
00142 if ( status.isSuccess() )
00143 log << MSG::INFO << "Service finalised successfully" << endmsg;
00144
00145 return status;
00146 }
00147
00148
00149