diff --git a/Documentation/Examples/CMakeLists.txt b/Documentation/Examples/CMakeLists.txt index 237e7a0b218718a34373fa3f503c12a5486e53f3..7faa2f4344e0f4b1c21b5000adbd395ff51ad246 100644 --- a/Documentation/Examples/CMakeLists.txt +++ b/Documentation/Examples/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable (staticsequence_example staticsequence_example.cc) target_link_libraries (staticsequence_example CORSIKAprocesssequence CORSIKAunits + CORSIKAgeometry CORSIKAlogging) install (TARGETS staticsequence_example DESTINATION share/examples) diff --git a/Documentation/Examples/staticsequence_example.cc b/Documentation/Examples/staticsequence_example.cc index 8049983f767a5ea28544f83cda9bffc84a35d95a..9a29d6f76ff8ae4e5a1b85a887575d5c2a42a40e 100644 --- a/Documentation/Examples/staticsequence_example.cc +++ b/Documentation/Examples/staticsequence_example.cc @@ -15,6 +15,11 @@ #include <corsika/process/ProcessSequence.h> +#include <corsika/setup/SetupTrajectory.h> // TODO: try to break this dependence later +using corsika::setup::Trajectory; +#include <corsika/units/PhysicalUnits.h> // dito +using namespace corsika::units::si; + using namespace std; using namespace corsika::process; @@ -72,7 +77,6 @@ struct DummyData { double p[10]; }; struct DummyStack {}; -struct DummyTrajectory {}; void modular() { @@ -84,9 +88,14 @@ void modular() { const auto sequence = m1 + m2 + m3 + m4; DummyData p; - DummyTrajectory t; DummyStack s; + auto const root = corsika::geometry::CoordinateSystem::CreateRootCS(); + corsika::geometry::Point pos(root, {0_m, 0_m, 0_m}); + corsika::geometry::Vector<SpeedType::dimension_type> vec(root, {1_m/1_s,0_m/1_s,0_m/1_s}); + corsika::geometry::Line traj(pos, vec); + Trajectory t(corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 0_s, 100_ns)); + const int n = 100000000; for (int i = 0; i < n; ++i) { sequence.DoContinuous(p, t, s); } diff --git a/Framework/Cascade/CMakeLists.txt b/Framework/Cascade/CMakeLists.txt index 5dbb843bc79e6b181e47489f331490bb87c495a6..2d67e8019d7df7a98b1cf465f652712519d23246 100644 --- a/Framework/Cascade/CMakeLists.txt +++ b/Framework/Cascade/CMakeLists.txt @@ -9,10 +9,12 @@ set ( set ( CORSIKAcascade_HEADERS Cascade.h + #TrackingStep.h ) #set ( # CORSIKAcascade_SOURCES +# TrackingStep.cc # Cascade.cc # ) diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index 0e920cc4bb6e2fa1eb5e25378848ab57c8d8a0a7..6beee09cffbc1dacd1daa6bb5ab0c03effb80968 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -9,19 +9,21 @@ * the license. */ -#ifndef _include_Cascade_h_ -#define _include_Cascade_h_ +#ifndef _include_corsika_cascade_Cascade_h_ +#define _include_corsika_cascade_Cascade_h_ #include <corsika/process/ProcessReturn.h> #include <corsika/units/PhysicalUnits.h> +#include <type_traits> + #include <corsika/setup/SetupTrajectory.h> using namespace corsika::units::si; namespace corsika::cascade { - template <typename ProcessList, typename Stack> //, typename Trajectory> + template <typename Tracking, typename ProcessList, typename Stack> class Cascade { typedef typename Stack::ParticleType Particle; @@ -29,32 +31,26 @@ namespace corsika::cascade { Cascade() = delete; public: - Cascade(ProcessList& pl, Stack& stack) - : fProcesseList(pl) - , fStack(stack) {} + Cascade(Tracking& tr, ProcessList& pl, Stack& stack) + : fTracking(tr) + , fProcesseList(pl) + , fStack(stack) { + // static_assert(std::is_member_function_pointer<decltype(&ProcessList::DoDiscrete)>::value, + //"ProcessList has not function DoDiscrete."); + // static_assert(std::is_member_function_pointer<decltype(&ProcessList::DoContinuous)>::value, + // "ProcessList has not function DoContinuous."); + } void Init() { - fStack.Init(); + fTracking.Init(); fProcesseList.Init(); + fStack.Init(); } void Run() { while (!fStack.IsEmpty()) { while (!fStack.IsEmpty()) { Particle& pNext = *fStack.GetNextParticle(); - /* - EnergyType Emin; - typename Stack::StackIterator pNext(fStack, 0); - bool first = true; - for (typename Stack::StackIterator ip = fStack.begin(); ip != fStack.end(); - ++ip) { - if (first || ip.GetEnergy() < Emin) { - first = false; - pNext = ip; - Emin = pMin.GetEnergy(); - } - } - */ Step(pNext); } // do cascade equations, which can put new particles on Stack, @@ -62,27 +58,33 @@ namespace corsika::cascade { // DoCascadeEquations(); // } } - + 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); + 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); corsika::process::EProcessReturn status = - fProcesseList.DoContinuous(particle, trajectory, fStack); + fProcesseList.DoContinuous(particle, step, fStack); if (status == corsika::process::EProcessReturn::eParticleAbsorbed) { - fStack.Delete(particle); + fStack.Delete(particle); // TODO: check if this is really needed } else { fProcesseList.DoDiscrete(particle, fStack); } } - + private: + Tracking& fTracking; ProcessList& fProcesseList; Stack& fStack; }; diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc index edb825bc78e70961920dcba98c28b1de1d02d337..3ade39483a7e00305d0ea0817e6eff1ef2a7557c 100644 --- a/Framework/Cascade/testCascade.cc +++ b/Framework/Cascade/testCascade.cc @@ -15,6 +15,7 @@ #include <corsika/setup/SetupStack.h> #include <corsika/setup/SetupTrajectory.h> +using corsika::setup::Trajectory; #define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one // cpp file @@ -34,11 +35,11 @@ public: ProcessSplit() {} template <typename Particle> - double MinStepLength(Particle&) const { - return 0; + void MinStepLength(Particle&, Trajectory& ) const { + //return 0; } - template <typename Particle, typename Trajectory, typename Stack> + template <typename Particle, typename Stack> EProcessReturn DoContinuous(Particle&, Trajectory&, Stack&) const { // corsika::utls::ignore(p); return EProcessReturn::eOk; @@ -58,19 +59,34 @@ public: void Init() { fCount = 0; } - int GetCount() { return fCount; } + int GetCount() const { return fCount; } private: }; +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::Line traj(p.GetPosition(), v); + return corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 0_s, 100_ns); + } +}; + + TEST_CASE("Cascade", "[Cascade]") { - stack_inspector::StackInspector<setup::Stack, setup::Trajectory> p0(true); + NewtonTracking<setup::Stack> tracking; + + stack_inspector::StackInspector<setup::Stack> p0(true); ProcessSplit p1; const auto sequence = p0 + p1; setup::Stack stack; - corsika::cascade::Cascade EAS(sequence, stack); + corsika::cascade::Cascade EAS(tracking, sequence, stack); stack.Clear(); auto particle = stack.NewParticle(); diff --git a/Framework/Geometry/CMakeLists.txt b/Framework/Geometry/CMakeLists.txt index 580066ae0fbe9e9f6c79c3980dd6a17bfc9c1fd9..78f0dee42ac7ad46ae718f974ca9758d8b301c7d 100644 --- a/Framework/Geometry/CMakeLists.txt +++ b/Framework/Geometry/CMakeLists.txt @@ -15,7 +15,7 @@ set ( BaseVector.h QuantityVector.h Trajectory.h - BaseTrajectory.h + # BaseTrajectory.h ) set ( diff --git a/Framework/Geometry/Helix.h b/Framework/Geometry/Helix.h index b647688d45c012d5188dd5a8a6147eabdca75ffc..8eb215820097fae23eef0e535631384d31db01c4 100644 --- a/Framework/Geometry/Helix.h +++ b/Framework/Geometry/Helix.h @@ -31,7 +31,7 @@ namespace corsika::geometry { */ class Helix { - + using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; Point const r0; @@ -58,8 +58,8 @@ namespace corsika::geometry { auto GetRadius() const { return radius; } - LengthType DistanceBetween(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const { + LengthType GetDistanceBetween(corsika::units::si::TimeType t1, + corsika::units::si::TimeType t2) const { return (vPar + vPerp).norm() * (t2 - t1); } }; diff --git a/Framework/Geometry/Line.h b/Framework/Geometry/Line.h index 829c16044a274785f838f4975f78af4c42354744..5de0ca9cf2befca18250edcf8e8c9d3b922d0001 100644 --- a/Framework/Geometry/Line.h +++ b/Framework/Geometry/Line.h @@ -34,9 +34,9 @@ namespace corsika::geometry { return r0 + v0 * t; } - LengthType DistanceBetween(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const { - assert(t2 >= t1); + LengthType GetDistanceBetween(corsika::units::si::TimeType t1, + corsika::units::si::TimeType t2) const { + // assert(t2 >= t1); return v0.norm() * (t2 - t1); } }; diff --git a/Framework/Geometry/Trajectory.h b/Framework/Geometry/Trajectory.h index 97adfdd3bba6a4c449316b37fec428d77060c8db..66e77a474867f9d648f76aff131dc98f008f44eb 100644 --- a/Framework/Geometry/Trajectory.h +++ b/Framework/Geometry/Trajectory.h @@ -12,37 +12,43 @@ #ifndef _include_TRAJECTORY_H #define _include_TRAJECTORY_H -#include <corsika/geometry/BaseTrajectory.h> +//#include <corsika/geometry/BaseTrajectory.h> #include <corsika/units/PhysicalUnits.h> namespace corsika::geometry { template <typename T> - class Trajectory : public BaseTrajectory { + class Trajectory : public T { // BaseTrajectory { - T fTraj; + // T fTraj; + corsika::units::si::TimeType fTStart, fTEnd; public: + using T::GetPosition; + using T::GetDistanceBetween; + Trajectory(T const& theT, corsika::units::si::TimeType pTStart, corsika::units::si::TimeType pTEnd) - //: T(theT), fTStart(pTStart), fTEnd(pTEnd) {} - : BaseTrajectory(pTStart, pTEnd) - , fTraj(theT) {} + : T(theT) + , fTStart(pTStart) + , fTEnd(pTEnd) {} + //: BaseTrajectory(pTStart, pTEnd) + // , fTraj(theT) {} - Point GetPosition(corsika::units::si::TimeType t) const { + /*Point GetPosition(corsika::units::si::TimeType t) const { return fTraj.GetPosition(t + fTStart); - } + }*/ Point GetPosition(double u) const { - return GetPosition(fTEnd * u + fTStart * (1 - u)); + return T::GetPosition(fTEnd * u + fTStart * (1 - u)); } - + + /* LengthType GetDistance(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const { + corsika::units::si::TimeType t2) const { return fTraj.DistanceBetween(t1, t2); } - - + */ }; } // namespace corsika::geometry diff --git a/Framework/Geometry/testGeometry.cc b/Framework/Geometry/testGeometry.cc index 742938ffec44f3e65054313634f8c246c33f40e2..274ec7d5d7e09b87a0d8aa1fca04550de9ee9edd 100644 --- a/Framework/Geometry/testGeometry.cc +++ b/Framework/Geometry/testGeometry.cc @@ -154,7 +154,7 @@ TEST_CASE("Trajectories") { CHECK(line.GetPosition(2_s).GetCoordinates() == base.GetPosition(2_s).GetCoordinates()); - CHECK(base.GetDistance(1_s, 2_s) / 1_m == Approx(1)); + CHECK(base.GetDistanceBetween(1_s, 2_s) / 1_m == Approx(1)); } SECTION("Helix") { @@ -182,6 +182,6 @@ TEST_CASE("Trajectories") { CHECK(helix.GetPosition(1234_s).GetCoordinates() == base.GetPosition(1234_s).GetCoordinates()); - CHECK(base.GetDistance(1_s, 2_s) / 1_m == Approx(5)); + CHECK(base.GetDistanceBetween(1_s, 2_s) / 1_m == Approx(5)); } } diff --git a/Framework/ProcessSequence/CMakeLists.txt b/Framework/ProcessSequence/CMakeLists.txt index c24567821d938b68fa27e9f2a7be29eec33bb295..9e95f0c8159a5bee17ce21ec138970f3c1928e94 100644 --- a/Framework/ProcessSequence/CMakeLists.txt +++ b/Framework/ProcessSequence/CMakeLists.txt @@ -42,6 +42,7 @@ add_executable ( target_link_libraries ( testProcessSequence + CORSIKAgeometry CORSIKAprocesssequence CORSIKAthirdparty # for catch2 ) diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h index 4188fb0aa56e9ff8735560cde5b9121a91dce22f..6c1cdf3bb3dda42498bf8ec9c17ece45bc09b94e 100644 --- a/Framework/ProcessSequence/ProcessSequence.h +++ b/Framework/ProcessSequence/ProcessSequence.h @@ -17,8 +17,12 @@ #include <corsika/process/DiscreteProcess.h> #include <corsika/process/ProcessReturn.h> +#include <corsika/setup/SetupTrajectory.h> + //#include <type_traits> // still needed ? +using corsika::setup::Trajectory; + namespace corsika::process { /* namespace detail { */ @@ -143,7 +147,7 @@ namespace corsika::process { // example for a trait-based call: // void Hello() const { detail::CallHello<T1,T2>::Call(A, B); } - template <typename Particle, typename Trajectory, typename Stack> + template <typename Particle, typename Stack> inline EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const { EProcessReturn ret = EProcessReturn::eOk; if constexpr (!std::is_base_of<DiscreteProcess<T1>, T1>::value) { @@ -155,9 +159,10 @@ namespace corsika::process { return ret; } - template <typename D> - inline double MinStepLength(D& d) const { - return std::min(A.MinStepLength(d), B.MinStepLength(d)); + template <typename Particle> + inline void MinStepLength(Particle& p, Trajectory& step) const { + A.MinStepLength(p, step); + B.MinStepLength(p, step); } /* diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/Framework/ProcessSequence/testProcessSequence.cc index 2d4b46b15f11a8d9b396bf24e0073bdc2cdbb147..5e76808331194a25f5df18fcb29257898d6322aa 100644 --- a/Framework/ProcessSequence/testProcessSequence.cc +++ b/Framework/ProcessSequence/testProcessSequence.cc @@ -19,17 +19,26 @@ #include <corsika/process/ProcessSequence.h> +#include <corsika/setup/SetupTrajectory.h> // TODO: maybe try to break this dependency later! +using corsika::setup::Trajectory; +#include <corsika/units/PhysicalUnits.h> +using namespace corsika::units::si; + using namespace std; using namespace corsika::process; + +static const int nData = 10; + + class ContinuousProcess1 : public ContinuousProcess<ContinuousProcess1> { public: ContinuousProcess1() {} void Init() { cout << "ContinuousProcess1::Init" << endl; } - template <typename D, typename T, typename S> - inline EProcessReturn DoContinuous(D& d, T&, S&) const { + template <typename D, typename S> + inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const { cout << "ContinuousProcess1::DoContinuous" << endl; - for (int i = 0; i < 10; ++i) d.p[i] += 0.933; + for (int i = 0; i < nData; ++i) d.p[i] += 0.933; return EProcessReturn::eOk; } @@ -44,10 +53,10 @@ class ContinuousProcess2 : public ContinuousProcess<ContinuousProcess2> { public: ContinuousProcess2() {} void Init() { cout << "ContinuousProcess2::Init" << endl; } - template <typename D, typename T, typename S> - inline EProcessReturn DoContinuous(D& d, T&, S&) const { + template <typename D, typename S> + inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const { cout << "ContinuousProcess2::DoContinuous" << endl; - for (int i = 0; i < 20; ++i) d.p[i] += 0.933; + for (int i = 0; i < nData; ++i) d.p[i] += 0.933; return EProcessReturn::eOk; } @@ -62,9 +71,9 @@ class Process1 : public DiscreteProcess<Process1> { public: Process1() {} void Init() { cout << "Process1::Init" << endl; } - template <typename D, typename T, typename S> - inline EProcessReturn DoContinuous(D& d, T&, S&) const { - for (int i = 0; i < 10; ++i) d.p[i] += 1 + i; + template <typename D, typename S> + inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const { + for (int i = 0; i < nData; ++i) d.p[i] += 1 + i; return EProcessReturn::eOk; } template <typename Particle, typename Stack> @@ -78,9 +87,9 @@ class Process2 : public DiscreteProcess<Process2> { public: Process2() {} void Init() { cout << "Process2::Init" << endl; } - template <typename D, typename T, typename S> - inline EProcessReturn DoContinuous(D& d, T&, S&) const { - for (int i = 0; i < 10; ++i) d.p[i] *= 0.7; + template <typename D, typename S> + inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const { + for (int i = 0; i < nData; ++i) d.p[i] *= 0.7; return EProcessReturn::eOk; } template <typename Particle, typename Stack> @@ -94,9 +103,9 @@ class Process3 : public DiscreteProcess<Process3> { public: Process3() {} void Init() { cout << "Process3::Init" << endl; } - template <typename D, typename T, typename S> - inline EProcessReturn DoContinuous(D& d, T&, S&) const { - for (int i = 0; i < 10; ++i) d.p[i] += 0.933; + template <typename D, typename S> + inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const { + for (int i = 0; i < nData; ++i) d.p[i] += 0.933; return EProcessReturn::eOk; } template <typename Particle, typename Stack> @@ -110,9 +119,9 @@ class Process4 : public BaseProcess<Process4> { public: Process4() {} void Init() { cout << "Process4::Init" << endl; } - template <typename D, typename T, typename S> - inline EProcessReturn DoContinuous(D& d, T&, S&) const { - for (int i = 0; i < 10; ++i) d.p[i] /= 1.2; + template <typename D, typename S> + inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const { + for (int i = 0; i < nData; ++i) d.p[i] /= 1.2; return EProcessReturn::eOk; } // inline double MinStepLength(D& d) { @@ -120,10 +129,9 @@ public: }; struct DummyData { - double p[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + double p[nData] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; }; struct DummyStack {}; -struct DummyTrajectory {}; TEST_CASE("Cascade", "[Cascade]") { @@ -142,12 +150,18 @@ TEST_CASE("Cascade", "[Cascade]") { const auto sequence2 = cp1 + m2 + m3 + cp2; DummyData p; - DummyTrajectory t; DummyStack s; - + cout << "-->init" << endl; sequence2.Init(); cout << "-->docont" << endl; + + //auto const root = corsika::geometry::CoordinateSystem::CreateRootCS(); + //corsika::geometry::Point pos(root, {0_m, 0_m, 0_m}); + //corsika::geometry::Vector<SpeedType::dimension_type> vec(root, {1_m/1_s,0_m/1_s,0_m/1_s}); + //corsika::geometry::Line traj(pos, vec); + Trajectory t;//(corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 0_s, 100_ns)); + sequence2.DoContinuous(p, t, s); cout << "-->dodisc" << endl; sequence2.DoDiscrete(p, s); @@ -155,11 +169,11 @@ TEST_CASE("Cascade", "[Cascade]") { sequence.Init(); - const int n = 100; - cout << "Running loop with n=" << n << endl; - for (int i = 0; i < n; ++i) { sequence.DoContinuous(p, t, s); } - - for (int i = 0; i < 10; i++) { cout << "data[" << i << "]=" << p.p[i] << endl; } + const int nLoop = 5; + cout << "Running loop with n=" << nLoop << endl; + for (int i = 0; i < nLoop; ++i) { sequence.DoContinuous(p, t, s); } + for (int i = 0; i < nData; i++) { cout << "data[" << i << "]=" << p.p[i] << endl; } + cout << "done" << endl; } SECTION("sectionThree") {} diff --git a/Processes/StackInspector/StackInspector.cc b/Processes/StackInspector/StackInspector.cc index 17acb32548efcda7a38835263a6485489b0aecff..7480d12d0098a18edf459fa097eb97da81138ecd 100644 --- a/Processes/StackInspector/StackInspector.cc +++ b/Processes/StackInspector/StackInspector.cc @@ -14,6 +14,8 @@ #include <corsika/logging/Logger.h> +#include <corsika/setup/SetupTrajectory.h> + #include <iostream> using namespace std; @@ -21,18 +23,16 @@ using namespace corsika; using namespace corsika::units::si; using namespace corsika::process::stack_inspector; -template <typename Stack, typename Trajectory> -StackInspector<Stack, Trajectory>::StackInspector(const bool aReport) +template <typename Stack> +StackInspector<Stack>::StackInspector(const bool aReport) : fReport(aReport) {} -template <typename Stack, typename Trajectory> -StackInspector<Stack, Trajectory>::~StackInspector() {} - -template <typename Stack, typename Trajectory> -process::EProcessReturn StackInspector<Stack, Trajectory>::DoContinuous(Particle&, - Trajectory&, - Stack& s) const { +template <typename Stack> +StackInspector<Stack>::~StackInspector() {} +template <typename Stack> +process::EProcessReturn StackInspector<Stack>::DoContinuous( + Particle&, corsika::setup::Trajectory&, Stack& s) const { static int countStep = 0; if (!fReport) return EProcessReturn::eOk; [[maybe_unused]] int i = 0; @@ -40,22 +40,26 @@ process::EProcessReturn StackInspector<Stack, Trajectory>::DoContinuous(Particle for (auto& iterP : s) { EnergyType E = iterP.GetEnergy(); Etot += E; + cout << "i=" << setw(5) << fixed << (i++) + << ", id=" << setw(30) << iterP.GetPID() + << " E=" << setw(15) << scientific << (E / 1_GeV) << " GeV, " + //<< " pos=" << iterP.GetPosition() + << endl; } countStep++; cout << countStep << " " << s.GetSize() << " " << Etot / 1_GeV << " " << endl; return EProcessReturn::eOk; } -template <typename Stack, typename Trajectory> -double StackInspector<Stack, Trajectory>::MinStepLength(Particle&) const { - return 0; +template <typename Stack> +void StackInspector<Stack>::MinStepLength(Particle&, + corsika::setup::Trajectory&) const { + // return 0; } -template <typename Stack, typename Trajectory> -void StackInspector<Stack, Trajectory>::Init() {} +template <typename Stack> +void StackInspector<Stack>::Init() {} #include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -template class corsika::process::stack_inspector::StackInspector<setup::Stack, - setup::Trajectory>; +template class corsika::process::stack_inspector::StackInspector<setup::Stack>; diff --git a/Processes/StackInspector/StackInspector.h b/Processes/StackInspector/StackInspector.h index 118c06d36a562dc8ed703ebca0eb6ffb3489a5ec..9d8d14f65d980d359f905aa3f1c3bc570c0aa52f 100644 --- a/Processes/StackInspector/StackInspector.h +++ b/Processes/StackInspector/StackInspector.h @@ -14,13 +14,19 @@ #include <corsika/process/ContinuousProcess.h> +#include <corsika/setup/SetupTrajectory.h> + +//namespace corsika::setup { +//class BaseTrajectory; +//} + namespace corsika::process { namespace stack_inspector { - template <typename Stack, typename Trajectory> + template <typename Stack> class StackInspector - : public corsika::process::ContinuousProcess<StackInspector<Stack, Trajectory>> { + : public corsika::process::ContinuousProcess<StackInspector<Stack>> { typedef typename Stack::ParticleType Particle; @@ -31,10 +37,10 @@ namespace corsika::process { void Init(); // template <typename Particle, typename Trajectory, typename Stack> - EProcessReturn DoContinuous(Particle&, Trajectory&, Stack& s) const; + EProcessReturn DoContinuous(Particle&, corsika::setup::Trajectory&, Stack& s) const; - // template <typename Particle> - double MinStepLength(Particle&) const; + // template <typename Particle> + void MinStepLength(Particle&, corsika::setup::Trajectory&) const; private: bool fReport; diff --git a/Setup/SetupTrajectory.h b/Setup/SetupTrajectory.h index d7f5c482d207ea04cfae1365ed7f11af13541f7f..2950929c0304915dea6856e1885937243b49f62a 100644 --- a/Setup/SetupTrajectory.h +++ b/Setup/SetupTrajectory.h @@ -12,12 +12,22 @@ #ifndef _corsika_setup_setuptrajectory_h_ #define _corsika_setup_setuptrajectory_h_ +#include <corsika/geometry/Helix.h> #include <corsika/geometry/Line.h> #include <corsika/geometry/Trajectory.h> +#include <variant> + namespace corsika::setup { - typedef corsika::geometry::Trajectory<corsika::geometry::Line> Trajectory; -} + using corsika::geometry::Helix; + using corsika::geometry::Line; + + typedef std::variant<std::monostate, + corsika::geometry::Trajectory<Line>, + corsika::geometry::Trajectory<Helix>> + Trajectory; + +} // namespace corsika::setup #endif diff --git a/Stack/SuperStupidStack/SuperStupidStack.h b/Stack/SuperStupidStack/SuperStupidStack.h index 816a8c5ba6dd662c99b464405cf4ce6178c7c58c..fa6bf4e208d1069966cebb25c71c60a43fcf8e28 100644 --- a/Stack/SuperStupidStack/SuperStupidStack.h +++ b/Stack/SuperStupidStack/SuperStupidStack.h @@ -30,6 +30,7 @@ namespace corsika::stack { using corsika::particles::Code; using corsika::units::si::EnergyType; using corsika::units::si::TimeType; + using corsika::units::si::SpeedType; using corsika::units::si::second; using corsika::units::si::meter; using corsika::units::si::joule; @@ -62,6 +63,12 @@ namespace corsika::stack { MomentumVector GetMomentum() const { return GetStackData().GetMomentum(GetIndex()); } Point GetPosition() const { return GetStackData().GetPosition(GetIndex()); } TimeType GetTime() const { return GetStackData().GetTime(GetIndex()); } + +#warning this does not really work, nor make sense: + Vector<SpeedType::dimension_type> GetDirection() const { + auto P = GetMomentum(); + return P/P.norm() * (corsika::units::si::meter/corsika::units::si::second); } + }; /**