File indexing completed on 2025-12-15 10:11:02
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <functional>
0010 #include <memory>
0011 #include <random>
0012 #include <vector>
0013
0014 #include "celeritas/Types.hh"
0015 #include "celeritas/io/EventIOInterface.hh"
0016
0017 #include "PDGNumber.hh"
0018 #include "PrimaryGeneratorOptions.hh"
0019
0020 namespace celeritas
0021 {
0022
0023 class ParticleParams;
0024 struct Primary;
0025 namespace inp
0026 {
0027 struct PrimaryGenerator;
0028 }
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 class PrimaryGenerator : public EventReaderInterface
0044 {
0045 public:
0046
0047
0048 using PrimaryGeneratorEngine = std::mt19937;
0049 using EnergySampler = std::function<real_type(PrimaryGeneratorEngine&)>;
0050 using PositionSampler = std::function<Real3(PrimaryGeneratorEngine&)>;
0051 using DirectionSampler = std::function<Real3(PrimaryGeneratorEngine&)>;
0052 using SPConstParticles = std::shared_ptr<ParticleParams const>;
0053 using result_type = std::vector<Primary>;
0054 using Input = inp::PrimaryGenerator;
0055
0056
0057 public:
0058
0059 static PrimaryGenerator
0060 from_options(SPConstParticles, PrimaryGeneratorOptions const&);
0061
0062
0063 PrimaryGenerator(Input const&, ParticleParams const& particles);
0064
0065
0066 PrimaryGenerator(Input const&, std::vector<ParticleId> particle_ids);
0067
0068
0069 CELER_DELETE_COPY_MOVE(PrimaryGenerator);
0070 ~PrimaryGenerator() override = default;
0071
0072
0073 result_type operator()() final;
0074
0075
0076 size_type num_events() const override { return num_events_; }
0077
0078
0079 void seed(UniqueEventId);
0080
0081 private:
0082 size_type num_events_{};
0083 size_type primaries_per_event_{};
0084 unsigned int seed_{};
0085 EnergySampler sample_energy_;
0086 PositionSampler sample_pos_;
0087 DirectionSampler sample_dir_;
0088 std::vector<ParticleId> particle_id_;
0089 size_type event_count_{0};
0090 PrimaryGeneratorEngine rng_;
0091 };
0092
0093 }