ATLAS Offline Software
Loading...
Searching...
No Matches
LayerMaterialProvider.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6// LayerMaterialProvider.cxx, (c) ATLAS Detector software
8
9// STL
10#include <sstream>
11#include <atomic>
12// Trk include
16#include "TrkGeometry/Layer.h"
18#include "TrkVolumes/Volume.h"
19#include "TrkSurfaces/Surface.h"
22
23// constructor
24Trk::LayerMaterialProvider::LayerMaterialProvider(const std::string& t, const std::string& n, const IInterface* p)
25: base_class(t,n,p)
26{
27 declareProperty ("LayerMaterialMapName", m_layerMaterialMapName,
28 "If LayerMaterialMapKey is not set, then fall back to retrieving this from the detector store.");
29}
30
31// destructor
33= default;
34
35
37{
39 return StatusCode::SUCCESS;
40}
41
42// Processor Action to work on TrackingGeometry
43StatusCode
45{
46 const LayerMaterialMap* layerMaterialMap = nullptr;
47 if (!m_layerMaterialMapKey.key().empty()) {
49 layerMaterialMap = *layerMaterialMapH;
50 }
51 else {
52 ATH_CHECK( detStore()->retrieve (layerMaterialMap, m_layerMaterialMapName) );
53 }
54 dumpMaterialMap (*layerMaterialMap);
55
56 ATH_MSG_VERBOSE("Start processing the TrackingGeometry recursively");
57 // retrieve the highest tracking volume
58 Trk::TrackingVolume* worldVolume = tgeo.highestTrackingVolume();
59 // check for the world volume
60 if (worldVolume){
61 // TrackingVolume : confined layers
62 ATH_MSG_VERBOSE("TrackingVolume '" << worldVolume->volumeName() << "' retrieved as highest level node.");
63 if (process(*worldVolume, *layerMaterialMap, 0).isFailure() ) {
64 ATH_MSG_FATAL("Could not load material maps for provided TrackingGeometry, abort job.");
65 return StatusCode::FAILURE;
66 }
67 // Boundary layers
68 if (!tgeo.boundaryLayers().empty()){
69 ATH_MSG_VERBOSE("TrackingGeometry has " << tgeo.numBoundaryLayers() << " unique boundary layers, loading material.");
70 for (const auto& bLayerIter : tgeo.boundaryLayers() ){
71 Trk::Layer* lay = bLayerIter.first;
72 int layCount = bLayerIter.second;
73 int layIndex = lay->layerIndex().value();
74 // only move on if layer index is different from 0
75 if (layIndex){
76 StatusCode sc( process(*lay, *layerMaterialMap, 0) );
77 // @TODO Currently recoverable errors are treated as failure. Is this the intended behaviour ? Elsewhere recoverable errors are treated as recoverable
78 if (sc.isSuccess())
79 ATH_MSG_DEBUG("---[B] Boundary layer with " << layCount << " references : successfully loaded material map for layer " << layIndex );
80 // else if (sc.isRecoverable())
81 // ATH_MSG_WARNING("Failed to call process(const Layer&) on layers - but recoverable.");
82 else {
83 ATH_MSG_FATAL("Failed to call process(const Layer&) on layer. Aborting.");
84 return StatusCode::FAILURE;
85 }
86 }
87 } // loop over layers
88 }// we have boundary layers
89 return StatusCode::SUCCESS;
90 } // we have a world volume
91 // abort job
92 ATH_MSG_FATAL("No highest level TrackingVolume found. Stopping recursive parsing, abort job.");
93 return StatusCode::FAILURE;
94}
95
96// Processor Action to work on TrackingVolumes
97StatusCode
99 size_t level) const
100{
101 const LayerMaterialMap* layerMaterialMap = nullptr;
102 if (!m_layerMaterialMapKey.key().empty()) {
104 layerMaterialMap = *layerMaterialMapH;
105 }
106 else {
107 ATH_CHECK( detStore()->retrieve (layerMaterialMap, m_layerMaterialMapName) );
108 }
109 dumpMaterialMap (*layerMaterialMap);
110 ATH_CHECK( process (tvol, *layerMaterialMap, level) );
111 return StatusCode::SUCCESS;
112}
113
114StatusCode
116 const LayerMaterialMap& layerMaterialMap,
117 size_t level) const
118{
119 std::stringstream displayBuffer;
120 for (size_t il = 0; il < level; ++il) displayBuffer << " ";
121 // formatted screen output
122 ATH_MSG_VERBOSE(displayBuffer.str() << "TrackingVolume '" << tvol.volumeName() << "'");
123
124 // @TODO add boundary surfaces
125
126 // Process the contained layers
127 Trk::LayerArray* layerArray = tvol.confinedLayers();
128 if (layerArray) {
129 // display output
130 std::span<Trk::Layer * const> layers = layerArray->arrayObjects();
131 ATH_MSG_VERBOSE(displayBuffer.str() << "--> has " << layers.size() << " confined layers." );
132 for ( const auto & layIter : layers ){
133 if (!layIter)
134 ATH_MSG_WARNING("Zero-pointer found in LayerArray - indicates problem !");
135 else {
136 // get the layer index and only process if it's an indexed layer
137 int layIndex = layIter->layerIndex().value();
138 if (layIndex){
139 StatusCode sc = process(*layIter, layerMaterialMap, level);
140 if (sc.isSuccess())
141 ATH_MSG_DEBUG(displayBuffer.str() << "---[M] Material layer: successfully loaded material map for layer " << layIndex );
142 else if (sc.isRecoverable())
143 ATH_MSG_WARNING("Failed to call process(const Layer&) on layers - but recoverable.");
144 else {
145 ATH_MSG_FATAL("Failed to call process(const Layer&) on layer. Aborting.");
146 return StatusCode::FAILURE;
147 }
148 } else
149 ATH_MSG_DEBUG(displayBuffer.str() << "---[o] Navigation layer: skipping.");
150 }
151 }
152 }
153
154 // Process the contained TrackingVolumes (recursively) if they exist
156 // register the next round
157 if (confinedVolumes) {
158 std::span<Trk::TrackingVolume * const> volumes = confinedVolumes->arrayObjects();
159 std::span<Trk::TrackingVolume * const>::iterator volumesIter = volumes.begin();
160 for (; volumesIter != volumes.end(); ++volumesIter){
161 if (!(*volumesIter))
162 ATH_MSG_WARNING("Zero-pointer found in VolumeArray - indicates problem !");
163 if ((*volumesIter) && process(**volumesIter, layerMaterialMap, ++level).isFailure() ){
164 ATH_MSG_FATAL("Failed to call process(const TrackingVolume&) on confined volumes. Aborting.");
165 return StatusCode::FAILURE;
166 }
167 }
168 }
169
170 // return
171 return StatusCode::SUCCESS;
172}
173
174// Processor Action to work on Layers
175StatusCode
177{
178 const LayerMaterialMap* layerMaterialMap = nullptr;
179 if (!m_layerMaterialMapKey.key().empty()) {
180 SG::ReadCondHandle<LayerMaterialMap> layerMaterialMapH(
182 layerMaterialMap = *layerMaterialMapH;
183 } else {
184 ATH_CHECK(detStore()->retrieve(layerMaterialMap, m_layerMaterialMapName));
185 }
186 dumpMaterialMap(*layerMaterialMap);
187 ATH_CHECK(process(lay, *layerMaterialMap, level));
188 return StatusCode::SUCCESS;
189}
190
191StatusCode
193 const LayerMaterialMap& layerMaterialMap,
194 size_t level) const
195{
196 // skip Layers w/o material
197 if (!lay.layerMaterialProperties())
198 return StatusCode::SUCCESS;
199
200 // get the layer index for assignment
201 Trk::LayerIndex lIndex = lay.layerIndex();
202
203 // display
204 std::stringstream displayBuffer;
205 for (size_t il = 0; il < level; ++il)
206 displayBuffer << " ";
207
208 // find the layer and assign the material properties
209 auto lmIter = layerMaterialMap.find(lIndex);
210 if (lmIter != layerMaterialMap.end()) {
211 ATH_MSG_VERBOSE(displayBuffer.str()
212 << "---[+] found material for Layer with Index: "
213 << lIndex.value());
214 if (lay.surfaceRepresentation().isFree()) {
215 ATH_MSG_VERBOSE(displayBuffer.str()
216 << "---[!] the Layer is not owned by the "
217 "TrackingGeometry, could indicate problem.");
218 } else {
219 ATH_MSG_VERBOSE(displayBuffer.str()
220 << "---[+] the Layer is owned by the TrackingGeometry.");
221 }
222 lay.assignMaterialProperties(*((*lmIter).second));
223 } else {
224 ATH_MSG_WARNING(displayBuffer.str()
225 << "---[!] could not find material for Layer with Index: "
226 << lIndex.value());
227 return StatusCode::RECOVERABLE;
228 }
229 return StatusCode::SUCCESS;
230}
231
232// Processor Action to work on Surfaces
234 return StatusCode::SUCCESS;
235}
236
237
238void
240{
241 if (msgLvl (MSG::VERBOSE)) {
242 static std::atomic_flag flag ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT;
243 if (!flag.test_and_set()) {
244 ATH_MSG_VERBOSE("Listing the layer indeces found in the loaded LayerMaterialMap");
245 for ( const auto & lmIter : layerMaterialMap ){
246 ATH_MSG_VERBOSE(" -> Found map for layer with index " << lmIter.first);
247 }
248 }
249 }
250}
251
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
Binned Array for avoiding map searches/.
Definition BinnedArray.h:36
virtual std::span< T *const > arrayObjects()=0
Return all objects of the Array non-const we can still modify the T.
LayerIndex for the identification of layers in a simplified detector geometry of Cylinders and Discs.
Definition LayerIndex.h:37
int value() const
layerIndex expressed in an integer
Definition LayerIndex.h:71
This class extends the DataVector<Trk::LayerMaterialProperties> by an elementTable;.
void dumpMaterialMap(const LayerMaterialMap &layerMaterialMap) const
virtual StatusCode initialize() override
virtual StatusCode process(TrackingGeometry &tgeo) const override
Processor Action to work on TrackingGeometry& tgeo.
SG::ReadCondHandleKey< LayerMaterialMap > m_layerMaterialMapKey
virtual ~LayerMaterialProvider()
Destructor.
LayerMaterialProvider(const std::string &, const std::string &, const IInterface *)
Constructor.
Base Class for a Detector Layer in the Tracking realm.
Definition Layer.h:72
void assignMaterialProperties(const LayerMaterialProperties &, double scale=1.0)
assignMaterialPropeties
Definition Layer.cxx:177
virtual const Surface & surfaceRepresentation() const =0
Transforms the layer into a Surface representation for extrapolation.
const LayerMaterialProperties * layerMaterialProperties() const
getting the LayerMaterialProperties including full/pre/post update
const LayerIndex & layerIndex() const
get the layerIndex
Abstract Base Class for tracking surfaces.
bool isFree() const
Returns 'true' if this surface is 'free', i.e.
The TrackingGeometry class is the owner of the constructed TrackingVolumes.
const std::map< Layer *, int > & boundaryLayers()
Return the unique BoundarySurfaces with MaterialInformation.
const TrackingVolume * highestTrackingVolume() const
return the world
size_t numBoundaryLayers() const
Full Volume description used in Tracking, it inherits from Volume to get the geometrical structure,...
const LayerArray * confinedLayers() const
Return the subLayer array.
const TrackingVolumeArray * confinedVolumes() const
Return the subLayer array.
const std::string & volumeName() const
Returns the VolumeName - for debug reason, might be depreciated later.
const std::string process
BinnedArray< Layer > LayerArray
simply for the eye