11 #include <PROPOSAL/PROPOSAL.h> 14 #include <corsika/framework/random/RNGManager.hpp> 24 static constexpr std::array<Code, 7> tracked{
25 Code::Photon, Code::Electron, Code::Positron, Code::MuMinus,
26 Code::MuPlus, Code::TauPlus, Code::TauMinus,
33 static constexpr
double v_cut = 0.01;
40 static std::map<Code, PROPOSAL::ParticleDef> particle = {
41 {Code::Photon, PROPOSAL::GammaDef()}, {Code::Electron, PROPOSAL::EMinusDef()},
42 {Code::Positron, PROPOSAL::EPlusDef()}, {Code::MuMinus, PROPOSAL::MuMinusDef()},
43 {Code::MuPlus, PROPOSAL::MuPlusDef()}, {Code::TauMinus, PROPOSAL::TauMinusDef()},
44 {Code::TauPlus, PROPOSAL::TauPlusDef()}};
52 auto cross_builder = [](PROPOSAL::Medium& medium,
55 auto particle_def = T();
57 CORSIKA_LOG_DEBUG(
"PROPOSAL: Generate general cross sections for particle type {} ",
59 auto interpolate =
true;
62 std::make_shared<const PROPOSAL::EnergyCutSettings>(emCut / 1_MeV, v_cut,
false);
66 std::make_shared<const PROPOSAL::EnergyCutSettings>(emCut / 1_MeV, 1,
false);
68 auto cross_vec = std::vector<std::shared_ptr<PROPOSAL::CrossSectionBase>>();
69 cross_vec.push_back(PROPOSAL::make_crosssection(
70 PROPOSAL::crosssection::BremsKelnerKokoulinPetrukhin{
false}, particle_def, medium,
72 cross_vec.push_back(PROPOSAL::make_crosssection(
73 PROPOSAL::crosssection::EpairKelnerKokoulinPetrukhin{
false}, particle_def, medium,
75 cross_vec.push_back(PROPOSAL::make_crosssection(
76 PROPOSAL::crosssection::IonizBetheBlochRossi{*p_cut_no_vcut}, particle_def,
77 medium, p_cut_no_vcut, interpolate));
78 cross_vec.push_back(PROPOSAL::make_crosssection(
79 PROPOSAL::crosssection::PhotoAbramowiczLevinLevyMaor97{
80 std::make_unique<PROPOSAL::crosssection::ShadowButkevichMikheyev>()},
81 particle_def, medium, p_cut, interpolate));
88 auto cross_builder<PROPOSAL::GammaDef> =
89 [](PROPOSAL::Medium& medium,
91 auto particle_def = PROPOSAL::GammaDef();
93 "PROPOSAL: Generate photon cross sections for particle type {} ",
96 auto interpolate =
true;
97 auto cross_vec = std::vector<std::shared_ptr<PROPOSAL::CrossSectionBase>>();
99 PROPOSAL::make_crosssection(PROPOSAL::crosssection::PhotoPairKochMotz{
false},
100 particle_def, medium,
nullptr, interpolate);
101 cross_vec.push_back(std::move(photopair));
103 PROPOSAL::make_crosssection(PROPOSAL::crosssection::ComptonKleinNishina{},
104 particle_def, medium,
nullptr, interpolate);
105 cross_vec.push_back(std::move(compton));
106 auto photoproduction = PROPOSAL::make_crosssection(
107 PROPOSAL::crosssection::PhotoproductionHeckC7Shadowing{}, particle_def,
108 medium,
nullptr, interpolate);
109 cross_vec.push_back(std::move(photoproduction));
111 PROPOSAL::make_crosssection(PROPOSAL::crosssection::PhotoeffectSauter{},
112 particle_def, medium,
nullptr, interpolate);
113 cross_vec.push_back(std::move(photoeffect));
119 auto cross_builder<PROPOSAL::EMinusDef> =
120 [](PROPOSAL::Medium& medium,
123 auto particle_def = PROPOSAL::EMinusDef();
126 "PROPOSAL: Generate electron cross sections for particle type {} ",
128 auto interpolate =
true;
130 auto p_cut = std::make_shared<const PROPOSAL::EnergyCutSettings>(emCut / 1_MeV,
135 std::make_shared<const PROPOSAL::EnergyCutSettings>(emCut / 1_MeV, 1,
false);
137 auto cross_vec = std::vector<std::shared_ptr<PROPOSAL::CrossSectionBase>>();
138 cross_vec.push_back(PROPOSAL::make_crosssection(
139 PROPOSAL::crosssection::BremsElectronScreening{
false}, particle_def, medium,
140 p_cut, interpolate));
141 cross_vec.push_back(PROPOSAL::make_crosssection(
142 PROPOSAL::crosssection::EpairForElectronPositron{
false}, particle_def, medium,
143 p_cut, interpolate));
144 cross_vec.push_back(PROPOSAL::make_crosssection(
145 PROPOSAL::crosssection::IonizBergerSeltzerMoller{*p_cut_no_vcut},
146 particle_def, medium, p_cut_no_vcut, interpolate));
147 cross_vec.push_back(PROPOSAL::make_crosssection(
148 PROPOSAL::crosssection::PhotoAbramowiczLevinLevyMaor97{
149 std::make_unique<PROPOSAL::crosssection::ShadowButkevichMikheyev>()},
150 particle_def, medium, p_cut, interpolate));
157 auto cross_builder<PROPOSAL::EPlusDef> =
158 [](PROPOSAL::Medium& medium,
161 auto particle_def = PROPOSAL::EPlusDef();
164 "PROPOSAL: Generate positron cross sections for particle type {} ",
166 auto interpolate =
true;
168 auto p_cut = std::make_shared<const PROPOSAL::EnergyCutSettings>(emCut / 1_MeV,
173 std::make_shared<const PROPOSAL::EnergyCutSettings>(emCut / 1_MeV, 1,
false);
175 auto cross_vec = std::vector<std::shared_ptr<PROPOSAL::CrossSectionBase>>();
176 cross_vec.push_back(PROPOSAL::make_crosssection(
177 PROPOSAL::crosssection::BremsElectronScreening{
false}, particle_def, medium,
178 p_cut, interpolate));
179 cross_vec.push_back(PROPOSAL::make_crosssection(
180 PROPOSAL::crosssection::EpairForElectronPositron{
false}, particle_def, medium,
181 p_cut, interpolate));
182 cross_vec.push_back(PROPOSAL::make_crosssection(
183 PROPOSAL::crosssection::IonizBergerSeltzerBhabha{*p_cut_no_vcut},
184 particle_def, medium, p_cut_no_vcut, interpolate));
185 cross_vec.push_back(PROPOSAL::make_crosssection(
186 PROPOSAL::crosssection::PhotoAbramowiczLevinLevyMaor97{
187 std::make_unique<PROPOSAL::crosssection::ShadowButkevichMikheyev>()},
188 particle_def, medium, p_cut, interpolate));
190 PROPOSAL::make_crosssection(PROPOSAL::crosssection::AnnihilationHeitler{},
191 particle_def, medium,
nullptr, interpolate));
200 static std::map<Code, std::function<PROPOSAL::crosssection_list_t(
202 cross = {{Code::Photon, cross_builder<PROPOSAL::GammaDef>},
203 {Code::Electron, cross_builder<PROPOSAL::EMinusDef>},
204 {Code::Positron, cross_builder<PROPOSAL::EPlusDef>},
205 {Code::MuMinus, cross_builder<PROPOSAL::MuMinusDef>},
206 {Code::MuPlus, cross_builder<PROPOSAL::MuPlusDef>},
207 {Code::TauMinus, cross_builder<PROPOSAL::TauMinusDef>},
208 {Code::TauPlus, cross_builder<PROPOSAL::TauPlusDef>}};
218 std::unordered_map<std::size_t, PROPOSAL::Medium>
226 template <
typename TEnvironment>
234 using calc_key_t = std::pair<std::size_t, Code>;
241 size_t operator()(
const calc_key_t& p)
const noexcept;
254 template <
typename Particle,
typename Calculators>
256 const auto& comp = vP.getNode()->getModelProperties().getNuclearComposition();
257 auto calc_it = calc.find(std::make_pair(comp.getHash(), vP.getPID()));
258 if (calc_it != calc.end())
return calc_it;
265 #include <corsika/detail/modules/proposal/ProposalProcessBase.inl> PROPOSAL base process which handels mapping of particle codes to stored interpolation tables...
auto getCalculator(Particle &vP, Calculators &calc)
Searches the particle dependet calculator dependent of actuall medium composition and particle type...
bool canInteract(Code pcode) const
Checks if a particle can be processed by proposal.
virtual void buildCalculator(Code, NuclearComposition const &)=0
Builds the calculator to the corresponding class.
std::unordered_map< std::size_t, PROPOSAL::Medium > media
maps nuclear composition from univers to media to produce crosssections, which requires further ioniz...
Hash to store interpolation tables related to a pair of particle and nuclear composition.
Describes the composition of matter Allowes and handles the creation of custom matter compositions...
Interface to particle properties.
ProposalProcessBase(TEnvironment const &_env)
Store cut and nuclear composition of the whole universe in media which are required for creating cros...
prng_type & getRandomStream(string_type const &streamName)