File indexing completed on 2025-12-16 09:23:31
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsExamples/MaterialMapping/MaterialMapping.hpp"
0010
0011 #include "Acts/Material/AccumulatedMaterialSlab.hpp"
0012 #include "Acts/Material/AccumulatedSurfaceMaterial.hpp"
0013 #include "ActsExamples/MaterialMapping/IMaterialWriter.hpp"
0014
0015 #include <stdexcept>
0016 #include <unordered_map>
0017
0018 namespace ActsExamples {
0019
0020 MaterialMapping::MaterialMapping(const MaterialMapping::Config& cfg,
0021 Acts::Logging::Level level)
0022 : IAlgorithm("MaterialMapping", level),
0023 m_cfg(cfg),
0024 m_mappingState(cfg.geoContext, cfg.magFieldContext),
0025 m_mappingStateVol(cfg.geoContext, cfg.magFieldContext) {
0026 if (!m_cfg.materialSurfaceMapper && !m_cfg.materialVolumeMapper) {
0027 throw std::invalid_argument("Missing material mapper");
0028 } else if (!m_cfg.trackingGeometry) {
0029 throw std::invalid_argument("Missing tracking geometry");
0030 }
0031
0032 m_inputMaterialTracks.initialize(m_cfg.inputMaterialTracks);
0033 m_outputMaterialTracks.initialize(m_cfg.mappingMaterialCollection);
0034
0035 ACTS_INFO("This algorithm requires inter-event information, "
0036 << "run in single-threaded mode!");
0037
0038 if (m_cfg.materialSurfaceMapper) {
0039
0040 m_mappingState = m_cfg.materialSurfaceMapper->createState(
0041 m_cfg.geoContext, m_cfg.magFieldContext, *m_cfg.trackingGeometry);
0042 }
0043 if (m_cfg.materialVolumeMapper) {
0044
0045 m_mappingStateVol = m_cfg.materialVolumeMapper->createState(
0046 m_cfg.geoContext, m_cfg.magFieldContext, *m_cfg.trackingGeometry);
0047 }
0048 }
0049
0050 ProcessCode MaterialMapping::finalize() {
0051 ACTS_INFO("Finalizing material mappig output");
0052 Acts::TrackingGeometryMaterial detectorMaterial;
0053
0054 if (m_cfg.materialSurfaceMapper && m_cfg.materialVolumeMapper) {
0055
0056 m_cfg.materialSurfaceMapper->finalizeMaps(m_mappingState);
0057 m_cfg.materialVolumeMapper->finalizeMaps(m_mappingStateVol);
0058
0059 for (auto& [key, value] : m_mappingState.surfaceMaterial) {
0060 detectorMaterial.first.insert({key, std::move(value)});
0061 }
0062
0063 for (auto& [key, value] : m_mappingStateVol.volumeMaterial) {
0064 detectorMaterial.second.insert({key, std::move(value)});
0065 }
0066 } else {
0067 if (m_cfg.materialSurfaceMapper) {
0068
0069 m_cfg.materialSurfaceMapper->finalizeMaps(m_mappingState);
0070
0071 for (auto& [key, value] : m_mappingState.surfaceMaterial) {
0072 detectorMaterial.first.insert({key, std::move(value)});
0073 }
0074
0075 for (auto& [key, value] : m_mappingState.volumeMaterial) {
0076 detectorMaterial.second.insert({key, std::move(value)});
0077 }
0078 }
0079 if (m_cfg.materialVolumeMapper) {
0080
0081 m_cfg.materialVolumeMapper->finalizeMaps(m_mappingStateVol);
0082
0083 for (auto& [key, value] : m_mappingStateVol.surfaceMaterial) {
0084 detectorMaterial.first.insert({key, std::move(value)});
0085 }
0086
0087 for (auto& [key, value] : m_mappingStateVol.volumeMaterial) {
0088 detectorMaterial.second.insert({key, std::move(value)});
0089 }
0090 }
0091 }
0092
0093 for (auto& imw : m_cfg.materialWriters) {
0094 imw->writeMaterial(detectorMaterial);
0095 }
0096
0097 return ProcessCode::SUCCESS;
0098 }
0099
0100 ProcessCode MaterialMapping::execute(const AlgorithmContext& context) const {
0101
0102 std::unordered_map<std::size_t, Acts::RecordedMaterialTrack>
0103 mtrackCollection = m_inputMaterialTracks(context);
0104
0105 if (m_cfg.materialSurfaceMapper) {
0106
0107 auto mappingState =
0108 const_cast<Acts::SurfaceMaterialMapper::State*>(&m_mappingState);
0109
0110 (*mappingState).geoContext = context.geoContext;
0111 (*mappingState).magFieldContext = context.magFieldContext;
0112 for (auto& [idTrack, mTrack] : mtrackCollection) {
0113
0114 m_cfg.materialSurfaceMapper->mapMaterialTrack(*mappingState, mTrack);
0115 }
0116 }
0117 if (m_cfg.materialVolumeMapper) {
0118
0119 auto mappingState =
0120 const_cast<Acts::VolumeMaterialMapper::State*>(&m_mappingStateVol);
0121
0122 (*mappingState).geoContext = context.geoContext;
0123 (*mappingState).magFieldContext = context.magFieldContext;
0124
0125 for (auto& [idTrack, mTrack] : mtrackCollection) {
0126
0127 m_cfg.materialVolumeMapper->mapMaterialTrack(*mappingState, mTrack);
0128 }
0129 }
0130
0131 m_outputMaterialTracks(context, std::move(mtrackCollection));
0132 return ProcessCode::SUCCESS;
0133 }
0134
0135 std::vector<std::pair<double, int>> MaterialMapping::scoringParameters(
0136 std::uint64_t surfaceID) {
0137 std::vector<std::pair<double, int>> scoringParameters;
0138
0139 if (m_cfg.materialSurfaceMapper) {
0140 auto surfaceAccumulatedMaterial = m_mappingState.accumulatedMaterial.find(
0141 Acts::GeometryIdentifier(surfaceID));
0142
0143 if (surfaceAccumulatedMaterial !=
0144 m_mappingState.accumulatedMaterial.end()) {
0145 auto matrixMaterial =
0146 surfaceAccumulatedMaterial->second.accumulatedMaterial();
0147 for (const auto& vectorMaterial : matrixMaterial) {
0148 for (const auto& AccumulatedMaterial : vectorMaterial) {
0149 auto totalVariance = AccumulatedMaterial.totalVariance();
0150 scoringParameters.push_back(
0151 {totalVariance.first, totalVariance.second});
0152 }
0153 }
0154 }
0155 }
0156 return scoringParameters;
0157 }
0158
0159 }