diff --git a/corsika/detail/framework/core/Cascade.inl b/corsika/detail/framework/core/Cascade.inl index 82b6887a3edcf18ff4f2044adc0c1d33efb9f9fe..bcbcf45ec67fba9e4e9fe40cdf4502a3242b9313 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 1b19136cc868b0e4d5e70235d2b1b59355fa30a4..47c5169a8ea0f4ddf41d9deecc318f27a3e5c32b 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 8402dcd95ec2b2e9fbb90593cbdaf90bf17e885b..bffda918f64b3fc7ef79193f6470f9d104f9e711 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 4a33fba5047efc32ad294f501ab6392e35bac382..b43428ae50e482f0760b4bb133bc0cd4fbfa1c14 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 3d878acd6c70fcac937e0352927b274198d6c269..7f41162b2feaf3efa785711697d17243a0e6ca89 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 392f7cd22eaed92a536ac4a271fa1d54491a2c7f..ffda4726879bea8baeb3b1b319dc49d842c851b9 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 979960925281396c0fd98ceaf092be5791ffe74e..cdd171e5ebd47ab276a95c875c5d305893ef2fd5 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 eaf4f9881dbf1958f083fc53c8dd12421580b0e4..4e695063468ad88ca2159c0642f57eb54117eced 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"); }