@@ -1334,28 +1334,7 @@ struct QaMatching {
13341334 {
13351335 return isGoodGlobalMatching (candidate, cfgMatchingChi2ScoreMftMchLow);
13361336 }
1337- /*
1338- template <class TMUON>
1339- bool isGoodGlobalMatching(const TMUON& muonTrack,
1340- double matchingScore,
1341- double matchingScoreCut)
1342- {
1343- if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax)
1344- return false;
1345-
1346- // MFT-MCH matching score cut
1347- if (matchingScore < matchingScoreCut)
1348- return false;
13491337
1350- return true;
1351- }
1352-
1353- template <class TMUON>
1354- bool isGoodGlobalMatching(const TMUON& muonTrack, double matchingScore)
1355- {
1356- return isGoodGlobalMatching(muonTrack, matchingScore, cfgMatchingChi2ScoreMftMchLow);
1357- }
1358- */
13591338 bool isTrueGlobalMatching (const MatchingCandidate& candidate, const std::vector<std::pair<int64_t , int64_t >>& matchablePairs)
13601339 {
13611340 if (candidate.trackType > GlobalTrackTypeMax)
@@ -1368,21 +1347,7 @@ struct QaMatching {
13681347
13691348 return (std::find (matchablePairs.begin (), matchablePairs.end (), trackIndexes) != matchablePairs.end ());
13701349 }
1371- /*
1372- template <class TMUON>
1373- bool isTrueGlobalMatching(const TMUON& muonTrack, const std::vector<std::pair<int64_t, int64_t>>& matchablePairs)
1374- {
1375- if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax)
1376- return false;
1377-
1378- int64_t mchTrackId = static_cast<int64_t>(muonTrack.matchMCHTrackId());
1379- int64_t mftTrackId = static_cast<int64_t>(muonTrack.matchMFTTrackId());
13801350
1381- std::pair<int64_t, int64_t> trackIndexes = std::make_pair(mchTrackId, mftTrackId);
1382-
1383- return (std::find(matchablePairs.begin(), matchablePairs.end(), trackIndexes) != matchablePairs.end());
1384- }
1385- */
13861351 bool isMatchableMch (int64_t mchTrackId, const std::vector<std::pair<int64_t , int64_t >>& matchablePairs)
13871352 {
13881353 for (const auto & [id1, id2] : matchablePairs) {
@@ -1847,44 +1812,7 @@ struct QaMatching {
18471812
18481813 return result;
18491814 }
1850- /*
1851- template <class TMUON, class TMUONS, class TMFTS>
1852- MuonMatchType getMatchType(const TMUON& muonTrack,
1853- TMUONS const& muonTracks,
1854- TMFTS const& mftTracks,
1855- const std::vector<std::pair<int64_t, int64_t>>& matchablePairs,
1856- int ranking)
1857- {
1858- bool verbose{false};
1859- if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax)
1860- return kMatchTypeUndefined;
1861-
1862- auto const& mchTrack = muonTrack.template matchMCHTrack_as<TMUONS>();
1863-
1864- //if (mchTrack.globalIndex() == 229 && muonTrack.globalIndex() == 230) verbose = true;
1865-
1866- bool isPairable = isMatchableMch(mchTrack.globalIndex(), matchablePairs);
1867- bool isTrueMatch = isTrueGlobalMatching(muonTrack, matchablePairs);
1868- int decayRanking = getDecayRanking(mchTrack, mftTracks);
1869-
1870- if (verbose) std::cout << std::format("[TOTO] ranking={} isPairable={} isTrueMatch={} decayRanking={} ", ranking, isPairable, isTrueMatch, decayRanking) << std::endl;
18711815
1872- MuonMatchType result{kMatchTypeUndefined};
1873- if (isPairable) {
1874- if (isTrueMatch) {
1875- result = (ranking == 1) ? kMatchTypeTrueLeading : kMatchTypeTrueNonLeading;
1876- } else {
1877- result = (ranking == 1) ? kMatchTypeWrongLeading : kMatchTypeWrongNonLeading;
1878- }
1879- } else if (decayRanking == DecayRankingDirect) {
1880- result = (ranking == 1) ? kMatchTypeDecayLeading : kMatchTypeDecayNonLeading;
1881- } else {
1882- result = (ranking == 1) ? kMatchTypeFakeLeading : kMatchTypeFakeNonLeading;
1883- }
1884-
1885- return result;
1886- }
1887- */
18881816 // tag muons based on the track quality and the track position at the front and back MFT planes
18891817 template <class TMUON , class C >
18901818 void getTaggedMuons (const CollisionInfo& collisionInfo,
@@ -1971,26 +1899,7 @@ struct QaMatching {
19711899 }
19721900 }
19731901 }
1974- /*
1975- template <class TMUONS>
1976- int64_t getGlobalFwdTrackIndex(const TMUONS& muonTracks, int64_t mchIndex, int64_t mftIndex)
1977- {
1978- int64_t result = -1;
1979- for (const auto& muonTrack : muonTracks) {
1980- if (static_cast<int>(muonTrack.trackType()) > GlobalTrackTypeMax) {
1981- continue;
1982- }
1983- if (mchIndex != muonTrack.matchMCHTrackId()) {
1984- continue;
1985- }
1986- if (mftIndex != muonTrack.matchMFTTrackId()) {
1987- continue;
1988- }
1989- result = muonTrack.globalIndex();
1990- }
1991- return result;
1992- }
1993- */
1902+
19941903 double getMuMuInvariantMass (const o2::mch::TrackParam& track1, const o2::mch::TrackParam& track2)
19951904 {
19961905 ROOT ::Math::PxPyPzMVector muon1{
@@ -2798,9 +2707,7 @@ struct QaMatching {
27982707 return ;
27992708 auto matchingFunc = mMatchingFunctionMap .at (funcName);
28002709
2801- int id1 = 0 ;
28022710 for (const auto & muonTrack : muonTracks) {
2803- id1 += 1 ;
28042711 if (!muonTrack.has_collision ()) {
28052712 continue ;
28062713 }
@@ -2820,10 +2727,8 @@ struct QaMatching {
28202727 const auto & collMch = collisions.rawIteratorAt (muonTrack.collisionId ());
28212728 const auto & bcMch = bcs.rawIteratorAt (collMch.bcId ());
28222729
2823- int id2 = 0 ;
28242730 // loop over MFT track/covariance mapping
28252731 for (const auto & [mftIndex, mftCovIndex] : mftTrackCovs) {
2826- id2 += 1 ;
28272732 auto const & mftTrack = mftTracks.rawIteratorAt (mftIndex);
28282733 auto const & mftTrackCov = mftCovs.rawIteratorAt (mftCovIndex);
28292734
@@ -2834,6 +2739,7 @@ struct QaMatching {
28342739 const auto & collMft = collisions.rawIteratorAt (mftTrack.collisionId ());
28352740 const auto & bcMft = bcs.rawIteratorAt (collMft.bcId ());
28362741
2742+ // check time compatibility between MCH and MFT tracks
28372743 int64_t deltaBc = static_cast <int64_t >(bcMft.globalBC ()) - static_cast <int64_t >(bcMch.globalBC ());
28382744 double deltaBcNS = o2::constants::lhc::LHCBunchSpacingNS * deltaBc;
28392745 double deltaTrackTime = mftTrack.trackTime () - muonTrack.trackTime () + deltaBcNS;
@@ -2882,7 +2788,7 @@ struct QaMatching {
28822788 if (matchingCandidateIterator != newMatchingCandidates.end ()) {
28832789 matchingCandidateIterator->second .emplace_back (MatchingCandidate{
28842790 muonTrack.collisionId (),
2885- globalTrackIndex, // candidate.globalTrackId,
2791+ globalTrackIndex,
28862792 mchIndex,
28872793 mftTrack.globalIndex (),
28882794 globalTrackType,
@@ -2898,7 +2804,7 @@ struct QaMatching {
28982804 } else {
28992805 newMatchingCandidates[mchIndex].emplace_back (MatchingCandidate{
29002806 muonTrack.collisionId (),
2901- globalTrackIndex, // candidate.globalTrackId,
2807+ globalTrackIndex,
29022808 mchIndex,
29032809 mftTrack.globalIndex (),
29042810 globalTrackType,
@@ -2943,7 +2849,7 @@ struct QaMatching {
29432849 ranking += 1 ;
29442850 }
29452851 }
2946- }
2852+ }
29472853
29482854 template <bool isMC, class C , class BC , class TMUON , class TMFT , class CMFT >
29492855 void runChi2Matching (C const & collisions,
@@ -3000,9 +2906,6 @@ struct QaMatching {
30002906 if (!muonTrack.has_collision ()) {
30012907 continue ;
30022908 }
3003- int64_t mchIndex = muonTrack.globalIndex ();
3004-
3005- auto collision = collisions.rawIteratorAt (muonTrack.collisionId ());
30062909
30072910 // skip global tracks
30082911 if (static_cast <int >(muonTrack.trackType ()) <= GlobalTrackTypeMax) {
@@ -3013,11 +2916,34 @@ struct QaMatching {
30132916 continue ;
30142917 }
30152918
2919+ int64_t mchIndex = muonTrack.globalIndex ();
2920+ auto collision = collisions.rawIteratorAt (muonTrack.collisionId ());
2921+
2922+ const auto & collMch = collisions.rawIteratorAt (muonTrack.collisionId ());
2923+ const auto & bcMch = bcs.rawIteratorAt (collMch.bcId ());
2924+
30162925 // loop over MFT track/covariance mapping
30172926 for (const auto & [mftIndex, mftCovIndex] : mftTrackCovs) {
30182927 auto const & mftTrack = mftTracks.rawIteratorAt (mftIndex);
30192928 auto const & mftTrackCov = mftCovs.rawIteratorAt (mftCovIndex);
30202929
2930+ if (!mftTrack.has_collision ()) {
2931+ continue ;
2932+ }
2933+
2934+ const auto & collMft = collisions.rawIteratorAt (mftTrack.collisionId ());
2935+ const auto & bcMft = bcs.rawIteratorAt (collMft.bcId ());
2936+
2937+ // check time compatibility between MCH and MFT tracks
2938+ int64_t deltaBc = static_cast <int64_t >(bcMft.globalBC ()) - static_cast <int64_t >(bcMch.globalBC ());
2939+ double deltaBcNS = o2::constants::lhc::LHCBunchSpacingNS * deltaBc;
2940+ double deltaTrackTime = mftTrack.trackTime () - muonTrack.trackTime () + deltaBcNS;
2941+ double trackTimeResTot = mftTrack.trackTimeRes () + muonTrack.trackTimeRes ();
2942+
2943+ if (std::fabs (deltaTrackTime) > trackTimeResTot) {
2944+ continue ;
2945+ }
2946+
30212947 // get tracks parameters in O2 format
30222948 auto mftTrackProp = fwdToTrackPar (mftTrack, mftTrackCov);
30232949 auto mchTrackProp = fwdToTrackPar (muonTrack, muonTrack);
@@ -3075,7 +3001,7 @@ struct QaMatching {
30753001 if (matchingCandidateIterator != newMatchingCandidates.end ()) {
30763002 matchingCandidateIterator->second .emplace_back (MatchingCandidate{
30773003 muonTrack.collisionId (),
3078- globalTrackIndex, // candidate.globalTrackId,
3004+ globalTrackIndex,
30793005 mchIndex,
30803006 mftTrack.globalIndex (),
30813007 globalTrackType,
@@ -3091,7 +3017,7 @@ struct QaMatching {
30913017 } else {
30923018 newMatchingCandidates[mchIndex].emplace_back (MatchingCandidate{
30933019 muonTrack.collisionId (),
3094- globalTrackIndex, // candidate.globalTrackId,
3020+ globalTrackIndex,
30953021 mchIndex,
30963022 mftTrack.globalIndex (),
30973023 globalTrackType,
0 commit comments