R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BNeulandGeneratorFactory.cxx
Go to the documentation of this file.
2#include "CosmicMuon.h"
4#include "R3BException.h"
5#include "R3BNeulandCommon.h"
6#include "R3BPDGConverter.h"
7#include <FairBoxGenerator.h>
8#include <FairPrimaryGenerator.h>
9#include <R3BROOTTypeJson.h> // NOLINT
10#include <memory>
11#include <string>
12
13namespace R3B::Neuland
14{
15 auto GeneratorFactory::Create() -> std::unique_ptr<FairPrimaryGenerator>
16 {
17 switch (options_.get().generator_type)
18 {
20 return create_box_generator();
21 break;
23 return create_muon_generator();
24 break;
25 default:
26 throw R3B::logic_error("Unrecgonized generator type");
27 }
28 }
29
30 auto GeneratorFactory::create_muon_generator() -> std::unique_ptr<FairPrimaryGenerator>
31 {
32 auto& options = options_.get();
33 const auto& position = options.position;
34
35 auto detector_box_size = ::R3B::Neuland::DetectorBoxSize{};
36 detector_box_size.xmin = position.x() - R3B::Neuland::BarLength / 2;
37 detector_box_size.xmax = position.x() + R3B::Neuland::BarLength / 2;
38 detector_box_size.ymin = position.y() - R3B::Neuland::BarLength / 2;
39 detector_box_size.ymax = position.y() + R3B::Neuland::BarLength / 2;
40 detector_box_size.zmin = position.z() - (R3B::Neuland::BarSize_Z * num_of_planes_ / 2);
41 detector_box_size.zmax = position.z() + (R3B::Neuland::BarSize_Z * num_of_planes_ / 2);
42
43 auto angle_dist = R3B::Neuland::AngleDist{};
44 auto energy_dist = R3B::Neuland::EnergyDist{};
45 auto position_dist = R3B::Neuland::PositionDist{};
46
47 energy_dist.set_mean_sigma(options.energy.value, options.energy.error);
48
49 position_dist.set_box_size(detector_box_size);
50
51 auto CosmicMuonGenerator = R3B::Neuland::CreateTrackGenerator(angle_dist, energy_dist, position_dist);
52
53 CosmicMuonGenerator->set_rd_engine(random_gen_);
54
55 auto primGen = std::make_unique<FairPrimaryGenerator>();
56 primGen->AddGenerator(CosmicMuonGenerator.release());
57 return primGen;
58 }
59
60 auto GeneratorFactory::create_box_generator() -> std::unique_ptr<FairPrimaryGenerator>
61 {
62 // Primary particle generator
63 auto& options = options_.get();
64 auto converter = R3B::PDGConverter();
65 auto boxGen =
66 std::make_unique<FairBoxGenerator>(converter.get_pid(options.particle_type), options.multiplicity);
67 const auto& position = options.position;
68 boxGen->SetXYZ(position.x(), position.y(), position.z());
69 boxGen->SetThetaRange(options.theta.min, options.theta.max);
70 boxGen->SetPhiRange(options.phi.min, options.phi.max);
71 boxGen->SetEkinRange(options.energy.value - options.energy.error, options.energy.value + options.energy.error);
72 auto primGen = std::make_unique<FairPrimaryGenerator>();
73 primGen->AddGenerator(boxGen.release());
74 return primGen;
75 }
76} // namespace R3B::Neuland
auto create_muon_generator() -> std::unique_ptr< FairPrimaryGenerator >
auto create_box_generator() -> std::unique_ptr< FairPrimaryGenerator >
std::reference_wrapper< Options > options_
auto Create() -> std::unique_ptr< FairPrimaryGenerator >
Create a primary generator.
void set_box_size(DetectorBoxSize detector_box_size)
Simulation of NeuLAND Bar/Paddle.
constexpr auto BarLength
constexpr auto BarSize_Z
auto CreateTrackGenerator(const AngleDist &angle_dist, const EnergyDist &energy_dist, const PositionDist &position_dist)
Definition CosmicMuon.h:206