3838
3939#include < map>
4040#include < string>
41+ #include < tuple>
4142#include < unordered_map>
4243#include < utility>
4344#include < vector>
@@ -399,14 +400,46 @@ struct skimmerPrimaryMuon {
399400 }
400401 }
401402
402- SliceCache cache;
403+ // std::map<std::tuple<int, int, int>, float> mCandidates; // std::pair<globalIndex of global muon, globalIndex of matched MCH-MID, globalIndex of MFT> -> chi2MatchMCHMFT;
404+ 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;
405+ template <typename TMuons>
406+ void findBestMatchPerMCHMID (TMuons const & muons)
407+ {
408+ vec_min_chi2MatchMCHMFT.reserve (muons.size ());
409+ for (const auto & muon : muons) {
410+ if (muon.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
411+ const auto & muons_per_MCHMID = muons.sliceBy (fwdtracksPerMCHTrack, muon.globalIndex ());
412+ // LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
413+ // LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
414+
415+ float min_chi2MatchMCHMFT = 1e+10 ;
416+ std::tuple<int , int , int > tupleIds_at_min;
417+ for (const auto & muon_tmp : muons_per_MCHMID) {
418+ if (muon_tmp.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
419+ // 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());
420+ if (0 .f < muon_tmp.chi2MatchMCHMFT () && muon_tmp.chi2MatchMCHMFT () < min_chi2MatchMCHMFT) {
421+ min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT ();
422+ tupleIds_at_min = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
423+ }
424+ }
425+ }
426+ vec_min_chi2MatchMCHMFT.emplace_back (tupleIds_at_min);
427+ // mCandidates[tupleIds_at_min] = min_chi2MatchMCHMFT;
428+ // 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);
429+ }
430+ } // end of muon loop
431+ }
403432
433+ SliceCache cache;
404434 Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
405435 Preslice<aod::FwdTrackAssoc> fwdtrackIndicesPerCollision = aod::track_association::collisionId;
406436 PresliceUnsorted<aod::FwdTrackAssoc> fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId;
437+ PresliceUnsorted<aod::FwdTracks> fwdtracksPerMCHTrack = aod::fwdtrack::matchMCHTrackId;
407438
408439 void processRec_SA (MyCollisions const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &)
409440 {
441+ findBestMatchPerMCHMID (fwdtracks);
442+
410443 for (const auto & collision : collisions) {
411444 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
412445 initCCDB (bc);
@@ -420,14 +453,24 @@ struct skimmerPrimaryMuon {
420453 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
421454 continue ;
422455 }
456+
457+ 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 ()) {
458+ continue ;
459+ }
460+
423461 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false );
424462 } // end of fwdtrack loop
425463 } // end of collision loop
464+
465+ vec_min_chi2MatchMCHMFT.clear ();
466+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
426467 }
427468 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_SA, " process reconstructed info" , false );
428469
429470 void processRec_TTCA (MyCollisions const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices)
430471 {
472+ findBestMatchPerMCHMID (fwdtracks);
473+
431474 std::unordered_map<int64_t , bool > mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
432475 for (const auto & fwdtrack : fwdtracks) {
433476 const auto & fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy (fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex ());
@@ -449,15 +492,23 @@ struct skimmerPrimaryMuon {
449492 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
450493 continue ;
451494 }
495+ 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 ()) {
496+ continue ;
497+ }
498+
452499 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex ()]);
453500 } // end of fwdtrack loop
454501 } // end of collision loop
455502 mapAmb.clear ();
503+ vec_min_chi2MatchMCHMFT.clear ();
504+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
456505 }
457506 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_TTCA, " process reconstructed info" , false );
458507
459508 void processRec_SA_SWT (MyCollisionsWithSWT const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &)
460509 {
510+ findBestMatchPerMCHMID (fwdtracks);
511+
461512 for (const auto & collision : collisions) {
462513 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
463514 initCCDB (bc);
@@ -475,14 +526,22 @@ struct skimmerPrimaryMuon {
475526 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
476527 continue ;
477528 }
529+ 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 ()) {
530+ continue ;
531+ }
532+
478533 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false );
479534 } // end of fwdtrack loop
480535 } // end of collision loop
536+ vec_min_chi2MatchMCHMFT.clear ();
537+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
481538 }
482539 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_SA_SWT, " process reconstructed info only with standalone" , false );
483540
484541 void processRec_TTCA_SWT (MyCollisionsWithSWT const & collisions, MyFwdTracks const & fwdtracks, aod::MFTTracks const &, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices)
485542 {
543+ findBestMatchPerMCHMID (fwdtracks);
544+
486545 std::unordered_map<int64_t , bool > mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
487546 for (const auto & fwdtrack : fwdtracks) {
488547 const auto & fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy (fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex ());
@@ -506,15 +565,23 @@ struct skimmerPrimaryMuon {
506565 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
507566 continue ;
508567 }
568+ 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 ()) {
569+ continue ;
570+ }
571+
509572 fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex ()]);
510573 } // end of fwdtrack loop
511574 } // end of collision loop
512575 mapAmb.clear ();
576+ vec_min_chi2MatchMCHMFT.clear ();
577+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
513578 }
514579 PROCESS_SWITCH (skimmerPrimaryMuon, processRec_TTCA_SWT, " process reconstructed info" , false );
515580
516581 void processMC_SA (soa::Join<MyCollisions, aod::McCollisionLabels> const & collisions, MyFwdTracksMC const & fwdtracks, MFTTracksMC const &, aod::BCsWithTimestamps const &)
517582 {
583+ findBestMatchPerMCHMID (fwdtracks);
584+
518585 for (const auto & collision : collisions) {
519586 const auto & bc = collision.template bc_as <aod::BCsWithTimestamps>();
520587 initCCDB (bc);
@@ -533,14 +600,22 @@ struct skimmerPrimaryMuon {
533600 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
534601 continue ;
535602 }
603+ 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 ()) {
604+ continue ;
605+ }
606+
536607 fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, false );
537608 } // end of fwdtrack loop
538609 } // end of collision loop
610+ vec_min_chi2MatchMCHMFT.clear ();
611+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
539612 }
540613 PROCESS_SWITCH (skimmerPrimaryMuon, processMC_SA, " process reconstructed and MC info" , false );
541614
542615 void processMC_TTCA (soa::Join<MyCollisions, aod::McCollisionLabels> const & collisions, MyFwdTracksMC const & fwdtracks, MFTTracksMC const &, aod::BCsWithTimestamps const &, aod::FwdTrackAssoc const & fwdtrackIndices)
543616 {
617+ findBestMatchPerMCHMID (fwdtracks);
618+
544619 std::unordered_map<int64_t , bool > mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
545620 for (const auto & fwdtrack : fwdtracks) {
546621 const auto & fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy (fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex ());
@@ -567,10 +642,16 @@ struct skimmerPrimaryMuon {
567642 if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
568643 continue ;
569644 }
645+ 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 ()) {
646+ continue ;
647+ }
648+
570649 fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex ()]);
571650 } // end of fwdtrack loop
572651 } // end of collision loop
573652 mapAmb.clear ();
653+ vec_min_chi2MatchMCHMFT.clear ();
654+ vec_min_chi2MatchMCHMFT.shrink_to_fit ();
574655 }
575656 PROCESS_SWITCH (skimmerPrimaryMuon, processMC_TTCA, " process reconstructed and MC info" , false );
576657
0 commit comments