@@ -603,17 +603,25 @@ struct UpcCandProducer {
603603 // "uncorrected" bcs
604604 template <int32_t tracksSwitch, typename TBCs, typename TAmbTracks>
605605 void collectAmbTrackBCs (std::unordered_map<int64_t , uint64_t >& ambTrIds,
606+ TBCs const & bcs,
606607 TAmbTracks ambTracks)
607608 {
608609 for (const auto & ambTrk : ambTracks) {
609610 auto trkId = getAmbTrackId<tracksSwitch>(ambTrk);
610- const auto & bcSlice = ambTrk.template bc_as <TBCs>();
611- uint64_t trackBC = -1 ;
612- if (bcSlice.size () != 0 ) {
613- auto first = bcSlice.begin ();
614- trackBC = first.globalBC ();
611+
612+ const auto & bcIds = ambTrk.bcIds ();
613+ if (bcIds.size () == 0 )
614+ continue ;
615+
616+ const auto firstBcId = static_cast <int64_t >(*bcIds.begin ());
617+ if (firstBcId < 0 || firstBcId >= static_cast <int64_t >(bcs.size ())) {
618+ LOGP (debug,
619+ " Skipping ambiguous track {}: invalid first bcId {} (nBCs = {})" ,
620+ trkId, firstBcId, bcs.size ());
621+ continue ;
615622 }
616- ambTrIds[trkId] = trackBC;
623+
624+ ambTrIds[trkId] = bcs.iteratorAt (firstBcId).globalBC ();
617625 }
618626 }
619627
@@ -649,16 +657,22 @@ struct UpcCandProducer {
649657 continue ;
650658 int64_t trkId = trk.globalIndex ();
651659 int32_t nContrib = -1 ;
660+ bool hasTrackBC = false ;
652661 uint64_t trackBC = 0 ;
653662 if (trk.has_collision ()) {
654663 const auto & col = trk.collision ();
655664 nContrib = col.numContrib ();
656665 trackBC = col.bc_as <TBCs>().globalBC ();
666+ hasTrackBC = true ;
657667 } else {
658668 auto ambIter = ambBarrelTrBCs.find (trkId);
659- if (ambIter != ambBarrelTrBCs.end ())
669+ if (ambIter != ambBarrelTrBCs.end ()) {
660670 trackBC = ambIter->second ;
671+ hasTrackBC = true ;
672+ }
661673 }
674+ if (!hasTrackBC)
675+ continue ;
662676 int64_t tint = TMath::FloorNint (trk.trackTime () / o2::constants::lhc::LHCBunchSpacingNS + static_cast <float >(fBarrelTrackTShift ));
663677 uint64_t bc = trackBC + tint;
664678 if (nContrib > upcCuts.getMaxNContrib ())
@@ -683,15 +697,22 @@ struct UpcCandProducer {
683697 continue ;
684698 int64_t trkId = trk.globalIndex ();
685699 int32_t nContrib = -1 ;
700+ bool hasTrackBC = false ;
686701 uint64_t trackBC = 0 ;
687702 auto ambIter = ambFwdTrBCs.find (trkId);
688703 if (ambIter == ambFwdTrBCs.end ()) {
704+ if (!trk.has_collision ())
705+ continue ;
689706 const auto & col = trk.collision ();
690707 nContrib = col.numContrib ();
691708 trackBC = col.bc_as <TBCs>().globalBC ();
709+ hasTrackBC = true ;
692710 } else {
693711 trackBC = ambIter->second ;
712+ hasTrackBC = true ;
694713 }
714+ if (!hasTrackBC)
715+ continue ;
695716 int64_t tint = TMath::FloorNint (trk.trackTime () / o2::constants::lhc::LHCBunchSpacingNS + static_cast <float >(fMuonTrackTShift ));
696717 uint64_t bc = trackBC + tint;
697718 if (nContrib > upcCuts.getMaxNContrib ())
@@ -716,9 +737,12 @@ struct UpcCandProducer {
716737 continue ;
717738 int64_t trkId = trk.globalIndex ();
718739 int32_t nContrib = -1 ;
740+ bool hasTrackBC = false ;
719741 uint64_t trackBC = 0 ;
720742 auto ambIter = ambFwdTrBCs.find (trkId);
721743 if (ambIter == ambFwdTrBCs.end ()) {
744+ if (!trk.has_collision ())
745+ continue ;
722746 const auto & col = trk.collision ();
723747 nContrib = col.numContrib ();
724748 trackBC = col.bc_as <TBCs>().globalBC ();
@@ -732,6 +756,8 @@ struct UpcCandProducer {
732756 } else {
733757 trackBC = ambIter->second ;
734758 }
759+ if (!hasTrackBC)
760+ continue ;
735761 int64_t tint = TMath::FloorNint (trk.trackTime () / o2::constants::lhc::LHCBunchSpacingNS + static_cast <float >(fMuonTrackTShift ));
736762 uint64_t bc = trackBC + tint;
737763 if (nContrib > upcCuts.getMaxNContrib ())
@@ -800,7 +826,7 @@ struct UpcCandProducer {
800826 // trackID -> index in amb. track table
801827 std::unordered_map<int64_t , uint64_t > ambBarrelTrBCs;
802828 if (upcCuts.getAmbigSwitch () != 1 )
803- collectAmbTrackBCs<0 , BCsWithBcSels>(ambBarrelTrBCs, ambBarrelTracks);
829+ collectAmbTrackBCs<0 , BCsWithBcSels>(ambBarrelTrBCs, bcs, ambBarrelTracks);
804830
805831 collectBarrelTracks (bcsMatchedTrIdsTOF,
806832 0 ,
@@ -1101,10 +1127,10 @@ struct UpcCandProducer {
11011127
11021128 // trackID -> index in amb. track table
11031129 std::unordered_map<int64_t , uint64_t > ambBarrelTrBCs;
1104- collectAmbTrackBCs<0 , BCsWithBcSels>(ambBarrelTrBCs, ambBarrelTracks);
1130+ collectAmbTrackBCs<0 , BCsWithBcSels>(ambBarrelTrBCs, bcs, ambBarrelTracks);
11051131
11061132 std::unordered_map<int64_t , uint64_t > ambFwdTrBCs;
1107- collectAmbTrackBCs<1 , BCsWithBcSels>(ambFwdTrBCs, ambFwdTracks);
1133+ collectAmbTrackBCs<1 , BCsWithBcSels>(ambFwdTrBCs, bcs, ambFwdTracks);
11081134
11091135 collectForwardTracks (bcsMatchedTrIdsMID,
11101136 o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack,
@@ -1301,7 +1327,7 @@ struct UpcCandProducer {
13011327
13021328 // trackID -> index in amb. track table
13031329 std::unordered_map<int64_t , uint64_t > ambFwdTrBCs;
1304- collectAmbTrackBCs<1 , BCsWithBcSels>(ambFwdTrBCs, ambFwdTracks);
1330+ collectAmbTrackBCs<1 , BCsWithBcSels>(ambFwdTrBCs, bcs, ambFwdTracks);
13051331
13061332 collectForwardTracks (bcsMatchedTrIdsMID,
13071333 o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack,
@@ -1556,7 +1582,7 @@ struct UpcCandProducer {
15561582
15571583 // trackID -> index in amb. track table
15581584 std::unordered_map<int64_t , uint64_t > ambFwdTrBCs;
1559- collectAmbTrackBCs<1 , BCsWithBcSels>(ambFwdTrBCs, ambFwdTracks);
1585+ collectAmbTrackBCs<1 , BCsWithBcSels>(ambFwdTrBCs, bcs, ambFwdTracks);
15601586
15611587 collectForwardTracks (bcsMatchedTrIdsMID,
15621588 o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack,
0 commit comments