diff --git a/Documentation/Examples/staticsequence_example.cc b/Documentation/Examples/staticsequence_example.cc index a7db0b283dc17a2774cadc9aa6df9a6d57bb1b0f..e118961bcfcbef701ced00e8d69bce43e705d416 100644 --- a/Documentation/Examples/staticsequence_example.cc +++ b/Documentation/Examples/staticsequence_example.cc @@ -88,24 +88,8 @@ modular() DummyData p; DummyStack s; - -#warning Look here for this very strange effect. The next lines of unrelated code determine if the compiler complains, or the code crashes. In particular the line highligted! - - DummyTrajectory t; - geometry::CoordinateSystem& rootCS = geometry::RootCoordinateSystem::GetInstance().GetRootCS(); - corsika::geometry::Point pos(rootCS, 0_m, 0_m, 0_m); - corsika::geometry::Point pos2(rootCS, 0_m, 0_m, 0_m); - corsika::geometry::Point pos3(rootCS, 0_m, 0_m, 0_m); - corsika::geometry::Vector<units::si::speed_d> vec(rootCS, 1_m/1_s,0_m/1_s,0_m/1_s); // HIGHLIGHTED LINE - // SpeedType::dimension_type - //corsika::geometry::Line traj(pos, vec); - //Trajectory t;//(corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 100_ns)); - -#warning ------- unitl here ------ - - const int n = 1000; for (int i = 0; i < n; ++i) { sequence.DoContinuous(p, t, s); } diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index 64c6ae0da0e6be96adafb2f6c150df091e3551d0..148092081c4c610f02a6372ee033acc343ed106e 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -35,10 +35,6 @@ namespace corsika::cascade { : 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() { @@ -65,7 +61,8 @@ namespace corsika::cascade { /// here the particle is actually moved along the trajectory to new position: // std::visit(corsika::setup::ParticleUpdate<Particle>{particle}, step); - + particle.SetPosition(step.GetPosition(1)); + corsika::process::EProcessReturn status = fProcesseList.DoContinuous(particle, step, fStack); if (status == corsika::process::EProcessReturn::eParticleAbsorbed) { diff --git a/Framework/ProcessSequence/BaseProcess.h b/Framework/ProcessSequence/BaseProcess.h index 95373237051e34afd4a0b9364a330b139adb998f..020607c20229618dc2ffacee55cbd82454c78197 100644 --- a/Framework/ProcessSequence/BaseProcess.h +++ b/Framework/ProcessSequence/BaseProcess.h @@ -29,6 +29,12 @@ namespace corsika::process { struct BaseProcess { derived& GetRef() { return static_cast<derived&>(*this); } const derived& GetRef() const { return static_cast<const derived&>(*this); } + + template <typename Particle, typename Stack> + inline EProcessReturn DoDiscrete(Particle&, Stack&) const; // {} + + template <typename Particle, typename Track, typename Stack> + inline EProcessReturn DoContinuous(Particle&, Track&, Stack&) const; // {} }; /* diff --git a/Framework/ProcessSequence/ContinuousProcess.h b/Framework/ProcessSequence/ContinuousProcess.h index 763ba07bd5d3dae40d81323c4b164f749fc0f46a..98a4dde0cce8d4b3497292f27144fa3eee58d218 100644 --- a/Framework/ProcessSequence/ContinuousProcess.h +++ b/Framework/ProcessSequence/ContinuousProcess.h @@ -35,15 +35,7 @@ namespace corsika::process { // -> enforce derived to implement DoContinuous... template <typename D, typename T, typename S> inline EProcessReturn DoContinuous(D&, T&, S&) const; - - - // provide "empty" version of DoDiscrete - /* - template <typename Particle, typename Stack> - inline EProcessReturn DoDiscrete(Particle&, Stack&) const { - return EProcessReturn::eOk; - } // find out how to make this FINAL - */ + }; diff --git a/Framework/ProcessSequence/DiscreteProcess.h b/Framework/ProcessSequence/DiscreteProcess.h index 4955ff68e72770ae1b86bd09f90a2dfd4e8da8e2..1c7b50c0c5566a37ab7bc5ac4038f2103cfc39c8 100644 --- a/Framework/ProcessSequence/DiscreteProcess.h +++ b/Framework/ProcessSequence/DiscreteProcess.h @@ -30,24 +30,14 @@ namespace corsika::process { template <typename derived> struct DiscreteProcess { - // DiscreteProcess() { - // static_assert(mustProvide<derived>::mustProvide, ""); - //} - derived& GetRef() { return static_cast<derived&>(*this); } const derived& GetRef() const { return static_cast<const derived&>(*this); } - // here starts the interface part + /// here starts the interface-definition part // -> enforce derived to implement DoDiscrete... template <typename Particle, typename Stack> inline EProcessReturn DoDiscrete(Particle&, Stack&) const; // {} - /* - template <typename D, typename S> - inline EProcessReturn DoContinuous(D&, corsika::setup::Trajectory&, S&) const { - return EProcessReturn::eOk; - } // find out how to make this FINAL - */ }; } // namespace corsika::process diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/Framework/ProcessSequence/testProcessSequence.cc index d7b15e573ef12c993304b150ee3b99db611aa58f..305023eaf4db01da0eac9bc0730985a75e11b2c7 100644 --- a/Framework/ProcessSequence/testProcessSequence.cc +++ b/Framework/ProcessSequence/testProcessSequence.cc @@ -17,14 +17,7 @@ #include <iomanip> #include <iostream> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> - #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; using namespace corsika::units::si; @@ -33,67 +26,65 @@ using namespace std; static const int nData = 10; +int globalCount = 0; + class ContinuousProcess1 : public ContinuousProcess<ContinuousProcess1> { + int fV = 0; public: - ContinuousProcess1() {} - void Init() { cout << "ContinuousProcess1::Init" << endl; } + ContinuousProcess1(const int v) : fV(v) {} + void Init() { + cout << "ContinuousProcess1::Init" << endl; + assert (globalCount == fV); + globalCount++; + } template <typename D, typename T, typename S> inline EProcessReturn DoContinuous(D& d, T&, S&) const { cout << "ContinuousProcess1::DoContinuous" << endl; for (int i = 0; i < nData; ++i) d.p[i] += 0.933; return EProcessReturn::eOk; } - - template <typename Particle, typename Stack> - inline EProcessReturn DoDiscrete(Particle&, Stack&) const { - cout << "ContinuousProcess1::DoDiscrete" << endl; - return EProcessReturn::eOk; - } }; class ContinuousProcess2 : public ContinuousProcess<ContinuousProcess2> { + int fV = 0; public: - ContinuousProcess2() {} - void Init() { cout << "ContinuousProcess2::Init" << endl; } + ContinuousProcess2(const int v) : fV(v) {} + void Init() { cout << "ContinuousProcess2::Init" << endl; + assert (globalCount == fV); + globalCount++; +} template <typename D, typename T, typename S> inline EProcessReturn DoContinuous(D& d, T&, S&) const { cout << "ContinuousProcess2::DoContinuous" << endl; for (int i = 0; i < nData; ++i) d.p[i] += 0.933; return EProcessReturn::eOk; } - - template <typename Particle, typename Stack> - inline EProcessReturn DoDiscrete(Particle&, Stack&) const { - cout << "ContinuousProcess2::DoDiscrete" << endl; - return EProcessReturn::eOk; - } }; 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 < nData; ++i) d.p[i] += 1 + i; - return EProcessReturn::eOk; + Process1(const int v) : fV(v) {} + void Init() { cout << "Process1::Init" << endl; + assert (globalCount == fV); + globalCount++; } - template <typename Particle, typename Stack> - inline EProcessReturn DoDiscrete(Particle&, Stack&) const { - cout << "Process1::DoDiscrete" << endl; + template <typename D, typename S> + inline EProcessReturn DoDiscrete(D& d, S&) const { + for (int i = 0; i < nData; ++i) d.p[i] += 1 + i; return EProcessReturn::eOk; } + //private: + int fV; }; class Process2 : public DiscreteProcess<Process2> { + int fV = 0; 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 < nData; ++i) d.p[i] *= 0.7; - return EProcessReturn::eOk; - } + Process2(const int v) : fV(v) {} + void Init() { cout << "Process2::Init" << endl; + assert (globalCount == fV); + globalCount++; +} template <typename Particle, typename Stack> inline EProcessReturn DoDiscrete(Particle&, Stack&) const { cout << "Process2::DoDiscrete" << endl; @@ -102,14 +93,13 @@ public: }; class Process3 : public DiscreteProcess<Process3> { + int fV = 0; 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 < nData; ++i) d.p[i] += 0.933; - return EProcessReturn::eOk; - } + Process3(const int v) : fV(v) {} + void Init() { cout << "Process3::Init" << endl; + assert (globalCount == fV); + globalCount++; +} template <typename Particle, typename Stack> inline EProcessReturn DoDiscrete(Particle&, Stack&) const { cout << "Process3::DoDiscrete" << endl; @@ -118,50 +108,65 @@ public: }; class Process4 : public BaseProcess<Process4> { + int fV = 0; public: - Process4() {} - void Init() { cout << "Process4::Init" << endl; } + Process4(const int v) : fV(v) {} + void Init() { cout << "Process4::Init" << endl; + assert (globalCount == fV); + globalCount++; +} template <typename D, typename T, typename S> inline EProcessReturn DoContinuous(D& d, T&, S&) const { for (int i = 0; i < nData; ++i) {d.p[i] /= 1.2;} return EProcessReturn::eOk; } // inline double MinStepLength(D& d) { - // void DoDiscrete(Particle& p, Stack& s) const { + template<typename Particle, typename Stack> + EProcessReturn DoDiscrete(Particle&, Stack&) const { return EProcessReturn::eOk; } }; struct DummyData { double p[nData] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; }; struct DummyStack {}; +struct DummyTrajectory {}; -TEST_CASE("Cascade", "[Cascade]") { - - SECTION("sectionTwo") { +TEST_CASE("Process Sequence", "[Process Sequence]") { - Process1 m1; - Process2 m2; - Process3 m3; - Process4 m4; + SECTION("Check init order") { + Process1 m1(0); + Process2 m2(1); + Process3 m3(2); + Process4 m4(3); const auto sequence = m1 + m2 + m3 + m4; - ContinuousProcess1 cp1; - ContinuousProcess2 cp2; + globalCount = 0; + sequence.Init(); + //REQUIRE_NOTHROW( (sequence.Init()) ); - const auto sequence2 = cp1 + m2 + m3 + cp2; + //const auto sequence_wrong = m3 + m2 + m1 + m4; + //globalCount = 0; + //sequence_wrong.Init(); + //REQUIRE_THROWS(sequence_wrong.Init()); + } - geometry::CoordinateSystem& rootCS = geometry::RootCoordinateSystem::GetInstance().GetRootCS(); - corsika::geometry::Point pos(rootCS, 0_m, 0_m, 0_m); - corsika::geometry::Vector<SpeedType::dimension_type> vec(rootCS, 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, 100_ns)); + + SECTION("sectionTwo") { - DummyData p; - DummyStack s; + ContinuousProcess1 cp1(0); + ContinuousProcess2 cp2(3); + Process2 m2(1); + Process3 m3(2); + const auto sequence2 = cp1 + m2 + m3 + cp2; - cout << "-->init" << endl; + DummyData p; + DummyStack s; + DummyTrajectory t; + + cout << "-->init sequence2" << endl; + globalCount = 0; sequence2.Init(); cout << "-->docont" << endl; @@ -170,14 +175,11 @@ TEST_CASE("Cascade", "[Cascade]") { sequence2.DoDiscrete(p, s); cout << "-->done" << endl; - sequence.Init(); - 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 < nLoop; ++i) { sequence2.DoContinuous(p, t, s); sequence2.DoDiscrete(p, 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 b0acefc4a86c72acba373feafc82b7434aa2b9a0..8a4514e5983000d5d2e8278a399fe24e450a4f2d 100644 --- a/Processes/StackInspector/StackInspector.cc +++ b/Processes/StackInspector/StackInspector.cc @@ -32,7 +32,8 @@ template <typename Stack> StackInspector<Stack>::~StackInspector() {} template <typename Stack> -process::EProcessReturn StackInspector<Stack>::DoContinuous(Particle&, setup::Trajectory&, +process::EProcessReturn StackInspector<Stack>::DoContinuous(Particle&, + setup::Trajectory&, Stack& s) const { static int countStep = 0; if (!fReport) return EProcessReturn::eOk; diff --git a/Processes/TrackingLine/TrackingLine.h b/Processes/TrackingLine/TrackingLine.h index 2f35e2d08255330d70e46b8478a63382b469e961..e750342a1add1bff5e32bd270710e995d60ce4b0 100644 --- a/Processes/TrackingLine/TrackingLine.h +++ b/Processes/TrackingLine/TrackingLine.h @@ -24,8 +24,7 @@ namespace corsika::process { setup::Trajectory GetTrack(Particle& p) { geometry::Vector<SpeedType::dimension_type> v = p.GetDirection(); geometry::Line traj(p.GetPosition(), v); - return setup::Trajectory(); - //return geometry::Trajectory<corsika::geometry::Line>(traj, 100_ns); + return geometry::Trajectory<corsika::geometry::Line>(traj, 100_ns); } }; diff --git a/Setup/SetupTrajectory.h b/Setup/SetupTrajectory.h index f30c55b7116183698fa9a397de1beb79dda43f95..fa630171970f68f6b85e2b416d9e4efbb607dfde 100644 --- a/Setup/SetupTrajectory.h +++ b/Setup/SetupTrajectory.h @@ -20,21 +20,19 @@ #include <variant> -struct TTTT {void blubb() {} }; - namespace corsika::setup { using corsika::geometry::Helix; using corsika::geometry::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;*/ - //typedef corsika::geometry::Trajectory<Line> Trajectory; - typedef TTTT Trajectory; + typedef corsika::geometry::Trajectory<Line> Trajectory; /* + 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 { diff --git a/Stack/SuperStupidStack/SuperStupidStack.h b/Stack/SuperStupidStack/SuperStupidStack.h index 064edffa2c4497743cfd4a5e5ef2caca6c86860a..d1c8bc2b38622698b359afe8805d22403d99a4ed 100644 --- a/Stack/SuperStupidStack/SuperStupidStack.h +++ b/Stack/SuperStupidStack/SuperStupidStack.h @@ -89,8 +89,11 @@ namespace corsika::stack { void Init() {} void Clear() { - fDataE.clear(); fDataPID.clear(); + fDataE.clear(); + fMomentum.clear(); + fPosition.clear(); + fTime.clear(); } int GetSize() const { return fDataPID.size(); }