Back to home page

EIC code displayed by LXR

 
 

    


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

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/mucf/executor/detail/MuonicAtomSpinSelector.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include "corecel/Assert.hh"
0010 #include "corecel/random/distribution/BernoulliDistribution.hh"
0011 #include "celeritas/Quantities.hh"
0012 #include "celeritas/Types.hh"
0013 #include "celeritas/mucf/Types.hh"
0014 
0015 namespace celeritas
0016 {
0017 namespace detail
0018 {
0019 //---------------------------------------------------------------------------//
0020 /*!
0021  * Select muonic atom spin, in units of \f$ \frac{\hbar}{2} \f$.
0022  *
0023  * Sampling is based on spin population probabilities from
0024  * \citet{yamashita-muonicspin-2022,
0025  * https://doi.org/10.1038/s41598-022-09487-0}
0026  * which are:
0027  * - Muonic deuterium: 2/3 probability for spin 3/2; 1/3 for spin 1/2
0028  * - Muonic tritium: 3/4 probability for spin 1; 1/4 for spin 0
0029  */
0030 class MuonicAtomSpinSelector
0031 {
0032   public:
0033     // Construct with muonic atom type
0034     inline CELER_FUNCTION MuonicAtomSpinSelector(MucfMuonicAtom atom);
0035 
0036     // Sample and return a spin value in units of hbar/2
0037     template<class Engine>
0038     inline CELER_FUNCTION units::HalfSpinInt operator()(Engine& rng);
0039 
0040   private:
0041     MucfMuonicAtom atom_;
0042 
0043     // Muonic deuterium spin probabilities: 2/3 for spin 3/2; 1/3 for spin 1/2
0044     constexpr CELER_FUNCTION real_type deuterium_spin_probability()
0045     {
0046         using namespace celeritas::literals;
0047         return 2_r / 3;
0048     }
0049 
0050     // Muonic tritium spin probabilities: 3/4 for spin 1; 1/4 for spin 0
0051     constexpr CELER_FUNCTION real_type tritium_spin_probability()
0052     {
0053         using namespace celeritas::literals;
0054         return 0.75_r;
0055     }
0056 };
0057 
0058 //---------------------------------------------------------------------------//
0059 // INLINE DEFINITIONS
0060 //---------------------------------------------------------------------------//
0061 /*!
0062  * Construct with muonic atom.
0063  */
0064 CELER_FUNCTION MuonicAtomSpinSelector::MuonicAtomSpinSelector(
0065     MucfMuonicAtom atom)
0066     : atom_(atom)
0067 {
0068     CELER_EXPECT(atom_ < MucfMuonicAtom::size_);
0069 }
0070 
0071 //---------------------------------------------------------------------------//
0072 /*!
0073  * Select a muonic atom spin, in units of \f$ \frac{\hbar}{2} \f$.
0074  */
0075 template<class Engine>
0076 CELER_FUNCTION units::HalfSpinInt MuonicAtomSpinSelector::operator()(
0077     Engine& rng)
0078 {
0079     switch (atom_)
0080     {
0081         case MucfMuonicAtom::deuterium:
0082             return BernoulliDistribution(this->deuterium_spin_probability())(
0083                        rng)
0084                        ? units::HalfSpinInt{3}  // Spin 3/2
0085                        : units::HalfSpinInt{1};  // Spin 1/2
0086 
0087         case MucfMuonicAtom::tritium:
0088             return BernoulliDistribution(this->tritium_spin_probability())(rng)
0089                        ? units::HalfSpinInt{2}  // Spin 1
0090                        : units::HalfSpinInt{0};  // Spin 0
0091         default:
0092             CELER_ASSERT_UNREACHABLE();
0093     }
0094 }
0095 
0096 //---------------------------------------------------------------------------//
0097 }  // namespace detail
0098 }  // namespace celeritas