diff --git a/Documentation/Examples/em_shower.cc b/Documentation/Examples/em_shower.cc index 05863e5431c44100e84c7fa2b764a4811adb3b6b..651cc981a2a0da9bf31a5a8f7e79eaeeea5a4ce1 100644 --- a/Documentation/Examples/em_shower.cc +++ b/Documentation/Examples/em_shower.cc @@ -80,20 +80,30 @@ int main(int argc, char** argv) { {{particles::Code::Nitrogen, particles::Code::Oxygen}, {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now - builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addLinearLayer<environment::UniformMediumType< + environment::UniformMagneticField<HomogeneousMedium<setup::EnvironmentInterface>>>>( + 1e9_cm, 112.8_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); builder.assemble(env); @@ -174,16 +184,16 @@ int main(int argc, char** argv) { EAS.Run(); cut.ShowResults(); - em_continuous.ShowResults(); + em_continuous.showResults(); observationLevel.ShowResults(); const HEPEnergyType Efinal = cut.GetCutEnergy() + cut.GetInvEnergy() + - cut.GetEmEnergy() + em_continuous.GetEnergyLost() + + cut.GetEmEnergy() + em_continuous.energyLost() + observationLevel.GetEnergyGround(); cout << "total cut energy (GeV): " << Efinal / 1_GeV << endl << "relative difference (%): " << (Efinal / E0 - 1) * 100 << endl; observationLevel.Reset(); cut.Reset(); - em_continuous.Reset(); + em_continuous.reset(); auto const hists = proposalCounted.GetHistogram(); hists.saveLab("inthist_lab_emShower.npz"); diff --git a/Documentation/Examples/hybrid_MC.cc b/Documentation/Examples/hybrid_MC.cc index bad8cee91271f546456ee61b2af398ee352b964d..51b34dc46501897c52659503a7242e4b3dd7c96d 100644 --- a/Documentation/Examples/hybrid_MC.cc +++ b/Documentation/Examples/hybrid_MC.cc @@ -72,9 +72,6 @@ void registerRandomStreams(const int seed) { random::RNGManager::GetInstance().SeedAll(seed); } -template <typename T> -using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>; - int main(int argc, char** argv) { logging::SetLevel(logging::level::info); @@ -104,20 +101,30 @@ int main(int argc, char** argv) { {{particles::Code::Nitrogen, particles::Code::Oxygen}, {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now - builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addLinearLayer<environment::UniformMediumType< + environment::UniformMagneticField<HomogeneousMedium<setup::EnvironmentInterface>>>>( + 1e9_cm, 112.8_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); builder.assemble(env); diff --git a/Documentation/Examples/vertical_EAS.cc b/Documentation/Examples/vertical_EAS.cc index 2d2a1b7cb031dc574337dddc654b90a904802cdb..ea3ff330e64446fac7aa88c2ca78088713ac34db 100644 --- a/Documentation/Examples/vertical_EAS.cc +++ b/Documentation/Examples/vertical_EAS.cc @@ -75,9 +75,6 @@ void registerRandomStreams(const int seed) { random::RNGManager::GetInstance().SeedAll(seed); } -template <typename T> -using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>; - int main(int argc, char** argv) { logging::SetLevel(logging::level::info); @@ -107,20 +104,30 @@ int main(int argc, char** argv) { {{particles::Code::Nitrogen, particles::Code::Oxygen}, {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now - builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addLinearLayer<environment::UniformMediumType< + environment::UniformMagneticField<HomogeneousMedium<setup::EnvironmentInterface>>>>( + 1e9_cm, 112.8_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); builder.assemble(env); @@ -257,16 +264,16 @@ int main(int argc, char** argv) { EAS.Run(); cut.ShowResults(); - em_continuous.ShowResults(); + em_continuous.showResults(); observationLevel.ShowResults(); const HEPEnergyType Efinal = cut.GetCutEnergy() + cut.GetInvEnergy() + - cut.GetEmEnergy() + em_continuous.GetEnergyLost() + + cut.GetEmEnergy() + em_continuous.energyLost() + observationLevel.GetEnergyGround(); cout << "total cut energy (GeV): " << Efinal / 1_GeV << endl << "relative difference (%): " << (Efinal / E0 - 1) * 100 << endl; observationLevel.Reset(); cut.Reset(); - em_continuous.Reset(); + em_continuous.reset(); auto const hists = sibyllCounted.GetHistogram() + sibyllNucCounted.GetHistogram() + urqmdCounted.GetHistogram() + proposalCounted.GetHistogram(); diff --git a/Environment/LayeredSphericalAtmosphereBuilder.h b/Environment/LayeredSphericalAtmosphereBuilder.h index 01f4855afe4cd97eb70d780fc0da8b5476847ba6..12db29715a3ae254d8de0e4b0bb5b5f248164a80 100644 --- a/Environment/LayeredSphericalAtmosphereBuilder.h +++ b/Environment/LayeredSphericalAtmosphereBuilder.h @@ -62,28 +62,13 @@ namespace corsika::environment { composition_ = std::make_unique<NuclearComposition>(composition); } - void addExponentialLayer(units::si::GrammageType b, units::si::LengthType c, - units::si::LengthType upperBoundary) { - auto const radius = earthRadius_ + upperBoundary; - checkRadius(radius); - previousRadius_ = radius; - - auto node = std::make_unique<VolumeTreeNode<TMediumInterface>>( - std::make_unique<geometry::Sphere>(center_, radius)); - - auto const rho0 = b / c; - std::cout << "rho0 = " << rho0 << ", c = " << c << std::endl; - - node->template SetModelProperties< - environment::SlidingPlanarExponential<TMediumInterface>>( - center_, rho0, -c, *composition_, earthRadius_); - - layers_.push(std::move(node)); - } - - template <template <typename> typename MExtraModels, typename... TArgs> + template < + typename TMediumModel = environment::SlidingPlanarExponential<TMediumInterface>, + typename... TArgs> void addExponentialLayer(units::si::GrammageType b, units::si::LengthType c, units::si::LengthType upperBoundary, TArgs&&... args) { + using namespace units::si; + auto const radius = earthRadius_ + upperBoundary; checkRadius(radius); previousRadius_ = radius; @@ -94,16 +79,14 @@ namespace corsika::environment { auto const rho0 = b / c; std::cout << "rho0 = " << rho0 << ", c = " << c << std::endl; - node->template SetModelProperties< - MExtraModels<SlidingPlanarExponential<TMediumInterface>>>( - args..., center_, rho0, -c, *composition_, earthRadius_); + node->template SetModelProperties<TMediumModel>(args..., center_, rho0, -c, + *composition_, earthRadius_); layers_.push(std::move(node)); } - int size() const { return layers_.size(); } - - template <template <typename> typename MExtraModels, typename... TArgs> + template <typename TMediumModel = environment::HomogeneousMedium<TMediumInterface>, + typename... TArgs> void addLinearLayer(units::si::LengthType c, units::si::LengthType upperBoundary, TArgs&&... args) { using namespace units::si; @@ -120,32 +103,12 @@ namespace corsika::environment { auto node = std::make_unique<VolumeTreeNode<TMediumInterface>>( std::make_unique<geometry::Sphere>(center_, radius)); - node->template SetModelProperties< - MExtraModels<HomogeneousMedium<TMediumInterface>>>(args..., rho0, - *composition_); + node->template SetModelProperties<TMediumModel>(args..., rho0, *composition_); layers_.push(std::move(node)); } - void addLinearLayer(units::si::LengthType c, units::si::LengthType upperBoundary) { - using namespace units::si; - - auto const radius = earthRadius_ + upperBoundary; - checkRadius(radius); - previousRadius_ = radius; - - units::si::GrammageType constexpr b = 1 * 1_g / (1_cm * 1_cm); - auto const rho0 = b / c; - - std::cout << "rho0 = " << rho0; - - auto node = std::make_unique<VolumeTreeNode<TMediumInterface>>( - std::make_unique<geometry::Sphere>(center_, radius)); - node->template SetModelProperties<HomogeneousMedium<TMediumInterface>>( - rho0, *composition_); - - layers_.push(std::move(node)); - } + int size() const { return layers_.size(); } void assemble(Environment<TMediumInterface>& env) { auto& universe = env.GetUniverse(); diff --git a/Environment/testEnvironment.cc b/Environment/testEnvironment.cc index 5480aec9426406fa152f4c9d57cd45b0f97a65c8..6c0062c711aa567f2014b8e16c3f72334716829d 100644 --- a/Environment/testEnvironment.cc +++ b/Environment/testEnvironment.cc @@ -298,7 +298,7 @@ TEST_CASE("UniformMagneticField w/ Homogeneous Medium") { TEST_CASE("LayeredSphericalAtmosphereBuilder w/ magnetic field") { // setup our interface types - using IModelInterface = IMagneticFieldModel<IMediumModel>; + using ModelInterface = IMagneticFieldModel<IMediumModel>; // the composition we use for the homogenous medium NuclearComposition const protonComposition(std::vector<Code>{Code::Proton}, @@ -308,14 +308,15 @@ TEST_CASE("LayeredSphericalAtmosphereBuilder w/ magnetic field") { Vector B0(gCS, 0_T, 0_T, 1_T); Vector B1(gCS, 1_T, 1_T, 0_T); - // LayeredSphericalAtmosphereBuilder<IMediumModel> builder(gOrigin); - LayeredSphericalAtmosphereBuilder<IModelInterface> builder(gOrigin); + LayeredSphericalAtmosphereBuilder<ModelInterface> builder(gOrigin); builder.setNuclearComposition( {{{particles::Code::Nitrogen, particles::Code::Oxygen}}, {{.6, .4}}}); - builder.addLinearLayer<UniformMagneticField>(1_km, 10_km, B0); - builder.addExponentialLayer<UniformMagneticField>(1222.6562_g / (1_cm * 1_cm), - 994186.38_cm, 20_km, B1); + builder.addLinearLayer<UniformMagneticField<HomogeneousMedium<ModelInterface>>>( + 1_km, 10_km, B0); + builder.addExponentialLayer< + UniformMagneticField<SlidingPlanarExponential<ModelInterface>>>( + 1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 20_km, B1); CHECK(builder.size() == 2); diff --git a/Processes/CONEXSourceCut/testCONEXSourceCut.cc b/Processes/CONEXSourceCut/testCONEXSourceCut.cc index 30831eed61e3e1f2e4168903a953366cf6dda674..6699e419c44edc920f261c605b601205f52e4444 100644 --- a/Processes/CONEXSourceCut/testCONEXSourceCut.cc +++ b/Processes/CONEXSourceCut/testCONEXSourceCut.cc @@ -35,8 +35,8 @@ using namespace corsika::environment; using namespace corsika::geometry; using namespace corsika::units::si; -template <typename T> -using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>; +// template <typename T> +// using MEnv = environment::UniformMediumType<environment::UniformMagneticField<T>>; TEST_CASE("CONEXSourceCut") { random::RNGManager::GetInstance().RegisterRandomStream("cascade"); @@ -56,20 +56,30 @@ TEST_CASE("CONEXSourceCut") { {{particles::Code::Nitrogen, particles::Code::Oxygen}, {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now - builder.addExponentialLayer<MEnv>(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addExponentialLayer<MEnv>(540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, - environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); - builder.addLinearLayer<MEnv>(1e9_cm, 112.8_km, environment::EMediumType::eAir, - geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addExponentialLayer< + environment::UniformMediumType<environment::UniformMagneticField< + SlidingPlanarExponential<setup::EnvironmentInterface>>>>( + 540.1778_g / (1_cm * 1_cm), 772170.16_cm, 100_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); + builder.addLinearLayer<environment::UniformMediumType< + environment::UniformMagneticField<HomogeneousMedium<setup::EnvironmentInterface>>>>( + 1e9_cm, 112.8_km, environment::EMediumType::eAir, + geometry::Vector(rootCS, 0_T, 0_T, 1_T)); builder.assemble(env); @@ -95,8 +105,7 @@ TEST_CASE("CONEXSourceCut") { [[maybe_unused]] process::sibyll::NuclearInteraction sibyllNuc(sibyll, env); corsika::process::conex_source_cut::CONEXSourceCut conex( - center, showerAxis, t, injectionHeight, E0, - particles::GetPDG(particles::Code::Proton)); + center, showerAxis, t, injectionHeight, E0, particles::Code::Proton); HEPEnergyType const Eem{1_PeV}; auto const momentum = showerAxis.GetDirection() * Eem; @@ -111,7 +120,8 @@ TEST_CASE("CONEXSourceCut") { std::cout << "position EM: " << emPosition.GetCoordinates(conex.GetObserverCS()) << " " << emPosition.GetCoordinates(rootCS) << std::endl; - conex.addParticle(0, Eem, 0_eV, emPosition, momentum.normalized(), 0_s); + conex.addParticle(particles::Code::Proton, Eem, 0_eV, emPosition, momentum.normalized(), + 0_s); conex.SolveCE(); }