diff --git a/corsika/detail/modules/pythia8/Decay.inl b/corsika/detail/modules/pythia8/Decay.inl index 662afa95ae2ff806122a2a47c8387d36f4ee4fe0..4a4f5dc3d2facf102eeff3c70a45841774b0bff0 100644 --- a/corsika/detail/modules/pythia8/Decay.inl +++ b/corsika/detail/modules/pythia8/Decay.inl @@ -9,6 +9,7 @@ #include <corsika/modules/pythia8/Pythia8.hpp> #include <corsika/modules/pythia8/Decay.hpp> #include <corsika/modules/pythia8/Random.hpp> +#include <corsika/modules/pythia8/ConfigurationDirectory.hpp> #include <corsika/framework/utility/COMBoost.hpp> @@ -18,7 +19,8 @@ namespace corsika::pythia8 { Decay::Decay(const bool print_listing) - : print_listing_(print_listing) { + : Pythia8::Pythia(CORSIKA_Pythia8_XML_DIR) + , print_listing_(print_listing) { init(); } @@ -36,7 +38,7 @@ namespace corsika::pythia8 { // set random number generator in pythia Pythia8::RndmEngine* rndm = new corsika::pythia8::Random(); - pythia_.setRndmEnginePtr(rndm); + Pythia8::Pythia::setRndmEnginePtr(rndm); /* issue xyz: definition of particles and decay channels use the same mechanism in @@ -44,15 +46,15 @@ namespace corsika::pythia8 { */ // bool ParticleData::reInit(string startFile, bool xmlFormat = true) // read in particle data from Corsika 8 - // pythia_.particleData.reInit("/home/felix/ngcorsika/corsika-build/include/corsika/particles/ParticleData.xml"); - // pythia_.particleData.checkTable(); + // Pythia8::Pythia::particleData.reInit("/home/felix/ngcorsika/corsika-build/include/corsika/particles/ParticleData.xml"); + // Pythia8::Pythia::particleData.checkTable(); - pythia_.readString("Next:numberShowInfo = 0"); - pythia_.readString("Next:numberShowProcess = 0"); - pythia_.readString("Next:numberShowEvent = 0"); + Pythia8::Pythia::readString("Next:numberShowInfo = 0"); + Pythia8::Pythia::readString("Next:numberShowProcess = 0"); + Pythia8::Pythia::readString("Next:numberShowEvent = 0"); - pythia_.readString("Print:quiet = on"); - pythia_.readString("Check:particleData = 0"); + Pythia8::Pythia::readString("Print:quiet = on"); + Pythia8::Pythia::readString("Check:particleData = 0"); /* switching off event check in pythia is needed to allow decays that are off-shell @@ -60,17 +62,17 @@ namespace corsika::pythia8 { the consistency of particle masses between event generators is an unsolved issues */ CORSIKA_LOG_INFO("Pythia::Init: switching off event checking in pythia.."); - pythia_.readString("Check:event = 1"); + Pythia8::Pythia::readString("Check:event = 1"); - pythia_.readString("ProcessLevel:all = off"); - pythia_.readString("ProcessLevel:resonanceDecays = off"); + Pythia8::Pythia::readString("ProcessLevel:all = off"); + Pythia8::Pythia::readString("ProcessLevel:resonanceDecays = off"); // making sure setStable(Code::Pi0); - // pythia_.particleData.readString("59:m0 = 101.00"); + // Pythia8::Pythia::particleData.readString("59:m0 = 101.00"); - if (!pythia_.init()) + if (!Pythia8::Pythia::init()) throw std::runtime_error("Pythia::Decay: Initialization failed!"); } @@ -115,20 +117,21 @@ namespace corsika::pythia8 { void Decay::setUnstable(Code const pCode) { CORSIKA_LOG_INFO("Pythia::Decay: setting {} unstable..", pCode); - pythia_.particleData.mayDecay(static_cast<int>(get_PDG(pCode)), true); + Pythia8::Pythia::particleData.mayDecay(static_cast<int>(get_PDG(pCode)), true); } void Decay::setStable(Code const pCode) { CORSIKA_LOG_INFO("Pythia::Decay: setting {} stable..", pCode); - pythia_.particleData.mayDecay(static_cast<int>(get_PDG(pCode)), false); + Pythia8::Pythia::particleData.mayDecay(static_cast<int>(get_PDG(pCode)), false); } bool Decay::isStable(Code const vCode) { - return pythia_.particleData.canDecay(static_cast<int>(get_PDG(vCode))); + return Pythia8::Pythia::particleData.canDecay(static_cast<int>(get_PDG(vCode))); } bool Decay::canDecay(Code const pCode) { - const bool ans = pythia_.particleData.canDecay(static_cast<int>(get_PDG(pCode))); + const bool ans = + Pythia8::Pythia::particleData.canDecay(static_cast<int>(get_PDG(pCode))); CORSIKA_LOG_INFO("Pythia::Decay: checking if particle: {} can decay in PYTHIA? {} ", pCode, ans); return ans; @@ -193,7 +196,7 @@ namespace corsika::pythia8 { count_++; // pythia stack - Pythia8::Event& event = pythia_.event; + Pythia8::Event& event = Pythia8::Pythia::event; event.reset(); auto const particleId = projectile.getPID(); @@ -213,7 +216,7 @@ namespace corsika::pythia8 { // add particle to pythia stack event.append(pdgCode, 1, 0, 0, px, py, pz, en, m); - if (!pythia_.next()) + if (!Pythia8::Pythia::next()) throw std::runtime_error("Pythia::Decay: decay failed!"); else CORSIKA_LOG_INFO("Pythia::Decay: particles after decay: {} ", event.size()); diff --git a/corsika/detail/modules/pythia8/Interaction.inl b/corsika/detail/modules/pythia8/Interaction.inl index 8ddb3ac9130a6185ff7071fb3fb3f8a319cbc54a..afa5f423fd0bc320b5750f161748c05550eeaa9b 100644 --- a/corsika/detail/modules/pythia8/Interaction.inl +++ b/corsika/detail/modules/pythia8/Interaction.inl @@ -9,6 +9,7 @@ #pragma once #include <corsika/modules/pythia8/Interaction.hpp> +#include <corsika/modules/pythia8/ConfigurationDirectory.hpp> #include <corsika/framework/geometry/FourVector.hpp> #include <corsika/framework/utility/COMBoost.hpp> @@ -25,29 +26,30 @@ namespace corsika::pythia8 { std::cout << "Pythia::Interaction n=" << count_ << std::endl; } - Interaction::Interaction(const bool print_listing) - : print_listing_(print_listing) { + Interaction::Interaction(bool const print_listing) + : Pythia8::Pythia(CORSIKA_Pythia8_XML_DIR) + , print_listing_(print_listing) { + std::cout << "Configuring Pythia8 from: " << CORSIKA_Pythia8_XML_DIR << std::endl; std::cout << "Pythia::Interaction n=" << count_ << std::endl; // initialize Pythia - - pythia_.readString("Print:quiet = off"); - pythia_.readString("Check:particleData = on"); // during init - pythia_.readString("Check:event = on"); // default: on - pythia_.readString("Check:levelParticleData = 12"); // 1 is default + Pythia8::Pythia::readString("Print:quiet = off"); + Pythia8::Pythia::readString("Check:particleData = on"); // during init + Pythia8::Pythia::readString("Check:event = on"); // default: on + Pythia8::Pythia::readString("Check:levelParticleData = 12"); // 1 is default // TODO: proper process initialization for MinBias needed - pythia_.readString("HardQCD:all = on"); - pythia_.readString("ProcessLevel:resonanceDecays = off"); + Pythia8::Pythia::readString("HardQCD:all = on"); + Pythia8::Pythia::readString("ProcessLevel:resonanceDecays = off"); - if (!pythia_.init()) + if (!Pythia8::Pythia::init()) throw std::runtime_error("Pythia::Interaction: Initialization failed!"); // any decays in pythia? if yes need to define which particles if (internalDecays_) { // define which particles are passed to corsika, i.e. which particles make it into // history even very shortlived particles like charm or pi0 are of interest here - const std::vector<Code> HadronsWeWantTrackedByCorsika = { + std::vector<Code> const HadronsWeWantTrackedByCorsika = { Code::PiPlus, Code::PiMinus, Code::Pi0, Code::KMinus, Code::KPlus, Code::K0Long, Code::K0Short, Code::SigmaPlus, Code::SigmaMinus, Code::Lambda0, Code::Xi0, Code::XiMinus, Code::OmegaMinus, Code::DPlus, Code::DMinus, @@ -57,7 +59,8 @@ namespace corsika::pythia8 { } // basic initialization of cross section routines - sigma_.init(&pythia_.info, pythia_.settings, &pythia_.particleData, &pythia_.rndm); + sigma_.init(&(Pythia8::Pythia::info), Pythia8::Pythia::settings, + &(Pythia8::Pythia::particleData), &(Pythia8::Pythia::rndm)); } void Interaction::setStable(std::vector<Code> const& particleList) { @@ -66,16 +69,16 @@ namespace corsika::pythia8 { void Interaction::setUnstable(Code const pCode) { std::cout << "Pythia::Interaction: setting " << pCode << " unstable.." << std::endl; - pythia_.particleData.mayDecay(static_cast<int>(get_PDG(pCode)), true); + Pythia8::Pythia::particleData.mayDecay(static_cast<int>(get_PDG(pCode)), true); } void Interaction::setStable(Code const pCode) { std::cout << "Pythia::Interaction: setting " << pCode << " stable.." << std::endl; - pythia_.particleData.mayDecay(static_cast<int>(get_PDG(pCode)), false); + Pythia8::Pythia::particleData.mayDecay(static_cast<int>(get_PDG(pCode)), false); } - void Interaction::configureLabFrameCollision(const Code BeamId, const Code TargetId, - const HEPEnergyType BeamEnergy) { + void Interaction::configureLabFrameCollision(Code const BeamId, Code const TargetId, + HEPEnergyType const BeamEnergy) { // Pythia configuration of the current event // very clumsy. I am sure this can be done better.. @@ -84,26 +87,26 @@ namespace corsika::pythia8 { auto const pdgBeam = static_cast<int>(get_PDG(BeamId)); std::stringstream stBeam; stBeam << "Beams:idA = " << pdgBeam; - pythia_.readString(stBeam.str()); + Pythia8::Pythia::readString(stBeam.str()); // set target auto pdgTarget = static_cast<int>(get_PDG(TargetId)); // replace hydrogen with proton, otherwise pythia goes into heavy ion mode! if (TargetId == Code::Hydrogen) pdgTarget = static_cast<int>(get_PDG(Code::Proton)); std::stringstream stTarget; stTarget << "Beams:idB = " << pdgTarget; - pythia_.readString(stTarget.str()); + Pythia8::Pythia::readString(stTarget.str()); // set frame to lab. frame - pythia_.readString("Beams:frameType = 2"); + Pythia8::Pythia::readString("Beams:frameType = 2"); // set beam energy - const double Elab = BeamEnergy / 1_GeV; + double const Elab = BeamEnergy / 1_GeV; std::stringstream stEnergy; stEnergy << "Beams:eA = " << Elab; - pythia_.readString(stEnergy.str()); + Pythia8::Pythia::readString(stEnergy.str()); // target at rest - pythia_.readString("Beams:eB = 0."); + Pythia8::Pythia::readString("Beams:eB = 0."); // initialize this config - if (!pythia_.init()) + if (!Pythia8::Pythia::init()) throw std::runtime_error("Pythia::Interaction: Initialization failed!"); } @@ -113,20 +116,20 @@ namespace corsika::pythia8 { } std::tuple<CrossSectionType, CrossSectionType> Interaction::getCrossSection( - const Code BeamId, const Code TargetId, const HEPEnergyType CoMenergy) { + Code const BeamId, Code const TargetId, HEPEnergyType const CoMenergy) { // interaction possible in pythia? if (TargetId == Code::Proton || TargetId == Code::Hydrogen) { if (canInteract(BeamId) && isValidCoMEnergy(CoMenergy)) { // input particle PDG auto const pdgCodeBeam = static_cast<int>(get_PDG(BeamId)); auto const pdgCodeTarget = static_cast<int>(get_PDG(TargetId)); - const double ecm = CoMenergy / 1_GeV; + double const ecm = CoMenergy / 1_GeV; // calculate cross section sigma_.calc(pdgCodeBeam, pdgCodeTarget, ecm); if (sigma_.hasSigmaTot()) { - const double sigEla = sigma_.sigmaEl(); - const double sigProd = sigma_.sigmaTot() - sigEla; + double const sigEla = sigma_.sigmaEl(); + double const sigProd = sigma_.sigmaTot() - sigEla; return std::make_tuple(sigProd * (1_fm * 1_fm), sigEla * (1_fm * 1_fm)); @@ -142,7 +145,6 @@ namespace corsika::pythia8 { } } - // template <> GrammageType Interaction::getInteractionLength( corsika::setup::Stack::particle_type const& particle) { @@ -166,7 +168,7 @@ namespace corsika::pythia8 { pTotLab += pTarget; auto const pTotLabNorm = pTotLab.getNorm(); // calculate cm. energy - const HEPEnergyType ECoM = sqrt( + HEPEnergyType const ECoM = sqrt( (Elab + pTotLabNorm) * (Elab - pTotLabNorm)); // binomial for numerical accuracy std::cout << "Interaction: LambdaInt: \n" @@ -183,8 +185,8 @@ namespace corsika::pythia8 { ideally as full particle object so that the four momenta and the boosts can be defined.. */ - const auto* currentNode = particle.getNode(); - const auto mediumComposition = + auto const* currentNode = particle.getNode(); + auto const mediumComposition = currentNode->getModelProperties().getNuclearComposition(); // determine average interaction length @@ -211,17 +213,12 @@ namespace corsika::pythia8 { return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); } - /** - In this function PYTHIA is called to produce one event. The - event is copied (and boosted) into the shower lab frame. - */ - template <class TView> void Interaction::doInteraction(TView& view) { auto projectile = view.getProjectile(); - const auto corsikaBeamId = projectile.getPID(); + auto const corsikaBeamId = projectile.getPID(); std::cout << "Pythia::Interaction: " << "DoInteraction: " << corsikaBeamId << " interaction? " << corsika::pythia8::Interaction::canInteract(corsikaBeamId) << std::endl; @@ -244,9 +241,9 @@ namespace corsika::pythia8 { // define target // FOR NOW: target is always at rest - const auto eTargetLab = 0_GeV + constants::nucleonMass; - const auto pTargetLab = MomentumVector(labCS, 0_GeV, 0_GeV, 0_GeV); - const FourVector PtargLab(eTargetLab, pTargetLab); + auto const eTargetLab = 0_GeV + constants::nucleonMass; + auto const pTargetLab = MomentumVector(labCS, 0_GeV, 0_GeV, 0_GeV); + FourVector const PtargLab(eTargetLab, pTargetLab); std::cout << "Interaction: ebeam lab: " << eProjectileLab / 1_GeV << std::endl << "Interaction: pbeam lab: " << pProjectileLab.getComponents() / 1_GeV @@ -255,7 +252,7 @@ namespace corsika::pythia8 { << "Interaction: ptarget lab: " << pTargetLab.getComponents() / 1_GeV << std::endl; - const FourVector PprojLab(eProjectileLab, pProjectileLab); + FourVector const PprojLab(eProjectileLab, pProjectileLab); // define target kinematics in lab frame // define boost to and from CoM frame @@ -288,8 +285,8 @@ namespace corsika::pythia8 { HEPEnergyType Ecm = sqrt(Etot * Etot - Ptot.getSquaredNorm()); // sample target mass number - const auto* currentNode = projectile.getNode(); - const auto& mediumComposition = + auto const* currentNode = projectile.getNode(); + auto const& mediumComposition = currentNode->getModelProperties().getNuclearComposition(); // get cross sections for target materials /* @@ -302,12 +299,12 @@ namespace corsika::pythia8 { for (size_t i = 0; i < compVec.size(); ++i) { auto const targetId = compVec[i]; - const auto [sigProd, sigEla] = getCrossSection(corsikaBeamId, targetId, Ecm); - [[maybe_unused]] const auto& dummy_sigEla = sigEla; + auto const [sigProd, sigEla] = getCrossSection(corsikaBeamId, targetId, Ecm); + [[maybe_unused]] auto const& dummy_sigEla = sigEla; cross_section_of_components[i] = sigProd; } - const auto corsikaTargetId = + auto const corsikaTargetId = mediumComposition.sampleTarget(cross_section_of_components, RNG_); std::cout << "Interaction: target selected: " << corsikaTargetId << std::endl; @@ -331,10 +328,11 @@ namespace corsika::pythia8 { configureLabFrameCollision(corsikaBeamId, corsikaTargetId, eProjectileLab); // create event in pytia - if (!pythia_.next()) throw std::runtime_error("Pythia::DoInteraction: failed!"); + if (!Pythia8::Pythia::next()) + throw std::runtime_error("Pythia::DoInteraction: failed!"); // link to pythia stack - Pythia8::Event& event = pythia_.event; + Pythia8::Event& event = Pythia8::Pythia::event; if (print_listing_) { // print final state @@ -350,7 +348,7 @@ namespace corsika::pythia8 { auto const pyId = convert_from_PDG(static_cast<PDGCode>(p8p.id())); - const MomentumVector pyPlab( + MomentumVector const pyPlab( labCS, {p8p.px() * 1_GeV, p8p.py() * 1_GeV, p8p.pz() * 1_GeV}); HEPEnergyType const pyEn = p8p.e() * 1_GeV; diff --git a/corsika/modules/pythia8/Decay.hpp b/corsika/modules/pythia8/Decay.hpp index 2bdfccb3c82a2a0aa8b653d7c117f062ee9bd1e6..5de68f4fbd2635471cc604a9fae3c2b783354195 100644 --- a/corsika/modules/pythia8/Decay.hpp +++ b/corsika/modules/pythia8/Decay.hpp @@ -17,7 +17,7 @@ namespace corsika::pythia8 { - class Decay : public DecayProcess<Decay> { + class Decay : public DecayProcess<Decay>, public Pythia8::Pythia { public: Decay(bool const print_listing = false); @@ -59,7 +59,6 @@ namespace corsika::pythia8 { void setStable(Code const); // data members - Pythia8::Pythia pythia_; int count_ = 0; bool handleAllDecays_ = true; std::set<Code> handledDecays_; diff --git a/corsika/modules/pythia8/Interaction.hpp b/corsika/modules/pythia8/Interaction.hpp index 9370ffd570fafb9539200720c74e90fee4340284..f2d264db15befbad789b0ba2afd122fa0e586f86 100644 --- a/corsika/modules/pythia8/Interaction.hpp +++ b/corsika/modules/pythia8/Interaction.hpp @@ -20,7 +20,7 @@ namespace corsika::pythia8 { - class Interaction : public InteractionProcess<Interaction> { + class Interaction : public InteractionProcess<Interaction>, public Pythia8::Pythia { public: Interaction(const bool print_listing = false); @@ -38,20 +38,17 @@ namespace corsika::pythia8 { std::tuple<CrossSectionType, CrossSectionType> getCrossSection( const Code BeamId, const Code TargetId, const HEPEnergyType CoMenergy); - // template <typename TParticle> GrammageType getInteractionLength(corsika::setup::Stack::particle_type const&); /** In this function PYTHIA is called to produce one event. The event is copied (and boosted) into the shower lab frame. */ - template <typename TView> void doInteraction(TView&); private: default_prng_type& RNG_ = RNGManager::getInstance().getRandomStream("pythia"); - Pythia8::Pythia pythia_; Pythia8::SigmaTotal sigma_; const bool internalDecays_ = true; int count_ = 0; diff --git a/modules/pythia/CMakeLists.txt b/modules/pythia/CMakeLists.txt index 623d53adcb285010cb1ca95146e59459b32ec0bd..868f801d15ac9333f2f93fdd4cdf7f9876e96626 100644 --- a/modules/pythia/CMakeLists.txt +++ b/modules/pythia/CMakeLists.txt @@ -8,7 +8,7 @@ mark_as_advanced (ThirdPartyChoiceValues) ############################################################################## # check for Pythia8: either use C8 or system-level installation -message ("***** Configuring Pythia8 version") +message (STATUS "***** Configuring Pythia8 version") set (USE_PYTHIA8_C8 "C8" CACHE STRING "Selection of pythia8 package. Can be \'C8\' or \'SYSTEM\'. Default: \'C8\'.") @@ -21,18 +21,18 @@ message (STATUS "USE_PYTHIA8_C8='${USE_PYTHIA8_C8}'") add_library (C8::ext::pythia8 STATIC IMPORTED GLOBAL) if ("x_${USE_PYTHIA8_C8}" STREQUAL "x_SYSTEM") - find_package (Pythia8 REQUIRED) + find_package (Pythia8 8245 EXACT REQUIRED) message (STATUS "Using system-level Pythia8 version ${Pythia8_VERSION} at ${Pythia8_INCLUDE_DIR}") set_target_properties ( C8::ext::pythia8 PROPERTIES IMPORTED_LOCATION ${Pythia8_LIBRARY}/libpythia8.a IMPORTED_LINK_INTERFACE_LIBRARIES dl INTERFACE_INCLUDE_DIRECTORIES ${Pythia8_INCLUDE_DIR} + INTERFACE_COMPILE_DEFINITIONS CORSIKA_Pythia8_PREFIX="${Pythia8_PREFIX}" ) set (Pythia8_FOUND 1 PARENT_SCOPE) - message ("Pythia8_LIBRARY=${Pythia8_LIBRARY}") - message ("Pythia8_INCLUDE_DIR=${Pythia8_INCLUDE_DIR}") + message (STATUS "Pythia8 (system) at ${Pythia8_PREFIX}") else () @@ -43,9 +43,9 @@ else () URL ${CMAKE_CURRENT_SOURCE_DIR}/pythia${_C8_Pythia8_VERSION}-stripped.tar.bz2 URL_MD5 d3e951a2f101e8cfec26405cb61db83b SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/pythia8/source - INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/external/pythia8 + INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/pythia8/install LOG_DIR ${CMAKE_CURRENT_BINARY_DIR}/pythia8/log - CONFIGURE_COMMAND ./configure --cxx-common=\\"${CMAKE_CXX_FLAGS} -O2 -fPIC\\" --prefix=${CMAKE_INSTALL_PREFIX}/external/pythia8 + CONFIGURE_COMMAND ./configure --cxx-common=\\"${CMAKE_CXX_FLAGS} -O2 -fPIC\\" --prefix=${CMAKE_CURRENT_BINARY_DIR}/pythia8/install BUILD_IN_SOURCE ON EXCLUDE_FROM_ALL TRUE LOG_CONFIGURE TRUE @@ -54,28 +54,27 @@ else () LOG_MERGED_STDOUTERR TRUE ) set (Pythia8_FOUND 1 PARENT_SCOPE) - ExternalProject_Get_Property (pythia8 INSTALL_DIR) + ExternalProject_Get_Property (pythia8 INSTALL_DIR) # this is "make" + set (Pythia8_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/externals/pythia8) # this is "make install" set (Pythia8_VERSION ${_C8_Pythia8_VERSION} CACHE STRING "Version of Pythia8") set (Pythia8_PREFIX ${INSTALL_DIR}) set (Pythia8_INCLUDE_DIR ${Pythia8_PREFIX}/include) set (Pythia8_LIBRARY ${Pythia8_PREFIX}/lib/libpythia8.a) add_dependencies (C8::ext::pythia8 pythia8) - # create include directory at config time - file (MAKE_DIRECTORY ${Pythia8_INCLUDE_DIR}) - set (Pythia8_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/externals/pythia8) install (DIRECTORY ${INSTALL_DIR}/ DESTINATION ${Pythia8_INSTALL_DIR}) set_target_properties ( - C8::ext::pythia8 PROPERTIES + C8::ext::pythia8 + PROPERTIES IMPORTED_LOCATION ${Pythia8_LIBRARY} IMPORTED_LINK_INTERFACE_LIBRARIES dl - INTERFACE_INCLUDE_DIRECTORIES - $<BUILD_INTERFACE:${Pythia8_INCLUDE_DIR}> + INTERFACE_INCLUDE_DIRECTORIES ${Pythia8_INCLUDE_DIR} + INTERFACE_COMPILE_DEFINITIONS CORSIKA_Pythia8_PREFIX="${Pythia8_PREFIX}" ) - message (STATUS "Pythia8_INCLUDE_DIR ${Pythia8_INCLUDE_DIR}") + message (STATUS "Pythia8 build at ${INSTALL_DIR}, install to ${Pythia8_INSTALL_DIR}") endif ()