00001 #include "GtHepEvtGenTool.h" 00002 #include "HepEvt2HepMC.h" 00003 00004 #include "Event/HepMCEvent.h" 00005 #include "HepMC/GenEvent.h" 00006 00007 #include <cstdio> 00008 00009 00010 00011 GtHepEvtGenTool::GtHepEvtGenTool(const std::string& type, 00012 const std::string& name, 00013 const IInterface* parent) 00014 : GaudiTool(type,name,parent) 00015 , m_parser(0) 00016 { 00017 declareInterface<IHepMCEventMutator>(this); 00018 00019 declareProperty("HepEvtDataSource",m_source = "","Source of HEPEvt data"); 00020 } 00021 00022 GtHepEvtGenTool::~GtHepEvtGenTool() {} 00023 00024 StatusCode GtHepEvtGenTool::initialize() 00025 { 00026 info() << "GtHepEvtGenTool::initialize()" << endreq; 00027 00028 if (this->GaudiTool::initialize().isFailure()) { 00029 fatal() << "Parent Tool class initialization failed" << endreq; 00030 return StatusCode::FAILURE; 00031 } 00032 00033 return StatusCode::SUCCESS; 00034 } 00035 00036 StatusCode GtHepEvtGenTool::finalize() 00037 { 00038 if (m_parser) delete m_parser; m_parser = 0; 00039 00040 return this->GaudiTool::finalize(); 00041 } 00042 00043 StatusCode GtHepEvtGenTool::mutate(HepMC::GenEvent& event) 00044 { 00045 if (!m_parser) { 00046 if ("" == m_source) { 00047 fatal() << "No HEPEvt source string given." << endreq; 00048 return StatusCode::FAILURE; 00049 } 00050 m_parser = new HepEvt2HepMC; 00051 if (m_parser->fill(m_source.c_str()).isFailure()) { 00052 fatal () << "Failed to fill primary vertices using \"" 00053 << m_source << "\"" << endreq; 00054 return StatusCode::FAILURE; 00055 } 00056 info () << "Filled HEPEvt cache with " << m_parser->cacheSize() 00057 << " events" << endreq; 00058 } 00059 else { 00060 if( m_parser->cacheSize()>0 ) { 00061 debug () << "Reusing cache with " << m_parser->cacheSize() 00062 << " events left" << endreq; 00063 } else { 00064 warning() << "WARNING: Reuse input source! Recommend more input lines!"<< endreq; 00065 if (m_parser->fill(m_source.c_str()).isFailure()) { 00066 fatal () << "Failed to fill primary vertices using \"" 00067 << m_source << "\"" << endreq; 00068 return StatusCode::FAILURE; 00069 } 00070 info () << "Filled HEPEvt cache with " << m_parser->cacheSize() 00071 << " events" << endreq; 00072 } 00073 } 00074 00075 HepMC::GenEvent* new_event=0; 00076 if (m_parser->generate(new_event).isFailure()) { 00077 fatal() << "Failed to generate new event" << endreq; 00078 if (new_event) delete new_event; 00079 return StatusCode::FAILURE; 00080 } 00081 event = *new_event; 00082 delete new_event; 00083 00084 HepMC::FourVector pos = event.signal_process_vertex()->position(); 00085 debug() << "HepEvt at (" <<pos.x() << "," << pos.y() << "," << pos.z() << ")" << endreq; 00086 00087 return StatusCode::SUCCESS; 00088 }