10 #include "GaudiKernel/MsgStream.h"
19 m_scoringTool(
"Trk::TrackScoringTool/TrackScoringTool"),
20 m_selectionTool(
"InDet::InDetAmbiTrackSelectionTool/InDetAmbiTrackSelectionTool")
22 declareInterface<ITrackAmbiguityProcessorTool>(
this);
38 return StatusCode::FAILURE;
40 ATH_CHECK( m_assoMapName.initialize(!m_assoMapName.key().empty()));
45 ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty()));
46 ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty()));
48 if (m_disableSorting)
ATH_MSG_DEBUG(
"Internal sorting disabled, using external ordering!" );
68 std::vector<const Track*> tracks;
69 tracks.reserve(tracksCol->
size());
70 for(
const auto *
e: *tracksCol){
74 std::unique_ptr<Trk::PRDtoTrackMap> tmpPrdToTrackMap;
75 if (!pPrdToTrackMap) {
76 tmpPrdToTrackMap = m_assoTool->createPRDtoTrackMap();
77 if (!m_assoMapName.key().empty()) {
80 ATH_MSG_ERROR(
"Failed to retrieve prd to track map " << m_assoMapName.key() );
82 *tmpPrdToTrackMap = *inputPrdMap;
85 pPrdToTrackMap = tmpPrdToTrackMap.get();
89 addNewTracks(trackScoreTrackMap,*pPrdToTrackMap, tracks);
97 return result.release()->asDataVector();
105 const std::vector<const Track*> &tracks)
const{
106 ATH_MSG_DEBUG (
"Number of tracks at Input: "<<tracks.size());
109 for (
const Track*a_track : tracks ) {
110 if(m_disableSorting) {
112 trackScoreTrackMap.insert( std::make_pair(itrack,
TrackPtr(a_track)) );
124 const std::vector<const Trk::PrepRawData*> & prds = m_assoTool->getPrdsOnTrack(prdToTrackMap, *a_track);
127 prdSig.insert( prds.begin(),prds.end() );
129 if ( !(prdSigSet.insert(prdSig)).second ) {
140 trackScoreTrackMap.insert( std::make_pair(-
score,
TrackPtr(a_track) ) );
143 ATH_MSG_DEBUG (
"Number of tracks in map:"<<trackScoreTrackMap.size());
153 const EventContext& ctx = Gaudi::Hive::currentContext();
155 if (!m_clusterSplitProbContainerIn.key().empty()) {
156 splitProbContainerIn =
SG::ReadHandle( m_clusterSplitProbContainerIn, ctx);
157 if (!splitProbContainerIn.
isValid()) {
158 ATH_MSG_ERROR(
"Failed to get input cluster split probability container " << m_clusterSplitProbContainerIn.key());
161 std::unique_ptr<Trk::ClusterSplitProbabilityContainer> splitProbContainerCleanup(!m_clusterSplitProbContainerIn.key().empty()
162 ? std::make_unique<ClusterSplitProbabilityContainer>(*splitProbContainerIn)
163 : std::make_unique<ClusterSplitProbabilityContainer>());
166 if (!m_clusterSplitProbContainerOut.key().empty()) {
168 if (splitProbContainerHandle.
record(std::move(splitProbContainerCleanup)).isFailure()) {
169 ATH_MSG_FATAL(
"Failed to record output cluster split probability container " << m_clusterSplitProbContainerOut.key());
171 splitProbContainer=splitProbContainerHandle.
ptr();
174 splitProbContainer=splitProbContainerCleanup.get();
179 while ( !trackScoreTrackMap.empty() ) {
181 TrackPtr atrack( std::move(itnext->second) );
183 trackScoreTrackMap.erase(itnext);
185 std::unique_ptr<Trk::Track> cleanedTrack;
186 const auto &[cleanedTrack_tmp, keepOriginal] = m_selectionTool->getCleanedOutTrack( atrack.
track() , -(ascore), *splitProbContainer, prdToTrackMap, -1, -1);
187 cleanedTrack.reset(cleanedTrack_tmp);
192 StatusCode sc = m_assoTool->addPRDs(prdToTrackMap,*atrack);
197 }
else if ( !cleanedTrack ) {
199 ATH_MSG_DEBUG (
"Track "<< atrack.
track() <<
" doesn't meet the cuts of the AmbiTrack Selection tool");
202 cleanedTrack.reset();
204 ATH_MSG_DEBUG(
"Selection tool returned a new track, cannot handle memory management of new track, deleting it. Check you configuration ");
220 for (;
it != itEnd ; ++
it){