ATLAS Offline Software
ScoreBasedAmbiguityResolutionAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 // Athena
10 
11 // ACTS
12 #include <fstream>
13 #include <iostream>
14 #include <vector>
15 
16 #include "Acts/AmbiguityResolution/ScoreBasedAmbiguityResolution.hpp"
17 #include "Acts/Definitions/Units.hpp"
18 #include "Acts/EventData/VectorMultiTrajectory.hpp"
19 #include "Acts/EventData/VectorTrackContainer.hpp"
20 #include "Acts/Plugins/Json/AmbiguityConfigJsonConverter.hpp"
21 #include "Acts/Utilities/Logger.hpp"
23 #include "ActsInterop/Logger.h"
24 #include "ActsInterop/TableUtils.h"
27 #include "src/detail/Definitions.h"
28 
29 namespace {
30 static std::size_t sourceLinkHash(const Acts::SourceLink &slink) {
31  const ActsTrk::ATLASUncalibSourceLink &atlasSourceLink =
33  const xAOD::UncalibratedMeasurement &uncalibMeas =
34  ActsTrk::getUncalibratedMeasurement(atlasSourceLink);
35  return uncalibMeas.identifier();
36 }
37 
38 static bool sourceLinkEquality(const Acts::SourceLink &a, const Acts::SourceLink &b) {
39  const xAOD::UncalibratedMeasurement &uncalibMeas_a =
42  const xAOD::UncalibratedMeasurement &uncalibMeas_b =
45 
46  return uncalibMeas_a.identifier() == uncalibMeas_b.identifier();
47 }
48 
49 } // namespace
50 
51 namespace ActsTrk {
52 
54  const std::string &name, ISvcLocator *pSvcLocator)
55  : AthReentrantAlgorithm(name, pSvcLocator) {}
56 
58  {
59  Acts::ScoreBasedAmbiguityResolution::Config cfg;
60  Acts::ConfigPair configPair;
61  nlohmann::json json_file;
62 
63  std::string fileName = PathResolver::find_file(
64  "ActsConfig/ActsAmbiguityConfig.json", "DATAPATH");
65 
66  std::ifstream file(fileName.c_str());
67  if (!file.is_open()) {
68  std::cerr << "Error opening file: " << fileName << std::endl;
69  return {};
70  }
71  file >> json_file;
72  file.close();
73 
74  Acts::from_json(json_file, configPair);
75 
76  cfg.volumeMap = configPair.first;
77  cfg.detectorConfigs = configPair.second;
78  cfg.minScore = m_minScore;
79  cfg.minScoreSharedTracks = m_minScoreSharedTracks;
80  cfg.maxSharedTracksPerMeasurement = m_maxSharedTracksPerMeasurement;
81  cfg.maxShared = m_maxShared;
82  cfg.minUnshared = m_minUnshared;
83  cfg.useAmbiguityScoring = m_useAmbiguityScoring;
84 
85  m_ambi = std::make_unique<Acts::ScoreBasedAmbiguityResolution>(
86  std::move(cfg), makeActsAthenaLogger(this, "Acts"));
87  assert(m_ambi);
88  }
89 
90  ATH_CHECK(m_monTool.retrieve(EnableTool{not m_monTool.empty()}));
93 
94  return StatusCode::SUCCESS;
95 }
96 
98  ATH_MSG_INFO("Score-based Ambiguity Resolution statistics" << std::endl
99  << makeTable(m_stat,
100  std::array<std::string, kNStat>{
101  "Input tracks",
102  "Resolved tracks",
103  "Total shared hits"}).columnWidth(10));
104  return StatusCode::SUCCESS;
105 }
106 
108  const EventContext &ctx) const {
109  auto timer = Monitored::Timer<std::chrono::milliseconds>("TIME_execute");
111 
114  ATH_CHECK(trackHandle.isValid());
115  const ActsTrk::TrackContainer* trackContainer = trackHandle.cptr();
116  m_stat[kNInputTracks] += trackContainer->size();
117 
118  // creates mutable tracks from the input tracks to add summary information
119  // NOTE: this operation likely needs to moved outside ambiguity resolution
120  auto updatedTracks =
122 
123  // create the optional cuts for the ambiguity resolution
124  Acts::ScoreBasedAmbiguityResolution::Optionals<
125  typename decltype(updatedTracks)::ConstTrackProxy>
126  Optionals;
127 
128  // Adding optional cuts
129  Optionals.cuts.push_back(ScoreBasedSolverCutsImpl::etaDependentCuts);
130 
131  // Adding optional Score Modifiers
132  Optionals.scores.push_back(ScoreBasedSolverCutsImpl::doubleHolesScore);
133  Optionals.scores.push_back(ScoreBasedSolverCutsImpl::nSCTPixelHitsScore);
134  Optionals.scores.push_back(
136  Optionals.scores.push_back(ScoreBasedSolverCutsImpl::ContribPixelLayersScore);
137 
138  // Call the ambiguity resolution algorithm with the optional cuts on the
139  // updated tracks
140  std::vector<int> goodTracks = m_ambi->solveAmbiguity(
141  updatedTracks, &sourceLinkHash, &sourceLinkEquality, Optionals);
142 
143  ATH_MSG_DEBUG("Resolved to " << goodTracks.size() << " tracks from "
144  << updatedTracks.size());
145  m_stat[kNResolvedTracks] += goodTracks.size();
146 
147 
148  // we start shortlisting the container
149  Acts::VectorTrackContainer resolvedTrackBackend;
150  Acts::VectorMultiTrajectory resolvedTrackStateBackend;
151  detail::RecoTrackContainer resolvedTracksContainer(resolvedTrackBackend, resolvedTrackStateBackend);
152 
153  resolvedTracksContainer.ensureDynamicColumns(updatedTracks);
154 
155  detail::MeasurementIndex measurementIndex;
156  detail::SharedHitCounter sharedHits;
157 
158  std::size_t totalShared = 0;
159  for (auto iTrack : goodTracks) {
160  auto destProxy = resolvedTracksContainer.getTrack(resolvedTracksContainer.addTrack());
161  destProxy.copyFrom(updatedTracks.getTrack(iTrack));
162 
163  if (m_countSharedHits) {
164  auto [nShared, nBadTrackMeasurements] = sharedHits.computeSharedHitsDynamic(destProxy, resolvedTracksContainer, measurementIndex);
165  if (nBadTrackMeasurements > 0) {
166  ATH_MSG_ERROR("computeSharedHits: " << nBadTrackMeasurements << " track measurements not found in input track");
167  }
168  totalShared += nShared;
169  }
170  }
171 
172  if (m_countSharedHits) {
173  ATH_MSG_DEBUG("total number of shared hits = " << totalShared);
174  m_stat[kNSharedHits] += totalShared;
175  }
176 
177  // make const collection
178  Acts::ConstVectorTrackContainer storableTrackBackend( std::move(resolvedTrackBackend) );
179  Acts::ConstVectorMultiTrajectory storableTrackStateBackend( std::move(resolvedTrackStateBackend) );
180  std::unique_ptr< ActsTrk::TrackContainer > storableTracksContainer = std::make_unique< ActsTrk::TrackContainer >( std::move(storableTrackBackend),
181  std::move(storableTrackStateBackend) );
183  if (resolvedTrackHandle.record( std::move(storableTracksContainer)).isFailure()) {
184  ATH_MSG_ERROR("Failed to record resolved ACTS tracks with key " << m_resolvedTracksKey.key() );
185  return StatusCode::FAILURE;
186  }
187 
188  return StatusCode::SUCCESS;
189 }
190 
191 } // namespace ActsTrk
xAOD::UncalibratedMeasurement_v1::identifier
DetectorIdentType identifier() const
Returns the full Identifier of the measurement.
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_monTool
ToolHandle< GenericMonitoringTool > m_monTool
Definition: ScoreBasedAmbiguityResolutionAlg.h:42
TrigDefs::Group
Group
Properties of a chain group.
Definition: GroupProperties.h:13
ActsTrk::TrackContainer
Definition: TrackContainer.h:30
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
Definitions.h
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
json
nlohmann::json json
Definition: HistogramDef.cxx:9
ActsTrk::ScoreBasedSolverCutsImpl::innermostPixelLayerHitsScore
void innermostPixelLayerHitsScore(const trackProxy_t &track, double &score)
Score modifier for tracks based on innermost pixel layer hits.
Definition: ScoreBasedSolverCutsImpl.cxx:185
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
ActsTrk::ScoreBasedAmbiguityResolutionAlg::finalize
virtual StatusCode finalize() override
Definition: ScoreBasedAmbiguityResolutionAlg.cxx:97
ActsTrk::ScoreBasedAmbiguityResolutionAlg::kNInputTracks
@ kNInputTracks
Definition: ScoreBasedAmbiguityResolutionAlg.h:82
ActsTrk::ScoreBasedAmbiguityResolutionAlg::ScoreBasedAmbiguityResolutionAlg
ScoreBasedAmbiguityResolutionAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: ScoreBasedAmbiguityResolutionAlg.cxx:53
ActsTrk::ScoreBasedAmbiguityResolutionAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: ScoreBasedAmbiguityResolutionAlg.cxx:107
ActsTrk::detail::SharedHitCounter
Definition: SharedHitCounter.h:19
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
ActsTrk::detail::MeasurementIndex
Definition: MeasurementIndex.h:16
SharedHitCounter.h
ActsTrk::detail::RecoTrackContainer
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:22
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_useAmbiguityScoring
Gaudi::Property< bool > m_useAmbiguityScoring
Definition: ScoreBasedAmbiguityResolutionAlg.h:64
MeasurementIndex.h
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_tracksKey
SG::ReadHandleKey< ActsTrk::TrackContainer > m_tracksKey
Definition: ScoreBasedAmbiguityResolutionAlg.h:45
python.utils.AtlRunQueryTimer.timer
def timer(name, disabled=False)
Definition: AtlRunQueryTimer.py:85
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_minUnshared
Gaudi::Property< std::size_t > m_minUnshared
Definition: ScoreBasedAmbiguityResolutionAlg.h:61
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
ActsTrk::detail::SharedHitCounter::computeSharedHitsDynamic
auto computeSharedHitsDynamic(typename track_container_t::TrackProxy &track, track_container_t &tracks, MeasurementIndex &measurementIndex, bool removeSharedHits=false) -> ReturnSharedAndBad
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_ambi
std::unique_ptr< Acts::ScoreBasedAmbiguityResolution > m_ambi
Definition: ScoreBasedAmbiguityResolutionAlg.h:74
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:274
makeActsAthenaLogger
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Definition: Tracking/Acts/ActsInterop/src/Logger.cxx:64
xAOD::UncalibratedMeasurement_v1
Definition: UncalibratedMeasurement_v1.h:13
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
makeTable
TableUtils::StatTable< T > makeTable(const std::array< T, N > &counter, const std::array< std::string, N > &label)
Definition: TableUtils.h:523
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_minScore
Gaudi::Property< double > m_minScore
Definition: ScoreBasedAmbiguityResolutionAlg.h:51
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
file
TFile * file
Definition: tile_monitor.h:29
ActsTrk::ScoreBasedSolverCutsImpl::addSummaryInformation
trackContainer_t addSummaryInformation(const ActsTrk::TrackContainer &trackContainer)
Adds summary information to the track container.
Definition: ScoreBasedSolverCutsImpl.cxx:66
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ActsTrk::ScoreBasedAmbiguityResolutionAlg::kNResolvedTracks
@ kNResolvedTracks
Definition: ScoreBasedAmbiguityResolutionAlg.h:83
python.TrackLeptonConfig.trackContainer
string trackContainer
Definition: TrackLeptonConfig.py:23
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
Monitored.h
Header file to be included by clients of the Monitored infrastructure.
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
PathResolver.h
ActsTrk::ScoreBasedSolverCutsImpl::nSCTPixelHitsScore
void nSCTPixelHitsScore(const trackProxy_t &track, double &score)
Score modifier for tracks based on number of SCT and pixel hits.
Definition: ScoreBasedSolverCutsImpl.cxx:256
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
ActsTrk::ScoreBasedSolverCutsImpl::doubleHolesScore
void doubleHolesScore(const trackProxy_t &track, double &score)
Filter for tracks based on double holes.
Definition: ScoreBasedSolverCutsImpl.cxx:157
ActsTrk::getUncalibratedMeasurement
const xAOD::UncalibratedMeasurement & getUncalibratedMeasurement(const ATLASUncalibSourceLink &source_link)
Definition: ATLASSourceLink.h:26
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_minScoreSharedTracks
Gaudi::Property< double > m_minScoreSharedTracks
Definition: ScoreBasedAmbiguityResolutionAlg.h:53
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_maxShared
Gaudi::Property< std::size_t > m_maxShared
Definition: ScoreBasedAmbiguityResolutionAlg.h:59
a
TList * a
Definition: liststreamerinfos.cxx:10
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
Definition: PathResolver.cxx:183
plotBeamSpotMon.mon
mon
Definition: plotBeamSpotMon.py:66
ActsTrk::ScoreBasedAmbiguityResolutionAlg::kNSharedHits
@ kNSharedHits
Definition: ScoreBasedAmbiguityResolutionAlg.h:84
ScoreBasedAmbiguityResolutionAlg.h
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MSTrackingVolumeBuilder.cxx:24
TableUtils.h
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_maxSharedTracksPerMeasurement
Gaudi::Property< std::size_t > m_maxSharedTracksPerMeasurement
Definition: ScoreBasedAmbiguityResolutionAlg.h:56
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_countSharedHits
Gaudi::Property< bool > m_countSharedHits
Definition: ScoreBasedAmbiguityResolutionAlg.h:72
ActsTrk::ScoreBasedAmbiguityResolutionAlg::m_resolvedTracksKey
SG::WriteHandleKey< ActsTrk::TrackContainer > m_resolvedTracksKey
Definition: ScoreBasedAmbiguityResolutionAlg.h:47
Logger.h
JetPileupTag::from_json
void from_json(const nlohmann::json &j, NNJvtBinning &binning)
Definition: NNJvtBinning.cxx:24
ActsTrk::ScoreBasedSolverCutsImpl::etaDependentCuts
bool etaDependentCuts(const trackProxy_t &track)
Filter for tracks based on eta dependent cuts.
Definition: ScoreBasedSolverCutsImpl.cxx:288
ActsTrk::ScoreBasedSolverCutsImpl::ContribPixelLayersScore
void ContribPixelLayersScore(const trackProxy_t &track, double &score)
Score modifier for tracks based on number of contributing pixel layers.
Definition: ScoreBasedSolverCutsImpl.cxx:215
Monitored::Timer
A monitored timer.
Definition: MonitoredTimer.h:32
ActsTrk::ScoreBasedAmbiguityResolutionAlg::initialize
virtual StatusCode initialize() override
Definition: ScoreBasedAmbiguityResolutionAlg.cxx:57