File indexing completed on 2025-08-05 08:09:08
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Material/ISurfaceMaterial.hpp"
0012 #include "Acts/Material/Material.hpp"
0013 #include "Acts/Material/MaterialProperties.hpp"
0014 #include "Acts/Propagator/ActionList.hpp"
0015 #include "Acts/Surfaces/Surface.hpp"
0016 #include "Fatras/Kernel/PhysicsList.hpp"
0017 #include "detail/RandomNumberDistributions.hpp"
0018 #include <climits>
0019 #include <cmath>
0020 #include <sstream>
0021 #include <utility>
0022
0023 namespace Fatras {
0024
0025 struct VoidSelector {
0026
0027 bool operator()(const Acts::Surface &) const { return false; }
0028 };
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 template <typename generator_t, typename particle_t, typename hit_t,
0049 typename hit_creator_t, typename sensitive_selector_t = VoidSelector,
0050 typename physics_list_t = PhysicsList<>>
0051 struct Interactor {
0052 using PhysicsList_t = physics_list_t;
0053
0054
0055 generator_t *generator = nullptr;
0056
0057
0058 sensitive_selector_t sensitiveSelector;
0059
0060
0061 physics_list_t physicsList;
0062
0063
0064 particle_t initialParticle;
0065
0066
0067 hit_creator_t hitCreator;
0068
0069
0070
0071 struct this_result {
0072
0073
0074 bool initialized = false;
0075
0076
0077 particle_t particle;
0078
0079
0080 std::vector<particle_t> outgoing;
0081
0082
0083 std::vector<hit_t> simulatedHits;
0084 };
0085
0086 typedef this_result result_type;
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 template <typename propagator_state_t, typename stepper_t>
0106 void operator()(propagator_state_t &state, stepper_t &stepper,
0107 result_type &result) const {
0108
0109
0110 if (state.navigation.targetReached)
0111 return;
0112
0113
0114 if (!result.initialized) {
0115
0116 result.particle = initialParticle;
0117 result.initialized = true;
0118 }
0119
0120 auto position = stepper.position(state.stepping);
0121 auto direction = stepper.direction(state.stepping);
0122 auto p = stepper.momentum(state.stepping);
0123
0124
0125 result.particle.update(position, p * direction, 0., 0.,
0126 stepper.time(state.stepping));
0127
0128
0129 bool sensitive = state.navigation.currentSurface
0130 ? sensitiveSelector(*state.navigation.currentSurface)
0131 : false;
0132 double depositedEnergy = 0.;
0133
0134
0135 if (state.navigation.currentSurface &&
0136 state.navigation.currentSurface->surfaceMaterial()) {
0137
0138 auto sMaterial = state.navigation.currentSurface->surfaceMaterial();
0139 const Acts::MaterialProperties &mProperties =
0140 sMaterial->materialProperties(position);
0141 bool breakIndicator = false;
0142 if (mProperties) {
0143
0144 breakIndicator = physicsList(*generator, mProperties, result.particle,
0145 result.outgoing);
0146 }
0147 }
0148
0149 position = result.particle.position();
0150 direction = result.particle.momentum().normalized();
0151 stepper.update(state.stepping, position, direction, result.particle.p(),
0152 result.particle.time());
0153
0154 if (sensitive) {
0155
0156 double htime =
0157 stepper.time(state.stepping);
0158 hit_t simHit =
0159 hitCreator(*state.navigation.currentSurface, position, direction,
0160 depositedEnergy, htime, result.particle);
0161 result.simulatedHits.push_back(std::move(simHit));
0162 }
0163 }
0164
0165
0166
0167 template <typename propagator_state_t, typename stepper_t>
0168 void operator()(propagator_state_t &, stepper_t &) const {}
0169 };
0170 }