From 87ab630483f7048b6785bbf2739d84a8425724d6 Mon Sep 17 00:00:00 2001 From: aferrero2707 Date: Wed, 17 Jun 2026 11:48:46 +0200 Subject: [PATCH] [PWGDQ] refactoring of some matching QA member functions The refactoring removes some unneeded retrieval of track references from the input tables. --- PWGDQ/Tasks/qaMatching.cxx | 107 +++++++++++++++---------------------- 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/PWGDQ/Tasks/qaMatching.cxx b/PWGDQ/Tasks/qaMatching.cxx index 602222d6e08..baec9e0361b 100644 --- a/PWGDQ/Tasks/qaMatching.cxx +++ b/PWGDQ/Tasks/qaMatching.cxx @@ -254,6 +254,7 @@ struct QaMatching { int64_t globalTrackId{-1}; int64_t muonTrackId{-1}; int64_t mftTrackId{-1}; + int trackType{-1}; o2::track::TrackParCovFwd mftTrackProp; o2::track::TrackParCovFwd mchTrackProp; double matchScore{-1}; @@ -1344,35 +1345,31 @@ struct QaMatching { return isGoodMft(mftTrack, cfgTrackChi2MftUp, cfgTrackNClustMftLow); } - template - bool isGoodGlobalMatching(const TMUON& muonTrack, - double matchingScore, + bool isGoodGlobalMatching(const MatchingCandidate& candidate, double matchingScoreCut) { - if (static_cast(muonTrack.trackType()) > GlobalTrackTypeMax) + if (static_cast(candidate.trackType) > GlobalTrackTypeMax) return false; // MFT-MCH matching score cut - if (matchingScore < matchingScoreCut) + if (candidate.matchScore < matchingScoreCut) return false; return true; } - template - bool isGoodGlobalMatching(const TMUON& muonTrack, double matchingScore) + bool isGoodGlobalMatching(const MatchingCandidate& candidate) { - return isGoodGlobalMatching(muonTrack, matchingScore, cfgMatchingChi2ScoreMftMchLow); + return isGoodGlobalMatching(candidate, cfgMatchingChi2ScoreMftMchLow); } - template - bool isTrueGlobalMatching(const TMUON& muonTrack, const std::vector>& matchablePairs) + bool isTrueGlobalMatching(const MatchingCandidate& candidate, const std::vector>& matchablePairs) { - if (static_cast(muonTrack.trackType()) > GlobalTrackTypeMax) + if (candidate.trackType > GlobalTrackTypeMax) return false; - int64_t mchTrackId = static_cast(muonTrack.matchMCHTrackId()); - int64_t mftTrackId = static_cast(muonTrack.matchMFTTrackId()); + int64_t mchTrackId = candidate.muonTrackId; + int64_t mftTrackId = candidate.mftTrackId; std::pair trackIndexes = std::make_pair(mchTrackId, mftTrackId); @@ -1751,9 +1748,7 @@ struct QaMatching { } } - template - int getTrueMatchIndex(TMUON const& muonTracks, - const std::vector& matchCandidatesVector, + int getTrueMatchIndex(const std::vector& matchCandidatesVector, const std::vector>& matchablePairs) { // find the index of the matching candidate that corresponds to the true match @@ -1761,9 +1756,7 @@ struct QaMatching { // index=0 means no candidate was found that corresponds to the true match int trueMatchIndex = 0; for (size_t i = 0; i < matchCandidatesVector.size(); i++) { - auto const& muonTrack = muonTracks.rawIteratorAt(matchCandidatesVector[i].globalTrackId); - - if (isTrueGlobalMatching(muonTrack, matchablePairs)) { + if (isTrueGlobalMatching(matchCandidatesVector[i], matchablePairs)) { trueMatchIndex = i + 1; break; } @@ -1807,20 +1800,20 @@ struct QaMatching { return isMuon(mchTrack, mftTrack); } - template - MuonMatchType getMatchType(const TMUON& muonTrack, - TMUONS const& /*muonTracks*/, + template + MuonMatchType getMatchType(const MatchingCandidate& candidate, + TMUONS const& muonTracks, TMFTS const& mftTracks, const std::vector>& matchablePairs, int ranking) { - if (static_cast(muonTrack.trackType()) > GlobalTrackTypeMax) + if (candidate.trackType > GlobalTrackTypeMax) return kMatchTypeUndefined; - auto const& mchTrack = muonTrack.template matchMCHTrack_as(); + auto const& mchTrack = muonTracks.rawIteratorAt(candidate.muonTrackId); - bool isPairable = isMatchableMch(mchTrack.globalIndex(), matchablePairs); - bool isTrueMatch = isTrueGlobalMatching(muonTrack, matchablePairs); + bool isPairable = isMatchableMch(candidate.muonTrackId, matchablePairs); + bool isTrueMatch = isTrueGlobalMatching(candidate, matchablePairs); int decayRanking = getDecayRanking(mchTrack, mftTracks); MuonMatchType result{kMatchTypeUndefined}; @@ -2081,6 +2074,7 @@ struct QaMatching { muonTrackIndex, mchTrackIndex, mftTrackIndex, + static_cast(muonTrack.trackType()), mftTrackProp, mchTrackProp, matchScore, @@ -2097,6 +2091,7 @@ struct QaMatching { muonTrackIndex, mchTrackIndex, mftTrackIndex, + static_cast(muonTrack.trackType()), mftTrackProp, mchTrackProp, matchScore, @@ -2148,12 +2143,10 @@ struct QaMatching { auto mftMchMatchAttempts = getMftMchMatchAttempts(collisions, bcs, mchTrack, mftTracks); int ranking = 1; for (auto& candidate : globalTracksVector) { // o2-linter: disable=const-ref-in-for-loop (object is modified in loop) - const auto& muonTrack = muonTracks.rawIteratorAt(candidate.globalTrackId); - candidate.matchRanking = ranking; candidate.matchRankingProd = ranking; if constexpr (isMC) { - candidate.matchType = getMatchType(muonTrack, muonTracks, mftTracks, collisionInfo.matchablePairs, ranking); + candidate.matchType = getMatchType(candidate, muonTracks, mftTracks, collisionInfo.matchablePairs, ranking); } else { candidate.matchType = kMatchTypeUndefined; } @@ -2229,13 +2222,11 @@ struct QaMatching { // loop over candidates for (const auto& candidate : globalTracksVector) { - auto const& muonTrack = muonTracks.rawIteratorAt(candidate.globalTrackId); - float matchScore = candidate.matchScore; float matchChi2 = candidate.matchChi2; - float matchChi2Prod = muonTrack.chi2MatchMCHMFT() / 5.f; - float matchScoreProd = chi2ToScore(muonTrack.chi2MatchMCHMFT(), 5, 50.f); + float matchChi2Prod = candidate.matchChi2Prod; + float matchScoreProd = candidate.matchScoreProd; std::get>(plotter->fMatchScoreVsProd)->Fill(matchScoreProd, matchScore); std::get>(plotter->fMatchChi2VsProd)->Fill(matchChi2Prod, matchChi2); @@ -2287,8 +2278,9 @@ struct QaMatching { // find the index of the matching candidate that corresponds to the true match // index=1 corresponds to the leading candidate // index=0 means no candidate was found that corresponds to the true match - int trueMatchIndex = getTrueMatchIndex(muonTracks, globalTracksVector, matchablePairs); - int trueMatchIndexProd = getTrueMatchIndex(muonTracks, matchingCandidatesProd.at(mchIndex), matchablePairs); + int trueMatchIndex = getTrueMatchIndex(globalTracksVector, matchablePairs); + const auto prodCandidatesIt = matchingCandidatesProd.find(mchIndex); + int trueMatchIndexProd = (prodCandidatesIt != matchingCandidatesProd.end()) ? getTrueMatchIndex(prodCandidatesIt->second, matchablePairs) : 0; float mcParticleDz = -1000; if (mchTrack.has_mcParticle()) { @@ -2474,18 +2466,16 @@ struct QaMatching { if (globalTracksVector.size() < 1) continue; - int trueMatchIndex = getTrueMatchIndex(muonTracks, globalTracksVector, matchablePairs); + int trueMatchIndex = getTrueMatchIndex(globalTracksVector, matchablePairs); // loop over candidates int candidateIndex = 1; for (const auto& candidate : globalTracksVector) { - auto const& muonTrack = muonTracks.rawIteratorAt(candidate.globalTrackId); - float matchScore = candidate.matchScore; float matchChi2 = candidate.matchChi2; - float matchChi2Prod = muonTrack.chi2MatchMCHMFT() / 5.f; - float matchScoreProd = chi2ToScore(muonTrack.chi2MatchMCHMFT(), 5, 50.f); + float matchChi2Prod = candidate.matchChi2Prod; + float matchScoreProd = candidate.matchScoreProd; std::get>(plotter->fMatchScoreVsProd)->Fill(matchScoreProd, matchScore); std::get>(plotter->fMatchChi2VsProd)->Fill(matchChi2Prod, matchChi2); @@ -2505,10 +2495,6 @@ struct QaMatching { if (globalTracksVector.size() < 1) continue; - // get the leading matching candidate - auto const& muonTrack = muonTracks.rawIteratorAt(globalTracksVector[0].globalTrackId); - double matchingScore = globalTracksVector[0].matchScore; - // get the standalone MCH and MFT tracks auto const& mchTrack = muonTracks.rawIteratorAt(mchIndex); @@ -2517,14 +2503,14 @@ struct QaMatching { continue; // skip candidates that do not pass the matching quality cuts - if (!isGoodGlobalMatching(muonTrack, matchingScore, matchingScoreCut)) + if (!isGoodGlobalMatching(globalTracksVector[0], matchingScoreCut)) continue; // check if the matching candidate is a true one - bool isTrueMatch = isTrueGlobalMatching(muonTrack, matchablePairs); + bool isTrueMatch = isTrueGlobalMatching(globalTracksVector[0], matchablePairs); // ---- MC ancestry ---- - auto motherParticles = getMotherParticles(muonTrack); + auto motherParticles = getMotherParticles(mchTrack); int motherPDG = 0; if (motherParticles.size() > 1) { motherPDG = motherParticles[1].first; @@ -2556,15 +2542,10 @@ struct QaMatching { if (matchingCandidates.count(matchableMchIndex) > 0) { const auto& globalTracksVector = matchingCandidates.at(static_cast(matchableMchIndex)); if (!globalTracksVector.empty()) { - // get the leading matching candidate - auto const& muonTrack = muonTracks.rawIteratorAt(globalTracksVector[0].globalTrackId); - double matchingScore = globalTracksVector[0].matchScore; + // get the standalone MFT track index + auto mftIndex = globalTracksVector[0].mftTrackId; - // get the standalone MFT track - auto const& mftTrack = muonTrack.template matchMFTTrack_as(); - auto mftIndex = mftTrack.globalIndex(); - - goodMatchFound = isGoodGlobalMatching(muonTrack, matchingScore, matchingScoreCut); + goodMatchFound = isGoodGlobalMatching(globalTracksVector[0], matchingScoreCut); isTrueMatch = (mftIndex == matchableMftIndex); } } @@ -2645,8 +2626,6 @@ struct QaMatching { auto const& muonTrack1 = muonTracks.rawIteratorAt(candidates1[0].globalTrackId); auto const& muonTrack2 = muonTracks.rawIteratorAt(candidates2[0].globalTrackId); - auto matchScore1 = candidates1[0].matchScore; - auto matchScore2 = candidates2[0].matchScore; auto const& mchTrack1 = muonTracks.rawIteratorAt(candidates1[0].muonTrackId); auto const& mchTrack2 = muonTracks.rawIteratorAt(candidates2[0].muonTrackId); auto const& mftTrack1 = mftTracks.rawIteratorAt(candidates1[0].mftTrackId); @@ -2672,7 +2651,7 @@ struct QaMatching { continue; } - bool goodGlobalMuonMatches = (isGoodGlobalMatching(muonTrack1, matchScore1) && isGoodGlobalMatching(muonTrack2, matchScore2)); + bool goodGlobalMuonMatches = (isGoodGlobalMatching(candidates1[0]) && isGoodGlobalMatching(candidates2[0])); double massMCH = getMuMuInvariantMass(propagateToVertexMch(mchTrack1, collision), propagateToVertexMch(mchTrack2, collision)); @@ -2765,6 +2744,7 @@ struct QaMatching { candidate.globalTrackId, mchIndex, mftTrack.globalIndex(), + candidate.trackType, mftTrackProp, mchTrackProp, matchScore, @@ -2780,6 +2760,7 @@ struct QaMatching { candidate.globalTrackId, mchIndex, mftTrack.globalIndex(), + candidate.trackType, mftTrackProp, mchTrackProp, matchScore, @@ -2805,11 +2786,9 @@ struct QaMatching { auto mftMchMatchAttempts = getMftMchMatchAttempts(collisions, bcs, mchTrack, mftTracks); int ranking = 1; for (auto& candidate : globalTracksVector) { // o2-linter: disable=const-ref-in-for-loop (object is modified in loop) - const auto& muonTrack = muonTracks.rawIteratorAt(candidate.globalTrackId); - candidate.matchRanking = ranking; if constexpr (isMC) { - candidate.matchType = getMatchType(muonTrack, muonTracks, mftTracks, matchablePairs, ranking); + candidate.matchType = getMatchType(candidate, muonTracks, mftTracks, matchablePairs, ranking); } else { candidate.matchType = kMatchTypeUndefined; } @@ -2914,6 +2893,7 @@ struct QaMatching { candidate.globalTrackId, mchIndex, mftTrack.globalIndex(), + candidate.trackType, mftTrackProp, mchTrackProp, matchScore, @@ -2929,6 +2909,7 @@ struct QaMatching { candidate.globalTrackId, mchIndex, mftTrack.globalIndex(), + candidate.trackType, mftTrackProp, mchTrackProp, matchScore, @@ -2954,11 +2935,9 @@ struct QaMatching { auto mftMchMatchAttempts = getMftMchMatchAttempts(collisions, bcs, mchTrack, mftTracks); int ranking = 1; for (auto& candidate : globalTracksVector) { // o2-linter: disable=const-ref-in-for-loop (object is modified in loop) - const auto& muonTrack = muonTracks.rawIteratorAt(candidate.globalTrackId); - candidate.matchRanking = ranking; if constexpr (isMC) { - candidate.matchType = getMatchType(muonTrack, muonTracks, mftTracks, matchablePairs, ranking); + candidate.matchType = getMatchType(candidate, muonTracks, mftTracks, matchablePairs, ranking); } else { candidate.matchType = kMatchTypeUndefined; }