From 4473d84b1dcaa73f59ca945f54a35908c17a2d6f Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 12 Nov 2025 08:22:13 +0100 Subject: [PATCH 1/3] Add protection for malformed ambiguous track table entries in AO2Ds --- Common/Core/CollisionAssociation.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Common/Core/CollisionAssociation.h b/Common/Core/CollisionAssociation.h index e224dad51ed..eb0898bb66f 100644 --- a/Common/Core/CollisionAssociation.h +++ b/Common/Core/CollisionAssociation.h @@ -127,7 +127,7 @@ class CollisionAssociation TTracksUnfiltered const& tracksUnfiltered, TTracks const& tracks, TAmbiTracks const& ambiguousTracks, - o2::aod::BCs const&, + o2::aod::BCs const& bcs, Assoc& association, RevIndices& reverseIndices) { @@ -151,6 +151,11 @@ class CollisionAssociation for (const auto& ambTrack : ambiguousTracks) { if constexpr (isCentralBarrel) { // FIXME: to be removed as soon as it is possible to use getId() for joined tables if (ambTrack.trackId() == track.globalIndex()) { + // special check to avoid crashes (in particular on some MC datasets) + // related to shifts in ambiguous tracks association to bc slices (off by 1) - see https://mattermost.web.cern.ch/alice/pl/g9yaaf3tn3g4pgn7c1yex9copy + if (ambTrack.bcIds()[0] >= bcs.size() || ambTrack.bcIds()[1] >= bcs.size()) { + break; + } if (!ambTrack.has_bc() || ambTrack.bc().size() == 0) { break; } From 1241dc0ed925d97794adf64b62d40866c5b48c5f Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 12 Nov 2025 08:28:21 +0100 Subject: [PATCH 2/3] Make linter happy --- Common/Core/CollisionAssociation.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Common/Core/CollisionAssociation.h b/Common/Core/CollisionAssociation.h index eb0898bb66f..673a0a3dec0 100644 --- a/Common/Core/CollisionAssociation.h +++ b/Common/Core/CollisionAssociation.h @@ -80,7 +80,8 @@ class CollisionAssociation switch (mTrackSelection) { case o2::aod::track_association::TrackSelection::CentralBarrelRun2: { unsigned char itsClusterMap = track.itsClusterMap(); - if (!(track.tpcNClsFound() >= 50 && track.flags() & o2::aod::track::ITSrefit && track.flags() & o2::aod::track::TPCrefit && (TESTBIT(itsClusterMap, 0) || TESTBIT(itsClusterMap, 1)))) { + int minTpcNClsFound{50}; + if (!(track.tpcNClsFound() >= minTpcNClsFound && track.flags() & o2::aod::track::ITSrefit && track.flags() & o2::aod::track::TPCrefit && (TESTBIT(itsClusterMap, 0) || TESTBIT(itsClusterMap, 1)))) { hasGoodQuality = false; } break; @@ -199,7 +200,7 @@ class CollisionAssociation uint64_t collBC = collision.bc().globalBC(); // This is done per block to allow optimization below. Within each block the globalBC increase continously - for (auto& iterationWindow : trackIterationWindows) { + for (const auto& iterationWindow : trackIterationWindows) { bool iteratorMoved = false; const bool isAssignedTrackWindow = (iterationWindow.first != iterationWindow.second) ? iterationWindow.first.has_collision() : false; for (auto trackInWindow = iterationWindow.first; trackInWindow != iterationWindow.second; ++trackInWindow) { From a53999a60f96325733b80ff8616a710db729b976 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 12 Nov 2025 09:22:22 +0100 Subject: [PATCH 3/3] Revert wrong linter suggestion --- Common/Core/CollisionAssociation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Core/CollisionAssociation.h b/Common/Core/CollisionAssociation.h index 673a0a3dec0..338a37022c9 100644 --- a/Common/Core/CollisionAssociation.h +++ b/Common/Core/CollisionAssociation.h @@ -200,7 +200,7 @@ class CollisionAssociation uint64_t collBC = collision.bc().globalBC(); // This is done per block to allow optimization below. Within each block the globalBC increase continously - for (const auto& iterationWindow : trackIterationWindows) { + for (auto& iterationWindow : trackIterationWindows) { // o2-linter: disable=const-ref-in-for-loop (iterationWindow is modified) bool iteratorMoved = false; const bool isAssignedTrackWindow = (iterationWindow.first != iterationWindow.second) ? iterationWindow.first.has_collision() : false; for (auto trackInWindow = iterationWindow.first; trackInWindow != iterationWindow.second; ++trackInWindow) {