From 5fa92278ac074ce1cde5335f62dc67d9b677ce97 Mon Sep 17 00:00:00 2001 From: Maximilian Reininghaus <maximilian.reininghaus@tu-dortmund.de> Date: Wed, 1 Apr 2020 15:05:30 +0200 Subject: [PATCH] alternate_ as member variable --- Processes/QGSJetII/Interaction.cc | 149 ++++++++++++++++-------------- Processes/QGSJetII/Interaction.h | 4 +- 2 files changed, 82 insertions(+), 71 deletions(-) diff --git a/Processes/QGSJetII/Interaction.cc b/Processes/QGSJetII/Interaction.cc index 92288e76c..17329a2fe 100644 --- a/Processes/QGSJetII/Interaction.cc +++ b/Processes/QGSJetII/Interaction.cc @@ -12,9 +12,8 @@ #include <corsika/environment/Environment.h> #include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/QuantityVector.h> #include <corsika/geometry/FourVector.h> -#include <corsika/process/qgsjetII/ParticleConversion.h> +#include <corsika/geometry/QuantityVector.h> #include <corsika/process/qgsjetII/QGSJetIIFragmentsStack.h> #include <corsika/process/qgsjetII/QGSJetIIStack.h> #include <corsika/process/qgsjetII/qgsjet-II-04.h> @@ -215,13 +214,15 @@ namespace corsika::process::qgsjetII { if (particles::IsNucleus(corsikaBeamId)) beamA = vP.GetNuclearA(); const HEPEnergyType projectileEnergyLabPerNucleon = - particles::IsNucleus(corsikaBeamId) ? projectileEnergyLab/beamA : projectileEnergyLab; - + particles::IsNucleus(corsikaBeamId) ? projectileEnergyLab / beamA + : projectileEnergyLab; + cout << "Interaction: ebeam lab: " << projectileEnergyLab / 1_GeV << endl << "Interaction: pbeam lab: " << projectileMomentumLab.GetComponents() / 1_GeV << endl; cout << "Interaction: etarget lab: " << targetEnergyLab / 1_GeV << endl - << "Interaction: ptarget lab: " << targetMomentumLab.GetComponents() / 1_GeV << endl; + << "Interaction: ptarget lab: " << targetMomentumLab.GetComponents() / 1_GeV + << endl; cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << endl; cout << "Interaction: time: " << tOrig << endl; @@ -248,7 +249,7 @@ namespace corsika::process::qgsjetII { cross_section_of_components[i] = sigProd; } - const auto targetCode = + const auto targetCode = mediumComposition.SampleTarget(cross_section_of_components, rng_); cout << "Interaction: target selected: " << targetCode << endl; @@ -268,22 +269,21 @@ namespace corsika::process::qgsjetII { throw std::runtime_error("QgsjetII target outside range."); // beam id for qgsjetII - std::uniform_real_distribution<double> select; - QgsjetIICode qgsjet_beam_code; - if (corsikaBeamId == particles::Code::Nucleus) { - if (select(rng_)>0.5) - qgsjet_beam_code = QgsjetIICode::Proton; - else - qgsjet_beam_code = QgsjetIICode::Neutron; - } else { // it is a nucleus + if (corsikaBeamId == particles::Code::Nucleus) { + std::array<QgsjetIICode, 2> constexpr nucleons = {QgsjetIICode::Proton, + QgsjetIICode::Neutron}; + std::uniform_int_distribution select(0, 1); + qgsjet_beam_code = nucleons[select(rng_)]; + } else { // it is an "elementary" particle qgsjet_beam_code = process::qgsjetII::ConvertToQgsjetII(corsikaBeamId); // from conex if (qgsjet_beam_code == QgsjetIICode::Pi0 or - qgsjet_beam_code == QgsjetIICode::Rho0) { // replace pi0 or rho0 with pi+/pi- in alternating sequence - static QgsjetIICode alternate = QgsjetIICode::PiPlus; - qgsjet_beam_code = alternate; - alternate = (alternate == QgsjetIICode::PiPlus ? QgsjetIICode::PiMinus : QgsjetIICode::PiPlus); + qgsjet_beam_code == QgsjetIICode::Rho0) { // replace pi0 or rho0 with pi+/pi- + // in alternating sequence + qgsjet_beam_code = alternate_; + alternate_ = (alternate_ == QgsjetIICode::PiPlus ? QgsjetIICode::PiMinus + : QgsjetIICode::PiPlus); } // replace lambda by neutron if (qgsjet_beam_code == QgsjetIICode::Lambda0) @@ -294,15 +294,17 @@ namespace corsika::process::qgsjetII { } int qgsjet_beam_code_int = static_cast<QgsjetIICodeIntType>(qgsjet_beam_code); - + cout << "Interaction: " << " DoInteraction: E(GeV):" << projectileEnergyLab / 1_GeV << endl; count_++; - qgini_(projectileEnergyLab / 1_GeV, qgsjet_beam_code_int, projQgsCode, targetQgsCode); + qgini_(projectileEnergyLab / 1_GeV, qgsjet_beam_code_int, projQgsCode, + targetQgsCode); // this is from CRMC, is this REALLY needed ??? - qgini_(projectileEnergyLab / 1_GeV, qgsjet_beam_code_int, projQgsCode, targetQgsCode); + qgini_(projectileEnergyLab / 1_GeV, qgsjet_beam_code_int, projQgsCode, + targetQgsCode); qgconf_(); - + // bookkeeping MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); HEPEnergyType Elab_final = 0_GeV; @@ -312,8 +314,8 @@ namespace corsika::process::qgsjetII { // CoM frame definition in QgsjetII projectile: +z auto const& originalCS = projectileMomentumLab.GetCoordinateSystem(); geometry::CoordinateSystem const zAxisFrame = - originalCS.RotateToZ(projectileMomentumLab); - + originalCS.RotateToZ(projectileMomentumLab); + // nuclear projectile fragments QGSJetIIFragmentsStack qfs; for (auto& fragm : qfs) { @@ -322,30 +324,31 @@ namespace corsika::process::qgsjetII { int Z = 0; switch (A) { case 1: { // proton/neutron - std::uniform_real_distribution<double> select; - if (select(rng_)>0.5) { - idFragm = particles::Code::Proton; - Z = 1; - } else { - idFragm = particles::Code::Neutron; - Z = 0; - } - - const HEPMassType projectileMass = particles::GetMass(idFragm); - - auto momentum = geometry::Vector( - zAxisFrame, - corsika::geometry::QuantityVector<hepmomentum_d>{0.0_GeV, 0.0_GeV, - sqrt((projectileEnergyLab + projectileMass) * - (projectileEnergyLab - projectileMass))}); - - auto const energy = sqrt(momentum.squaredNorm() + square(projectileMass)); - momentum.rebase(originalCS); // transform back into standard lab frame - std::cout << "secondary fragment> id=" << idFragm << " p=" << momentum.GetComponents() << std::endl; + std::uniform_real_distribution<double> select; + if (select(rng_) > 0.5) { + idFragm = particles::Code::Proton; + Z = 1; + } else { + idFragm = particles::Code::Neutron; + Z = 0; + } + + const HEPMassType projectileMass = particles::GetMass(idFragm); + + auto momentum = geometry::Vector( + zAxisFrame, corsika::geometry::QuantityVector<hepmomentum_d>{ + 0.0_GeV, 0.0_GeV, + sqrt((projectileEnergyLab + projectileMass) * + (projectileEnergyLab - projectileMass))}); + + auto const energy = sqrt(momentum.squaredNorm() + square(projectileMass)); + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" << idFragm + << " p=" << momentum.GetComponents() << std::endl; auto pnew = vP.AddSecondary( tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, - geometry::Point, units::si::TimeType>{ - idFragm, energy, momentum, pOrig, tOrig}); + geometry::Point, units::si::TimeType>{idFragm, energy, momentum, + pOrig, tOrig}); Plab_final += pnew.GetMomentum(); Elab_final += pnew.GetEnergy(); } break; @@ -365,22 +368,25 @@ namespace corsika::process::qgsjetII { } if (idFragm == particles::Code::Nucleus) { - const HEPMassType nucleusMass = particles::Proton::GetMass() * Z + particles::Neutron::GetMass() * (A-Z); - auto momentum = geometry::Vector( - zAxisFrame, - geometry::QuantityVector<hepmomentum_d>{0.0_GeV, 0.0_GeV, - sqrt((projectileEnergyLabPerNucleon*A + nucleusMass) * - (projectileEnergyLabPerNucleon*A - nucleusMass))}); - - auto const energy = sqrt(momentum.squaredNorm() + square(nucleusMass)); - momentum.rebase(originalCS); // transform back into standard lab frame - std::cout << "secondary fragment> id=" << idFragm << " p=" << momentum.GetComponents() << " A=" << A << " Z=" << Z << std::endl; - auto pnew = vP.AddSecondary( - tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, - geometry::Point, units::si::TimeType, unsigned short, unsigned short>{ - idFragm, energy, momentum, pOrig, tOrig, A, Z}); - Plab_final += pnew.GetMomentum(); - Elab_final += pnew.GetEnergy(); + const HEPMassType nucleusMass = + particles::Proton::GetMass() * Z + particles::Neutron::GetMass() * (A - Z); + auto momentum = geometry::Vector( + zAxisFrame, geometry::QuantityVector<hepmomentum_d>{ + 0.0_GeV, 0.0_GeV, + sqrt((projectileEnergyLabPerNucleon * A + nucleusMass) * + (projectileEnergyLabPerNucleon * A - nucleusMass))}); + + auto const energy = sqrt(momentum.squaredNorm() + square(nucleusMass)); + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" << idFragm + << " p=" << momentum.GetComponents() << " A=" << A << " Z=" << Z + << std::endl; + auto pnew = vP.AddSecondary( + tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, + geometry::Point, units::si::TimeType, unsigned short, unsigned short>{ + idFragm, energy, momentum, pOrig, tOrig, A, Z}); + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); } } @@ -391,14 +397,17 @@ namespace corsika::process::qgsjetII { auto momentum = psec.GetMomentum(zAxisFrame); auto const energy = psec.GetEnergy(); - momentum.rebase(originalCS); // transform back into standard lab frame - std::cout << "secondary fragment> id=" << process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()) << " p=" << momentum.GetComponents() << std::endl; - auto pnew = vP.AddSecondary( - tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, - geometry::Point, units::si::TimeType>{ - process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()), energy, momentum, pOrig, tOrig}); - Plab_final += pnew.GetMomentum(); - Elab_final += pnew.GetEnergy(); + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" + << process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()) + << " p=" << momentum.GetComponents() << std::endl; + auto pnew = vP.AddSecondary( + tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, + geometry::Point, units::si::TimeType>{ + process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()), energy, momentum, + pOrig, tOrig}); + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); } cout << "conservation (all GeV): Ecm_final= n/a" /* << Ecm_final / 1_GeV*/ << endl << "Elab_final=" << Elab_final / 1_GeV diff --git a/Processes/QGSJetII/Interaction.h b/Processes/QGSJetII/Interaction.h index 0b2804a23..d06a07843 100644 --- a/Processes/QGSJetII/Interaction.h +++ b/Processes/QGSJetII/Interaction.h @@ -13,6 +13,7 @@ #include <corsika/particles/ParticleProperties.h> #include <corsika/process/InteractionProcess.h> +#include <corsika/process/qgsjetII/ParticleConversion.h> #include <corsika/random/RNGManager.h> #include <corsika/units/PhysicalUnits.h> @@ -25,6 +26,7 @@ namespace corsika::process::qgsjetII { std::string data_path_; int count_ = 0; bool initialized_ = false; + QgsjetIICode alternate_ = QgsjetIICode::PiPlus; // for pi0, rho0 projectiles public: Interaction(const std::string& dataPath = ""); @@ -58,7 +60,7 @@ namespace corsika::process::qgsjetII { private: corsika::random::RNG& rng_ = corsika::random::RNGManager::GetInstance().GetRandomStream("qgran"); - const int maxMassNumber_ = 208; + static constexpr int maxMassNumber_ = 208; }; } // namespace corsika::process::qgsjetII -- GitLab