19 if (!
track )
return true;
21 if (
track->trackParameters()){
24 if (param && param->covariance() && param->covariance()->determinant() < 0) {
26 << *(param) <<
" cov=" << *(param->covariance())
28 <<
" det=" << param->covariance()->determinant() );
48 m_fitterTool.push_back(
"Trk::KalmanFitter/InDetTrackFitter");
50 declareInterface<ITrackAmbiguityProcessorTool>(
this);
71 ATH_CHECK( m_assoMapName.initialize(!m_assoMapName.key().empty()));
73 ATH_CHECK( m_trackSummaryTool.retrieve( DisableTool{ m_trackSummaryTool.name().empty() } ) );
76 if (m_fitterTool.empty()){
78 sc = StatusCode::FAILURE;
83 if (initializeClusterSplitProbContainer().isFailure()) {
84 sc=StatusCode::FAILURE;
90 ATH_CHECK(m_observerToolWriter.retrieve(DisableTool{m_observerToolWriter.empty()}));
94 ATH_MSG_DEBUG(
"Try brem fit and recovery for electron like tracks." );
96 if (m_etaBounds.size() != Counter::nRegions) {
97 ATH_MSG_FATAL(
"There must be exactly " << (Counter::nRegions) <<
" eta bounds but "
98 << m_etaBounds.size() <<
" are set." );
99 return StatusCode::FAILURE;
101 ATH_MSG_DEBUG(m_fitterTool.size()<<
" fitters was/were input");
102 for(
const auto &
i:m_fitterTool){
110 return StatusCode::SUCCESS;
115 if (msgLvl(MSG::INFO)) {
116 MsgStream &
out=
msg(MSG::INFO);
117 out <<
" -- statistics \n";
118 std::lock_guard<std::mutex> lock( m_statMutex );
130 if (!trackScoreTrackMap)
return nullptr;
131 const EventContext& ctx = Gaudi::Hive::currentContext();
134 std::unique_ptr<Trk::PRDtoTrackMap> prdToTrackMap( m_assoTool->createPRDtoTrackMap() );
135 if (!m_assoMapName.key().empty()) {
137 if (!input_prd_map.
isValid()) {
138 ATH_MSG_ERROR(
"Failed to retrieve prd to track map " << m_assoMapName.key() );
141 std::vector<std::unique_ptr<const Trk::Track> > trackDustbin;
151 solveTracks(*trackScoreTrackMap, *prdToTrackMap, *finalTracks, trackDustbin,
stat);
153 std::lock_guard<std::mutex> lock(m_statMutex);
161 unsigned int nFinalTracks;
162 if (!trackScoreTrackMap->empty()){
166 nFinalTracks = m_observerToolWriter->saveTracksToStore(ctx,
nullptr);
169 if (nFinalTracks != finalTracks->
size()){
170 ATH_MSG_ERROR(
"Track observer recorded different number of final tracks: "<<nFinalTracks<<
" vs. "<<finalTracks->
size());
173 ATH_MSG_DEBUG(
"Track observer recorded "<<nFinalTracks<<
" final tracks");
187 std::vector<std::unique_ptr<const Trk::Track> > &trackDustbin,
190 for(
const std::pair< const Trk::Track *, float> &scoreTrack: trackScoreTrackMap){
196 scoreTrackFitflagMap.emplace(scoreTrack.second,
TrackPtr(scoreTrack.first, map_track_uid) );
200 scoreTrackFitflagMap.emplace(scoreTrack.second,
TrackPtr(scoreTrack.first) );
202 stat.incrementCounterByRegion(CounterIndex::kNcandidates,scoreTrack.first);
204 const EventContext& ctx = Gaudi::Hive::currentContext();
208 while ( !scoreTrackFitflagMap.empty() ){
211 int uid = itnext->second.getUid();
212 TrackPtr atrack( std::move(itnext->second), uid );
213 float ascore = itnext->first;
214 scoreTrackFitflagMap.erase(itnext);
217 std::unique_ptr<Trk::Track> cleanedTrack;
219 const auto &[cleanedTrack_tmp, keepOriginal] = m_selectionTool->getCleanedOutTrack( atrack.
track() , -ascore, *splitProbContainer, prdToTrackMap, uid, cleanedTrack_uid);
220 cleanedTrack.reset(cleanedTrack_tmp);
221 ATH_MSG_DEBUG (
"--- cleaned next track "<< cleanedTrack.get());
223 if (keepOriginal && atrack.
fitted()){
226 stat.incrementCounterByRegion(CounterIndex::kNaccepted, atrack.
track() );
228 stat.incrementCounterByRegion(CounterIndex::kNacceptedBrem,atrack.
track());
232 StatusCode sc = m_assoTool->addPRDs(prdToTrackMap, *atrack);
236 }
else if ( keepOriginal){
238 ATH_MSG_DEBUG (
"Good track ("<< atrack.
track() <<
") but need to fit this track first, score, add it into map again and retry ! ");
246 addTrack( pRefittedTrack,
true , scoreTrackFitflagMap, trackDustbin,
stat, refittedTrack_uid);
250 trackDustbin.emplace_back(atrack.
release());
252 }
else if ( cleanedTrack ) {
253 ATH_MSG_DEBUG (
"Candidate excluded, add subtrack to map. Track "<<cleanedTrack.get());
254 stat.incrementCounterByRegion(CounterIndex::kNsubTrack,cleanedTrack.get());
256 addTrack(cleanedTrack.release(),
false, scoreTrackFitflagMap, trackDustbin,
stat, cleanedTrack_uid);
259 trackDustbin.emplace_back(atrack.
release() );
264 stat.incrementCounterByRegion(CounterIndex::kNnoSubTrack,atrack.
track());
267 trackDustbin.emplace_back(atrack.
release());
284 const auto & prds = m_assoTool->getPrdsOnTrack(prdToTrackMap,*
track);
285 if ( prds.empty() ) {
291 if (not
par)
return nullptr;
294 std::unique_ptr<Trk::Track> newTrack;
296 stat.incrementCounterByRegion(CounterIndex::kNbremFits,
track);
300 newTrack = doBremRefit(*
track);
302 stat.incrementCounterByRegion(CounterIndex::kNfits,
track);
304 newTrack =
fit(prds, *
par,
true, m_particleHypothesis);
305 if ((not newTrack) and shouldTryBremRecovery(*
track,
par)){
306 stat.incrementCounterByRegion(CounterIndex::kNrecoveryBremFits,
track);
310 newTrack = doBremRefit(*
track);
314 stat.incrementCounterByRegion(CounterIndex::kNgoodFits,newTrack.get());
319 stat.incrementCounterByRegion(CounterIndex::kNfailedFits,
track);
321 return newTrack.release();
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 =
out.precision();
336 out <<
"Output from ";
337 out << parseFileName(__FILE__);
341 out <<
"------------------------------------------------------------------------------------" <<
"\n";
343 if (
const auto nInvalid = m_stat.globalCount(Counter::nInvalidTracks); nInvalid>0) {
344 out <<
" Number of invalid tracks : "<< nInvalid<<
"\n";
346 if (
const auto nNoParams = m_stat.globalCount(Counter::nTracksWithoutParam); nNoParams>0) {
347 out <<
" Tracks without parameters : "<< nNoParams <<
"\n";
349 out <<
" statistics by eta range ------All---Barrel---Trans.-- Endcap-- Forwrd-- " <<
"\n";
350 out <<
"------------------------------------------------------------------------------------" <<
"\n";
351 out << m_stat.dumpRegions(
" Number of candidates at input :", CounterIndex::kNcandidates,iw);
352 out <<
"------------------------------------------------------------------------------------" <<
"\n";
353 out << m_stat.dumpRegions(
" candidates with good score :", CounterIndex::kNscoreOk,iw);
355 out << m_stat.dumpRegions(
" + recovered after brem refit :", CounterIndex::kNscoreZeroBremRefit,iw);
357 out << m_stat.dumpRegions(
" candidates rejected score 0 :", CounterIndex::kNscoreZero,iw);
359 out << m_stat.dumpRegions(
" + m refit :", CounterIndex::kNscoreZeroBremRefitFailed,iw);
360 out << m_stat.dumpRegions(
" + rejected brem refit score 0 :", CounterIndex::kNscoreZeroBremRefitScoreZero,iw);
362 out <<
"------------------------------------------------------------------------------------" <<
"\n";
363 out << m_stat.dumpRegions(
" number of normal fits :" , CounterIndex::kNfits,iw);
365 out << m_stat.dumpRegions(
" + 2nd brem fit for failed fit :", CounterIndex::kNrecoveryBremFits,iw);
366 out << m_stat.dumpRegions(
" normal brem fits for electrons :", CounterIndex::kNbremFits,iw);
368 out <<
"------------------------------------------------------------------------------------" <<
"\n";
369 out << m_stat.dumpRegions(
" sum of succesful fits :", CounterIndex::kNgoodFits,iw);
370 out << m_stat.dumpRegions(
" sum of failed fits :", CounterIndex::kNfailedFits,iw);
371 out <<
"------------------------------------------------------------------------------------" <<
"\n";
372 out << m_stat.dumpRegions(
" Number of subtracks created :", CounterIndex::kNsubTrack,iw);
373 out << m_stat.dumpRegions(
" Number of candidates excluded :", CounterIndex::kNnoSubTrack,iw);
374 out <<
"------------------------------------------------------------------------------------" <<
"\n";
375 out << m_stat.dumpRegions(
" Number of tracks accepted :", CounterIndex::kNaccepted,iw);
377 out << m_stat.dumpRegions(
" including number of brem fits :", CounterIndex::kNacceptedBrem,iw);
379 out <<
"------------------------------------------------------------------------------------" <<
"\n";
380 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setprecision(2)
381 <<
" definition: ( 0.0 < Barrel < " << m_etaBounds[Counter::iBarrel] <<
" < Transition < " << m_etaBounds[Counter::iTransi]
382 <<
" < Endcap < " << m_etaBounds[Counter::iEndcap] <<
" < Forward < " << m_etaBounds[Counter::iForwrd] <<
" )" <<
"\n";
383 out <<
"------------------------------------------------------------------------------------" <<
"\n";
384 out << std::setprecision(
ss);
387 std::unique_ptr<Trk::Track>