diff --git a/Documentation/Examples/boundary_example.cc b/Documentation/Examples/boundary_example.cc index a2f0d1001fb7c4a71a6dd759fce19b55cd3a0ecf..caaa087a4fb1e32b52daf54276c23626b419d4f0 100644 --- a/Documentation/Examples/boundary_example.cc +++ b/Documentation/Examples/boundary_example.cc @@ -114,7 +114,7 @@ int main() { // setup processes, decays and interactions tracking_line::TrackingLine tracking; - random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + random::RNGManager::GetInstance().RegisterRandomStream("sibyll"); process::sibyll::Interaction sibyll; process::sibyll::Decay decay; diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc index fb94eaa5bee349ed4d0e62a840137afa6a9dcb50..93902e146ae7b223644eb8a0e34fb73cf93ebcab 100644 --- a/Documentation/Examples/cascade_example.cc +++ b/Documentation/Examples/cascade_example.cc @@ -133,7 +133,7 @@ int main() { tracking_line::TrackingLine tracking; stack_inspector::StackInspector<setup::Stack> stackInspect(1, true, E0); - random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + random::RNGManager::GetInstance().RegisterRandomStream("sibyll"); random::RNGManager::GetInstance().RegisterRandomStream("pythia"); process::sibyll::Interaction sibyll; process::sibyll::NuclearInteraction sibyllNuc(sibyll, env); diff --git a/Documentation/Examples/cascade_proton_example.cc b/Documentation/Examples/cascade_proton_example.cc index 5125902df40a4a1c318d02400dbc3f7fb0131775..996d67eb9fd3383801f150c2eb6d50c87f2da36d 100644 --- a/Documentation/Examples/cascade_proton_example.cc +++ b/Documentation/Examples/cascade_proton_example.cc @@ -116,7 +116,7 @@ int main() { tracking_line::TrackingLine tracking; stack_inspector::StackInspector<setup::Stack> stackInspect(1, true, E0); - random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + random::RNGManager::GetInstance().RegisterRandomStream("sibyll"); random::RNGManager::GetInstance().RegisterRandomStream("pythia"); // process::sibyll::Interaction sibyll(env); process::pythia::Interaction pythia; diff --git a/Documentation/Examples/vertical_EAS.cc b/Documentation/Examples/vertical_EAS.cc index 3e1af668f1f8a0e07bc82fea9b22eca42b5e1476..17a80986d0485df5043a1216926ca1da9f542f2f 100644 --- a/Documentation/Examples/vertical_EAS.cc +++ b/Documentation/Examples/vertical_EAS.cc @@ -56,10 +56,10 @@ using namespace corsika::units::si; void registerRandomStreams() { random::RNGManager::GetInstance().RegisterRandomStream("cascade"); - random::RNGManager::GetInstance().RegisterRandomStream("qgran"); - random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + random::RNGManager::GetInstance().RegisterRandomStream("qgsjet"); + random::RNGManager::GetInstance().RegisterRandomStream("sibyll"); random::RNGManager::GetInstance().RegisterRandomStream("pythia"); - random::RNGManager::GetInstance().RegisterRandomStream("UrQMD"); + random::RNGManager::GetInstance().RegisterRandomStream("urqmd"); random::RNGManager::GetInstance().SeedAll(); } diff --git a/Framework/Random/RNGManager.cc b/Framework/Random/RNGManager.cc index ab60ff721f876d728a2f4ee04e3a31b33d121d43..238b38636e4ef5ec6ab9a3e219ba044d7a503845 100644 --- a/Framework/Random/RNGManager.cc +++ b/Framework/Random/RNGManager.cc @@ -7,6 +7,7 @@ */ #include <corsika/random/RNGManager.h> +#include <sstream> void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStreamName) { corsika::random::RNG rng; @@ -20,7 +21,15 @@ void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStrea corsika::random::RNG& corsika::random::RNGManager::GetRandomStream( std::string const& pStreamName) { - return rngs.at(pStreamName); + if (IsRegistered(pStreamName)) { + return rngs.at(pStreamName); + } else { // this stream name is not in the map + throw std::runtime_error("'" + pStreamName + "' is not a registered stream."); + } +} + +bool corsika::random::RNGManager::IsRegistered(std::string const& pStreamName) const { + return rngs.count(pStreamName) > 0; } std::stringstream corsika::random::RNGManager::dumpState() const { @@ -44,10 +53,3 @@ void corsika::random::RNGManager::SeedAll() { entry.second.seed(sseq); } } - -/* -void corsika::random::RNGManager::SetSeedSeq(std::string const& pStreamName, - std::seed_seq const& pSeedSeq) { - seeds[pStreamName] = pSeedSeq; -} -*/ diff --git a/Framework/Random/RNGManager.h b/Framework/Random/RNGManager.h index 15e90d69a294824a3e58d0e60eab38d4ebd37e07..0826642a86e57df9f25ab0c297e5ce080839565b 100644 --- a/Framework/Random/RNGManager.h +++ b/Framework/Random/RNGManager.h @@ -12,7 +12,6 @@ #include <map> #include <random> -#include <sstream> #include <string> /*! @@ -23,7 +22,10 @@ namespace corsika::random { using RNG = std::mt19937; //!< the actual RNG type that will be used - class RNGManager : public corsika::utl::Singleton<RNGManager> { + /*! + * Manage random number generators. + */ + class RNGManager final : public corsika::utl::Singleton<RNGManager> { friend class corsika::utl::Singleton<RNGManager>; @@ -48,17 +50,17 @@ namespace corsika::random { */ RNG& GetRandomStream(std::string const& pStreamName); + /*! + * Check whether a stream has been registered. + */ + bool IsRegistered(std::string const& pStreamName) const; + /*! * dumps the names and states of all registered random-number streams * into a std::stringstream. */ std::stringstream dumpState() const; - /** - * set seed_seq of \a pStreamName to \a pSeedSeq - */ - // void SetSeedSeq(std::string const& pStreamName, std::seed_seq& const pSeedSeq); - /** * Set explicit seeds for all currently registered streams. The actual seed values * are incremented from \a vSeed. diff --git a/Framework/Random/testRandom.cc b/Framework/Random/testRandom.cc index 9a1d96fbb7a1dd426643a4fe4eba51c65403330a..14971167d1517e8cef0dfc2a3860f86f25e1c386 100644 --- a/Framework/Random/testRandom.cc +++ b/Framework/Random/testRandom.cc @@ -23,18 +23,32 @@ SCENARIO("random-number streams can be registered and retrieved") { GIVEN("a RNGManager") { RNGManager& rngManager = RNGManager::GetInstance(); - WHEN("a sequence is registered by name") { - rngManager.RegisterRandomStream("stream_A"); + WHEN("the sequence name is not registered") { + REQUIRE(rngManager.IsRegistered("stream_A") == false); - THEN("the sequence can be retrieved") { - REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); - } + THEN("a sequence is registered by name") { + rngManager.RegisterRandomStream("stream_A"); - THEN("an unknown sequence cannot be retrieved") { - REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN")); - } + THEN("the sequence can be retrieved") { + REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); + + THEN("we can check that the sequence exists") { + REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); - // seeding not covered yet + THEN("an unknown sequence cannot be retrieved") { + REQUIRE(rngManager.IsRegistered("stream_A") == true); + + THEN("an unknown sequence cannot be retrieved") { + REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN")); + + THEN("an unknown sequence is not registered") { + REQUIRE(rngManager.IsRegistered("stream_UNKNOWN") == false); + } + } + } + } + } + } } } } diff --git a/Processes/CONEXSourceCut/testCONEXSourceCut.cc b/Processes/CONEXSourceCut/testCONEXSourceCut.cc index 3dfc6c73e0a320851d6d89fb0af864102ad7f540..dacfc8728d07f5056b5aee36153e97f362097478 100644 --- a/Processes/CONEXSourceCut/testCONEXSourceCut.cc +++ b/Processes/CONEXSourceCut/testCONEXSourceCut.cc @@ -27,7 +27,7 @@ using namespace corsika::units::si; TEST_CASE("CONEXSourceCut") { random::RNGManager::GetInstance().RegisterRandomStream("cascade"); - random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + random::RNGManager::GetInstance().RegisterRandomStream("sibyll"); feenableexcept(FE_INVALID); diff --git a/Processes/QGSJetII/Interaction.h b/Processes/QGSJetII/Interaction.h index f72cbdcc7bf5aea207afa938010b900e34cbf835..fc44b8f884e487ce1ed904c47d7af3be2b51a177 100644 --- a/Processes/QGSJetII/Interaction.h +++ b/Processes/QGSJetII/Interaction.h @@ -55,7 +55,7 @@ namespace corsika::process::qgsjetII { private: corsika::random::RNG& rng_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("qgran"); + corsika::random::RNGManager::GetInstance().GetRandomStream("qgsjet"); static constexpr int maxMassNumber_ = 208; }; diff --git a/Processes/QGSJetII/qgsjet-II-04.cc b/Processes/QGSJetII/qgsjet-II-04.cc index fef484e999b46ea1ea8b196f4cc3a42492e987c3..a318d0a6cb774057203d34a93c977f290c70362b 100644 --- a/Processes/QGSJetII/qgsjet-II-04.cc +++ b/Processes/QGSJetII/qgsjet-II-04.cc @@ -26,7 +26,7 @@ datadir::datadir(const std::string& dir) { double qgran_(int&) { static corsika::random::RNG& rng = - corsika::random::RNGManager::GetInstance().GetRandomStream("qgran"); + corsika::random::RNGManager::GetInstance().GetRandomStream("qgsjet"); std::uniform_real_distribution<double> dist; return dist(rng); diff --git a/Processes/QGSJetII/testQGSJetII.cc b/Processes/QGSJetII/testQGSJetII.cc index b5092ed9d247c43d6062a3614115149db70da803..d9a3dcda735ef3c2e941cc760b1f5389dc7bfd48 100644 --- a/Processes/QGSJetII/testQGSJetII.cc +++ b/Processes/QGSJetII/testQGSJetII.cc @@ -117,7 +117,7 @@ TEST_CASE("QgsjetIIInterface", "[processes]") { const geometry::CoordinateSystem& cs = env.GetCoordinateSystem(); - corsika::random::RNGManager::GetInstance().RegisterRandomStream("qgran"); + corsika::random::RNGManager::GetInstance().RegisterRandomStream("qgsjet"); SECTION("InteractionInterface") { diff --git a/Processes/Sibyll/Interaction.h b/Processes/Sibyll/Interaction.h index bcc9b632e8ce622ef55dbb2c25ea6d160f0609c9..fcb3b94e5f342134b16289286e66ee977d157abf 100644 --- a/Processes/Sibyll/Interaction.h +++ b/Processes/Sibyll/Interaction.h @@ -57,7 +57,7 @@ namespace corsika::process::sibyll { private: corsika::random::RNG& RNG_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm"); + corsika::random::RNGManager::GetInstance().GetRandomStream("sibyll"); const corsika::units::si::HEPEnergyType minEnergyCoM_ = 10. * 1e9 * corsika::units::si::electronvolt; diff --git a/Processes/Sibyll/NuclearInteraction.h b/Processes/Sibyll/NuclearInteraction.h index 8897d199dfa605f76c43a53c6edfeb838f797d7b..ba9c710bb09363da5ee9f82d15bfeb6f41f397ab 100644 --- a/Processes/Sibyll/NuclearInteraction.h +++ b/Processes/Sibyll/NuclearInteraction.h @@ -60,7 +60,7 @@ namespace corsika::process::sibyll { corsika::process::sibyll::Interaction& hadronicInteraction_; std::map<corsika::particles::Code, int> targetComponentsIndex_; corsika::random::RNG& RNG_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm"); + corsika::random::RNGManager::GetInstance().GetRandomStream("sibyll"); static constexpr int gNSample_ = 500; // number of samples in MC estimation of cross section static constexpr int gMaxNucleusAProjectile_ = 56; diff --git a/Processes/Sibyll/sibyll2.3d.cc b/Processes/Sibyll/sibyll2.3d.cc index 7257e97a84340d7cc9dcf7c3dc7689c529762e3d..16db131f7cede092ced66a7b8eebd4e22658c560 100644 --- a/Processes/Sibyll/sibyll2.3d.cc +++ b/Processes/Sibyll/sibyll2.3d.cc @@ -16,7 +16,7 @@ double get_sibyll_mass2(int& id) { return s_mass1_.am2[abs(id) - 1]; } double s_rndm_(int&) { static corsika::random::RNG& rng = - corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm"); + corsika::random::RNGManager::GetInstance().GetRandomStream("sibyll"); std::uniform_real_distribution<double> dist; return dist(rng); diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc index 2aab98c2ab9716d82e2cd78cf5f0ae6b817381eb..308e8ea1835d8bea50f57c79d4074024d595ba3f 100644 --- a/Processes/Sibyll/testSibyll.cc +++ b/Processes/Sibyll/testSibyll.cc @@ -115,7 +115,7 @@ TEST_CASE("SibyllInterface", "[processes]") { const geometry::CoordinateSystem& cs = env.GetCoordinateSystem(); - random::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + random::RNGManager::GetInstance().RegisterRandomStream("sibyll"); SECTION("InteractionInterface") { diff --git a/Processes/UrQMD/UrQMD.cc b/Processes/UrQMD/UrQMD.cc index a9ee78c119ee00a9a6e3505bf2f612ba9e4ec293..cc9e02f61d2f7c45144260e6871a17e63aa42c60 100644 --- a/Processes/UrQMD/UrQMD.cc +++ b/Processes/UrQMD/UrQMD.cc @@ -358,7 +358,7 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupProjectile& projectil */ double corsika::process::UrQMD::ranf_(int&) { static corsika::random::RNG& rng = - corsika::random::RNGManager::GetInstance().GetRandomStream("UrQMD"); + corsika::random::RNGManager::GetInstance().GetRandomStream("urqmd"); static std::uniform_real_distribution<double> dist; return dist(rng); diff --git a/Processes/UrQMD/UrQMD.h b/Processes/UrQMD/UrQMD.h index 1852e3d2e6e2a1336f224d7af05c3abdbd216486..3461c8ca36cd082eb0afc4731cdb44177c883201 100644 --- a/Processes/UrQMD/UrQMD.h +++ b/Processes/UrQMD/UrQMD.h @@ -49,7 +49,7 @@ namespace corsika::process::UrQMD { void readXSFile(std::string const&); corsika::random::RNG& rng_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("UrQMD"); + corsika::random::RNGManager::GetInstance().GetRandomStream("urqmd"); std::uniform_int_distribution<int> booleanDist_{0, 1}; boost::multi_array<corsika::units::si::CrossSectionType, 3> xs_interp_support_table_; diff --git a/Processes/UrQMD/testUrQMD.cc b/Processes/UrQMD/testUrQMD.cc index 5690e0c289cd941e2b45b2e5d1849b0e25b52448..fd947e83f60776d36fe986f0471ec827603e116b 100644 --- a/Processes/UrQMD/testUrQMD.cc +++ b/Processes/UrQMD/testUrQMD.cc @@ -130,7 +130,7 @@ TEST_CASE("UrQMD") { } feenableexcept(FE_INVALID); - corsika::random::RNGManager::GetInstance().RegisterRandomStream("UrQMD"); + corsika::random::RNGManager::GetInstance().RegisterRandomStream("urqmd"); UrQMD urqmd; SECTION("interaction length") {