diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc index 44a17868444bd7a70a466462a05683e98a910561..f91ed4e43a7a3a7a50faf8c91c4505f616390b6b 100644 --- a/Processes/Proposal/Interaction.cc +++ b/Processes/Proposal/Interaction.cc @@ -3,17 +3,23 @@ #include <corsika/setup/SetupTrajectory.h> #include <corsika/environment/NuclearComposition.h> #include <corsika/environment/IMediumModel.h> +#include <corsika/units/PhysicalUnits.h> #include <set> #include <map> #include <memory> +#include <limits> +#include <random> namespace corsika::process::proposal { using namespace corsika::setup; using namespace corsika::environment; +using namespace corsika::units::si; using namespace corsika; +using SetupParticle = setup::Stack::StackIterator; + template <> Interaction<SetupEnvironment>::Interaction(SetupEnvironment const& env, ParticleCut const& cut) : fEnvironment(env), @@ -118,25 +124,120 @@ Interaction<SetupEnvironment>::Interaction(SetupEnvironment const& env, Particle interpolation_def.just_use_readonly_path = false; // std::map<particles::Code, double> corsika_particle_to_utility_map; - std::map<particles::Code, std::unique_ptr<const PROPOSAL::UtilityInterpolantInteraction>> corsika_particle_to_utility_map; std::cout << "go PROPOSAL !!!" << std::endl; for(auto const& medium:composition_medium_map){ - corsika_particle_to_utility_map[Code::MuMinus] = std::make_unique<const PROPOSAL::UtilityInterpolantInteraction>( + corsika_particle_to_utility_map[Code::MuMinus] = std::make_unique<PROPOSAL::UtilityInterpolantInteraction>( PROPOSAL::UtilityInterpolantInteraction(PROPOSAL::Utility(PROPOSAL::MuMinusDef::Get(), medium.second, loss_cut, utility_def, interpolation_def), interpolation_def) ); + corsika_particle_to_displacement_map[Code::MuMinus] = std::make_unique<PROPOSAL::UtilityInterpolantDisplacement>( + PROPOSAL::UtilityInterpolantDisplacement(PROPOSAL::Utility(PROPOSAL::MuMinusDef::Get(), medium.second, loss_cut, utility_def, interpolation_def), + interpolation_def) + ); } std::cout << "PROPOSAL done." << std::endl; + } // Interaction::~Interaction {} // template <> -// corsika::process::EProcessReturn Interaction::DoInteraction(Particle&) {} - // template <> -// corsika::units::si::GrammageType Interaction::GetInteractionLength(TParticle& p) {} +// corsika::process::EProcessReturn Interaction<SetupEnvironment>::DoInteraction(SetupParticle const& vP) { + +// // double rndi = dist(rng); +// // double rndiMin = corsika_particle_to_utility_map[pcode]->Calculate(initial_energy, p_low, 0); + +// // if (rndd >= rnddMin || rnddMin <= 0) { +// // // return particle_.GetLow(); +// // return process::EProcessReturn::eOk; +// // } else { +// // return corsika_particle_to_utility_map[pcode]->GetUpperLimit(initial_energy, rndi) ; +// // } + +// return process::EProcessReturn::eOk; +// } + +template <> +template <> +corsika::units::si::GrammageType Interaction<SetupEnvironment>::GetInteractionLength(SetupParticle const& vP) { + std::uniform_real_distribution<double> distribution(0., 1.); + double rndi = distribution(fRNG); + double particle_energy = vP.GetEnergy() / 1_GeV * 1000; + double rndiMin = corsika_particle_to_utility_map[vP.GetPID()]->Calculate(particle_energy, 0, 0); + + if (rndi >= rndiMin || rndiMin <= 0) { + return 1 * 1_g / 1_cm / 1_cm; + } + double final_energy = corsika_particle_to_utility_map[vP.GetPID()]->GetUpperLimit(particle_energy, rndi) ; + return corsika_particle_to_displacement_map[vP.GetPID()]->Calculate( + particle_energy, + final_energy, + std::numeric_limits<double>::max(), + PROPOSAL::Vector3D(), + PROPOSAL::Vector3D() + ) * 1_g / 1_cm / 1_cm; +} + +template <> +template <> +process::EProcessReturn Interaction<SetupEnvironment>::DoInteraction(SetupParticle& vP) { + std::uniform_real_distribution<double> distribution(0., 1.); + double rnd1 = distribution(fRNG); + double rnd2 = distribution(fRNG); + double rnd3 = distribution(fRNG); + double particle_energy = vP.GetEnergy() / 1_GeV * 1000; + + corsika::stack::MomentumVector Ptot = vP.GetMomentum(); + corsika::geometry::QuantityVector q_momentum = Ptot.GetComponents(); + PROPOSAL::Vector3D initial_direction(q_momentum[0] / 1_GeV, q_momentum[1] / 1_GeV, q_momentum[2] / 1_GeV); + initial_direction.normalise(); + initial_direction.CalculateSphericalCoordinates(); + std::pair<double, PROPOSAL::DynamicData::Type> energy_loss; + energy_loss = corsika_particle_to_utility_map[vP.GetPID()]->GetUtility().StochasticLoss(particle_energy, rnd1, rnd2, rnd3); + + // std::vector<CrossSection*> cross_sections = utility_.GetCrosssections(); + // for (unsigned int i = 0; i < cross_sections.size(); i++) { + // if (cross_sections[i]->GetTypeId() == energy_loss.second) + // { + // deflection_angles = cross_sections[i]->StochasticDeflection(particle_energy, energy_loss.first); + // // calculate produced particles, get an empty list if no particles + // // are produced in interaction + // products = cross_sections[i]->CalculateProducedParticles(particle_energy, energy_loss.first, particle_.GetDirection()); + // } + // } + + // auto pnew = vP.AddSecondary(tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, + // geometry::Point, units::si::TimeType> + // { + // process::sibyll::ConvertFromSibyll(psib.GetPID()), + // Plab.GetTimeLikeComponent(), + // Plab.GetSpaceLikeComponents(), + // pOrig, + // tOrig + // } + // ); + + // // position and time of interaction, not used in PROPOSAL + // Point pOrig = vP.GetPosition(); + // TimeType tOrig = vP.GetTime(); + + // // add to corsika stack + // auto pnew = vP.AddSecondary(tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, + // geometry::Point, units::si::TimeType> + // { + // process::sibyll::ConvertFromSibyll(psib.GetPID()), + // energy_lost, + // Plab.GetTimeLikeComponent(), + // Plab.GetSpaceLikeComponents(), + // pOrig, + // tOrig + // } + // ); + + return process::EProcessReturn::eOk; +} } // corsika::process::proposal diff --git a/Processes/Proposal/Interaction.h b/Processes/Proposal/Interaction.h index ed3fd2e57e0f0af804c4f5327c60d2e41ce7c5d4..a574e1eb147084cc3caed0e6bf2bf6f1436ebcc3 100644 --- a/Processes/Proposal/Interaction.h +++ b/Processes/Proposal/Interaction.h @@ -16,6 +16,9 @@ #include <corsika/process/InteractionProcess.h> #include <corsika/environment/Environment.h> #include <corsika/process/particle_cut/ParticleCut.h> +#include <corsika/random/UniformRealDistribution.h> +#include <corsika/random/RNGManager.h> +#include <random> using namespace corsika::environment; using namespace corsika::process::particle_cut; @@ -28,17 +31,27 @@ namespace corsika::process::proposal { private: TEnvironment const& fEnvironment; ParticleCut const& pCut; + // Initializing of uniform_real_distribution class + // double min{0.0}; + // double max{1.0}; + // std::uniform_real_distribution<double> rnd_uniform(min,max); + + std::map<particles::Code, std::unique_ptr<PROPOSAL::UtilityInterpolantInteraction>> corsika_particle_to_utility_map; + std::map<particles::Code, std::unique_ptr<PROPOSAL::UtilityInterpolantDisplacement>> corsika_particle_to_displacement_map; + + corsika::random::RNG& fRNG = corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm"); + public: Interaction(TEnvironment const& env, ParticleCut const& cut); // ~Interaction; - // template <typename Particle> - // corsika::process::EProcessReturn DoInteraction(Particle&); + template <typename Particle> + corsika::process::EProcessReturn DoInteraction(Particle&); - // template <typename TParticle> - // corsika::units::si::GrammageType GetInteractionLength(TParticle& p); + template <typename TParticle> + corsika::units::si::GrammageType GetInteractionLength(TParticle& p); };