File indexing completed on 2025-01-19 09:23:24
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/EventData/TrackParameters.hpp"
0012 #include "Acts/Geometry/GeometryContext.hpp"
0013 #include "Acts/MagneticField/MagneticFieldContext.hpp"
0014 #include "Acts/Material/interface/IAssignmentFinder.hpp"
0015 #include "Acts/Propagator/AbortList.hpp"
0016 #include "Acts/Propagator/ActionList.hpp"
0017 #include "Acts/Propagator/Propagator.hpp"
0018 #include "Acts/Propagator/SurfaceCollector.hpp"
0019 #include "Acts/Surfaces/Surface.hpp"
0020 #include "Acts/Utilities/Logger.hpp"
0021 #include "Acts/Utilities/VectorHelpers.hpp"
0022
0023 #include <utility>
0024 #include <vector>
0025
0026 namespace Acts {
0027
0028
0029
0030
0031 struct MaterialSurfaceIdentifier {
0032
0033 bool operator()(const Surface& sf) const {
0034 return (sf.surfaceMaterial() != nullptr);
0035 }
0036 };
0037
0038
0039 struct InteractionVolumeCollector {
0040
0041
0042
0043
0044 struct this_result {
0045 std::map<GeometryIdentifier, IAssignmentFinder::VolumeAssignment> collected;
0046 };
0047
0048 using result_type = this_result;
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 template <typename propagator_state_t, typename stepper_t,
0064 typename navigator_t>
0065 void operator()(propagator_state_t& state, const stepper_t& stepper,
0066 const navigator_t& navigator, result_type& result,
0067 const Logger& ) const {
0068
0069 auto currentVolume = navigator.currentVolume(state.navigation);
0070
0071
0072 if (currentVolume != nullptr) {
0073 auto collIt = result.collected.find(currentVolume->geometryId());
0074
0075 if (collIt == result.collected.end() &&
0076 currentVolume->volumeMaterial() != nullptr) {
0077 Vector3 entryPosition = stepper.position(state.stepping);
0078 Vector3 exitPosition = entryPosition;
0079 IAssignmentFinder::VolumeAssignment vAssignment{
0080 InteractionVolume(currentVolume), entryPosition, exitPosition};
0081 result.collected.emplace(currentVolume->geometryId(), vAssignment);
0082 } else if (collIt != result.collected.end()) {
0083
0084 (collIt->second).exit = stepper.position(state.stepping);
0085 }
0086 }
0087 }
0088 };
0089
0090
0091
0092
0093
0094
0095
0096
0097 template <typename propagator_t>
0098 class PropagatorMaterialAssigner final : public IAssignmentFinder {
0099 public:
0100
0101
0102 PropagatorMaterialAssigner(propagator_t propagator)
0103 : m_propagator(std::move(propagator)) {}
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 std::pair<std::vector<IAssignmentFinder::SurfaceAssignment>,
0115 std::vector<IAssignmentFinder::VolumeAssignment>>
0116 assignmentCandidates(const GeometryContext& gctx,
0117 const MagneticFieldContext& mctx,
0118 const Vector3& position,
0119 const Vector3& direction) const final {
0120
0121 std::pair<std::vector<IAssignmentFinder::SurfaceAssignment>,
0122 std::vector<IAssignmentFinder::VolumeAssignment>>
0123 candidates;
0124
0125 using VectorHelpers::makeVector4;
0126
0127 NeutralCurvilinearTrackParameters start(
0128 makeVector4(position, 0), direction, 1, std::nullopt,
0129 NeutralParticleHypothesis::geantino());
0130
0131
0132 using MaterialSurfaceCollector =
0133 SurfaceCollector<MaterialSurfaceIdentifier>;
0134 using ActionList =
0135 ActionList<MaterialSurfaceCollector, InteractionVolumeCollector>;
0136 using AbortList = AbortList<EndOfWorldReached>;
0137
0138 PropagatorOptions<ActionList, AbortList> options(gctx, mctx);
0139
0140 const auto& result = m_propagator.propagate(start, options).value();
0141
0142
0143 auto scResult =
0144 result.template get<MaterialSurfaceCollector::result_type>();
0145 auto mappingSurfaces = scResult.collected;
0146
0147 for (auto& mSurface : mappingSurfaces) {
0148 candidates.first.push_back(IAssignmentFinder::SurfaceAssignment{
0149 mSurface.surface, mSurface.position, direction});
0150 }
0151
0152
0153 auto vcResult =
0154 result.template get<InteractionVolumeCollector::result_type>();
0155 for (auto [geoId, vIntersection] : vcResult.collected) {
0156 candidates.second.push_back(vIntersection);
0157 }
0158
0159
0160 return candidates;
0161 }
0162
0163 private:
0164 propagator_t m_propagator;
0165 };
0166
0167 }