@@ -255,6 +255,9 @@ struct qaMatching {
255255 std::vector<int64_t > taggedMuons;
256256 };
257257
258+ struct NoCovTag {};
259+ struct WithCovTag {};
260+
258261 using CollisionInfos = std::map<int64_t , CollisionInfo>;
259262
260263 std::unordered_map<int64_t , int32_t > mftTrackCovs;
@@ -2561,12 +2564,13 @@ struct qaMatching {
25612564 }
25622565 }
25632566
2564- template <class C , class TMUON , class TMFT , class CMFT >
2565- void ProcessCollisionMC (const CollisionInfo& collisionInfo,
2567+ template <class CovTag , class C , class TMUON , class TMFT , class CMFT = void >
2568+ void ProcessCollisionMC (CovTag,
2569+ const CollisionInfo& collisionInfo,
25662570 C const & collisions,
25672571 TMUON const & muonTracks,
25682572 TMFT const & mftTracks,
2569- CMFT const & mftCovs)
2573+ CMFT const * mftCovs = nullptr )
25702574 {
25712575 auto collision = collisions.rawIteratorAt (collisionInfo.index );
25722576
@@ -2575,25 +2579,27 @@ struct qaMatching {
25752579
25762580 // Chi2-based matching analysis
25772581 FillMatchingPlotsMC (collision, collisionInfo, muonTracks, mftTracks, collisionInfo.matchingCandidates , collisionInfo.matchingCandidates , collisionInfo.matchablePairs , fMatchingChi2ScoreMftMchLow , fChi2MatchingPlotter .get (), false );
2578- for (auto & [label, func] : matchingChi2Functions) {
2579- MatchingCandidates matchingCandidates;
2580- RunChi2Matching (collisions, muonTracks, mftTracks, mftCovs, label, collisionInfo.matchablePairs , collisionInfo.matchingCandidates , matchingCandidates);
2582+ if constexpr (std::is_same_v<CovTag, WithCovTag>) {
2583+ for (auto & [label, func] : matchingChi2Functions) {
2584+ MatchingCandidates matchingCandidates;
2585+ RunChi2Matching (collisions, muonTracks, mftTracks, *mftCovs, label, collisionInfo.matchablePairs , collisionInfo.matchingCandidates , matchingCandidates);
25812586
2582- auto * plotter = fMatchingPlotters .at (label).get ();
2583- double matchingScoreCut = matchingScoreCuts.at (label);
2587+ auto * plotter = fMatchingPlotters .at (label).get ();
2588+ double matchingScoreCut = matchingScoreCuts.at (label);
25842589
2585- FillMatchingPlotsMC (collision, collisionInfo, muonTracks, mftTracks, matchingCandidates, collisionInfo.matchingCandidates , collisionInfo.matchablePairs , matchingScoreCut, plotter, false );
2586- }
2590+ FillMatchingPlotsMC (collision, collisionInfo, muonTracks, mftTracks, matchingCandidates, collisionInfo.matchingCandidates , collisionInfo.matchablePairs , matchingScoreCut, plotter, false );
2591+ }
25872592
2588- // ML-based matching analysis
2589- for (auto & [label, mlResponse] : matchingMlResponses) {
2590- MatchingCandidates matchingCandidates;
2591- RunMLMatching (collisions, muonTracks, mftTracks, mftCovs, label, collisionInfo.matchablePairs , collisionInfo.matchingCandidates , matchingCandidates);
2593+ // ML-based matching analysis
2594+ for (auto & [label, mlResponse] : matchingMlResponses) {
2595+ MatchingCandidates matchingCandidates;
2596+ RunMLMatching (collisions, muonTracks, mftTracks, * mftCovs, label, collisionInfo.matchablePairs , collisionInfo.matchingCandidates , matchingCandidates);
25922597
2593- auto * plotter = fMatchingPlotters .at (label).get ();
2594- double matchingScoreCut = matchingScoreCuts.at (label);
2598+ auto * plotter = fMatchingPlotters .at (label).get ();
2599+ double matchingScoreCut = matchingScoreCuts.at (label);
25952600
2596- FillMatchingPlotsMC (collision, collisionInfo, muonTracks, mftTracks, matchingCandidates, collisionInfo.matchingCandidates , collisionInfo.matchablePairs , matchingScoreCut, plotter);
2601+ FillMatchingPlotsMC (collision, collisionInfo, muonTracks, mftTracks, matchingCandidates, collisionInfo.matchingCandidates , collisionInfo.matchablePairs , matchingScoreCut, plotter);
2602+ }
25972603 }
25982604
25992605 // Muons tagging
@@ -2603,18 +2609,25 @@ struct qaMatching {
26032609 continue ;
26042610 auto collision = collisions.rawIteratorAt (mchTrack.collisionId ());
26052611
2606- auto const & mftTrack = mftTracks.rawIteratorAt (mftIndex);
2607- if (mftTrackCovs.count (mftTrack.globalIndex ()) < 1 ) {
2608- continue ;
2609- }
2610- auto const & mftTrackCov = mftCovs.rawIteratorAt (mftTrackCovs[mftTrack.globalIndex ()]);
2611-
26122612 auto mchTrackAtVertex = VarManager::PropagateMuon (mchTrack, collision, VarManager::kToVertex );
26132613
26142614 // extrapolate to the matching plane
26152615 auto z = o2::mft::constants::mft::LayerZCoordinate ()[9 ];
26162616 auto mchTrackProp = PropagateToZMCH (mchTrackAtVertex, z);
2617- auto mftTrackProp = PropagateToZMFT (FwdToTrackPar (mftTrack, mftTrackCov), z);
2617+
2618+ auto const & mftTrack = mftTracks.rawIteratorAt (mftIndex);
2619+ o2::track::TrackParCovFwd mftTrackBeforeProp;
2620+ if constexpr (std::is_same_v<CovTag, WithCovTag>) {
2621+ if (mftTrackCovs.count (mftTrack.globalIndex ()) < 1 ) {
2622+ continue ;
2623+ }
2624+ auto const & mftTrackCov = mftCovs->rawIteratorAt (mftTrackCovs[mftTrack.globalIndex ()]);
2625+ mftTrackBeforeProp = FwdToTrackPar (mftTrack, mftTrackCov);
2626+ } else {
2627+ mftTrackBeforeProp = FwdToTrackPar (mftTrack);
2628+ }
2629+
2630+ auto mftTrackProp = PropagateToZMFT (mftTrackBeforeProp, z);
26182631
26192632 registry.get <TH2>(HIST (" matching/MC/pairedMCHTracksAtMFT" ))->Fill (mchTrackProp.getX (), mchTrackProp.getY ());
26202633 registry.get <TH2>(HIST (" matching/MC/pairedMFTTracksAtMFT" ))->Fill (mftTrackProp.getX (), mftTrackProp.getY ());
@@ -2668,11 +2681,34 @@ struct qaMatching {
26682681 }
26692682
26702683 for (auto const & [collisionIndex, collisionInfo] : fCollisionInfos ) {
2671- ProcessCollisionMC (collisionInfo, collisions, muonTracks, mftTracks, mftCovs);
2684+ ProcessCollisionMC (WithCovTag{}, collisionInfo, collisions, muonTracks, mftTracks, & mftCovs);
26722685 }
26732686 }
26742687
26752688 PROCESS_SWITCH (qaMatching, processQAMC, " processQAMC" , true );
2689+
2690+ void processQAMCNoCov (MyEvents const & collisions,
2691+ aod::BCsWithTimestamps const & bcs,
2692+ MyMuonsMC const & muonTracks,
2693+ MyMFTsMC const & mftTracks,
2694+ aod::McParticles const & /* mcParticles*/ )
2695+ {
2696+ auto bc = bcs.begin ();
2697+ initCCDB (bc);
2698+
2699+ for (auto & muon : muonTracks) {
2700+ registry.get <TH1>(HIST (" nTracksPerType" ))->Fill (static_cast <int >(muon.trackType ()));
2701+ }
2702+
2703+ FillCollisions (collisions, bcs, muonTracks, mftTracks, fCollisionInfos );
2704+
2705+ for (auto const & [collisionIndex, collisionInfo] : fCollisionInfos ) {
2706+ ProcessCollisionMC (NoCovTag{}, collisionInfo, collisions, muonTracks, mftTracks);
2707+ }
2708+ }
2709+
2710+ PROCESS_SWITCH (qaMatching, processQAMCNoCov, " processQAMCNoCov" , true );
2711+
26762712};
26772713
26782714WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments