ATLAS Offline Software
Loading...
Searching...
No Matches
AmbiguityResolutionAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// Athena
9
10// ACTS
11#include "Acts/Definitions/Units.hpp"
12
13#include "Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp"
14#include "Acts/EventData/MultiTrajectoryHelpers.hpp"
15#include "Acts/EventData/VectorMultiTrajectory.hpp"
16#include "Acts/EventData/VectorTrackContainer.hpp"
17#include "Acts/Utilities/Logger.hpp"
18
19#include "ActsInterop/Logger.h"
21
25
27
28namespace ActsTrk {
29
31 {
32 {
33 Acts::GreedyAmbiguityResolution::Config cfg;
34 cfg.maximumSharedHits = m_maximumSharedHits;
35 cfg.maximumIterations = m_maximumIterations;
36 cfg.nMeasurementsMin = m_nMeasurementsMin;
37 m_ambi = std::make_unique<Acts::GreedyAmbiguityResolution>(std::move(cfg), makeActsAthenaLogger(this, "Acts") ) ;
38 assert( m_ambi );
39 }
40
41 ATH_CHECK(m_monTool.retrieve(EnableTool{not m_monTool.empty()}));
42 ATH_CHECK(m_tracksKey.initialize());
43 ATH_CHECK(m_resolvedTracksKey.initialize());
44
45
46 return StatusCode::SUCCESS;
47 }
48
50 ATH_MSG_INFO("Ambiguity Resolution statistics" << std::endl
51 << makeTable(m_stat,
52 std::array<std::string, kNStat>{
53 "Input tracks",
54 "Resolved tracks",
55 "Total shared hits"}).columnWidth(10));
56 return StatusCode::SUCCESS;
57 }
58
59 StatusCode AmbiguityResolutionAlg::execute(const EventContext &ctx) const
60 {
61 auto timer = Monitored::Timer<std::chrono::milliseconds>( "TIME_execute" );
62 auto mon = Monitored::Group( m_monTool, timer );
63
64 const ActsTrk::TrackContainer* trackContainer{};
65 ATH_CHECK(SG::get(trackContainer, m_tracksKey, ctx));
66 m_stat[kNInputTracks] += trackContainer->size();
67
68 Acts::GreedyAmbiguityResolution::State state;
69
70
71 m_ambi->computeInitialState(*trackContainer, state, &detail::sourceLinkHash,
73 m_ambi->resolve(state);
74
75 ATH_MSG_DEBUG("Resolved to " << state.selectedTracks.size() << " tracks from "
76 << trackContainer->size());
77 m_stat[kNResolvedTracks] += state.selectedTracks.size();
78
79
80 // we start shortlisting the container
81 Acts::VectorTrackContainer resolvedTrackBackend;
82 Acts::VectorMultiTrajectory resolvedTrackStateBackend;
83 detail::RecoTrackContainer resolvedTracksContainer(resolvedTrackBackend, resolvedTrackStateBackend);
84
85 // need centralized function here
86 resolvedTracksContainer.ensureDynamicColumns(*trackContainer);
87
88 detail::MeasurementIndex measurementIndex;
89 detail::SharedHitCounter sharedHits;
90
91 std::size_t totalShared = 0;
94
95 for (auto iTrack : state.selectedTracks) {
96 auto destProxy = resolvedTracksContainer.getTrack(resolvedTracksContainer.addTrack());
97 destProxy.copyFrom(trackContainer->getTrack(state.trackTips.at(iTrack)));
98
100 auto [nShared, nBadTrackMeasurements] = sharedHits.computeSharedHitsDynamic(destProxy, resolvedTracksContainer, measurementIndex);
101 if (nBadTrackMeasurements > 0)
102 ATH_MSG_ERROR("computeSharedHits: " << nBadTrackMeasurements << " track measurements not found in input track");
103 totalShared += nShared;
104 }
105 }
106
107 if (m_countSharedHits) {
108 ATH_MSG_DEBUG("total number of shared hits = " << totalShared);
109 m_stat[kNSharedHits] += totalShared;
110 }
111
112 // make const collection
113 Acts::ConstVectorTrackContainer storableTrackBackend( std::move(resolvedTrackBackend) );
114 Acts::ConstVectorMultiTrajectory storableTrackStateBackend( std::move(resolvedTrackStateBackend) );
115 std::unique_ptr< ActsTrk::TrackContainer > storableTracksContainer = std::make_unique< ActsTrk::TrackContainer >( std::move(storableTrackBackend),
116 std::move(storableTrackStateBackend) );
117 SG::WriteHandle resolvedTrackHandle{m_resolvedTracksKey, ctx };
118 ATH_CHECK(resolvedTrackHandle.record( std::move(storableTracksContainer)));
119
120 return StatusCode::SUCCESS;
121 }
122
123} // namespace
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Header file to be included by clients of the Monitored infrastructure.
TableUtils::StatTable< T > makeTable(const std::array< T, N > &counter, const std::array< std::string, N > &label)
Definition TableUtils.h:543
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
ToolHandle< GenericMonitoringTool > m_monTool
Gaudi::Property< unsigned int > m_maximumSharedHits
virtual StatusCode finalize() override
std::unique_ptr< Acts::GreedyAmbiguityResolution > m_ambi
SG::ReadHandleKey< ActsTrk::TrackContainer > m_tracksKey
SG::WriteHandleKey< ActsTrk::TrackContainer > m_resolvedTracksKey
Gaudi::Property< bool > m_countSharedHits
virtual StatusCode initialize() override
Gaudi::Property< unsigned int > m_maximumIterations
Gaudi::Property< unsigned int > m_nMeasurementsMin
virtual StatusCode execute(const EventContext &ctx) const override
auto computeSharedHitsDynamic(typename track_container_t::TrackProxy &track, track_container_t &tracks, MeasurementIndex &measurementIndex, bool removeSharedHits=false) -> ReturnSharedAndBad
Group of local monitoring quantities and retain correlation when filling histograms
A monitored timer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
bool sourceLinkEquality(const Acts::SourceLink &a, const Acts::SourceLink &b)
Returns whether two source links are equal.
std::size_t sourceLinkHash(const Acts::SourceLink &sl)
Calculates the source link hash which is evaluated to be the identifier of the underlying sourcelink.
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.