File indexing completed on 2026-01-07 10:01:45
0001
0002
0003
0004
0005
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
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 class ProcessBuilder
0053 {
0054 public:
0055
0056
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
0066 using UserBuildInput = inp::ProcessBuilderInput;
0067 using UserBuildFunction = inp::ProcessBuilderFunction;
0068 using UserBuildMap = inp::ProcessBuilderMap;
0069
0070
0071 public:
0072
0073 static std::set<IPC>
0074 get_all_process_classes(std::vector<ImportProcess> const& processes);
0075
0076
0077 ProcessBuilder(ImportData const& data,
0078 SPConstParticle particle,
0079 SPConstMaterial material,
0080 UserBuildMap user_build);
0081
0082
0083 ProcessBuilder(ImportData const& data,
0084 SPConstParticle particle,
0085 SPConstMaterial material);
0086
0087
0088 ~ProcessBuilder();
0089
0090
0091 SPProcess operator()(IPC ipc);
0092
0093 private:
0094
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
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
0129
0130
0131
0132
0133
0134
0135
0136
0137 struct WarnAndIgnoreProcess
0138 {
0139
0140 using argument_type = ProcessBuilder::UserBuildInput const&;
0141 using result_type = ProcessBuilder::SPProcess;
0142
0143
0144
0145 ImportProcessClass process;
0146
0147
0148
0149 result_type operator()(argument_type) const;
0150 };
0151
0152
0153 }