29 m_etaBounds{0.8, 1.6, 2.5,4.0},
33 declareInterface<ITrackAmbiguityScoreProcessorTool>(
this);
38 declareProperty(
"etaBounds" , m_etaBounds,
"eta intervals for internal monitoring");
51 ATH_CHECK( m_assoToolNotGanged.retrieve( DisableTool{m_assoToolNotGanged.empty()} )) ;
52 ATH_CHECK( m_assoMapName.initialize(!m_assoMapName.key().empty()) );
54 ATH_CHECK(m_splitProbTool.retrieve( DisableTool{m_splitProbTool.empty()} ));
55 ATH_CHECK(m_clusterSplitProbContainerIn.initialize(!m_clusterSplitProbContainerIn.key().empty()) );
56 ATH_CHECK(m_clusterSplitProbContainerOut.initialize(!m_clusterSplitProbContainerOut.key().empty()) );
58 ATH_CHECK( m_splitClusterMapKey_last.initialize(!m_splitClusterMapKey_last.key().empty()) );
59 ATH_CHECK( m_splitClusterMapKey.initialize(!m_splitClusterMapKey.key().empty()) );
61 ATH_CHECK(m_observerTool.retrieve(DisableTool{m_observerTool.empty()}));
63 if (m_etaBounds.size() != Counter::nRegions) {
64 ATH_MSG_FATAL(
"There must be exactly " << (Counter::nRegions) <<
" eta bounds but "
65 << m_etaBounds.size() <<
" are set." );
66 return StatusCode::FAILURE;
75 return StatusCode::SUCCESS;
80 if (msgLvl(MSG::INFO)) {
81 MsgStream &
out=
msg(MSG::INFO);
82 out <<
" -- statistics " <<
"\n";
83 std::lock_guard<std::mutex> lock( m_statMutex );
98 const EventContext& ctx = Gaudi::Hive::currentContext();
100 if(!m_splitClusterMapKey.key().empty()){
101 if(!m_splitClusterMapKey_last.key().empty()){
103 if ( !splitClusterMapHandle_last.
isValid() ){
114 if (!m_clusterSplitProbContainerIn.key().empty()) {
115 splitProbContainerIn =
SG::ReadHandle( m_clusterSplitProbContainerIn, ctx);
116 if (!splitProbContainerIn.
isValid()) {
117 ATH_MSG_ERROR(
"Failed to get input cluster split probability container " << m_clusterSplitProbContainerIn.key());
120 std::unique_ptr<Trk::ClusterSplitProbabilityContainer> splitProbContainerCleanup(!m_clusterSplitProbContainerIn.key().empty()
121 ? std::make_unique<ClusterSplitProbabilityContainer>(*splitProbContainerIn)
122 : std::make_unique<ClusterSplitProbabilityContainer>());
127 if (!m_clusterSplitProbContainerOut.key().empty()) {
129 if (splitProbContainerHandle.
record(std::move(splitProbContainerCleanup)).isFailure()) {
130 ATH_MSG_FATAL(
"Failed to record output cluster split probability container " << m_clusterSplitProbContainerOut.key());
132 splitProbContainer=splitProbContainerHandle.
ptr();
135 splitProbContainer=splitProbContainerCleanup.get();
139 std::unique_ptr<Trk::PRDtoTrackMap> prdToTrackMap( m_assoToolNotGanged.isEnabled()
140 ? m_assoToolNotGanged->createPRDtoTrackMap()
141 : m_assoTool->createPRDtoTrackMap() );
142 overlappingTracks(trackScoreTrackMap, splitClusterMap, *splitProbContainer, *prdToTrackMap);
143 if (!m_assoMapName.key().empty()) {
145 (m_assoToolNotGanged.isEnabled()
146 ? m_assoToolNotGanged->reduceToStorableMap(std::move(prdToTrackMap))
147 : m_assoTool->reduceToStorableMap(std::move(prdToTrackMap)) )).isFailure()) {
148 ATH_MSG_FATAL(
"Failed to add PRD to track association map " << m_assoMapName.key() <<
".");
151 if(!m_splitClusterMapKey.key().empty()){
153 splitClusterMapHandle = std::unique_ptr<InDet::PixelGangedClusterAmbiguities>(splitClusterMap);
154 if( !splitClusterMapHandle.
isValid() ){
167 std::unique_ptr<Trk::PRDtoTrackMap> prdToTrackMap( m_assoTool->createPRDtoTrackMap() );
170 const std::array<ScoreCategory, 3> categoryMapping {ScoreCategory::kNcandScoreZero, ScoreCategory::kNcandDouble, ScoreCategory::kNaccept};
171 constexpr
bool dropDuplicateTracks{
true};
175 for(
const Track* pThisTrack : tracks) {
177 stat.incrementCounterByRegion(ScoreCategory::kNcandidates,pThisTrack);
182 m_assoTool, *prdToTrackMap,
184 if (
category<categoryMapping.size()) {
185 stat.incrementCounterByRegion(categoryMapping[
category],pThisTrack);
191 trackScoreTrackMap->push_back(std::make_pair(pThisTrack, -
score));
192 if (m_observerTool.isEnabled()) {
195 }
else if (m_observerTool.isEnabled() &&
198 m_observerTool->addInputTrack(input_track_uid, *pThisTrack);
199 m_observerTool->updateTrackMap(input_track_uid,
200 static_cast<double>(
score),
204 }
else if (m_observerTool.isEnabled() &&
207 m_observerTool->addInputTrack(input_track_uid, *pThisTrack);
208 m_observerTool->updateTrackMap(input_track_uid,
209 static_cast<double>(
score),
216 std::lock_guard<std::mutex> lock(m_statMutex);
219 if (m_observerTool.isEnabled()){
220 if ((
unsigned int) (nZeroScore+
nDuplicates+nToMap) != tracks.size()){
221 ATH_MSG_ERROR(
"(nZeroScore+nDuplicates+nToMap) = "<<nZeroScore+
nDuplicates+nToMap<<
" but tracks.size() = "<<tracks.size());
252 <<
" --- trk params: " << *clusterTrkPara.second );
275 const Trk::IPRDtoTrackMapTool *the_asso_tool = (m_assoToolNotGanged.isEnabled() ? &(*m_assoToolNotGanged) : &(*m_assoTool));
279 std::map< const InDet::PixelCluster*, const Trk::TrackParameters* > setOfPixelClustersOnTrack;
280 std::map< const InDet::PixelCluster*, const Trk::Track* > setOfPixelClustersToTrackAssoc;
283 for(
const std::pair<const Track*, float>& scoredTracksItem : *scoredTracks ){
286 <<
":" << (scoredTracksItem.first->trackParameters() ? scoredTracksItem.first->trackParameters()->front()->pT() : -1.)
287 <<
", " << scoredTracksItem.first->measurementsOnTrack()->size()
288 <<
"\t with score "<<-scoredTracksItem.second <<
" to PRD map");
292 if(the_asso_tool->
addPRDs( prdToTrackMap, *scoredTracksItem.first ).isSuccess()){
299 const Trk::TrackStates* tsosVec = scoredTracksItem.first->trackStateOnSurfaces();
304 ATH_MSG_VERBOSE(
"---> Looping over TSOS's to allow for cluster updates: "<< tsosVec->
size() );
306 for (; tsos != tsosVec->
end(); ++tsos) {
308 if(!measurement || ! (*tsos)->trackParameters()){
309 ATH_MSG_VERBOSE(
"---- TSOS has either no measurement or parameters: "<< measurement <<
" " << (*tsos)->trackParameters() );
318 auto ret = setOfPixelClustersOnTrack.insert(std::make_pair(
pixel, (*tsos)->trackParameters() ));
319 if (
ret.second && m_splitProbTool.isEnabled()) {
320 updatePixelSplitInformationForCluster( *(
ret.first), splitClusterMap, splitProbContainer);
322 setOfPixelClustersToTrackAssoc.insert( std::make_pair(
pixel, scoredTracksItem.first ) );
328 std::vector< std::pair< const InDet::PixelCluster*, const Trk::Track* > >
sorted;
329 sorted.reserve( setOfPixelClustersToTrackAssoc.size() );
330 for(
const std::pair< const InDet::PixelCluster* const, const Trk::Track* > &pixelTrackItem : setOfPixelClustersToTrackAssoc ) {
331 sorted.emplace_back(pixelTrackItem );
333 std::sort(
sorted.begin(),
sorted.end(), [](
const std::pair< const InDet::PixelCluster*, const Trk::Track* > &
a,
334 const std::pair< const InDet::PixelCluster*, const Trk::Track* > &
b) {
335 return a.first->getHashAndIndex().collHash() < b.first->getHashAndIndex().collHash()
336 || ( a.first->getHashAndIndex().collHash() == b.first->getHashAndIndex().collHash()
337 && a.first->getHashAndIndex().objIndex() < b.first->getHashAndIndex().objIndex() );
339 for (
const std::pair< const InDet::PixelCluster*, const Trk::Track* > &pixelTrackItem :
sorted) {
340 ATH_MSG_VERBOSE (
"---- Checking if track shares pixel hits if other tracks: " << pixelTrackItem.first <<
" with R " << pixelTrackItem.first->globalPosition().perp() );
345 TString tracks(
"---- number of tracks with this shared Prd: ");
346 tracks += numberOfTracksWithThisPrd;
349 tracks += Form(
" %p",(
void*)(
it->second));
350 double pt = (
it->second->trackParameters() ?
it->second->trackParameters()->front()->pT() : -1);
351 tracks += Form(
":%.3f",
pt);
352 tracks += Form(
",%i",
static_cast<int>(
it->second->measurementsOnTrack()->size()));
363 auto parseFileName=[](
const std::string & fullname){
364 auto dotPosition = fullname.rfind(
'.');
365 auto slashPosition = fullname.rfind(
'/');
366 auto stringLength = dotPosition - slashPosition;
367 return fullname.substr(slashPosition, stringLength);
369 std::streamsize
ss =
out.precision();
371 out <<
"Output from ";
372 out << parseFileName(__FILE__);
376 out <<
"------------------------------------------------------------------------------------" <<
"\n";
378 if (m_stat.globalCount(Counter::nInvalidTracks)>0) {
379 out <<
" Number of invalid tracks : "<< m_stat.globalCount(Counter::nInvalidTracks) <<
"\n";
381 if (m_stat.globalCount(Counter::nTracksWithoutParam)>0) {
382 out <<
" Tracks without parameters : "<< m_stat.globalCount(Counter::nTracksWithoutParam) <<
"\n";
384 out <<
" statistics by eta range ------All---Barrel---Trans.-- Endcap-- Forwrd-- " <<
"\n";
385 out <<
"------------------------------------------------------------------------------------" <<
"\n";
386 out << m_stat.dumpRegions(
" Number of candidates at input :", ScoreCategory::kNcandidates,iw);
387 out << m_stat.dumpRegions(
" - candidates rejected score 0 :", ScoreCategory::kNcandScoreZero,iw);
388 out << m_stat.dumpRegions(
" - candidates rejected as double :", ScoreCategory::kNcandDouble,iw);
389 out <<
"------------------------------------------------------------------------------------" <<
"\n";
390 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setprecision(2)
391 <<
" definition: ( 0.0 < Barrel < " << m_etaBounds[Counter::iBarrel] <<
" < Transition < " << m_etaBounds[Counter::iTransi]
392 <<
" < Endcap < " << m_etaBounds[Counter::iEndcap] <<
" < Forward < " << m_etaBounds[Counter::iForwrd] <<
" )" <<
"\n";
393 out <<
"------------------------------------------------------------------------------------" <<
"\n";
394 out << std::setprecision(
ss);