3838
3939#include < map>
4040#include < string>
41+ #include < tuple>
4142#include < unordered_map>
4243#include < vector>
4344
@@ -568,26 +569,37 @@ struct matchingMFT {
568569 fRegistry .fill (HIST (" Event/hMultFT0CvsMultNTracksPV" ), collision.multFT0C (), collision.multNTracksPV ());
569570 }
570571
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- // }
572+ 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;
573+ template <typename TMuons>
574+ void findBestMatchPerMCHMID (TMuons const & muons)
575+ {
576+ vec_min_chi2MatchMCHMFT.reserve (muons.size ());
577+ for (const auto & muon : muons) {
578+ if (muon.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
579+ const auto & muons_per_MCHMID = muons.sliceBy (fwdtracksPerMCHTrack, muon.globalIndex ());
580+ // LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
581+ // LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
582+
583+ float min_chi2MatchMCHMFT = 1e+10 ;
584+ std::tuple<int , int , int > tupleIds_at_min;
585+ for (const auto & muon_tmp : muons_per_MCHMID) {
586+ if (muon_tmp.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
587+ // 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());
588+ if (0 .f < muon_tmp.chi2MatchMCHMFT () && muon_tmp.chi2MatchMCHMFT () < min_chi2MatchMCHMFT) {
589+ min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT ();
590+ tupleIds_at_min = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
591+ }
592+ }
593+ }
594+ vec_min_chi2MatchMCHMFT.emplace_back (tupleIds_at_min);
595+ // mCandidates[tupleIds_at_min] = min_chi2MatchMCHMFT;
596+ // 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);
597+ }
598+ } // end of muon loop
599+ }
589600
590601 SliceCache cache;
602+ PresliceUnsorted<aod::FwdTracks> fwdtracksPerMCHTrack = aod::fwdtrack::matchMCHTrackId;
591603 PresliceUnsorted<aod::FwdTracks> perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId;
592604 Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
593605 Preslice<aod::FwdTrackAssoc> fwdtrackIndicesPerCollision = aod::track_association::collisionId;
@@ -599,6 +611,8 @@ struct matchingMFT {
599611
600612 void processWithoutFTTCA (FilteredMyCollisions const & collisions, MyFwdTracks const & fwdtracks, MyMFTTracks const & mfttracks, aod::BCsWithTimestamps const &, aod::McParticles const &)
601613 {
614+ findBestMatchPerMCHMID (fwdtracks);
615+
602616 for (const auto & collision : collisions) {
603617 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
604618 initCCDB (bc);
@@ -621,15 +635,22 @@ struct matchingMFT {
621635 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
622636 continue ;
623637 }
638+ 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 ()) {
639+ continue ;
640+ }
624641 fillHistograms (collision, fwdtrack, fwdtracks, mfttracks);
625642 } // end of fwdtrack loop
626643 } // end of collision loop
627- // runGen(mcParticles);
644+
645+ vec_min_chi2MatchMCHMFT.clear ();
646+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
628647 }
629648 PROCESS_SWITCH (matchingMFT, processWithoutFTTCA, " process without FTTCA" , false );
630649
631650 void processWithFTTCA (FilteredMyCollisions const & collisions, MyFwdTracks const & fwdtracks, MyMFTTracks const & mfttracks, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices, aod::McParticles const &)
632651 {
652+ findBestMatchPerMCHMID (fwdtracks);
653+
633654 for (const auto & collision : collisions) {
634655 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
635656 initCCDB (bc);
@@ -650,13 +671,18 @@ struct matchingMFT {
650671 const auto & fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy (fwdtrackIndicesPerCollision, collision.globalIndex ());
651672 for (const auto & fwdtrackId : fwdtrackIdsThisCollision) {
652673 const auto & fwdtrack = fwdtrackId.template fwdtrack_as <MyFwdTracks>();
653- if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType ()) {
674+ if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
675+ continue ;
676+ }
677+ 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 ()) {
654678 continue ;
655679 }
656680 fillHistograms (collision, fwdtrack, fwdtracks, mfttracks);
657681 } // end of fwdtrack loop
658682 } // end of collision loop
659- // runGen(mcParticles);
683+
684+ vec_min_chi2MatchMCHMFT.clear ();
685+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
660686 }
661687 PROCESS_SWITCH (matchingMFT, processWithFTTCA, " process with FTTCA" , true );
662688};
0 commit comments