File indexing completed on 2025-09-15 08:54:49
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 struct ProcessBuilderOptions
0036 {
0037 bool brem_combined{false};
0038 };
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 class ProcessBuilder
0060 {
0061 public:
0062
0063
0064 using IPC = ImportProcessClass;
0065 using Options = ProcessBuilderOptions;
0066 using SPProcess = std::shared_ptr<Process>;
0067 using SPConstParticle = std::shared_ptr<ParticleParams const>;
0068 using SPConstMaterial = std::shared_ptr<MaterialParams const>;
0069 using SPConstImported = std::shared_ptr<ImportedProcesses const>;
0070
0071
0072
0073
0074 using UserBuildInput = inp::ProcessBuilderInput;
0075 using UserBuildFunction = inp::ProcessBuilderFunction;
0076 using UserBuildMap = inp::ProcessBuilderMap;
0077
0078
0079 public:
0080
0081 static std::set<IPC>
0082 get_all_process_classes(std::vector<ImportProcess> const& processes);
0083
0084
0085 ProcessBuilder(ImportData const& data,
0086 SPConstParticle particle,
0087 SPConstMaterial material,
0088 UserBuildMap user_build,
0089 Options options);
0090
0091
0092 ProcessBuilder(ImportData const& data,
0093 SPConstParticle particle,
0094 SPConstMaterial material,
0095 Options options);
0096
0097
0098 ~ProcessBuilder();
0099
0100
0101 SPProcess operator()(IPC ipc);
0102
0103 private:
0104
0105
0106 UserBuildInput input_;
0107 UserBuildMap user_build_map_;
0108 std::function<ImportSBTable(AtomicNumber)> read_sb_;
0109 std::function<ImportLivermorePE(AtomicNumber)> read_livermore_;
0110 std::function<inp::Grid(AtomicNumber)> read_neutron_elastic_;
0111 std::shared_ptr<ImportMuPairProductionTable> mu_pairprod_table_;
0112
0113 bool brem_combined_;
0114 bool enable_lpm_;
0115
0116
0117
0118 SPConstMaterial const material() const { return input_.material; }
0119 SPConstParticle const particle() const { return input_.particle; }
0120 SPConstImported const imported() const { return input_.imported; }
0121
0122 auto build_annihilation() -> SPProcess;
0123 auto build_compton() -> SPProcess;
0124 auto build_conversion() -> SPProcess;
0125 auto build_coulomb() -> SPProcess;
0126 auto build_ebrems() -> SPProcess;
0127 auto build_eioni() -> SPProcess;
0128 auto build_mubrems() -> SPProcess;
0129 auto build_muioni() -> SPProcess;
0130 auto build_mupairprod() -> SPProcess;
0131 auto build_msc() -> SPProcess;
0132 auto build_neutron_elastic() -> SPProcess;
0133 auto build_photoelectric() -> SPProcess;
0134 auto build_rayleigh() -> SPProcess;
0135 };
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148 struct WarnAndIgnoreProcess
0149 {
0150
0151 using argument_type = ProcessBuilder::UserBuildInput const&;
0152 using result_type = ProcessBuilder::SPProcess;
0153
0154
0155
0156 ImportProcessClass process;
0157
0158
0159
0160 result_type operator()(argument_type) const;
0161 };
0162
0163
0164 }