Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 43 additions & 64 deletions PWGDQ/Tasks/qaMatching.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -1344,35 +1345,31 @@ struct QaMatching {
return isGoodMft(mftTrack, cfgTrackChi2MftUp, cfgTrackNClustMftLow);
}

template <class TMUON>
bool isGoodGlobalMatching(const TMUON& muonTrack,
double matchingScore,
bool isGoodGlobalMatching(const MatchingCandidate& candidate,
double matchingScoreCut)
{
if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax)
if (static_cast<int>(candidate.trackType) > GlobalTrackTypeMax)
return false;

// MFT-MCH matching score cut
if (matchingScore < matchingScoreCut)
if (candidate.matchScore < matchingScoreCut)
return false;

return true;
}

template <class TMUON>
bool isGoodGlobalMatching(const TMUON& muonTrack, double matchingScore)
bool isGoodGlobalMatching(const MatchingCandidate& candidate)
{
return isGoodGlobalMatching(muonTrack, matchingScore, cfgMatchingChi2ScoreMftMchLow);
return isGoodGlobalMatching(candidate, cfgMatchingChi2ScoreMftMchLow);
}

template <class TMUON>
bool isTrueGlobalMatching(const TMUON& muonTrack, const std::vector<std::pair<int64_t, int64_t>>& matchablePairs)
bool isTrueGlobalMatching(const MatchingCandidate& candidate, const std::vector<std::pair<int64_t, int64_t>>& matchablePairs)
{
if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax)
if (candidate.trackType > GlobalTrackTypeMax)
return false;

int64_t mchTrackId = static_cast<int64_t>(muonTrack.matchMCHTrackId());
int64_t mftTrackId = static_cast<int64_t>(muonTrack.matchMFTTrackId());
int64_t mchTrackId = candidate.muonTrackId;
int64_t mftTrackId = candidate.mftTrackId;

std::pair<int64_t, int64_t> trackIndexes = std::make_pair(mchTrackId, mftTrackId);

Expand Down Expand Up @@ -1751,19 +1748,15 @@ struct QaMatching {
}
}

template <class TMUON>
int getTrueMatchIndex(TMUON const& muonTracks,
const std::vector<MatchingCandidate>& matchCandidatesVector,
int getTrueMatchIndex(const std::vector<MatchingCandidate>& matchCandidatesVector,
const std::vector<std::pair<int64_t, int64_t>>& matchablePairs)
{
// 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 = 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;
}
Expand Down Expand Up @@ -1807,20 +1800,20 @@ struct QaMatching {
return isMuon(mchTrack, mftTrack);
}

template <class TMUON, class TMUONS, class TMFTS>
MuonMatchType getMatchType(const TMUON& muonTrack,
TMUONS const& /*muonTracks*/,
template <class TMUONS, class TMFTS>
MuonMatchType getMatchType(const MatchingCandidate& candidate,
TMUONS const& muonTracks,
TMFTS const& mftTracks,
const std::vector<std::pair<int64_t, int64_t>>& matchablePairs,
int ranking)
{
if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax)
if (candidate.trackType > GlobalTrackTypeMax)
return kMatchTypeUndefined;

auto const& mchTrack = muonTrack.template matchMCHTrack_as<TMUONS>();
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};
Expand Down Expand Up @@ -2081,6 +2074,7 @@ struct QaMatching {
muonTrackIndex,
mchTrackIndex,
mftTrackIndex,
static_cast<int>(muonTrack.trackType()),
mftTrackProp,
mchTrackProp,
matchScore,
Expand All @@ -2097,6 +2091,7 @@ struct QaMatching {
muonTrackIndex,
mchTrackIndex,
mftTrackIndex,
static_cast<int>(muonTrack.trackType()),
mftTrackProp,
mchTrackProp,
matchScore,
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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<std::shared_ptr<TH2>>(plotter->fMatchScoreVsProd)->Fill(matchScoreProd, matchScore);
std::get<std::shared_ptr<TH2>>(plotter->fMatchChi2VsProd)->Fill(matchChi2Prod, matchChi2);
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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<std::shared_ptr<TH2>>(plotter->fMatchScoreVsProd)->Fill(matchScoreProd, matchScore);
std::get<std::shared_ptr<TH2>>(plotter->fMatchChi2VsProd)->Fill(matchChi2Prod, matchChi2);
Expand All @@ -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);

Expand All @@ -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;
Expand Down Expand Up @@ -2556,15 +2542,10 @@ struct QaMatching {
if (matchingCandidates.count(matchableMchIndex) > 0) {
const auto& globalTracksVector = matchingCandidates.at(static_cast<int64_t>(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<TMFT>();
auto mftIndex = mftTrack.globalIndex();

goodMatchFound = isGoodGlobalMatching(muonTrack, matchingScore, matchingScoreCut);
goodMatchFound = isGoodGlobalMatching(globalTracksVector[0], matchingScoreCut);
isTrueMatch = (mftIndex == matchableMftIndex);
}
}
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down Expand Up @@ -2765,6 +2744,7 @@ struct QaMatching {
candidate.globalTrackId,
mchIndex,
mftTrack.globalIndex(),
candidate.trackType,
mftTrackProp,
mchTrackProp,
matchScore,
Expand All @@ -2780,6 +2760,7 @@ struct QaMatching {
candidate.globalTrackId,
mchIndex,
mftTrack.globalIndex(),
candidate.trackType,
mftTrackProp,
mchTrackProp,
matchScore,
Expand All @@ -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;
}
Expand Down Expand Up @@ -2914,6 +2893,7 @@ struct QaMatching {
candidate.globalTrackId,
mchIndex,
mftTrack.globalIndex(),
candidate.trackType,
mftTrackProp,
mchTrackProp,
matchScore,
Expand All @@ -2929,6 +2909,7 @@ struct QaMatching {
candidate.globalTrackId,
mchIndex,
mftTrack.globalIndex(),
candidate.trackType,
mftTrackProp,
mchTrackProp,
matchScore,
Expand All @@ -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;
}
Expand Down
Loading