From b12a7b73dd9cf9a849c8fdee06ded1a90325b365 Mon Sep 17 00:00:00 2001 From: ralfulrich <ralf.ulrich@kit.edu> Date: Sun, 2 Dec 2018 22:36:17 +0100 Subject: [PATCH] first moving particles in corsika --- Framework/Cascade/Cascade.h | 18 +++------- Framework/Cascade/testCascade.cc | 38 ++++++++++++++++----- Framework/Geometry/Trajectory.h | 36 +++++++++---------- Framework/Geometry/testGeometry.cc | 4 +-- Framework/ProcessSequence/ProcessSequence.h | 2 ++ Processes/StackInspector/StackInspector.cc | 2 +- Setup/SetupTrajectory.h | 33 ++++++++++++++++-- Stack/SuperStupidStack/SuperStupidStack.h | 2 +- 8 files changed, 89 insertions(+), 46 deletions(-) diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index 6beee09c..c97e3376 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -60,20 +60,12 @@ namespace corsika::cascade { } void Step(Particle& particle) { - /* - [[maybe_unused]] double nextStep = fProcesseList.MinStepLength(particle); - // corsika::utls::ignore(nextStep); - auto const root = corsika::geometry::CoordinateSystem::CreateRootCS(); - corsika::geometry::Trajectory<corsika::geometry::Line> - trajectory( // trajectory is not yet used. this is a dummy. - corsika::geometry::Line(corsika::geometry::Point(root, {0_m, 0_m, - 0_m}), corsika::geometry::Vector<corsika::units::si::SpeedType::dimension_type>( - root, 0 * 1_m / second, 0 * 1_m / second, 1 * 1_m / second)), - 0_s, 1_s); - */ - // //[[maybe_unused]] double nextStep = fProcesseList.MinStepLength(particle); corsika::setup::Trajectory step = fTracking.GetTrack(particle); - fProcesseList.MinStepLength(particle, step); + fProcesseList.MinStepLength(particle, step); + + /// here the particle is actually moved along the trajectory to new position: + std::visit(corsika::setup::ParticleUpdate<Particle>{particle}, step); + corsika::process::EProcessReturn status = fProcesseList.DoContinuous(particle, step, fStack); if (status == corsika::process::EProcessReturn::eParticleAbsorbed) { diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc index 6d6258d2..0cb36f52 100644 --- a/Framework/Cascade/testCascade.cc +++ b/Framework/Cascade/testCascade.cc @@ -10,9 +10,15 @@ */ #include <corsika/cascade/Cascade.h> + #include <corsika/process/ProcessSequence.h> #include <corsika/process/stack_inspector/StackInspector.h> +#include <corsika/stack/super_stupid/SuperStupidStack.h> + +#include <corsika/geometry/Point.h> +#include <corsika/geometry/Vector.h> + #include <corsika/setup/SetupStack.h> #include <corsika/setup/SetupTrajectory.h> using corsika::setup::Trajectory; @@ -24,6 +30,7 @@ using corsika::setup::Trajectory; using namespace corsika; using namespace corsika::process; using namespace corsika::units; +using namespace corsika::geometry; #include <iostream> using namespace std; @@ -35,11 +42,10 @@ public: ProcessSplit() {} template <typename Particle> - void MinStepLength(Particle&, Trajectory& ) const { - } + void MinStepLength(Particle&, setup::Trajectory&) const {} template <typename Particle, typename Stack> - EProcessReturn DoContinuous(Particle&, Trajectory&, Stack&) const { + EProcessReturn DoContinuous(Particle&, setup::Trajectory&, Stack&) const { return EProcessReturn::eOk; } @@ -51,7 +57,11 @@ public: fCount++; } else { p.SetEnergy(E / 2); - s.NewParticle().SetEnergy(E / 2); + auto pnew = s.NewParticle(); + // s.Copy(p, pnew); + pnew.SetEnergy(E / 2); + pnew.SetPosition(p.GetPosition()); + pnew.SetMomentum(p.GetMomentum()); } } @@ -62,23 +72,28 @@ public: private: }; -template<typename Stack> +template <typename Stack> class NewtonTracking { // naja.. not yet typedef typename Stack::ParticleType Particle; + public: void Init() {} corsika::setup::Trajectory GetTrack(Particle& p) { - corsika::geometry::Vector<SpeedType::dimension_type> v = p.GetDirection();// * 1_m/1_s; + corsika::geometry::Vector<SpeedType::dimension_type> v = + p.GetDirection(); corsika::geometry::Line traj(p.GetPosition(), v); - return corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 0_s, 100_ns); + { + CoordinateSystem& rootCS = RootCoordinateSystem::GetInstance().GetRootCS(); + cout << v.GetComponents(rootCS) << endl; + } + return corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 100_ns); } }; - TEST_CASE("Cascade", "[Cascade]") { NewtonTracking<setup::Stack> tracking; - + stack_inspector::StackInspector<setup::Stack> p0(true); ProcessSplit p1; const auto sequence = p0 + p1; @@ -86,10 +101,15 @@ TEST_CASE("Cascade", "[Cascade]") { corsika::cascade::Cascade EAS(tracking, sequence, stack); + CoordinateSystem& rootCS = RootCoordinateSystem::GetInstance().GetRootCS(); + stack.Clear(); auto particle = stack.NewParticle(); EnergyType E0 = 100_GeV; particle.SetEnergy(E0); + particle.SetPosition(Point(rootCS, {0_m, 0_m, 10_km})); + particle.SetMomentum( + corsika::stack::super_stupid::MomentumVector(rootCS, {0_GeV, 0_GeV, -1_MeV})); EAS.Init(); EAS.Run(); diff --git a/Framework/Geometry/Trajectory.h b/Framework/Geometry/Trajectory.h index 66e77a47..99b02b37 100644 --- a/Framework/Geometry/Trajectory.h +++ b/Framework/Geometry/Trajectory.h @@ -12,43 +12,43 @@ #ifndef _include_TRAJECTORY_H #define _include_TRAJECTORY_H -//#include <corsika/geometry/BaseTrajectory.h> #include <corsika/units/PhysicalUnits.h> +using corsika::units::si::LengthType; +using corsika::units::si::TimeType; + namespace corsika::geometry { template <typename T> - class Trajectory : public T { // BaseTrajectory { + class Trajectory : public T { - // T fTraj; - corsika::units::si::TimeType fTStart, fTEnd; + corsika::units::si::TimeType fTimeLength; public: using T::GetPosition; using T::GetDistanceBetween; - Trajectory(T const& theT, corsika::units::si::TimeType pTStart, - corsika::units::si::TimeType pTEnd) + Trajectory(T const& theT, + corsika::units::si::TimeType timeLength) : T(theT) - , fTStart(pTStart) - , fTEnd(pTEnd) {} - //: BaseTrajectory(pTStart, pTEnd) - // , fTraj(theT) {} + , fTimeLength(timeLength) {} /*Point GetPosition(corsika::units::si::TimeType t) const { return fTraj.GetPosition(t + fTStart); }*/ - - Point GetPosition(double u) const { - return T::GetPosition(fTEnd * u + fTStart * (1 - u)); + + Point GetPosition(const double u) const { + return T::GetPosition(fTimeLength * u); } - /* - LengthType GetDistance(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const { - return fTraj.DistanceBetween(t1, t2); + TimeType GetDuration() const { return fTimeLength; } + + LengthType GetDistance(const corsika::units::si::TimeType t) const { + assert(t>fTimeLength); + assert(t>=0*corsika::units::si::second); + return T::DistanceBetween(0, t); } - */ + }; } // namespace corsika::geometry diff --git a/Framework/Geometry/testGeometry.cc b/Framework/Geometry/testGeometry.cc index 874c2ce0..c582b2d6 100644 --- a/Framework/Geometry/testGeometry.cc +++ b/Framework/Geometry/testGeometry.cc @@ -152,7 +152,7 @@ TEST_CASE("Trajectories") { .norm() .magnitude() == Approx(0).margin(absMargin)); - Trajectory<Line> base(line, 0_s, 1_s); + Trajectory<Line> base(line, 1_s); CHECK(line.GetPosition(2_s).GetCoordinates() == base.GetPosition(2_s).GetCoordinates()); @@ -180,7 +180,7 @@ TEST_CASE("Trajectories") { .norm() .magnitude() == Approx(0).margin(absMargin)); - Trajectory<Helix> const base(helix, 0_s, 1_s); + Trajectory<Helix> const base(helix, 1_s); CHECK(helix.GetPosition(1234_s).GetCoordinates() == base.GetPosition(1234_s).GetCoordinates()); diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h index 6c1cdf3b..f4e4eb80 100644 --- a/Framework/ProcessSequence/ProcessSequence.h +++ b/Framework/ProcessSequence/ProcessSequence.h @@ -19,6 +19,8 @@ #include <corsika/setup/SetupTrajectory.h> +#include <variant> + //#include <type_traits> // still needed ? using corsika::setup::Trajectory; diff --git a/Processes/StackInspector/StackInspector.cc b/Processes/StackInspector/StackInspector.cc index 94abaff7..546b578b 100644 --- a/Processes/StackInspector/StackInspector.cc +++ b/Processes/StackInspector/StackInspector.cc @@ -46,7 +46,7 @@ process::EProcessReturn StackInspector<Stack>::DoContinuous( cout << "StackInspector: i=" << setw(5) << fixed << (i++) << ", id=" << setw(30) << iterP.GetPID() << " E=" << setw(15) << scientific << (E / 1_GeV) << " GeV, " - //<< " pos=" << pos + << " pos=" << pos << endl; } countStep++; diff --git a/Setup/SetupTrajectory.h b/Setup/SetupTrajectory.h index 2950929c..bad174c4 100644 --- a/Setup/SetupTrajectory.h +++ b/Setup/SetupTrajectory.h @@ -16,6 +16,8 @@ #include <corsika/geometry/Line.h> #include <corsika/geometry/Trajectory.h> +#include <corsika/units/PhysicalUnits.h> + #include <variant> namespace corsika::setup { @@ -23,11 +25,38 @@ namespace corsika::setup { using corsika::geometry::Helix; using corsika::geometry::Line; - typedef std::variant<std::monostate, - corsika::geometry::Trajectory<Line>, + /// definition of Trajectory base class, to be used in tracking and cascades + typedef std::variant<std::monostate, corsika::geometry::Trajectory<Line>, corsika::geometry::Trajectory<Helix>> Trajectory; + /// helper visitor to modify Particle by moving along Trajectory + template <typename Particle> + class ParticleUpdate { + + Particle& fP; + + public: + ParticleUpdate(Particle& p) + : fP(p) {} + void operator()(std::monostate const&) {} + + template <typename T> + void operator()(T const& trajectory) { + fP.SetPosition(trajectory.GetPosition(1)); + } + }; + + /// helper visitor to modify Particle by moving along Trajectory + class GetDuration { + public: + corsika::units::si::TimeType operator()(std::monostate const&) { return 0*corsika::units::si::second; } + template <typename T> + corsika::units::si::TimeType operator()(T const &trajectory) { + return trajectory.GetDuration(); + } + }; + } // namespace corsika::setup #endif diff --git a/Stack/SuperStupidStack/SuperStupidStack.h b/Stack/SuperStupidStack/SuperStupidStack.h index 27e97f4a..c157a6f6 100644 --- a/Stack/SuperStupidStack/SuperStupidStack.h +++ b/Stack/SuperStupidStack/SuperStupidStack.h @@ -69,7 +69,7 @@ namespace corsika::stack { #warning this does not really work, nor make sense: Vector<SpeedType::dimension_type> GetDirection() const { auto P = GetMomentum(); - return P/P.norm() * (units::si::meter/units::si::second); } + return P/P.norm() * 1e10 * (units::si::meter/units::si::second); } }; -- GitLab