14 #include "ThePEG/Repository/EventGenerator.h"
15 #include "ThePEG/Repository/Repository.h"
16 #include "ThePEG/Persistency/PersistentIStream.h"
17 #include "ThePEG/Utilities/DynamicLoader.h"
18 #include "ThePEG/Utilities/Debug.h"
19 #include "ThePEG/EventRecord/Event.h"
20 #include "ThePEG/EventRecord/SubProcess.h"
21 #include "ThePEG/Handlers/XComb.h"
22 #include "ThePEG/Handlers/EventHandler.h"
23 #include "ThePEG/PDF/PartonExtractor.h"
24 #include "ThePEG/PDF/PDF.h"
26 #include "Herwig/API/HerwigAPI.h"
30 #include "boost/thread/thread.hpp"
32 #include "boost/algorithm/string.hpp"
40 m_use_seed_from_generatetf(false),
41 m_seed_from_generatetf(0),
42 m_pdfname_me(
"UNKNOWN"), m_pdfname_mpi(
"UNKNOWN")
74 const long* seeds = engine->getSeeds();
79 int32_t combined_seed = std::abs(seeds[0] * seeds[1]);
81 std::ostringstream ss_seed;
82 ss_seed << combined_seed;
88 ATH_MSG_INFO(
"Using the random number seed " + ss_seed.str() +
" provided by athena");
94 ThePEG::Repository::exitOnError() = 1;
98 std::vector< std::string > datapaths;
100 boost::is_any_of( std::string(
":" ) ) );
101 for(
const std::string&
p : datapaths ) {
102 ThePEG::Repository::appendReadDir(
p );
104 const char* ldpath =
getenv(
"LD_LIBRARY_PATH" );
105 std::vector< std::string > ldpaths;
106 boost::split( ldpaths, ldpath, boost::is_any_of( std::string(
":" ) ) );
107 for(
const std::string&
p : ldpaths ) {
108 ThePEG::DynamicLoader::appendPath(
p );
111 ATH_MSG_DEBUG(
"Num of library search paths = " << ThePEG::DynamicLoader::allPaths().
size());
115 ATH_MSG_DEBUG(
"Loading Herwig default repo from " << repopath);
117 ATH_MSG_DEBUG(
"Successfully loaded Herwig default repository");
125 m_runinfo = std::make_shared<HepMC3::GenRunInfo>();
127 struct HepMC3::GenRunInfo::ToolInfo
generator={std::string(
"Herwig7"), std::string(
"7"), std::string(
"Used generator")};
134 return StatusCode::SUCCESS;
146 return StatusCode::SUCCESS;
159 ATH_MSG_DEBUG(
"Converting ThePEG::Event to HepMC::GenEvent");
161 if (!
evt->run_info())
evt->set_run_info(m_runinfo);
172 const EventContext& ctx = Gaudi::Hive::currentContext();
174 std::vector<long> seeds(
s,
s+2);
175 ATH_MSG_DEBUG(
"Random seeds: " << seeds[0] <<
", " << seeds[1]);
179 if (
evt->weights().empty()) {
186 ThePEG::tSubProPtr sub =
m_event->primarySubProcess();
187 int id1 = sub->incoming().first ->id();
188 int id2 = sub->incoming().second->id();
190 ThePEG::tcEHPtr eh = ThePEG::dynamic_ptr_cast<ThePEG::tcEHPtr>(
m_event->handler());
192 double x1 = eh->lastX1();
193 double x2 = eh->lastX2();
195 std::pair<ThePEG::PDF,ThePEG::PDF> pdfs;
196 pdfs.first = eh->pdf<
ThePEG::PDF>(sub->incoming().first);
197 pdfs.second = eh->pdf<
ThePEG::PDF>(sub->incoming().second);
199 ThePEG::Energy2
scale = eh->lastScale();
200 double Q = std::sqrt(
scale/ThePEG::GeV2);
202 double pdf1 = pdfs.first.xfx(sub->incoming().first ->dataPtr(),
scale,
x1);
203 double pdf2 = pdfs.first.xfx(sub->incoming().second->dataPtr(),
scale,
x2);
207 pdfi->set(id1,
id2,
x1,
x2, Q, pdf1, pdf2);
209 HepMC::PdfInfo pdfi(id1,
id2,
x1,
x2, Q, pdf1, pdf2);
211 evt->set_pdf_info(pdfi);
223 return StatusCode::SUCCESS;
234 ATH_MSG_INFO(
"MetaData: generator = Herwig7 " << HWVERSION );
239 ThePEG::Repository::cleanup();
242 if (
m_cleanup_herwig_scratch && (std::filesystem::is_directory(
"Herwig-scratch") || std::filesystem::is_directory(
"Herwig-cache"))){
244 ATH_MSG_INFO(
"removing Herwig-scratch/Herwig-cache folder from "+std::filesystem::current_path().
string());
251 (std::filesystem::remove_all(
"Herwig-scratch") || std::filesystem::remove_all(
"Herwig-cache"));
254 ATH_MSG_WARNING(
"Failed to delete the folder 'Herwig-scratch': "+std::string(
e.what()));
259 return StatusCode::SUCCESS;