ATLAS Offline Software
AmbiguityProcessorBase.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 
8 #include "GaudiKernel/RenounceToolInputsVisitor.h"
9 #include "GaudiKernel/ToolVisitor.h"
10 
11 namespace Trk {
13  const std::string& n,
14  const IInterface* p)
15  : AthAlgTool(t, n, p),
16  m_etaBounds{0.8, 1.6, 2.5, 4.0},
17  m_stat(m_etaBounds) {}
18 //
20  const Trk::Track& track) const {
21  return m_tryBremFit and
22  not(track.info().trackProperties(Trk::TrackInfo::BremFit)) and
23  (track.trackParameters()->front()->pT() > m_pTminBrem) and
24  ((not m_caloSeededBrem) or
25  track.info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI));
26 }
27 
29  // init ClusterSplitProb input and output container handles and renounce the
30  // output handle from its tools. the latter works because the ClusterSplitProb
31  // output container is created and recorded before the tools are called.
36  if (!m_clusterSplitProbContainerOut.key().empty()) {
37  auto visitor = [this](const IAlgTool* tool) {
38  const AlgTool* alg_tool = dynamic_cast<const AlgTool*>(tool);
39  for (Gaudi::DataHandle* handle : alg_tool->inputHandles()) {
40  this->msg(MSG::DEBUG) << " input Handle " << tool->name() << " . "
41  << handle->objKey() << endmsg;
42  }
43  for (const auto& elm : alg_tool->inputDataObjs()) {
44  this->msg(MSG::DEBUG)
45  << " input object " << tool->name() << " . " << elm.key() << endmsg;
46  }
47  };
48  if (msgLvl(MSG::DEBUG)) {
49  ToolVisitor::visit(tools(), visitor);
50  }
52  ATH_MSG_DEBUG(" Renounce " << m_clusterSplitProbContainerOut.objKey());
53  auto logger = RenounceToolInputsVisitor::createLogger(
54  [this](const std::string_view& tool_name, const std::string_view& key) {
55  this->msg(MSG::INFO)
56  << " Renounce " << tool_name << " . " << key << endmsg;
57  });
58  RenounceToolInputsVisitor renounce(
59  std::vector<DataObjID>{m_clusterSplitProbContainerOut.fullKey()},
60  logger);
61  ToolVisitor::visit(tools(), renounce);
62  ATH_MSG_DEBUG(" renounced " << m_clusterSplitProbContainerOut.objKey());
63  if (msgLvl(MSG::DEBUG)) {
64  ToolVisitor::visit(tools(), visitor);
65  }
66  }
67  return StatusCode::SUCCESS;
68 }
69 
72  const EventContext& ctx) const {
74  if (!m_clusterSplitProbContainerIn.key().empty()) {
75  splitProbContainerIn = SG::ReadHandle(m_clusterSplitProbContainerIn, ctx);
76  if (!splitProbContainerIn.isValid()) {
77  ATH_MSG_ERROR("Failed to get input cluster split probability container "
79  }
80  }
81  std::unique_ptr<Trk::ClusterSplitProbabilityContainer> newSplitProbContainer(
83  ? std::make_unique<Trk::ClusterSplitProbabilityContainer>(
84  *splitProbContainerIn)
85  : std::make_unique<Trk::ClusterSplitProbabilityContainer>());
87  splitProbContainerHandle;
88  if (!m_clusterSplitProbContainerOut.key().empty()) {
89  splitProbContainerHandle =
92  if (splitProbContainerHandle.record(std::move(newSplitProbContainer))
93  .isFailure()) {
95  "Failed to record output cluster split probability container "
97  }
98  // newSplitProbContainer owned by storegate -> no cleanup
99  return {splitProbContainerHandle.ptr(),
101  } else {
102  // when not recording the split prob container in storegate the container
103  // must be deleted once going out of scope
104  return {newSplitProbContainer.release(),
105  [](Trk::ClusterSplitProbabilityContainer* ptr) { delete ptr; }};
106  }
107 }
108 
110  const Trk::Track& track, const TrackParameters* pPar) const {
111  return m_tryBremFit and (pPar->pT() > m_pTminBrem) and
112  ((not m_caloSeededBrem) or
113  track.info().patternRecoInfo(Trk::TrackInfo::TrackInCaloROI));
114 }
115 //
117  Trk::PRDtoTrackMap& prdToTrackMap,
118  Counter& stat, int trackId,
119  int subtrackId) const {
120  std::unique_ptr<Trk::Track> newTrack;
121  if (!m_suppressTrackFit) {
122  if (m_refitPrds) {
123  // simple case, fit PRD directly
124  ATH_MSG_VERBOSE("Refit track " << track << " from PRDs");
125  newTrack.reset(refitPrds(track, prdToTrackMap, stat));
126  } else {
127  // ok, we fit ROTs
128  ATH_MSG_VERBOSE("Refit track " << track << " from ROTs");
129  newTrack.reset(refitRots(track, stat));
130  }
131  } else {
133  }
134  if (newTrack) {
135  if (m_observerTool.isEnabled()) {
136  m_observerTool->rejectTrack(trackId, xAOD::RejectionStep::refitTrack,
138  m_observerTool->addSubTrack(subtrackId, trackId, *newTrack);
139  }
140  ATH_MSG_DEBUG("New track " << newTrack.get() << " successfully fitted from "
141  << track);
142  } else {
143  if (m_observerTool.isEnabled()) {
144  m_observerTool->rejectTrack(trackId, xAOD::RejectionStep::refitTrack,
146  }
147  ATH_MSG_DEBUG("Fit failed !");
148  }
149  return newTrack.release();
150 }
151 //
153  Trk::Track* in_track, const bool fitted, TrackScoreMap& trackScoreTrackMap,
154  std::vector<std::unique_ptr<const Trk::Track> >& trackDustbin,
155  Counter& stat, int parentTrackId) const {
156  std::unique_ptr<Trk::Track> atrack(in_track);
157  // compute score
159  bool suppressHoleSearch = fitted ? m_suppressHoleSearch : true;
160  if (m_trackSummaryTool.isEnabled()) {
161  m_trackSummaryTool->computeAndReplaceTrackSummary(*atrack,
162  suppressHoleSearch);
163  }
164  score = m_scoringTool->score(*atrack);
165  if (m_observerTool.isEnabled()) {
166  m_observerTool->updateScore(parentTrackId, static_cast<double>(score));
167  }
168  // do we accept the track ?
169  if (score != 0) {
170  ATH_MSG_DEBUG("Track (" << atrack.get() << ") has score " << score);
171  // statistic
172  stat.incrementCounterByRegion(CounterIndex::kNscoreOk, atrack.get());
173  // add track to map, map is sorted small to big !
174  if (m_observerTool.isEnabled()) {
175  trackScoreTrackMap.emplace(
176  -score, TrackPtr(atrack.release(), fitted, parentTrackId));
177  } else {
178  trackScoreTrackMap.emplace(-score, TrackPtr(atrack.release(), fitted));
179  }
180  return;
181  }
182  // do we try to recover the track ?
183  if (fitted and shouldTryBremRecovery(*atrack)) {
184  ATH_MSG_DEBUG("Track score is zero, try to recover it via brem fit");
185  // run track fit using electron hypothesis
186  auto bremTrack(doBremRefit(*atrack));
187  if (!bremTrack) {
188  ATH_MSG_DEBUG("Brem refit failed, drop track");
189  if (m_observerTool.isEnabled()) {
190  m_observerTool->rejectTrack(parentTrackId,
193  }
194  // statistic
195  stat.incrementCounterByRegion(CounterIndex::kNscoreZeroBremRefitFailed,
196  atrack.get());
197  stat.incrementCounterByRegion(CounterIndex::kNfailedFits, atrack.get());
198  // clean up
199  trackDustbin.push_back(std::move(atrack));
200  } else {
201  int newTrackId = AmbiguityProcessor::getUid();
202  if (m_observerTool.isEnabled()) {
203  m_observerTool->rejectTrack(
204  parentTrackId, xAOD::RejectionStep::addTrack,
206  m_observerTool->addSubTrack(newTrackId, parentTrackId, *bremTrack);
207  }
208  // statistic
209  stat.incrementCounterByRegion(CounterIndex::kNgoodFits, bremTrack.get());
210  // rerun score
211  if (m_trackSummaryTool.isEnabled()) {
212  m_trackSummaryTool->computeAndReplaceTrackSummary(*bremTrack,
213  suppressHoleSearch);
214  }
215  score = m_scoringTool->score(*bremTrack);
216  if (m_observerTool.isEnabled()) {
217  m_observerTool->updateScore(newTrackId, static_cast<double>(score));
218  }
219  // put original track in the bin, ready to preserve a new Brem track
220  trackDustbin.push_back(std::move(atrack));
221  // do we accept the track ?
222  if (score != 0) {
223  ATH_MSG_DEBUG("Brem refit successful, recovered track ("
224  << bremTrack.get() << ") has score " << score);
225  // statistics
226  stat.incrementCounterByRegion(CounterIndex::kNscoreZeroBremRefit,
227  bremTrack.get());
228  // add track to map, map is sorted small to big !
229  if (m_observerTool.isEnabled()) {
230  m_observerTool->addSubTrack(newTrackId, parentTrackId, *bremTrack);
231  trackScoreTrackMap.emplace(
232  -score, TrackPtr(bremTrack.release(), fitted, newTrackId));
233  } else {
234  trackScoreTrackMap.emplace(-score,
235  TrackPtr(bremTrack.release(), fitted));
236  }
237  return;
238  } else {
239  ATH_MSG_DEBUG("Brem refit gave still track score zero, reject it");
240  if (m_observerTool.isEnabled()) {
241  m_observerTool->rejectTrack(
242  newTrackId, xAOD::RejectionStep::addTrack,
244  }
245  // statistic
246  stat.incrementCounterByRegion(
248  }
249  }
250  } else {
251  ATH_MSG_DEBUG("Track score is zero, reject it");
252  if (m_observerTool.isEnabled()) {
253  m_observerTool->rejectTrack(parentTrackId, xAOD::RejectionStep::addTrack,
255  }
256  // statistic
257  stat.incrementCounterByRegion(CounterIndex::kNscoreZero, atrack.get());
258  trackDustbin.push_back(std::move(atrack));
259  }
260 }
261 
263  const Trk::Track* track) const {
264  const TrackParameters* par = track->perigeeParameters();
265  if (not par) {
266  ATH_MSG_DEBUG("Track (" << track << ") has no perigee! Try any other ?");
267  par = track->trackParameters()->front();
268  }
269  if (not par)
270  ATH_MSG_DEBUG("Track (" << track
271  << ") has no Track Parameters ! No refit !");
272  return par;
273 }
274 
275 //==================================================================================================
276 
278  Counter& stat) const {
279  ATH_MSG_VERBOSE("Refit track " << track);
280  // refit using first parameter, do outliers
281  std::unique_ptr<Trk::Track> newTrack{};
282  if (m_tryBremFit and track->info().trackProperties(Trk::TrackInfo::BremFit)) {
283  stat.incrementCounterByRegion(CounterIndex::kNbremFits, track);
284  ATH_MSG_VERBOSE("Brem track, refit with electron brem fit");
285  newTrack = doBremRefit(*track);
286  } else {
287  stat.incrementCounterByRegion(CounterIndex::kNfits, track);
288  ATH_MSG_VERBOSE("Normal track, refit");
289  newTrack = fit(*track, true, m_particleHypothesis);
290  if ((not newTrack) and shouldTryBremRecovery(*track)) {
291  stat.incrementCounterByRegion(CounterIndex::kNrecoveryBremFits, track);
292  ATH_MSG_VERBOSE("Normal fit failed, try brem recovery");
293  newTrack = doBremRefit(*track);
294  }
295  }
296 
297  if (newTrack) {
298  stat.incrementCounterByRegion(CounterIndex::kNgoodFits, newTrack.get());
299  // keeping the track of previously accumulated TrackInfo
300  const Trk::TrackInfo& originalInfo = track->info();
301  newTrack->info().addPatternReco(originalInfo);
302  } else {
303  stat.incrementCounterByRegion(CounterIndex::kNfailedFits, track);
304  }
305  return newTrack.release();
306 }
307 } // namespace Trk
Trk::AmbiguityProcessorBase::CounterIndex::kNfailedFits
@ kNfailedFits
Trk::AmbiguityProcessorBase::m_clusterSplitProbContainerIn
SG::ReadHandleKey< Trk::ClusterSplitProbabilityContainer > m_clusterSplitProbContainerIn
Definition: AmbiguityProcessorBase.h:150
Trk::TrackInfo
Contains information about the 'fitter' of this track.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:32
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
Trk::AmbiguityProcessorBase::m_pTminBrem
float m_pTminBrem
Definition: AmbiguityProcessorBase.h:160
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
xAOD::refitTrackScoreZero
@ refitTrackScoreZero
Definition: TrackingPrimitives.h:485
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
xAOD::bremRefitTrackScoreZero
@ bremRefitTrackScoreZero
Definition: TrackingPrimitives.h:484
Trk::AmbiguityProcessorBase::CounterIndex::kNbremFits
@ kNbremFits
Trk::PRDtoTrackMap
Definition: PRDtoTrackMap.h:17
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
Trk::AmbiguityProcessorBase::refitTrack
Track * refitTrack(const Trk::Track *track, Trk::PRDtoTrackMap &prdToTrackMap, Counter &stat, int trackId, int subtrackId) const
refit track
Definition: AmbiguityProcessorBase.cxx:116
AmbiguityProcessorBase.h
Trk::AmbiguityProcessorBase::CounterIndex::kNscoreZeroBremRefitFailed
@ kNscoreZeroBremRefitFailed
Trk::AmbiguityProcessorBase::UniqueClusterSplitProbabilityContainerPtr
std::unique_ptr< Trk::ClusterSplitProbabilityContainer, void(*)(Trk::ClusterSplitProbabilityContainer *)> UniqueClusterSplitProbabilityContainerPtr
Definition: AmbiguityProcessorBase.h:115
AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)
Definition: AthCommonDataStore.h:380
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Trk::AmbiguityProcessorBase::refitRots
virtual Trk::Track * refitRots(const Trk::Track *track, Counter &stat) const
Definition: AmbiguityProcessorBase.cxx:277
Trk::AmbiguityProcessorBase::createAndRecordClusterSplitProbContainer
AmbiguityProcessorBase::UniqueClusterSplitProbabilityContainerPtr createAndRecordClusterSplitProbContainer(const EventContext &ctx) const
Create a new cluster splitting probability container and (optionally) record it in storegate The new ...
Definition: AmbiguityProcessorBase.cxx:71
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
Trk::AmbiguityProcessorBase::m_refitPrds
bool m_refitPrds
Definition: AmbiguityProcessorBase.h:164
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
Trk::AmbiguityProcessorBase::m_observerTool
PublicToolHandle< Trk::ITrkObserverTool > m_observerTool
Observer tool This tool is used to observe the tracks and their 'score'.
Definition: AmbiguityProcessorBase.h:140
Trk::AmbiguityProcessorBase::AmbiguityProcessorBase
AmbiguityProcessorBase(const std::string &, const std::string &, const IInterface *)
Definition: AmbiguityProcessorBase.cxx:12
Trk::AmbiguityProcessorBase::CounterIndex::kNfits
@ kNfits
Trk::AmbiguityProcessorBase::initializeClusterSplitProbContainer
StatusCode initializeClusterSplitProbContainer()
Initialize read and write handles for ClusterSplitProbabilityContainers.
Definition: AmbiguityProcessorBase.cxx:28
xAOD::addTrack
@ addTrack
Definition: TrackingPrimitives.h:465
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Trk::AmbiguityProcessorBase::CounterIndex::kNscoreZero
@ kNscoreZero
beamspotman.n
n
Definition: beamspotman.py:731
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::WriteHandle::ptr
pointer_type ptr()
Dereference the pointer.
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::AmbiguityProcessorBase::shouldTryBremRecovery
bool shouldTryBremRecovery(const Trk::Track &track) const
Definition: AmbiguityProcessorBase.cxx:19
Trk::AmbiguityProcessorBase::CounterIndex::kNscoreZeroBremRefitScoreZero
@ kNscoreZeroBremRefitScoreZero
xAOD::bremRefitFailed
@ bremRefitFailed
Definition: TrackingPrimitives.h:482
Trk::AmbiguityProcessorBase::fit
virtual std::unique_ptr< Trk::Track > fit(const Track &track, bool flag, Trk::ParticleHypothesis hypo) const =0
Trk::TrackScore
float TrackScore
Definition: TrackScore.h:10
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AmbiguityProcessor::createNewFitQualityTrack
std::unique_ptr< Trk::Track > createNewFitQualityTrack(const Trk::Track &track)
Definition: AmbiguityProcessorUtility.cxx:33
Trk::TrackInfo::BremFit
@ BremFit
A brem fit was performed on this track.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:78
Trk::ParametersBase
Definition: ParametersBase.h:55
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
Trk::TrackInfo::TrackInCaloROI
@ TrackInCaloROI
A track in a CaloROI.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:236
xAOD::refitFailed
@ refitFailed
Definition: TrackingPrimitives.h:480
Trk::AmbiguityProcessorBase::getTrackParameters
const TrackParameters * getTrackParameters(const Trk::Track *track) const
Definition: AmbiguityProcessorBase.cxx:262
beamspotman.stat
stat
Definition: beamspotman.py:266
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::bremRefitSubtrackCreated
@ bremRefitSubtrackCreated
Definition: TrackingPrimitives.h:483
Trk::AmbiguityProcessorBase::m_tryBremFit
bool m_tryBremFit
brem recovery mode with brem fit ?
Definition: AmbiguityProcessorBase.h:158
Trk::AmbiguityProcessorBase::CounterIndex::kNrecoveryBremFits
@ kNrecoveryBremFits
Trk::AmbiguityProcessorBase::m_scoringTool
ToolHandle< ITrackScoringTool > m_scoringTool
Scoring tool This tool is used to 'score' the tracks, i.e.
Definition: AmbiguityProcessorBase.h:136
Trk::AmbiguityProcessorBase::addTrack
void addTrack(Trk::Track *in_track, const bool fitted, TrackScoreMap &trackScoreTrackMap, std::vector< std::unique_ptr< const Trk::Track > > &trackDustbin, Counter &stat, int parentTrackId) const
Definition: AmbiguityProcessorBase.cxx:152
Trk::AmbiguityProcessorBase::m_clusterSplitProbContainerOut
SG::WriteHandleKey< Trk::ClusterSplitProbabilityContainer > m_clusterSplitProbContainerOut
Definition: AmbiguityProcessorBase.h:153
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::ParametersBase::pT
double pT() const
Access method for transverse momentum.
tools
Definition: DataQuality/ZLumiScripts/python/tools/__init__.py:1
createCoolChannelIdFile.par
par
Definition: createCoolChannelIdFile.py:29
Trk::AmbiguityProcessorBase::m_trackSummaryTool
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
Definition: AmbiguityProcessorBase.h:142
Trk::ClusterSplitProbabilityContainer
Container to associate Cluster with cluster splitting probabilities.
Definition: ClusterSplitProbabilityContainer.h:17
Trk::AmbiguityProcessorBase::m_suppressHoleSearch
bool m_suppressHoleSearch
Definition: AmbiguityProcessorBase.h:161
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:453
xAOD::score
@ score
Definition: TrackingPrimitives.h:513
Trk::AmbiguityProcessorBase::m_particleHypothesis
Trk::ParticleHypothesis m_particleHypothesis
Definition: AmbiguityProcessorBase.h:171
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
AmbiguityProcessor::getUid
int getUid()
Definition: AmbiguityProcessorUtility.cxx:60
Trk::AmbiguityProcessorBase::m_suppressTrackFit
bool m_suppressTrackFit
Definition: AmbiguityProcessorBase.h:163
Track
Definition: TriggerChamberClusterOnTrackCreator.h:21
AmbiguityProcessorUtility.h
Trk::AmbiguityProcessorBase::doBremRefit
virtual std::unique_ptr< Trk::Track > doBremRefit(const Trk::Track &track) const =0
Trk::AmbiguityProcessorBase::refitPrds
virtual Trk::Track * refitPrds(const Trk::Track *track, Trk::PRDtoTrackMap &prdToTrackMap, Counter &stat) const =0
Trk::AmbiguityProcessorBase::CounterIndex::kNgoodFits
@ kNgoodFits
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
Trk::AmbiguityProcessorBase::m_caloSeededBrem
bool m_caloSeededBrem
Definition: AmbiguityProcessorBase.h:159
AthAlgTool
Definition: AthAlgTool.h:26
xAOD::refitTrack
@ refitTrack
Definition: TrackingPrimitives.h:463
xAOD::subtrackCreated
@ subtrackCreated
Definition: TrackingPrimitives.h:479
python.iconfTool.gui.pad.logger
logger
Definition: pad.py:14
CP::TrackPtr
SortedObjPtr< xAOD::TrackParticle > TrackPtr
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:70
Trk::AmbiguityProcessorBase::CounterIndex::kNscoreZeroBremRefit
@ kNscoreZeroBremRefit
Trk::AmbiguityProcessorBase::CounterIndex::kNscoreOk
@ kNscoreOk
AmbiCounter
Definition: AmbiCounter.h:16
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
Trk::AmbiguityProcessorBase::TrackScoreMap
std::multimap< TrackScore, TrackPtr > TrackScoreMap
Definition: AmbiguityProcessorBase.h:59