27 declareInterface<ITrackAmbiguityProcessorTool>(
this);
50 return StatusCode::FAILURE;
54 ATH_CHECK( m_trackSummaryTool.retrieve( DisableTool{ m_trackSummaryTool.name().empty() } ) );
59 if (m_forceRefit && m_suppressTrackFit ) {
60 ATH_MSG_WARNING(
"Inconsistent parameter settings, forced refit is true, but fitting suppressed, resetting force refit !" );
65 ATH_MSG_DEBUG(
"The forced refit of Tracks is switched off." );
66 ATH_MSG_DEBUG(
"Ensure that the tracks are fitted after the ambiguity processing!");
72 ATH_MSG_DEBUG(
"Try brem fit and recovery for electron like tracks.");
76 if (m_etaBounds.size() != Counter::nRegions) {
78 <<
" etaBounds: barrel end, transition region end, end-cap end, forward, and the-restaurant-at-the-end-of-the-world." );
79 return StatusCode::FAILURE;
81 if (initializeClusterSplitProbContainer().isFailure()) {
82 sc=StatusCode::FAILURE;
89 return StatusCode::SUCCESS;
95 out <<
" -- statistics:" <<
"\n";
96 std::lock_guard<std::mutex> lock( m_statMutex );
109 return processVector(*trackCol, prdToTrackMap);
116 tracks.reserve(tracksScores->size());
117 for(
const std::pair<const Trk::Track *, float>&
e: *tracksScores){
127 std::unique_ptr<Trk::PRDtoTrackMap> prdToTrackMap_cleanup;
128 if (!prdToTrackMap) {
130 prdToTrackMap_cleanup = m_assoTool->createPRDtoTrackMap();
131 prdToTrackMap = prdToTrackMap_cleanup.get();
136 addNewTracks(tracks, trackScoreTrackMap, *prdToTrackMap);
142 std::vector<std::unique_ptr<const Trk::Track> > trackDustbin;
145 std::lock_guard<std::mutex> lock(m_statMutex);
148 if (msgLvl(
MSG::DEBUG)) dumpTracks(*finalTracks);
163 const std::array<CounterIndex, 2> categoryMapping {CounterIndex::kNcandScoreZero, CounterIndex::kNcandDouble};
164 for(
const Track *pTrack : tracks) {
165 stat.incrementCounterByRegion(CounterIndex::kNcandidates,pTrack);
169 m_assoTool, prdToTrackMap, prdSigSet);
170 if (
category < categoryMapping.size()) {
171 stat.incrementCounterByRegion(categoryMapping[
category],pTrack);
178 trackScoreTrackMap.insert( std::make_pair(-
score,std::move(ptr)) );
181 ATH_MSG_DEBUG (
"Number of tracks in map:"<<trackScoreTrackMap.size());
183 std::lock_guard<std::mutex> lock(m_statMutex);
195 std::vector<std::unique_ptr<const Trk::Track> >& trackDustbin,
197 const EventContext& ctx = Gaudi::Hive::currentContext();
204 while ( !trackScoreTrackMap.empty() ){
208 TrackPtr atrack(std::move(itnext->second));
209 trackScoreTrackMap.erase(itnext);
212 std::unique_ptr<Trk::Track> cleanedTrack;
213 auto [cleanedTrack_tmp,keep_orig] = m_selectionTool->getCleanedOutTrack( atrack.
track() , -(ascore), *splitProbContainer, prdToTrackMap, -1, -1);
214 cleanedTrack.reset( cleanedTrack_tmp);
216 if (keep_orig && atrack.
fitted() ){
220 stat.incrementCounterByRegion(CounterIndex::kNaccepted,atrack.
track());
223 if (m_assoTool->addPRDs(prdToTrackMap, *atrack.
track()).isFailure())
ATH_MSG_ERROR(
"addPRDs() failed" );
225 finalTracks->push_back( atrack.
release() );
226 }
else if ( keep_orig ) {
229 ATH_MSG_DEBUG (
"Good track, but need to fit this track first, score, add it into map again and retry !");
232 addTrack( pRefittedTrack,
true , trackScoreTrackMap, trackDustbin,
stat, -1);
235 trackDustbin.emplace_back(atrack.
release());
238 }
else if ( cleanedTrack ) {
241 trackDustbin.emplace_back(atrack.
release());
245 ATH_MSG_DEBUG (
"Candidate excluded, add subtrack to map. Track "<<cleanedTrack.get());
247 stat.incrementCounterByRegion(CounterIndex::kNsubTrack,cleanedTrack.get());
249 addTrack( cleanedTrack.release(),
false, trackScoreTrackMap, trackDustbin,
stat, -1);
254 stat.incrementCounterByRegion(CounterIndex::kNnoSubTrack,atrack.
track());
256 trackDustbin.emplace_back(atrack.
release());
261 ATH_MSG_DEBUG (
"Finished, number of track on output: "<<finalTracks->size());
262 return finalTracks.release()->asDataVector();
273 std::vector<const Trk::PrepRawData*> prds = m_assoTool->getPrdsOnTrack(prdToTrackMap,*
track);
274 if ( prds.empty() ) {
279 if (not
par)
return nullptr;
283 stat.incrementCounterByRegion(CounterIndex::kNbremFits,
track);
285 newTrack = m_fitterTool->fit(Gaudi::Hive::currentContext(),prds, *
par,
true,
Trk::electron).release();
287 stat.incrementCounterByRegion(CounterIndex::kNfits,
track);
289 newTrack = m_fitterTool->fit(Gaudi::Hive::currentContext(),prds, *
par,
true, m_particleHypothesis).release();
290 if ((not newTrack) and shouldTryBremRecovery(*
track,
par)){
291 stat.incrementCounterByRegion(CounterIndex::kNrecoveryBremFits,
track);
293 newTrack = m_fitterTool->fit(Gaudi::Hive::currentContext(),prds, *
par,
true,
Trk::electron).release();
297 stat.incrementCounterByRegion(CounterIndex::kNgoodFits,newTrack);
302 stat.incrementCounterByRegion(CounterIndex::kNfailedFits,
track);
316 for (;
it != itEnd ; ++
it){
327 auto parseFileName=[](
const std::string & fullname){
328 auto dotPosition = fullname.rfind(
'.');
329 auto slashPosition = fullname.rfind(
'/');
330 auto stringLength = dotPosition - slashPosition;
331 return fullname.substr(slashPosition, stringLength);
334 std::streamsize
ss = std::cout.precision();
335 out <<
"Output from ";
336 out << parseFileName(__FILE__);
340 out <<
"---------------------------------------------------------------------------------" <<
"\n";
341 out <<
" Number of events processed : "<< m_stat.numberOfEvents() <<
"\n";
342 out <<
" statistics by eta range ------All---Barrel---Trans.--- Endcap---Fwd---" <<
"\n";
343 out <<
"---------------------------------------------------------------------------------" <<
"\n";
344 out << m_stat.dumpRegions(
" Number of candidates at input :", CounterIndex::kNcandidates);
345 out << m_stat.dumpRegions(
" - candidates rejected score 0 :", CounterIndex::kNcandScoreZero);
346 out << m_stat.dumpRegions(
" - candidates rejected as double :", CounterIndex::kNcandDouble);
347 out <<
"---------------------------------------------------------------------------------" <<
"\n";
348 out << m_stat.dumpRegions(
" candidates with good score :", CounterIndex::kNscoreOk);
350 out << m_stat.dumpRegions(
" + recovered after brem refit :", CounterIndex::kNscoreZeroBremRefit);
352 out << m_stat.dumpRegions(
" candidates rejected score 0 :", CounterIndex::kNscoreZero);
354 out << m_stat.dumpRegions(
" + rejected failed brem refit :", CounterIndex::kNscoreZeroBremRefitFailed);
356 out <<
"---------------------------------------------------------------------------------" <<
"\n";
357 out << m_stat.dumpRegions(
" number of normal fits :", CounterIndex::kNfits);
359 out << m_stat.dumpRegions(
" + 2nd brem fit for failed fit :", CounterIndex::kNrecoveryBremFits);
360 out << m_stat.dumpRegions(
" normal brem fits for electrons :", CounterIndex::kNbremFits);
362 out <<
"---------------------------------------------------------------------------------" <<
"\n";
363 out << m_stat.dumpRegions(
" sum of succesful fits :", CounterIndex::kNgoodFits);
364 out << m_stat.dumpRegions(
" sum of failed fits :", CounterIndex::kNfailedFits);
365 out <<
"---------------------------------------------------------------------------------" <<
"\n";
366 out << m_stat.dumpRegions(
" Number of subtracks created :", CounterIndex::kNsubTrack);
367 out << m_stat.dumpRegions(
" Number of candidates excluded :", CounterIndex::kNnoSubTrack);
368 out <<
"---------------------------------------------------------------------------------" <<
"\n";
369 out << m_stat.dumpRegions(
" Number of tracks accepted :", CounterIndex::kNaccepted);
371 out << m_stat.dumpRegions(
" including number of brem fits :", CounterIndex::kNacceptedBrem);
373 out <<
"---------------------------------------------------------------------------------" <<
"\n";
374 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setprecision(2)
375 <<
" definition: ( 0.0 < Barrel < " << m_etaBounds[Counter::iBarrel] <<
" < Transition < " << m_etaBounds[Counter::iTransi]
376 <<
" < Endcap < " << m_etaBounds[Counter::iEndcap] <<
" FWD )" <<
"\n";
377 out <<
"-------------------------------------------------------------------------------" <<
"\n";
382 std::unique_ptr<Trk::Track>
387 std::unique_ptr<Trk::Track>
389 return m_fitterTool->fit(Gaudi::Hive::currentContext(),
track,
flag,hypo);