@@ -568,26 +568,37 @@ struct matchingMFT {
568568 fRegistry .fill (HIST (" Event/hMultFT0CvsMultNTracksPV" ), collision.multFT0C (), collision.multNTracksPV ());
569569 }
570570
571- // template <typename TMCParticles>
572- // void runGen(TMCParticles const& mcParticles)
573- // {
574- // for (const auto& mcParticle : mcParticles) {
575- // if (std::abs(mcParticle.pdgCode()) != 13) { // select true muon
576- // continue;
577- // }
578- // if (!(mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator())) {
579- // continue;
580- // }
581- // if (mcParticle.eta() < minEtaGL || maxEtaGL < mcParticle.eta()) {
582- // continue;
583- // }
584-
585- // fRegistry.fill(HIST("Generated/primary/hs"), mcParticle.pt(), mcParticle.eta(), mcParticle.phi());
586-
587- // } // end of mc particles
588- // }
571+ std::vector<std::tuple<int , int , int >> vec_min_chi2MatchMCHMFT; // std::pair<globalIndex of global muon, globalIndex of matched MCH-MID, globalIndex of MFT> -> chi2MatchMCHMFT;
572+ template <typename TMuons>
573+ void findBestMatchPerMCHMID (TMuons const & muons)
574+ {
575+ vec_min_chi2MatchMCHMFT.reserve (muons.size ());
576+ for (const auto & muon : muons) {
577+ if (muon.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
578+ const auto & muons_per_MCHMID = muons.sliceBy (fwdtracksPerMCHTrack, muon.globalIndex ());
579+ // LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
580+ // LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
581+
582+ float min_chi2MatchMCHMFT = 1e+10 ;
583+ std::tuple<int , int , int > tupleIds_at_min;
584+ for (const auto & muon_tmp : muons_per_MCHMID) {
585+ if (muon_tmp.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
586+ // LOGF(info, "muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", muon_tmp.globalIndex(), muon_tmp.matchMCHTrackId(), muon_tmp.matchMFTTrackId(), muon_tmp.chi2MatchMCHMFT());
587+ if (0 .f < muon_tmp.chi2MatchMCHMFT () && muon_tmp.chi2MatchMCHMFT () < min_chi2MatchMCHMFT) {
588+ min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT ();
589+ tupleIds_at_min = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
590+ }
591+ }
592+ }
593+ vec_min_chi2MatchMCHMFT.emplace_back (tupleIds_at_min);
594+ // mCandidates[tupleIds_at_min] = min_chi2MatchMCHMFT;
595+ // LOGF(info, "min: muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", std::get<0>(tupleIds_at_min), std::get<1>(tupleIds_at_min), std::get<2>(tupleIds_at_min), min_chi2MatchMCHMFT);
596+ }
597+ } // end of muon loop
598+ }
589599
590600 SliceCache cache;
601+ PresliceUnsorted<aod::FwdTracks> fwdtracksPerMCHTrack = aod::fwdtrack::matchMCHTrackId;
591602 PresliceUnsorted<aod::FwdTracks> perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId;
592603 Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
593604 Preslice<aod::FwdTrackAssoc> fwdtrackIndicesPerCollision = aod::track_association::collisionId;
@@ -599,6 +610,8 @@ struct matchingMFT {
599610
600611 void processWithoutFTTCA (FilteredMyCollisions const & collisions, MyFwdTracks const & fwdtracks, MyMFTTracks const & mfttracks, aod::BCsWithTimestamps const &, aod::McParticles const &)
601612 {
613+ findBestMatchPerMCHMID (fwdtracks);
614+
602615 for (const auto & collision : collisions) {
603616 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
604617 initCCDB (bc);
@@ -621,15 +634,22 @@ struct matchingMFT {
621634 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
622635 continue ;
623636 }
637+ if (fwdtrack.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find (vec_min_chi2MatchMCHMFT.begin (), vec_min_chi2MatchMCHMFT.end (), std::make_tuple (fwdtrack.globalIndex (), fwdtrack.matchMCHTrackId (), fwdtrack.matchMFTTrackId ())) == vec_min_chi2MatchMCHMFT.end ()) {
638+ continue ;
639+ }
624640 fillHistograms (collision, fwdtrack, fwdtracks, mfttracks);
625641 } // end of fwdtrack loop
626642 } // end of collision loop
627- // runGen(mcParticles);
643+
644+ vec_min_chi2MatchMCHMFT.clear ();
645+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
628646 }
629647 PROCESS_SWITCH (matchingMFT, processWithoutFTTCA, " process without FTTCA" , false );
630648
631649 void processWithFTTCA (FilteredMyCollisions const & collisions, MyFwdTracks const & fwdtracks, MyMFTTracks const & mfttracks, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices, aod::McParticles const &)
632650 {
651+ findBestMatchPerMCHMID (fwdtracks);
652+
633653 for (const auto & collision : collisions) {
634654 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
635655 initCCDB (bc);
@@ -650,13 +670,18 @@ struct matchingMFT {
650670 const auto & fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy (fwdtrackIndicesPerCollision, collision.globalIndex ());
651671 for (const auto & fwdtrackId : fwdtrackIdsThisCollision) {
652672 const auto & fwdtrack = fwdtrackId.template fwdtrack_as <MyFwdTracks>();
653- if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType ()) {
673+ if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
674+ continue ;
675+ }
676+ if (fwdtrack.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find (vec_min_chi2MatchMCHMFT.begin (), vec_min_chi2MatchMCHMFT.end (), std::make_tuple (fwdtrack.globalIndex (), fwdtrack.matchMCHTrackId (), fwdtrack.matchMFTTrackId ())) == vec_min_chi2MatchMCHMFT.end ()) {
654677 continue ;
655678 }
656679 fillHistograms (collision, fwdtrack, fwdtracks, mfttracks);
657680 } // end of fwdtrack loop
658681 } // end of collision loop
659- // runGen(mcParticles);
682+
683+ vec_min_chi2MatchMCHMFT.clear ();
684+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
660685 }
661686 PROCESS_SWITCH (matchingMFT, processWithFTTCA, " process with FTTCA" , true );
662687};
0 commit comments