IAP GITLAB

Skip to content
Snippets Groups Projects
Commit bf8aa703 authored by ralfulrich's avatar ralfulrich
Browse files

Improved StackInspector process

parent cd4f0249
No related branches found
No related tags found
No related merge requests found
...@@ -93,27 +93,6 @@ int main() { ...@@ -93,27 +93,6 @@ int main() {
universe.AddChild(std::move(outerMedium)); universe.AddChild(std::move(outerMedium));
// setup processes, decays and interactions
tracking_line::TrackingLine tracking;
stack_inspector::StackInspector<setup::Stack> stackInspect(1, true);
const std::vector<particles::Code> trackedHadrons = {
particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
particles::Code::KMinus, particles::Code::K0Long, particles::Code::K0Short};
random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
process::sibyll::Interaction sibyll;
process::sibyll::NuclearInteraction sibyllNuc(sibyll, env);
process::sibyll::Decay decay(trackedHadrons);
process::particle_cut::ParticleCut cut(20_GeV);
process::track_writer::TrackWriter trackWriter("tracks.dat");
process::energy_loss::EnergyLoss eLoss;
// assemble all processes into an ordered process list
auto sequence = stackInspect << sibyll << sibyllNuc << decay << eLoss << cut
<< trackWriter;
// setup particle stack, and add primary particle // setup particle stack, and add primary particle
setup::Stack stack; setup::Stack stack;
stack.Clear(); stack.Clear();
...@@ -148,6 +127,28 @@ int main() { ...@@ -148,6 +127,28 @@ int main() {
beamCode, E0, plab, pos, 0_ns, nuclA, nuclZ}); beamCode, E0, plab, pos, 0_ns, nuclA, nuclZ});
} }
// setup processes, decays and interactions
tracking_line::TrackingLine tracking;
stack_inspector::StackInspector<setup::Stack> stackInspect(1, true, E0);
const std::vector<particles::Code> trackedHadrons = {
particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
particles::Code::KMinus, particles::Code::K0Long, particles::Code::K0Short};
random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
random::RNGManager::GetInstance().RegisterRandomStream("pythia");
process::sibyll::Interaction sibyll;
process::sibyll::NuclearInteraction sibyllNuc(sibyll, env);
process::sibyll::Decay decay(trackedHadrons);
ProcessCut cut(20_GeV);
process::track_writer::TrackWriter trackWriter("tracks.dat");
process::energy_loss::EnergyLoss eLoss;
// assemble all processes into an ordered process list
auto sequence = stackInspect << sibyll << sibyllNuc << decay << eLoss << cut
<< trackWriter;
// define air shower object, run simulation // define air shower object, run simulation
cascade::Cascade EAS(env, tracking, sequence, stack); cascade::Cascade EAS(env, tracking, sequence, stack);
EAS.Init(); EAS.Init();
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <corsika/cascade/Cascade.h> #include <corsika/cascade/Cascade.h>
#include <corsika/process/ProcessSequence.h> #include <corsika/process/ProcessSequence.h>
#include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h> #include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h>
#include <corsika/process/stack_inspector/StackInspector.h>
#include <corsika/process/tracking_line/TrackingLine.h> #include <corsika/process/tracking_line/TrackingLine.h>
#include <corsika/setup/SetupStack.h> #include <corsika/setup/SetupStack.h>
...@@ -85,35 +86,6 @@ int main() { ...@@ -85,35 +86,6 @@ int main() {
const CoordinateSystem& rootCS = env.GetCoordinateSystem(); const CoordinateSystem& rootCS = env.GetCoordinateSystem();
// setup processes, decays and interactions
tracking_line::TrackingLine tracking;
const std::vector<particles::Code> trackedHadrons = {
particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
particles::Code::KMinus, particles::Code::K0Long, particles::Code::K0Short};
random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
random::RNGManager::GetInstance().RegisterRandomStream("pythia");
// process::sibyll::Interaction sibyll(env);
process::pythia::Interaction pythia;
// process::sibyll::NuclearInteraction sibyllNuc(env, sibyll);
// process::sibyll::Decay decay(trackedHadrons);
process::pythia::Decay decay(trackedHadrons);
process::particle_cut::ParticleCut cut(20_GeV);
// random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
// process::HadronicElasticModel::HadronicElasticInteraction
// hadronicElastic(env);
process::track_writer::TrackWriter trackWriter("tracks.dat");
// assemble all processes into an ordered process list
// auto sequence = sibyll << decay << hadronicElastic << cut << trackWriter;
auto sequence = pythia << decay << cut << trackWriter;
// cout << "decltype(sequence)=" << type_id_with_cvr<decltype(sequence)>().pretty_name()
// << "\n";
// setup particle stack, and add primary particle // setup particle stack, and add primary particle
setup::Stack stack; setup::Stack stack;
stack.Clear(); stack.Clear();
...@@ -145,6 +117,36 @@ int main() { ...@@ -145,6 +117,36 @@ int main() {
beamCode, E0, plab, pos, 0_ns}); beamCode, E0, plab, pos, 0_ns});
} }
// setup processes, decays and interactions
tracking_line::TrackingLine tracking;
stack_inspector::StackInspector<setup::Stack> stackInspect(1, true, E0);
const std::vector<particles::Code> trackedHadrons = {
particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
particles::Code::KMinus, particles::Code::K0Long, particles::Code::K0Short};
random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
random::RNGManager::GetInstance().RegisterRandomStream("pythia");
// process::sibyll::Interaction sibyll(env);
process::pythia::Interaction pythia;
// process::sibyll::NuclearInteraction sibyllNuc(env, sibyll);
// process::sibyll::Decay decay(trackedHadrons);
process::pythia::Decay decay(trackedHadrons);
ProcessCut cut(20_GeV);
// random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
// process::HadronicElasticModel::HadronicElasticInteraction
// hadronicElastic(env);
process::track_writer::TrackWriter trackWriter("tracks.dat");
// assemble all processes into an ordered process list
// auto sequence = sibyll << decay << hadronicElastic << cut << trackWriter;
auto sequence = pythia << decay << cut << trackWriter << stackInspect;
// cout << "decltype(sequence)=" << type_id_with_cvr<decltype(sequence)>().pretty_name()
// << "\n";
// define air shower object, run simulation // define air shower object, run simulation
cascade::Cascade EAS(env, tracking, sequence, stack); cascade::Cascade EAS(env, tracking, sequence, stack);
EAS.Init(); EAS.Init();
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <corsika/process/ProcessSequence.h> #include <corsika/process/ProcessSequence.h>
#include <corsika/process/energy_loss/EnergyLoss.h> #include <corsika/process/energy_loss/EnergyLoss.h>
#include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h> #include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h>
#include <corsika/process/stack_inspector/StackInspector.h>
#include <corsika/process/tracking_line/TrackingLine.h> #include <corsika/process/tracking_line/TrackingLine.h>
#include <corsika/setup/SetupStack.h> #include <corsika/setup/SetupStack.h>
...@@ -86,32 +87,6 @@ int main() { ...@@ -86,32 +87,6 @@ int main() {
const CoordinateSystem& rootCS = env.GetCoordinateSystem(); const CoordinateSystem& rootCS = env.GetCoordinateSystem();
// setup processes, decays and interactions
tracking_line::TrackingLine tracking;
const std::vector<particles::Code> trackedHadrons = {
particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
particles::Code::KMinus, particles::Code::K0Long, particles::Code::K0Short};
random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
process::sibyll::Interaction sibyll;
process::sibyll::NuclearInteraction sibyllNuc(sibyll, env);
process::sibyll::Decay decay(trackedHadrons);
process::particle_cut::ParticleCut cut(20_GeV);
// random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
// process::HadronicElasticModel::HadronicElasticInteraction
// hadronicElastic(env);
process::track_writer::TrackWriter trackWriter("tracks.dat");
process::energy_loss::EnergyLoss eLoss;
// assemble all processes into an ordered process list
// cut << trackWriter;
auto sequence = sibyll << sibyllNuc << decay << eLoss << cut;
// cout << "decltype(sequence)=" << type_id_with_cvr<decltype(sequence)>().pretty_name()
// << "\n";
// setup particle stack, and add primary particle // setup particle stack, and add primary particle
setup::Stack stack; setup::Stack stack;
stack.Clear(); stack.Clear();
...@@ -146,6 +121,36 @@ int main() { ...@@ -146,6 +121,36 @@ int main() {
beamCode, E0, plab, pos, 0_ns, nuclA, nuclZ}); beamCode, E0, plab, pos, 0_ns, nuclA, nuclZ});
} }
// setup processes, decays and interactions
tracking_line::TrackingLine tracking;
stack_inspector::StackInspector<setup::Stack> stackInspect(1, true, E0);
const std::vector<particles::Code> trackedHadrons = {
particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
particles::Code::KMinus, particles::Code::K0Long, particles::Code::K0Short};
random::RNGManager::GetInstance().RegisterRandomStream("s_rndm");
process::sibyll::Interaction sibyll;
process::sibyll::NuclearInteraction sibyllNuc(sibyll, env);
process::sibyll::Decay decay(trackedHadrons);
// random::RNGManager::GetInstance().RegisterRandomStream("pythia");
// process::pythia::Decay decay(trackedHadrons);
ProcessCut cut(20_GeV);
// random::RNGManager::GetInstance().RegisterRandomStream("HadronicElasticModel");
// process::HadronicElasticModel::HadronicElasticInteraction
// hadronicElastic(env);
process::track_writer::TrackWriter trackWriter("tracks.dat");
process::energy_loss::EnergyLoss eLoss;
// assemble all processes into an ordered process list
// cut << trackWriter;
auto sequence = sibyll << sibyllNuc << decay << eLoss << cut << stackInspect;
// cout << "decltype(sequence)=" << type_id_with_cvr<decltype(sequence)>().pretty_name()
// << "\n";
// define air shower object, run simulation // define air shower object, run simulation
cascade::Cascade EAS(env, tracking, sequence, stack); cascade::Cascade EAS(env, tracking, sequence, stack);
EAS.Init(); EAS.Init();
......
...@@ -131,13 +131,16 @@ public: ...@@ -131,13 +131,16 @@ public:
}; };
TEST_CASE("Cascade", "[Cascade]") { TEST_CASE("Cascade", "[Cascade]") {
HEPEnergyType E0 = 100_GeV;
random::RNGManager& rmng = random::RNGManager::GetInstance(); random::RNGManager& rmng = random::RNGManager::GetInstance();
rmng.RegisterRandomStream("cascade"); rmng.RegisterRandomStream("cascade");
auto env = MakeDummyEnv(); auto env = MakeDummyEnv();
tracking_line::TrackingLine tracking; tracking_line::TrackingLine tracking;
stack_inspector::StackInspector<TestCascadeStack> stackInspect(1, true); stack_inspector::StackInspector<TestCascadeStack> stackInspect(1, true, E0);
null_model::NullModel nullModel; null_model::NullModel nullModel;
const GrammageType X0 = 20_g / square(1_cm); const GrammageType X0 = 20_g / square(1_cm);
...@@ -154,7 +157,6 @@ TEST_CASE("Cascade", "[Cascade]") { ...@@ -154,7 +157,6 @@ TEST_CASE("Cascade", "[Cascade]") {
RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); RootCoordinateSystem::GetInstance().GetRootCoordinateSystem();
stack.Clear(); stack.Clear();
HEPEnergyType E0 = 100_GeV;
stack.AddParticle( stack.AddParticle(
std::tuple<particles::Code, units::si::HEPEnergyType, std::tuple<particles::Code, units::si::HEPEnergyType,
corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
......
...@@ -156,8 +156,8 @@ namespace corsika::process { ...@@ -156,8 +156,8 @@ namespace corsika::process {
} }
/** /**
Execute the StackProcess-es in the ProcessSequence Execute the StackProcess-es in the ProcessSequence
*/ */
template <typename TStack> template <typename TStack>
EProcessReturn DoStack(TStack& vS) { EProcessReturn DoStack(TStack& vS) {
EProcessReturn ret = EProcessReturn::eOk; EProcessReturn ret = EProcessReturn::eOk;
......
...@@ -42,6 +42,7 @@ namespace corsika::process { ...@@ -42,6 +42,7 @@ namespace corsika::process {
template <typename TStack> template <typename TStack>
inline EProcessReturn DoStack(TStack&); inline EProcessReturn DoStack(TStack&);
int GetStep() const { return fIStep; }
bool CheckStep() { return !((++fIStep) % fNStep); } bool CheckStep() { return !((++fIStep) % fNStep); }
private: private:
......
# general
add_subdirectory (NullModel) add_subdirectory (NullModel)
# tracking
add_subdirectory (TrackingLine)
# hadron interaction models
add_subdirectory (Sibyll) add_subdirectory (Sibyll)
if (PYTHIA8_FOUND) if (PYTHIA8_FOUND)
add_subdirectory (Pythia) add_subdirectory (Pythia)
endif (PYTHIA8_FOUND) endif (PYTHIA8_FOUND)
add_subdirectory (StackInspector)
add_subdirectory (TrackWriter)
add_subdirectory (TrackingLine)
add_subdirectory (HadronicElasticModel) add_subdirectory (HadronicElasticModel)
add_subdirectory (EnergyLoss)
add_subdirectory (UrQMD) add_subdirectory (UrQMD)
add_subdirectory (SwitchProcess) add_subdirectory (SwitchProcess)
add_subdirectory (ParticleCut) add_subdirectory (ParticleCut)
# continuous physics
add_subdirectory (EnergyLoss)
add_subdirectory (TrackWriter)
# stack processes
add_subdirectory (StackInspector)
# secondaries process
# cuts, thinning, etc.
##########################################
# add_custom_target(CORSIKAprocesses)
add_library (CORSIKAprocesses INTERFACE) add_library (CORSIKAprocesses INTERFACE)
add_dependencies(CORSIKAprocesses ProcessNullModel) add_dependencies(CORSIKAprocesses ProcessNullModel)
add_dependencies(CORSIKAprocesses ProcessSibyll) add_dependencies(CORSIKAprocesses ProcessSibyll)
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include <corsika/setup/SetupTrajectory.h> #include <corsika/setup/SetupTrajectory.h>
#include <chrono>
#include <iomanip>
#include <iostream> #include <iostream>
#include <limits> #include <limits>
using namespace std; using namespace std;
...@@ -27,41 +29,58 @@ using namespace corsika::units::si; ...@@ -27,41 +29,58 @@ using namespace corsika::units::si;
using namespace corsika::process::stack_inspector; using namespace corsika::process::stack_inspector;
template <typename TStack> template <typename TStack>
StackInspector<TStack>::StackInspector(const int nStep, const bool aReport) StackInspector<TStack>::StackInspector(const int vNStep, const bool vReportStack,
: StackProcess<StackInspector<TStack>>(nStep) const HEPEnergyType vE0)
, fReport(aReport) : StackProcess<StackInspector<TStack>>(vNStep)
, fCountStep(0) {} , fReportStack(vReportStack)
, fE0(vE0)
, fStartTime(std::chrono::system_clock::now()) {}
template <typename TStack> template <typename TStack>
StackInspector<TStack>::~StackInspector() {} StackInspector<TStack>::~StackInspector() {}
template <typename TStack> template <typename TStack>
process::EProcessReturn StackInspector<TStack>::DoStack(TStack const& vS) { process::EProcessReturn StackInspector<TStack>::DoStack(const TStack& vS) {
if (!fReport) return process::EProcessReturn::eOk;
[[maybe_unused]] int i = 0; [[maybe_unused]] int i = 0;
HEPEnergyType Etot = 0_GeV; HEPEnergyType Etot = 0_GeV;
for (auto& iterP : vS) { for (const auto& iterP : vS) {
HEPEnergyType E = iterP.GetEnergy(); HEPEnergyType E = iterP.GetEnergy();
Etot += E; Etot += E;
geometry::CoordinateSystem& rootCS = geometry::RootCoordinateSystem::GetInstance() if (fReportStack) {
.GetRootCoordinateSystem(); // for printout geometry::CoordinateSystem& rootCS = geometry::RootCoordinateSystem::GetInstance()
auto pos = iterP.GetPosition().GetCoordinates(rootCS); .GetRootCoordinateSystem(); // for printout
cout << "StackInspector: i=" << setw(5) << fixed << (i++) << ", id=" << setw(30) auto pos = iterP.GetPosition().GetCoordinates(rootCS);
<< iterP.GetPID() << " E=" << setw(15) << scientific << (E / 1_GeV) << " GeV, " cout << "StackInspector: i=" << setw(5) << fixed << (i++) << ", id=" << setw(30)
<< " pos=" << pos << " node = " << iterP.GetNode(); << iterP.GetPID() << " E=" << setw(15) << scientific << (E / 1_GeV) << " GeV, "
if (iterP.GetPID() == Code::Nucleus) cout << " nuc_ref=" << iterP.GetNucleusRef(); << " pos=" << pos << " node = " << iterP.GetNode();
cout << endl; if (iterP.GetPID() == Code::Nucleus) cout << " nuc_ref=" << iterP.GetNucleusRef();
cout << endl;
}
} }
fCountStep++;
cout << "StackInspector: nStep=" << fCountStep << " stackSize=" << vS.GetSize() auto const now = std::chrono::system_clock::now();
<< " Estack=" << Etot / 1_GeV << " GeV" << endl; const std::chrono::duration<double> elapsed_seconds = now - fStartTime;
std::time_t const now_time = std::chrono::system_clock::to_time_t(now);
double const progress = (fE0 - Etot) / fE0;
double const eta_seconds = elapsed_seconds.count() / progress;
std::time_t const eta_time = std::chrono::system_clock::to_time_t(
fStartTime + std::chrono::seconds((int)eta_seconds));
cout << "StackInspector: "
<< " time=" << std::put_time(std::localtime(&now_time), "%T")
<< ", running=" << elapsed_seconds.count() << " seconds"
<< " (" << setw(3) << int(progress * 100) << "%)"
<< ", nStep=" << GetStep() << ", stackSize=" << vS.GetSize()
<< ", Estack=" << Etot / 1_GeV << " GeV"
<< ", ETA=" << std::put_time(std::localtime(&eta_time), "%T") << endl;
return process::EProcessReturn::eOk; return process::EProcessReturn::eOk;
} }
template <typename TStack> template <typename TStack>
void StackInspector<TStack>::Init() { void StackInspector<TStack>::Init() {
fCountStep = 0; fReportStack = false;
fStartTime = std::chrono::system_clock::now();
} }
#include <corsika/cascade/testCascade.h> #include <corsika/cascade/testCascade.h>
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <corsika/setup/SetupTrajectory.h> #include <corsika/setup/SetupTrajectory.h>
#include <corsika/units/PhysicalUnits.h> #include <corsika/units/PhysicalUnits.h>
#include <chrono>
namespace corsika::process { namespace corsika::process {
namespace stack_inspector { namespace stack_inspector {
...@@ -24,16 +26,25 @@ namespace corsika::process { ...@@ -24,16 +26,25 @@ namespace corsika::process {
typedef typename TStack::ParticleType Particle; typedef typename TStack::ParticleType Particle;
using corsika::process::StackProcess<StackInspector<TStack>>::GetStep;
public: public:
StackInspector(const int nStep, const bool aReport); StackInspector(const int vNStep, const bool vReportStack,
const corsika::units::si::HEPEnergyType vE0);
~StackInspector(); ~StackInspector();
void Init(); void Init();
EProcessReturn DoStack(TStack const&); EProcessReturn DoStack(const TStack&);
/**
* To set a new E0, for example when a new shower event is started
*/
void SetE0(const corsika::units::si::HEPEnergyType vE0) { fE0 = vE0; }
private: private:
bool fReport; bool fReportStack;
int fCountStep = 0; corsika::units::si::HEPEnergyType fE0;
decltype(std::chrono::system_clock::now()) fStartTime;
}; };
} // namespace stack_inspector } // namespace stack_inspector
......
...@@ -49,7 +49,7 @@ TEST_CASE("StackInspector", "[processes]") { ...@@ -49,7 +49,7 @@ TEST_CASE("StackInspector", "[processes]") {
SECTION("interface") { SECTION("interface") {
StackInspector<TestCascadeStack> model(1, true); StackInspector<TestCascadeStack> model(1, true, E0);
model.Init(); model.Init();
[[maybe_unused]] const process::EProcessReturn ret = model.DoStack(stack); [[maybe_unused]] const process::EProcessReturn ret = model.DoStack(stack);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment