From cd05ecd40ade91767f829a96868154dffcd3dda9 Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Fri, 17 Dec 2021 17:32:48 +0100
Subject: [PATCH] examples

---
 corsika/detail/framework/core/Cascade.inl | 7 +++++++
 corsika/detail/output/OutputManager.inl   | 9 +++++++++
 examples/boundary_example.cpp             | 6 ++----
 examples/cascade_example.cpp              | 6 ++----
 examples/cascade_proton_example.cpp       | 6 ++----
 examples/corsika.cpp                      | 4 ----
 examples/em_shower.cpp                    | 6 ++----
 examples/hybrid_MC.cpp                    | 6 ++----
 8 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/corsika/detail/framework/core/Cascade.inl b/corsika/detail/framework/core/Cascade.inl
index 82b6887a3..bcbcf45ec 100644
--- a/corsika/detail/framework/core/Cascade.inl
+++ b/corsika/detail/framework/core/Cascade.inl
@@ -35,6 +35,10 @@ namespace corsika {
 
   template <typename TTracking, typename TProcessList, typename TOutput, typename TStack>
   inline void Cascade<TTracking, TProcessList, TOutput, TStack>::run() {
+
+    // trigger the start of the outputs for this shower
+    output.startOfShower();
+
     setNodes(); // put each particle on stack in correct environment volume
 
     while (!stack_.isEmpty()) {
@@ -60,6 +64,9 @@ namespace corsika {
       // thus, the double loop
       sequence_.doCascadeEquations(stack_);
     }
+
+    // indicate end of shower
+    output.endOfShower();
   }
 
   template <typename TTracking, typename TProcessList, typename TOutput, typename TStack>
diff --git a/corsika/detail/output/OutputManager.inl b/corsika/detail/output/OutputManager.inl
index 1b19136cc..47c5169a8 100644
--- a/corsika/detail/output/OutputManager.inl
+++ b/corsika/detail/output/OutputManager.inl
@@ -46,6 +46,15 @@ namespace corsika {
 
   template <typename TOutput>
   inline void OutputManager::add(std::string const& name, TOutput& output) {
+
+    if (state_ == OutputState::NoInit) {
+      // if "add" is called after the ouptput has started, this is an ERROR.
+      CORSIKA_LOGGER_ERROR(
+          logger_, "Cannot add more outputs to OutputManager after output was started.");
+      throw std::runtime_error(
+          "Cannot add more outputs to OutputManager after output was started.");
+    }
+
     // check if that name is already in the map
     if (outputs_.count(name) > 0) {
       CORSIKA_LOGGER_ERROR(
diff --git a/examples/boundary_example.cpp b/examples/boundary_example.cpp
index 8402dcd95..bffda918f 100644
--- a/examples/boundary_example.cpp
+++ b/examples/boundary_example.cpp
@@ -166,11 +166,9 @@ int main() {
   // define air shower object, run simulation
   Cascade EAS(env, tracking, sequence, output, stack);
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   CORSIKA_LOG_INFO("Done");
-
-  output.endOfLibrary();
 }
diff --git a/examples/cascade_example.cpp b/examples/cascade_example.cpp
index 4a33fba50..b43428ae5 100644
--- a/examples/cascade_example.cpp
+++ b/examples/cascade_example.cpp
@@ -155,9 +155,9 @@ int main() {
   // define air shower object, run simulation
   Cascade EAS(env, tracking, sequence, output, stack);
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   const HEPEnergyType Efinal = dEdX.getEnergyLost();
   CORSIKA_LOG_INFO(
@@ -168,6 +168,4 @@ int main() {
       "relative difference (%): {}\n",
       Efinal / 1_GeV, (Efinal / E0 - 1) * 100, dEdX.getEnergyLost() / 1_GeV,
       dEdX.getEnergyLost() / E0 * 100);
-
-  output.endOfLibrary();
 }
diff --git a/examples/cascade_proton_example.cpp b/examples/cascade_proton_example.cpp
index 3d878acd6..7f41162b2 100644
--- a/examples/cascade_proton_example.cpp
+++ b/examples/cascade_proton_example.cpp
@@ -147,11 +147,9 @@ int main() {
 
   // define air shower object, run simulation
   Cascade EAS(env, tracking, sequence, output, stack);
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   CORSIKA_LOG_INFO("Done");
-
-  output.endOfLibrary();
 }
diff --git a/examples/corsika.cpp b/examples/corsika.cpp
index 392f7cd22..ffda47268 100644
--- a/examples/corsika.cpp
+++ b/examples/corsika.cpp
@@ -380,9 +380,6 @@ int main(int argc, char** argv) {
 
     CORSIKA_LOG_INFO("Shower {} / {} ", i_shower, nevent);
 
-    // trigger the start of the outputs for this shower
-    output.startOfShower();
-
     // directory for outputs
     string const outdir(app["--filename"]->as<std::string>());
     string const labHist_file = outdir + "/inthist_lab_" + to_string(i_shower) + ".npz";
@@ -420,7 +417,6 @@ int main(int argc, char** argv) {
 
     save_hist(hists.labHist(), labHist_file, true);
     save_hist(hists.CMSHist(), cMSHist_file, true);
-    output.endOfShower();
   }
 
   // and finalize the output on disk
diff --git a/examples/em_shower.cpp b/examples/em_shower.cpp
index 979960925..cdd171e5e 100644
--- a/examples/em_shower.cpp
+++ b/examples/em_shower.cpp
@@ -183,9 +183,9 @@ int main(int argc, char** argv) {
   //  EAS.setNodes();
   //  EAS.forceInteraction();
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   HEPEnergyType const Efinal = dEdX.getEnergyLost() + observationLevel.getEnergyGround();
 
@@ -193,6 +193,4 @@ int main(int argc, char** argv) {
       "total energy budget (GeV): {}, "
       "relative difference (%): {}",
       Efinal / 1_GeV, (Efinal / E0 - 1) * 100);
-
-  output.endOfLibrary();
 }
diff --git a/examples/hybrid_MC.cpp b/examples/hybrid_MC.cpp
index eaf4f9881..4e6950634 100644
--- a/examples/hybrid_MC.cpp
+++ b/examples/hybrid_MC.cpp
@@ -316,9 +316,9 @@ int main(int argc, char** argv) {
   //  EAS.SetNodes();
   //  EAS.forceInteraction();
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   const HEPEnergyType Efinal = dEdX.getEnergyLost() + observationLevel.getEnergyGround();
   CORSIKA_LOG_INFO(
@@ -332,7 +332,5 @@ int main(int argc, char** argv) {
   save_hist(hists.labHist(), "inthist_lab_hybrid.npz", true);
   save_hist(hists.CMSHist(), "inthist_cms_hybrid.npz", true);
 
-  output.endOfLibrary();
-
   CORSIKA_LOG_INFO("done");
 }
-- 
GitLab