5#include <G4RunManager.hh>
6#include <R3BFieldConst.h>
9#include <TG4EventAction.h>
15 :
Application{
"neuland_sim", std::make_unique<FairRunSim>(), std::ref(options_.general) }
17 options_.general.input.par.clear();
18 options_.general.input.data.clear();
19 options_.general.output.data =
"sim.output.root";
20 options_.general.output.par =
"sim.par.root";
25 auto* sim_run =
dynamic_cast<FairRunSim*
>(
run);
26 setup_engine(sim_run);
27 setup_generator(sim_run);
28 setup_detectors(sim_run);
33 const auto& options = options_.simulation;
34 auto* grun = G4RunManager::GetRunManager();
35 grun->SetPrintProgress(options.event_print_num);
37 dynamic_cast<TG4EventAction*
>(
const_cast<G4UserEventAction*
>(grun->GetUserEventAction()));
38 event->VerboseLevel(0);
41 void SimulationApplication::setup_engine(FairRunSim* run)
43 const auto& options = options_;
44 run->SetName(options.simulation.engine.c_str());
45 run->SetRunId(options.general.run_id);
46 run->SetStoreTraj(options.simulation.store_trajectory);
47 run->SetMaterials(options.simulation.material_filename.c_str());
48 auto fairField = std::make_unique<R3BFieldConst>();
49 run->SetField(fairField.release());
52 void SimulationApplication::setup_generator(FairRunSim* run)
56 random_gen_ = std::make_unique<TRandom3>(options.random_seed);
57 auto primary_generator = [
this, &options, &options_pos]()
59 if (options.type ==
"muon")
61 return create_muon_generator(*random_gen_, options_pos.num_of_dp, options.energy, options_pos.location);
63 if (options.type ==
"box")
67 throw std::runtime_error(fmt::format(
"unrecognized generator type: {}!", options.type));
69 run->SetGenerator(primary_generator.release());
72 void SimulationApplication::setup_detectors(FairRunSim* run)
const
74 const auto& options = options_.detectors;
76 const auto& cave_options = options.cave;
77 if (cave_options.enable)
79 auto cave = std::make_unique<R3BCave>(cave_options.name.c_str());
80 cave->SetGeometryFileName(cave_options.geo_file.c_str());
81 run->AddModule(cave.release());
84 const auto& neuland_options = options.neuland;
85 if (neuland_options.enable)
88 const auto& location = neuland_options.location;
89 auto const neulandGeoTrans = TGeoTranslation{ location.x, location.y, location.z };
90 auto neuland = std::make_unique<R3BNeuland>(neuland_options.num_of_dp, neulandGeoTrans);
91 if (neuland_options.enable_auto_geo_build)
93 neuland->EnableAutoGeoBuild();
95 run->AddModule(neuland.release());
auto create_box_generator(double energy, int multi)
auto create_muon_generator(TRandom3 &random_gen, int num_dp, double energy, const R3B::Neuland::XYZCoordinate &pos)
Application(std::string_view name, std::unique_ptr< FairRun > run, std::reference_wrapper< Options > option)
void dump_json_options(const OptionType &options, const std::string &filename)
virtual void print_json_options()
void dump_json_options(const std::string &filename) override
void run_action(FairRun *run, int num_of_events) override
void print_json_options() override
void post_init(FairRun *run) override
void pre_init(FairRun *run) override
Simulation of NeuLAND Bar/Paddle.
struct R3B::Neuland::SimulationApplication::Options::Detector::Neuland neuland
struct R3B::Neuland::SimulationApplication::Options::Simulation::Generator generator
struct R3B::Neuland::SimulationApplication::Options::Simulation simulation
struct R3B::Neuland::SimulationApplication::Options::Detector detectors