From c6eaf499d7c05f07075c998ff32286604ccfbcab Mon Sep 17 00:00:00 2001
From: Alan Coleman <alanc@udel.edu>
Date: Wed, 6 Dec 2023 22:25:40 +0100
Subject: [PATCH] auto-calculate the writer binning

---
 applications/c8_air_shower.cpp                | 6 ++++--
 examples/cascade_examples/em_shower.cpp       | 6 ++++--
 examples/cascade_examples/hybrid_MC.cpp       | 6 ++++--
 examples/cascade_examples/mars.cpp            | 6 ++++--
 examples/cascade_examples/radio_em_shower.cpp | 6 ++++--
 examples/cascade_examples/water.cpp           | 6 ++++--
 examples/physics_examples/stopping_power.cpp  | 1 -
 7 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/applications/c8_air_shower.cpp b/applications/c8_air_shower.cpp
index cf6b72f2b..0837d31c4 100644
--- a/applications/c8_air_shower.cpp
+++ b/applications/c8_air_shower.cpp
@@ -352,6 +352,8 @@ int main(int argc, char** argv) {
   // we make the axis much longer than the inj-core distance since the
   // profile will go beyond the core, depending on zenith angle
   ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.2, env};
+  auto const dX = 10_g / square(1_cm); //Binning of the writers along the shower axis
+  uint const nAxisBins = showerAxis.getMaximumX() / dX + 1; //Get maximum number of bins
   /* === END: CONSTRUCT GEOMETRY === */
 
   double const emthinfrac = app["--emthin"]->as<double>();
@@ -370,7 +372,7 @@ int main(int argc, char** argv) {
   OutputManager output(app["--filename"]->as<std::string>(), seed, args.str(), outputDir);
 
   // register energy losses as output
-  EnergyLossWriter dEdX{showerAxis, 10_g / square(1_cm), 200};
+  EnergyLossWriter dEdX{showerAxis, dX, nAxisBins};
   output.add("energyloss", dEdX);
 
   DynamicInteractionProcess<StackType> heModel;
@@ -432,7 +434,7 @@ int main(int argc, char** argv) {
   auto emContinuous =
       make_select(EMHadronSwitch(), emContinuousBethe, emContinuousProposal);
 
-  LongitudinalWriter profile{showerAxis, 200, 10_g / square(1_cm)};
+  LongitudinalWriter profile{showerAxis, nAxisBins, dX};
   output.add("profile", profile);
   LongitudinalProfile<SubWriter<decltype(profile)>> longprof{profile};
 
diff --git a/examples/cascade_examples/em_shower.cpp b/examples/cascade_examples/em_shower.cpp
index a685d70f1..614572bc9 100644
--- a/examples/cascade_examples/em_shower.cpp
+++ b/examples/cascade_examples/em_shower.cpp
@@ -133,6 +133,8 @@ int main(int argc, char** argv) {
 
   ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.02, env,
                               false, 1000};
+  auto const dX = 10_g / square(1_cm); //Binning of the writers along the shower axis
+  uint const nAxisBins = showerAxis.getMaximumX() / dX + 1; //Get maximum number of bins
 
   CORSIKA_LOG_INFO("Primary particle:   {}", beamCode);
   CORSIKA_LOG_INFO("Zenith angle:       {} (rad)", theta);
@@ -143,7 +145,7 @@ int main(int argc, char** argv) {
                    (showerCore - injectionPos).getNorm() * 1.02);
 
   // setup processes, decays and interactions
-  EnergyLossWriter energyloss{showerAxis, 10_g / square(1_cm), 200};
+  EnergyLossWriter energyloss{showerAxis, dX, nAxisBins};
   ParticleCut<SubWriter<decltype(energyloss)>> cut(5_MeV, 5_MeV, 100_GeV, 100_GeV, true,
                                                    energyloss);
 
@@ -165,7 +167,7 @@ int main(int argc, char** argv) {
   TrackWriter tracks;
   output.add("tracks", tracks);
 
-  LongitudinalWriter profile{showerAxis, 10_g / square(1_cm)};
+  LongitudinalWriter profile{showerAxis, nAxisBins, dX};
   output.add("profile", profile);
   LongitudinalProfile<SubWriter<decltype(profile)>> longprof{profile};
 
diff --git a/examples/cascade_examples/hybrid_MC.cpp b/examples/cascade_examples/hybrid_MC.cpp
index b3241ffa9..6d6841f56 100644
--- a/examples/cascade_examples/hybrid_MC.cpp
+++ b/examples/cascade_examples/hybrid_MC.cpp
@@ -206,6 +206,8 @@ int main(int argc, char** argv) {
 
   ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.02, env,
                               false, 1000};
+  auto const dX = 10_g / square(1_cm); //Binning of the writers along the shower axis
+  uint const nAxisBins = showerAxis.getMaximumX() / dX + 1; //Get maximum number of bins
 
   CORSIKA_LOG_INFO("Primary particle:   {}", beamCode);
   CORSIKA_LOG_INFO("Zenith angle:       {} (rad)", theta);
@@ -220,7 +222,7 @@ int main(int argc, char** argv) {
   OutputManager output("hybrid_MC_outputs");
 
   // register energy losses as output
-  EnergyLossWriter dEdX{showerAxis, 10_g / square(1_cm), 200};
+  EnergyLossWriter dEdX{showerAxis, dX, nAxisBins};
   output.add("energyloss", dEdX);
 
   // create a track writer and register it with the output manager
@@ -230,7 +232,7 @@ int main(int argc, char** argv) {
   ParticleCut<SubWriter<decltype(dEdX)>> cut(3_GeV, false, dEdX);
   BetheBlochPDG<SubWriter<decltype(dEdX)>> eLoss(dEdX);
 
-  LongitudinalWriter profile{showerAxis, 10_g / square(1_cm)};
+  LongitudinalWriter profile{showerAxis, nAxisBins, dX};
   output.add("profile", profile);
   LongitudinalProfile<SubWriter<decltype(profile)>> longprof{profile};
 
diff --git a/examples/cascade_examples/mars.cpp b/examples/cascade_examples/mars.cpp
index f382ef119..e4c6945a8 100644
--- a/examples/cascade_examples/mars.cpp
+++ b/examples/cascade_examples/mars.cpp
@@ -303,8 +303,10 @@ int main(int argc, char** argv) {
   OutputManager output(app["--filename"]->as<std::string>());
 
   ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.2, env};
+  auto const dX = 10_g / square(1_cm); //Binning of the writers along the shower axis
+  uint const nAxisBins = showerAxis.getMaximumX() / dX + 1; //Get maximum number of bins
 
-  EnergyLossWriter dEdX{showerAxis};
+  EnergyLossWriter dEdX{showerAxis, dX, nAxisBins};
   output.add("energyloss", dEdX);
 
   HEPEnergyType const emcut = 1_GeV;
@@ -336,7 +338,7 @@ int main(int argc, char** argv) {
   auto emContinuous =
       make_select(EMHadronSwitch(), emContinuousBethe, emContinuousProposal);
 
-  LongitudinalWriter longprof{showerAxis};
+  LongitudinalWriter longprof{showerAxis, nAxisBins, dX};
   output.add("profile", longprof);
   LongitudinalProfile<SubWriter<decltype(longprof)>> profile{longprof};
 
diff --git a/examples/cascade_examples/radio_em_shower.cpp b/examples/cascade_examples/radio_em_shower.cpp
index 9631ce895..199946217 100644
--- a/examples/cascade_examples/radio_em_shower.cpp
+++ b/examples/cascade_examples/radio_em_shower.cpp
@@ -157,6 +157,8 @@ int main(int argc, char** argv) {
 
   ShowerAxis const showerAxis{injectionPos, (showerCore - injectionPos) * 1.02, env,
                               false, 1000};
+  auto const dX = 10_g / square(1_cm); //Binning of the writers along the shower axis
+  uint const nAxisBins = showerAxis.getMaximumX() / dX + 1; //Get maximum number of bins
 
   // setup the radio antennas
   TimeType const groundHitTime{(showerCore - injectionPos).getNorm() / constants::c};
@@ -227,7 +229,7 @@ int main(int argc, char** argv) {
   // }
 
   // setup processes, decays and interactions
-  EnergyLossWriter energyloss{showerAxis, 10_g / square(1_cm), 200};
+  EnergyLossWriter energyloss{showerAxis, dX, nAxisBins};
   ParticleCut<SubWriter<decltype(energyloss)>> cut(5_MeV, 5_MeV, 100_GeV, 100_GeV, true,
                                                    energyloss);
 
@@ -249,7 +251,7 @@ int main(int argc, char** argv) {
   TrackWriter tracks;
   output.add("tracks", tracks);
 
-  LongitudinalWriter profile{showerAxis, 10_g / square(1_cm)};
+  LongitudinalWriter profile{showerAxis, nAxisBins, dX};
   output.add("profile", profile);
   LongitudinalProfile<SubWriter<decltype(profile)>> longprof{profile};
 
diff --git a/examples/cascade_examples/water.cpp b/examples/cascade_examples/water.cpp
index c0f995f63..5e398d5b5 100644
--- a/examples/cascade_examples/water.cpp
+++ b/examples/cascade_examples/water.cpp
@@ -199,11 +199,13 @@ int main(int argc, char** argv) {
 
   // * longitutional profile
   ShowerAxis const showerAxis{injectionPos, 1.2 * injectorLength * downVec, env};
-  LongitudinalWriter longiWriter{showerAxis, 5500, 1_g / square(1_cm)};
+  auto const dX = 1_g / square(1_cm); //Binning of the writers along the shower axis
+  uint const nAxisBins = showerAxis.getMaximumX() / dX + 1; //Get maximum number of bins
+  LongitudinalWriter longiWriter{showerAxis, nAxisBins, dX};
   LongitudinalProfile<SubWriter<decltype(longiWriter)>> longprof{longiWriter};
 
   // * energy loss profile
-  EnergyLossWriter dEdX{showerAxis, 1_g / square(1_cm), 5500};
+  EnergyLossWriter dEdX{showerAxis, dX, nAxisBins};
 
   // * physical process list
   // particle production threshold
diff --git a/examples/physics_examples/stopping_power.cpp b/examples/physics_examples/stopping_power.cpp
index cbf1733ff..28a9ff7f0 100644
--- a/examples/physics_examples/stopping_power.cpp
+++ b/examples/physics_examples/stopping_power.cpp
@@ -9,7 +9,6 @@
 #include <corsika/media/Environment.hpp>
 #include <corsika/media/HomogeneousMedium.hpp>
 #include <corsika/media/IMediumModel.hpp>
-#include <corsika/media/ShowerAxis.hpp>
 
 #include <corsika/framework/geometry/Sphere.hpp>
 #include <corsika/modules/BetheBlochPDG.hpp>
-- 
GitLab