ATLAS Offline Software
ActsMaterialMapping.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 // ATHENA
8 #include "Acts/Surfaces/PerigeeSurface.hpp"
9 #include "Acts/Utilities/Logger.hpp"
11 #include "GaudiKernel/EventContext.h"
12 #include "GaudiKernel/ISvcLocator.h"
13 
14 // ACTS
15 #include "Acts/Propagator/detail/SteppingLogger.hpp"
16 #include "Acts/Utilities/Helpers.hpp"
17 #include "Acts/Definitions/Units.hpp"
18 
19 // PACKAGE
20 #include "ActsInterop/Logger.h"
28 
29 // STL
30 #include <fstream>
31 #include <string>
32 
33 //TEST
34 #include "Acts/EventData/TrackParameters.hpp"
35 #include "Acts/Propagator/ActionList.hpp"
36 #include "Acts/Propagator/Navigator.hpp"
37 #include "Acts/Propagator/Propagator.hpp"
38 #include "Acts/Propagator/StandardAborters.hpp"
39 #include "Acts/Propagator/StraightLineStepper.hpp"
40 
42  ISvcLocator *pSvcLocator)
43  : AthAlgorithm(name, pSvcLocator),
44  m_materialTrackWriterSvc("ActsMaterialTrackWriterSvc", name),
45  m_mappingState(m_gctx,m_mctx),
46  m_mappingStateVol(m_gctx,m_mctx)
47 {}
48 
50  ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
51 
52  if(!m_mapSurfaces && !m_mapVolumes){
53  ATH_MSG_ERROR("No element to map onto defined.");
54  return StatusCode::FAILURE;
55  }
56 
59  if(m_mapSurfaces){
60  ATH_CHECK(m_surfaceMappingTool.retrieve() );
61  m_mappingState = m_surfaceMappingTool->mappingState();
62  }
63  if(m_mapVolumes){
64  ATH_CHECK(m_volumeMappingTool.retrieve() );
65  m_mappingStateVol = m_volumeMappingTool->mappingState();
66  }
69  return StatusCode::SUCCESS;
70 }
71 
73  ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
74  const EventContext& ctx = Gaudi::Hive::currentContext();
76 
77  if (materialStepCollection.isValid() and not materialStepCollection->empty()) {
78  Acts::RecordedMaterialTrack mTrack = m_materialStepConverterTool->convertToMaterialTrack(*materialStepCollection);
79 
80  if(m_mapSurfaces){
81  auto context = m_surfaceMappingTool->trackingGeometryTool()->getNominalGeometryContext().context();
82  std::reference_wrapper<const Acts::GeometryContext> geoContext(context);
83  m_mappingState.geoContext = geoContext;
84  m_surfaceMappingTool->mapper()->mapMaterialTrack(m_mappingState, mTrack);
85  }
86  if(m_mapVolumes){
87  auto context = m_volumeMappingTool->trackingGeometryTool()->getNominalGeometryContext().context();
88  std::reference_wrapper<const Acts::GeometryContext> geoContext(context);
89  m_mappingStateVol.geoContext = geoContext;
90  m_volumeMappingTool->mapper()->mapMaterialTrack(m_mappingStateVol, mTrack);
91  }
92  m_materialTrackWriterSvc->write(mTrack);
93  }
94  return StatusCode::SUCCESS;
95 }
96 
98  ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
99  Acts::DetectorMaterialMaps detectorMaterial;
100 
101  // Finalize all the maps using the cached state
103  m_surfaceMappingTool->mapper()->finalizeMaps(m_mappingState);
104  m_volumeMappingTool->mapper()->finalizeMaps(m_mappingStateVol);
105  // Loop over the state, and collect the maps for surfaces
106  for (auto& [key, value] : m_mappingState.surfaceMaterial) {
107  detectorMaterial.first.insert({key, std::move(value)});
108  }
109  // Loop over the state, and collect the maps for volumes
110  for (auto& [key, value] : m_mappingStateVol.volumeMaterial) {
111  detectorMaterial.second.insert({key, std::move(value)});
112  }
113  }
114  else{
115  if(m_mapSurfaces){
116  m_surfaceMappingTool->mapper()->finalizeMaps(m_mappingState);
117  // Loop over the state, and collect the maps for surfaces
118  for (auto& [key, value] : m_mappingState.surfaceMaterial) {
119  detectorMaterial.first.insert({key, std::move(value)});
120  }
121  // Loop over the state, and collect the maps for volumes
122  for (auto& [key, value] : m_mappingState.volumeMaterial) {
123  detectorMaterial.second.insert({key, std::move(value)});
124  }
125  }
126  if(m_mapVolumes){
127  m_volumeMappingTool->mapper()->finalizeMaps(m_mappingStateVol);
128  // Loop over the state, and collect the maps for surfaces
129  for (auto& [key, value] : m_mappingStateVol.surfaceMaterial) {
130  detectorMaterial.first.insert({key, std::move(value)});
131  }
132  // Loop over the state, and collect the maps for volumes
133  for (auto& [key, value] : m_mappingStateVol.volumeMaterial) {
134  detectorMaterial.second.insert({key, std::move(value)});
135  }
136  }
137  }
138 
139  auto context = m_surfaceMappingTool->trackingGeometryTool()->getNominalGeometryContext();
140  m_materialJsonWriterTool->write(context, detectorMaterial);
141 
142  return StatusCode::SUCCESS;
143 
144 }
IActsSurfaceMappingTool.h
IActsVolumeMappingTool.h
ActsMaterialMapping::m_materialStepConverterTool
ToolHandle< IActsMaterialStepConverterTool > m_materialStepConverterTool
Definition: ActsMaterialMapping.h:63
ActsGeometryContext.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
ActsMaterialMapping::finalize
virtual StatusCode finalize() override
Definition: ActsMaterialMapping.cxx:97
ActsMaterialMapping::m_materialJsonWriterTool
ToolHandle< IActsMaterialJsonWriterTool > m_materialJsonWriterTool
Definition: ActsMaterialMapping.h:67
Acts::RecordedMaterialTrack
std::pair< std::pair< Acts::Vector3, Acts::Vector3 >, RecordedMaterial > RecordedMaterialTrack
Recorded material track.
Definition: ActsExtrapolationAlg.cxx:43
ActsMaterialMapping::m_volumeMappingTool
ToolHandle< IActsVolumeMappingTool > m_volumeMappingTool
Definition: ActsMaterialMapping.h:66
athena.value
value
Definition: athena.py:122
ActsMaterialMapping::initialize
virtual StatusCode initialize() override
Definition: ActsMaterialMapping.cxx:49
Acts::DetectorMaterialMaps
std::pair< SurfaceMaterialMap, VolumeMaterialMap > DetectorMaterialMaps
Definition: ActsMaterialMapping.h:42
ActsMaterialMapping.h
IActsMaterialStepConverterTool.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ActsMaterialMapping::ActsMaterialMapping
ActsMaterialMapping(const std::string &name, ISvcLocator *pSvcLocator)
Definition: ActsMaterialMapping.cxx:41
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthAlgorithm
Definition: AthAlgorithm.h:47
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
ActsMaterialMapping::m_mapVolumes
Gaudi::Property< bool > m_mapVolumes
Definition: ActsMaterialMapping.h:62
ActsMaterialMapping::m_surfaceMappingTool
ToolHandle< IActsSurfaceMappingTool > m_surfaceMappingTool
Definition: ActsMaterialMapping.h:65
IActsPropStepRootWriterSvc.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsMaterialMapping::m_mappingState
Acts::SurfaceMaterialMapper::State m_mappingState
Definition: ActsMaterialMapping.h:71
ActsMaterialMapping::m_inputMaterialStepCollection
SG::ReadHandleKey< Trk::MaterialStepCollection > m_inputMaterialStepCollection
Definition: ActsMaterialMapping.h:64
ActsMaterialMapping::m_mapSurfaces
Gaudi::Property< bool > m_mapSurfaces
Definition: ActsMaterialMapping.h:61
ActsMaterialMapping::m_mappingStateVol
Acts::VolumeMaterialMapper::State m_mappingStateVol
Definition: ActsMaterialMapping.h:72
ActsMaterialMapping::m_materialTrackWriterSvc
ServiceHandle< IActsMaterialTrackWriterSvc > m_materialTrackWriterSvc
Definition: ActsMaterialMapping.h:60
IActsMaterialJsonWriterTool.h
ActsMaterialMapping::execute
virtual StatusCode execute() override
Definition: ActsMaterialMapping.cxx:72
Logger.h
IActsMaterialTrackWriterSvc.h
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
IActsTrackingGeometryTool.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37