Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-01-07 10:01:45

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/phys/ProcessBuilder.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include <functional>
0010 #include <memory>
0011 #include <set>
0012 #include <unordered_map>
0013 #include <vector>
0014 
0015 #include "celeritas/ext/GeantPhysicsOptions.hh"
0016 #include "celeritas/inp/ProcessBuilder.hh"
0017 #include "celeritas/io/ImportProcess.hh"
0018 #include "celeritas/io/ImportSBTable.hh"
0019 
0020 #include "AtomicNumber.hh"
0021 #include "Process.hh"
0022 
0023 namespace celeritas
0024 {
0025 //---------------------------------------------------------------------------//
0026 class ImportedProcesses;
0027 class MaterialParams;
0028 class ParticleParams;
0029 struct ImportData;
0030 struct ImportLivermorePE;
0031 struct ImportMuPairProductionTable;
0032 
0033 //---------------------------------------------------------------------------//
0034 /*!
0035  * Construct Celeritas EM processes from imported data.
0036  *
0037  * This factory class has a hardcoded map that takes a \c ImportProcessClass
0038  * and constructs a built-in EM process (which will then build corresponding
0039  * models). This map can be overridden or extended by the \c user_build
0040  * constructor argument, which is a mapping of process class to user-supplied
0041  * factory functions.
0042  *
0043  * The function can return a null process pointer (in which case the caller
0044  * *must* ignore it) to indicate that a process should be deliberately omitted
0045  * from Celeritas. This can be used to (for example) skip very-high-energy
0046  * processes if Celeritas offloads only tracks below some energy cutoff. See \c
0047  * WarnAndIgnoreProcess below for a helper function for this purpose.
0048  *
0049  * \note Imported data may have multiple duplicate "process" entries, one
0050  * per particle type, because that's how Geant4 manages processes.
0051  */
0052 class ProcessBuilder
0053 {
0054   public:
0055     //!@{
0056     //! \name Type aliases
0057     using IPC = ImportProcessClass;
0058     using SPProcess = std::shared_ptr<Process>;
0059     using SPConstParticle = std::shared_ptr<ParticleParams const>;
0060     using SPConstMaterial = std::shared_ptr<MaterialParams const>;
0061     using SPConstImported = std::shared_ptr<ImportedProcesses const>;
0062     //!@}
0063 
0064     //!@{
0065     //! \name User builder type aliases
0066     using UserBuildInput = inp::ProcessBuilderInput;
0067     using UserBuildFunction = inp::ProcessBuilderFunction;
0068     using UserBuildMap = inp::ProcessBuilderMap;
0069     //!@}
0070 
0071   public:
0072     // Get an ordered set of all available processes
0073     static std::set<IPC>
0074     get_all_process_classes(std::vector<ImportProcess> const& processes);
0075 
0076     // Construct from imported and shared data and user construction
0077     ProcessBuilder(ImportData const& data,
0078                    SPConstParticle particle,
0079                    SPConstMaterial material,
0080                    UserBuildMap user_build);
0081 
0082     // Construct without custom user builders
0083     ProcessBuilder(ImportData const& data,
0084                    SPConstParticle particle,
0085                    SPConstMaterial material);
0086 
0087     // Default destructor
0088     ~ProcessBuilder();
0089 
0090     // Create a process from the data
0091     SPProcess operator()(IPC ipc);
0092 
0093   private:
0094     //// DATA ////
0095 
0096     UserBuildInput input_;
0097     UserBuildMap user_build_map_;
0098     std::function<ImportSBTable(AtomicNumber)> read_sb_;
0099     std::function<ImportLivermorePE(AtomicNumber)> read_livermore_;
0100     std::function<inp::Grid(AtomicNumber)> read_neutron_elastic_;
0101     std::shared_ptr<ImportMuPairProductionTable> mu_pairprod_table_;
0102 
0103     bool enable_lpm_;
0104 
0105     //// HELPER FUNCTIONS ////
0106 
0107     SPConstMaterial const material() const { return input_.material; }
0108     SPConstParticle const particle() const { return input_.particle; }
0109     SPConstImported const imported() const { return input_.imported; }
0110 
0111     auto build_annihilation() -> SPProcess;
0112     auto build_compton() -> SPProcess;
0113     auto build_conversion() -> SPProcess;
0114     auto build_coulomb() -> SPProcess;
0115     auto build_ebrems() -> SPProcess;
0116     auto build_eioni() -> SPProcess;
0117     auto build_mubrems() -> SPProcess;
0118     auto build_muioni() -> SPProcess;
0119     auto build_mupairprod() -> SPProcess;
0120     auto build_msc() -> SPProcess;
0121     auto build_neutron_elastic() -> SPProcess;
0122     auto build_photoelectric() -> SPProcess;
0123     auto build_rayleigh() -> SPProcess;
0124 };
0125 
0126 //---------------------------------------------------------------------------//
0127 /*!
0128  * Warn about a missing process and deliberately skip it.
0129  *
0130  * Example:
0131  * \code
0132   ProcessBuilder::UserBuildMap ubm;
0133   ubm.emplace(ImportProcessClass::coulomb_scat,
0134               WarnAndIgnoreProcess{ImportProcessClass::coulomb_scat});
0135  * \endcode
0136  */
0137 struct WarnAndIgnoreProcess
0138 {
0139     //// TYPES ////
0140     using argument_type = ProcessBuilder::UserBuildInput const&;
0141     using result_type = ProcessBuilder::SPProcess;
0142 
0143     //// DATA ////
0144 
0145     ImportProcessClass process;
0146 
0147     //// METHODS ////
0148 
0149     result_type operator()(argument_type) const;
0150 };
0151 
0152 //---------------------------------------------------------------------------//
0153 }  // namespace celeritas