From 92d0d8f0078bf5ea8f2ddce7a6655410824a5b2a Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Sat, 24 Apr 2021 21:25:38 +0200
Subject: [PATCH] also re-enable all tests and examples

---
 corsika/detail/modules/TrackWriter.inl    |  21 ++---
 corsika/detail/output/ParquetStreamer.inl |   6 +-
 corsika/output/NoOutput.hpp               |  59 ++++++++++++
 examples/vertical_EAS.cpp                 | 104 ++++++++++++----------
 tests/modules/testObservationPlane.cpp    |  10 ++-
 5 files changed, 134 insertions(+), 66 deletions(-)
 create mode 100644 corsika/output/NoOutput.hpp

diff --git a/corsika/detail/modules/TrackWriter.inl b/corsika/detail/modules/TrackWriter.inl
index f77e763ac..8af3c31dc 100644
--- a/corsika/detail/modules/TrackWriter.inl
+++ b/corsika/detail/modules/TrackWriter.inl
@@ -15,13 +15,14 @@
 
 namespace corsika {
 
-  template <typename TOutput>
-  inline TrackWriter<TOutput>::TrackWriter() {}
+  template <typename TOutputWriter>
+  inline TrackWriter<TOutputWriter>::TrackWriter() {}
 
-  template <typename TOutput>
+  template <typename TOutputWriter>
   template <typename TParticle, typename TTrack>
-  inline ProcessReturn TrackWriter<TOutput>::doContinuous(TParticle const& vP,
-                                                          TTrack const& vT, bool const) {
+  inline ProcessReturn TrackWriter<TOutputWriter>::doContinuous(TParticle const& vP,
+                                                                TTrack const& vT,
+                                                                bool const) {
 
     auto const start = vT.getPosition(0).getCoordinates();
     auto const end = vT.getPosition(1).getCoordinates();
@@ -32,15 +33,15 @@ namespace corsika {
     return ProcessReturn::Ok;
   }
 
-  template <typename TOutput>
+  template <typename TOutputWriter>
   template <typename TParticle, typename TTrack>
-  inline LengthType TrackWriter<TOutput>::getMaxStepLength(TParticle const&,
-                                                           TTrack const&) {
+  inline LengthType TrackWriter<TOutputWriter>::getMaxStepLength(TParticle const&,
+                                                                 TTrack const&) {
     return meter * std::numeric_limits<double>::infinity();
   }
 
-  template <typename TOutput>
-  YAML::Node TrackWriter<TOutput>::getConfig() const {
+  template <typename TOutputWriter>
+  YAML::Node TrackWriter<TOutputWriter>::getConfig() const {
     using namespace units::si;
 
     YAML::Node node;
diff --git a/corsika/detail/output/ParquetStreamer.inl b/corsika/detail/output/ParquetStreamer.inl
index 8f29e3a4e..0a128f992 100644
--- a/corsika/detail/output/ParquetStreamer.inl
+++ b/corsika/detail/output/ParquetStreamer.inl
@@ -30,9 +30,9 @@ namespace corsika {
     fields_.push_back(parquet::schema::PrimitiveNode::Make(args...));
   }
 
-  void ParquetStreamer::enableCompression(int const level) {
-    builder_.compression(parquet::Compression::ZSTD);
-    builder_.compression_level(level);
+  void ParquetStreamer::enableCompression(int const /*level*/) {
+    // builder_.compression(parquet::Compression::ZSTD);
+    // builder_.compression_level(level);
   }
 
   void ParquetStreamer::buildStreamer() {
diff --git a/corsika/output/NoOutput.hpp b/corsika/output/NoOutput.hpp
new file mode 100644
index 000000000..67710e2d0
--- /dev/null
+++ b/corsika/output/NoOutput.hpp
@@ -0,0 +1,59 @@
+/*
+ * (c) Copyright 2021 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+#pragma once
+
+namespace corsika {
+
+  /**
+   * This is the base class for all outputs so that they
+   * can be stored in homogeneous containers.
+   */
+  class NoOutput : public BaseOutput {
+
+  protected:
+    NoOutput() {}
+
+  public:
+    /**
+     * Called at the start of each run.
+     */
+    void startOfLibrary(boost::filesystem::path const&) final override {}
+
+    /**
+     * Called at the start of each event/shower.
+     */
+    void startOfShower() final override {}
+
+    /**
+     * Called at the end of each event/shower.
+     */
+    void endOfShower() final override {}
+
+    /**
+     * Called at the end of each run.
+     */
+    void endOfLibrary() final override {}
+
+    /**
+     * Get the configuration of this output.
+     */
+    YAML::Node getConfig() const { return YAML::Node(); };
+
+    /**
+     * Get any summary information for the entire library.
+     */
+    YAML::Node getSummary() final override { return YAML::Node(); };
+
+  protected:
+    void write(Code const&, units::si::HEPEnergyType const&, units::si::LengthType const&,
+               units::si::LengthType const&) {}
+  };
+
+} // namespace corsika
+
+#include <corsika/detail/output/BaseOutput.inl>
diff --git a/examples/vertical_EAS.cpp b/examples/vertical_EAS.cpp
index 3ada2b875..fa08acc5e 100644
--- a/examples/vertical_EAS.cpp
+++ b/examples/vertical_EAS.cpp
@@ -136,6 +136,7 @@ int main(int argc, char** argv) {
       {{Code::Nitrogen, Code::Oxygen},
        {0.7847f, 1.f - 0.7847f}}); // values taken from AIRES manual, Ar removed for now
 
+  builder.addExponentialLayer(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 2_km);
   builder.addExponentialLayer(1222.6562_g / (1_cm * 1_cm), 994186.38_cm, 4_km);
   builder.addExponentialLayer(1144.9069_g / (1_cm * 1_cm), 878153.55_cm, 10_km);
   builder.addExponentialLayer(1305.5948_g / (1_cm * 1_cm), 636143.04_cm, 40_km);
@@ -143,22 +144,6 @@ int main(int argc, char** argv) {
   builder.addLinearLayer(1e9_cm, 112.8_km + constants::EarthRadius::Mean);
   builder.assemble(env);
 
-  CORSIKA_LOG_DEBUG(
-      "environment setup: universe={}, layer1={}, layer2={}, layer3={}, layer4={}, "
-      "layer5={}",
-      fmt::ptr(env.getUniverse()->getContainingNode(
-          Point(rootCS, {constants::EarthRadius::Mean + 130_km, 0_m, 0_m}))),
-      fmt::ptr(env.getUniverse()->getContainingNode(
-          Point(rootCS, {constants::EarthRadius::Mean + 110_km, 0_m, 0_m}))),
-      fmt::ptr(env.getUniverse()->getContainingNode(
-          Point(rootCS, {constants::EarthRadius::Mean + 50_km, 0_m, 0_m}))),
-      fmt::ptr(env.getUniverse()->getContainingNode(
-          Point(rootCS, {constants::EarthRadius::Mean + 20_km, 0_m, 0_m}))),
-      fmt::ptr(env.getUniverse()->getContainingNode(
-          Point(rootCS, {constants::EarthRadius::Mean + 5_km, 0_m, 0_m}))),
-      fmt::ptr(env.getUniverse()->getContainingNode(
-          Point(rootCS, {constants::EarthRadius::Mean + 2_km, 0_m, 0_m}))));
-
   // pre-setup particle stack
   unsigned short const A = std::stoi(std::string(argv[1]));
   Code beamCode;
@@ -216,6 +201,9 @@ int main(int argc, char** argv) {
 
   ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.5, env};
 
+  // create the output manager that we then register outputs with
+  OutputManager output("vertical_EAS_outputs");
+
   // setup processes, decays and interactions
 
   // corsika::qgsjetII::Interaction qgsjet;
@@ -282,8 +270,6 @@ int main(int argc, char** argv) {
     string const labHist_file = "inthist_lab_verticalEAS_" + to_string(i_shower) + ".npz";
     string const cMSHist_file = "inthist_cms_verticalEAS_" + to_string(i_shower) + ".npz";
     string const longprof_file = "longprof_verticalEAS_" + to_string(i_shower) + ".txt";
-    string const tracks_file = "tracks_" + to_string(i_shower) + ".dat";
-    string const particles_file = "particles_" + to_string(i_shower) + ".dat";
 
     std::cout << std::endl;
     std::cout << "Shower " << i_shower << "/" << number_showers << std::endl;
@@ -291,9 +277,50 @@ int main(int argc, char** argv) {
     // setup particle stack, and add primary particle
     setup::Stack stack;
     stack.clear();
+    unsigned short const A = std::stoi(std::string(argv[1]));
+    Code beamCode;
+    HEPEnergyType mass;
+    unsigned short Z = 0;
+    if (A > 0) {
+      beamCode = Code::Nucleus;
+      Z = std::stoi(std::string(argv[2]));
+      mass = get_nucleus_mass(A, Z);
+    } else {
+      int pdg = std::stoi(std::string(argv[2]));
+      beamCode = convert_from_PDG(PDGCode(pdg));
+      mass = get_mass(beamCode);
+    }
+    HEPEnergyType const E0 = 1_GeV * std::stof(std::string(argv[3]));
+    double theta = 0.;
+    auto const thetaRad = theta / 180. * M_PI;
+
+    auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) {
+      return sqrt((Elab - m) * (Elab + m));
+    };
+    HEPMomentumType P0 = elab2plab(E0, mass);
+    auto momentumComponents = [](double thetaRad, HEPMomentumType ptot) {
+      return std::make_tuple(ptot * sin(thetaRad), 0_eV, -ptot * cos(thetaRad));
+    };
+
+    auto const [px, py, pz] = momentumComponents(thetaRad, P0);
+    auto plab = MomentumVector(rootCS, {px, py, pz});
+    cout << "input particle: " << beamCode << endl;
+    cout << "input angles: theta=" << theta << endl;
+    cout << "input momentum: " << plab.getComponents() / 1_GeV
+         << ", norm = " << plab.getNorm() << endl;
+
+    auto const observationHeight = 0_km + builder.getEarthRadius();
+    auto const injectionHeight = 111.75_km + builder.getEarthRadius();
+    auto const t = (injectionHeight - observationHeight) / cos(thetaRad);
+    Point const showerCore{rootCS, 0_m, 0_m, observationHeight};
+    Point const injectionPos =
+        showerCore + DirectionVector{rootCS, {-sin(thetaRad), 0, cos(thetaRad)}} * t;
+
+    std::cout << "point of injection: " << injectionPos.getCoordinates() << std::endl;
 
     if (A > 1) {
       stack.addParticle(std::make_tuple(beamCode, E0, plab, injectionPos, 0_ns, A, Z));
+
     } else {
       if (A == 1) {
         if (Z == 1) {
@@ -314,10 +341,8 @@ int main(int argc, char** argv) {
     std::cout << "shower axis length: " << (showerCore - injectionPos).getNorm() * 1.5
               << std::endl;
 
-    ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.5, env};
-
-    // create the output manager that we then register outputs with
-    OutputManager output("vertical_EAS_outputs");
+    ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.5, env,
+                                false};
 
     // setup processes, decays and interactions
 
@@ -353,10 +378,11 @@ int main(int argc, char** argv) {
 
     decaySibyll.printDecayConfig();
 
-    ParticleCut cut{60_GeV, 60_GeV, 60_GeV, 60_GeV, true};
-    corsika::proposal::Interaction emCascade(env);
-    corsika::proposal::ContinuousProcess emContinuous(env);
-    InteractionCounter emCascadeCounted(emCascade);
+    ParticleCut cut{60_GeV, true, true};
+    // corsika::proposal::Interaction emCascade(env);
+    // corsika::proposal::ContinuousProcess emContinuous(env);
+    // InteractionCounter emCascadeCounted(emCascade);
+    BetheBlochPDG emContinuous(showerAxis);
 
     OnShellCheck reset_particle_mass(1.e-3, 1.e-1, false);
     TrackWriter trackWriter;
@@ -369,26 +395,6 @@ int main(int argc, char** argv) {
     // register the observation plane with the output
     output.add("obsplane", observationLevel);
 
-    corsika::urqmd::UrQMD urqmd;
-    InteractionCounter urqmdCounted{urqmd};
-    StackInspector<setup::Stack> stackInspect(50000, false, E0);
-
-    // assemble all processes into an ordered process list
-    struct EnergySwitch {
-      HEPEnergyType cutE_;
-      EnergySwitch(HEPEnergyType cutE)
-          : cutE_(cutE) {}
-      SwitchResult operator()(const Particle& p) {
-        if (p.getEnergy() < cutE_)
-          return SwitchResult::First;
-        else
-          return SwitchResult::Second;
-      }
-    };
-    auto hadronSequence =
-        make_select(urqmdCounted, make_sequence(sibyllNucCounted, sibyllCounted),
-                    EnergySwitch(55_GeV));
-    auto decaySequence = make_sequence(decayPythia, decaySibyll);
     auto sequence =
         make_sequence(stackInspect, hadronSequence, reset_particle_mass, decaySequence,
                       emContinuous, cut, trackWriter, observationLevel, longprof);
@@ -403,16 +409,16 @@ int main(int argc, char** argv) {
     EAS.run();
 
     cut.showResults();
-    emContinuous.showResults();
+    // emContinuous.showResults();
     observationLevel.showResults();
     const HEPEnergyType Efinal = cut.getCutEnergy() + cut.getInvEnergy() +
-                                 cut.getEmEnergy() + emContinuous.getEnergyLost() +
+                                 cut.getEmEnergy() + // emContinuous.getEnergyLost() +
                                  observationLevel.getEnergyGround();
     cout << "total cut energy (GeV): " << Efinal / 1_GeV << endl
          << "relative difference (%): " << (Efinal / E0 - 1) * 100 << endl;
     observationLevel.reset();
     cut.reset();
-    emContinuous.reset();
+    // emContinuous.reset();
 
     auto const hists = sibyllCounted.getHistogram() + sibyllNucCounted.getHistogram() +
                        urqmdCounted.getHistogram();
diff --git a/tests/modules/testObservationPlane.cpp b/tests/modules/testObservationPlane.cpp
index 1c0b65fc8..03de5d47d 100644
--- a/tests/modules/testObservationPlane.cpp
+++ b/tests/modules/testObservationPlane.cpp
@@ -17,6 +17,8 @@
 #include <corsika/framework/core/ParticleProperties.hpp>
 #include <corsika/framework/core/PhysicalUnits.hpp>
 
+#include <corsika/output/NoOutput.hpp>
+
 #include <SetupTestEnvironment.hpp>
 #include <SetupTestStack.hpp>
 #include <SetupTestTrajectory.hpp>
@@ -54,7 +56,7 @@ TEST_CASE("ObservationPlane", "[proccesses][observation_plane]") {
   SECTION("horizontal plane") {
 
     Plane const obsPlane(Point(cs, {10_m, 0_m, 0_m}), DirectionVector(cs, {1., 0., 0.}));
-    ObservationPlane obs(obsPlane, DirectionVector(cs, {0., 1., 0.}));
+    ObservationPlane<NoOutput> obs(obsPlane, DirectionVector(cs, {0., 1., 0.}));
 
     LengthType const length = obs.getMaxStepLength(particle, no_used_track);
     ProcessReturn const ret = obs.doContinuous(particle, no_used_track, true);
@@ -65,10 +67,10 @@ TEST_CASE("ObservationPlane", "[proccesses][observation_plane]") {
 
   SECTION("transparent plane") {
     Plane const obsPlane(Point(cs, {1_m, 0_m, 0_m}), DirectionVector(cs, {1., 0., 0.}));
-    ObservationPlane obs(obsPlane, DirectionVector(cs, {0., 0., 1.}));
+    ObservationPlane<NoOutput> obs(obsPlane, DirectionVector(cs, {0., 0., 1.}));
 
     LengthType const length = obs.getMaxStepLength(particle, no_used_track);
-    ProcessReturn const ret = obs.doContinuous(particle, no_used_track, true);
+    ProcessReturn const ret = obs.doContinuous(particle, no_used_track, false);
 
     CHECK(length / 1_m == Approx(1).margin(1e-4));
     CHECK(ret == ProcessReturn::Ok);
@@ -83,7 +85,7 @@ TEST_CASE("ObservationPlane", "[proccesses][observation_plane]") {
 
     Plane const obsPlane(Point(cs, {10_m, 5_m, 5_m}),
                          DirectionVector(cs, {1, 0.1, -0.05}));
-    ObservationPlane obs(obsPlane, DirectionVector(cs, {0., 1., 0.}));
+    ObservationPlane<NoOutput> obs(obsPlane, DirectionVector(cs, {0., 1., 0.}));
 
     LengthType const length = obs.getMaxStepLength(particle, no_used_track);
     ProcessReturn const ret = obs.doContinuous(particle, no_used_track, true);
-- 
GitLab