@@ -399,14 +399,46 @@ struct skimmerPrimaryMuon {
399399 }
400400 }
401401
402- SliceCache cache;
402+ // std::map<std::tuple<int, int, int>, float> mCandidates; // std::pair<globalIndex of global muon, globalIndex of matched MCH-MID, globalIndex of MFT> -> chi2MatchMCHMFT;
403+ 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;
404+ template <typename TMuons>
405+ void findBestMatchPerMCHMID (TMuons const & muons)
406+ {
407+ vec_min_chi2MatchMCHMFT.reserve (muons.size ());
408+ for (const auto & muon : muons) {
409+ if (muon.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
410+ const auto & muons_per_MCHMID = muons.sliceBy (fwdtracksPerMCHTrack, muon.globalIndex ());
411+ // LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
412+ // LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
413+
414+ float min_chi2MatchMCHMFT = 1e+10 ;
415+ std::tuple<int , int , int > tupleIds_at_min;
416+ for (const auto & muon_tmp : muons_per_MCHMID) {
417+ if (muon_tmp.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
418+ // 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());
419+ if (0 .f < muon_tmp.chi2MatchMCHMFT () && muon_tmp.chi2MatchMCHMFT () < min_chi2MatchMCHMFT) {
420+ min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT ();
421+ tupleIds_at_min = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
422+ }
423+ }
424+ }
425+ vec_min_chi2MatchMCHMFT.emplace_back (tupleIds_at_min);
426+ // mCandidates[tupleIds_at_min] = min_chi2MatchMCHMFT;
427+ // 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);
428+ }
429+ } // end of muon loop
430+ }
403431
432+ SliceCache cache;
404433 Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
405434 Preslice<aod::FwdTrackAssoc> fwdtrackIndicesPerCollision = aod::track_association::collisionId;
406435 PresliceUnsorted<aod::FwdTrackAssoc> fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId;
436+ PresliceUnsorted<aod::FwdTracks> fwdtracksPerMCHTrack = aod::fwdtrack::matchMCHTrackId;
407437
408438 void processRec_SA (MyCollisions const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &)
409439 {
440+ findBestMatchPerMCHMID (fwdtracks);
441+
410442 for (const auto & collision : collisions) {
411443 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
412444 initCCDB (bc);
@@ -420,14 +452,24 @@ struct skimmerPrimaryMuon {
420452 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
421453 continue ;
422454 }
455+
456+ 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 ()) {
457+ continue ;
458+ }
459+
423460 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false );
424461 } // end of fwdtrack loop
425462 } // end of collision loop
463+
464+ vec_min_chi2MatchMCHMFT.clear ();
465+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
426466 }
427467 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_SA, " process reconstructed info" , false );
428468
429469 void processRec_TTCA (MyCollisions const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices)
430470 {
471+ findBestMatchPerMCHMID (fwdtracks);
472+
431473 std::unordered_map<int64_t , bool > mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
432474 for (const auto & fwdtrack : fwdtracks) {
433475 const auto & fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy (fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex ());
@@ -449,15 +491,23 @@ struct skimmerPrimaryMuon {
449491 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
450492 continue ;
451493 }
494+ 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 ()) {
495+ continue ;
496+ }
497+
452498 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex ()]);
453499 } // end of fwdtrack loop
454500 } // end of collision loop
455501 mapAmb.clear ();
502+ vec_min_chi2MatchMCHMFT.clear ();
503+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
456504 }
457505 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_TTCA, " process reconstructed info" , false );
458506
459507 void processRec_SA_SWT (MyCollisionsWithSWT const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &)
460508 {
509+ findBestMatchPerMCHMID (fwdtracks);
510+
461511 for (const auto & collision : collisions) {
462512 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
463513 initCCDB (bc);
@@ -475,14 +525,22 @@ struct skimmerPrimaryMuon {
475525 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
476526 continue ;
477527 }
528+ 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 ()) {
529+ continue ;
530+ }
531+
478532 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false );
479533 } // end of fwdtrack loop
480534 } // end of collision loop
535+ vec_min_chi2MatchMCHMFT.clear ();
536+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
481537 }
482538 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_SA_SWT, " process reconstructed info only with standalone" , false );
483539
484540 void processRec_TTCA_SWT (MyCollisionsWithSWT const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices)
485541 {
542+ findBestMatchPerMCHMID (fwdtracks);
543+
486544 std::unordered_map<int64_t , bool > mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
487545 for (const auto & fwdtrack : fwdtracks) {
488546 const auto & fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy (fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex ());
@@ -506,15 +564,23 @@ struct skimmerPrimaryMuon {
506564 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
507565 continue ;
508566 }
567+ 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 ()) {
568+ continue ;
569+ }
570+
509571 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex ()]);
510572 } // end of fwdtrack loop
511573 } // end of collision loop
512574 mapAmb.clear ();
575+ vec_min_chi2MatchMCHMFT.clear ();
576+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
513577 }
514578 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_TTCA_SWT, " process reconstructed info" , false );
515579
516580 void processMC_SA (soa::Join<MyCollisions, aod::McCollisionLabels> const & collisions, MyFwdTracksMC const & fwdtracks, MFTTracksMC const &, aod::BCsWithTimestamps const &)
517581 {
582+ findBestMatchPerMCHMID (fwdtracks);
583+
518584 for (const auto & collision : collisions) {
519585 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
520586 initCCDB (bc);
@@ -533,14 +599,22 @@ struct skimmerPrimaryMuon {
533599 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
534600 continue ;
535601 }
602+ 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 ()) {
603+ continue ;
604+ }
605+
536606 fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, false );
537607 } // end of fwdtrack loop
538608 } // end of collision loop
609+ vec_min_chi2MatchMCHMFT.clear ();
610+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
539611 }
540612 PROCESS_SWITCH (skimmerPrimaryMuon, processMC_SA, " process reconstructed and MC info" , false );
541613
542614 void processMC_TTCA (soa::Join<MyCollisions, aod::McCollisionLabels> const & collisions, MyFwdTracksMC const & fwdtracks, MFTTracksMC const &, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices)
543615 {
616+ findBestMatchPerMCHMID (fwdtracks);
617+
544618 std::unordered_map<int64_t , bool > mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
545619 for (const auto & fwdtrack : fwdtracks) {
546620 const auto & fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy (fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex ());
@@ -567,10 +641,16 @@ struct skimmerPrimaryMuon {
567641 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
568642 continue ;
569643 }
644+ 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 ()) {
645+ continue ;
646+ }
647+
570648 fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex ()]);
571649 } // end of fwdtrack loop
572650 } // end of collision loop
573651 mapAmb.clear ();
652+ vec_min_chi2MatchMCHMFT.clear ();
653+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
574654 }
575655 PROCESS_SWITCH (skimmerPrimaryMuon, processMC_TTCA, " process reconstructed and MC info" , false );
576656
0 commit comments