Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-07 10:11:38

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file celeritas/optical/gen/PrimaryGenerator.hh
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  * Sample optical photons from user-configurable distributions.
0026  *
0027  * This samples a user-specified number of photons from user-configurable
0028  * distributions specified in \c celeritas::inp::OpticalPrimaryGenerator .
0029  *
0030  * \internal The \c DistributionVisitor is responsible for managing the
0031  * std::variant-like behavior of this class by mapping distribution IDs to
0032  * type-deleted data.
0033  */
0034 class PrimaryGenerator
0035 {
0036   public:
0037     // Construct from distribution data
0038     inline CELER_FUNCTION PrimaryGenerator(
0039         NativeCRef<DistributionParamsData> const& params,
0040         PrimaryDistributionData const& data);
0041 
0042     // Sample an optical photon from the distributions
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 // INLINE DEFINITIONS
0053 //---------------------------------------------------------------------------//
0054 /*!
0055  * Construct from optical materials and distribution parameters.
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  * Sample an optical photon from the energy, angular and spatial distributions.
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 = {};  // No associated Geant4 primary
0083     result.polarization = TransversePolarizationSampler{result.direction}(rng);
0084 
0085     return result;
0086 }
0087 
0088 //---------------------------------------------------------------------------//
0089 }  // namespace optical
0090 }  // namespace celeritas