File indexing completed on 2026-11-07 10:11:38
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include "corecel/Assert.hh"
0010 #include "corecel/Macros.hh"
0011 #include "corecel/Types.hh"
0012 #include "corecel/random/data/DistributionData.hh"
0013 #include "corecel/random/distribution/DistributionVisitor.hh"
0014 #include "celeritas/phys/InteractionUtils.hh"
0015
0016 #include "PrimaryGeneratorData.hh"
0017 #include "../TrackInitializer.hh"
0018
0019 namespace celeritas
0020 {
0021 namespace optical
0022 {
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 class PrimaryGenerator
0035 {
0036 public:
0037
0038 inline CELER_FUNCTION PrimaryGenerator(
0039 NativeCRef<DistributionParamsData> const& params,
0040 PrimaryDistributionData const& data);
0041
0042
0043 template<class Generator>
0044 inline CELER_FUNCTION optical::TrackInitializer operator()(Generator& rng);
0045
0046 private:
0047 NativeCRef<DistributionParamsData> const& params_;
0048 PrimaryDistributionData const& data_;
0049 };
0050
0051
0052
0053
0054
0055
0056
0057 CELER_FUNCTION PrimaryGenerator::PrimaryGenerator(
0058 NativeCRef<DistributionParamsData> const& params,
0059 PrimaryDistributionData const& data)
0060 : params_(params), data_(data)
0061 {
0062 CELER_EXPECT(params_);
0063 CELER_EXPECT(data_);
0064 }
0065
0066
0067
0068
0069
0070 template<class Generator>
0071 CELER_FUNCTION optical::TrackInitializer PrimaryGenerator::operator()(
0072 Generator& rng)
0073 {
0074 DistributionVisitor visit{params_};
0075
0076 optical::TrackInitializer result;
0077 result.energy = units::MevEnergy{sample_with(visit, data_.energy, rng)};
0078 CELER_ASSERT(result.energy > zero_quantity());
0079 result.position = sample_with(visit, data_.shape, rng);
0080 result.direction = sample_with(visit, data_.angle, rng);
0081 CELER_ASSERT(is_soft_unit_vector(result.direction));
0082 result.primary = {};
0083 result.polarization = TransversePolarizationSampler{result.direction}(rng);
0084
0085 return result;
0086 }
0087
0088
0089 }
0090 }