From b0daaf2080146c59810f40939386b1e737e76d61 Mon Sep 17 00:00:00 2001 From: jaimenorman Date: Fri, 28 Nov 2025 14:35:41 +0000 Subject: [PATCH] improvements to track outlier rejection --- PWGJE/TableProducer/mcOutlierRejector.cxx | 54 ++++++++++++++--------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/PWGJE/TableProducer/mcOutlierRejector.cxx b/PWGJE/TableProducer/mcOutlierRejector.cxx index 0527490a905..8b8035a8ba7 100644 --- a/PWGJE/TableProducer/mcOutlierRejector.cxx +++ b/PWGJE/TableProducer/mcOutlierRejector.cxx @@ -37,10 +37,14 @@ struct McOutlierRejectorTask { Configurable checkmcCollisionForCollision{"checkmcCollisionForCollision", true, "additionally reject collision based on mcCollision"}; Configurable ptHatMax{"ptHatMax", 4.0, "maximum factor of pt hat the leading jet in the event is allowed"}; + Configurable ptTrackMaxMinBias{"ptTrackMaxMinBias", 20.0, "maximum pt for track originating from minimum bias event"}; + Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; std::vector collisionFlag; std::vector mcCollisionFlag; + int trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + void processSetupCollisionSelection(aod::JCollisions const& collisions) { collisionFlag.clear(); @@ -59,34 +63,40 @@ struct McOutlierRejectorTask { void collisionSelection(int32_t collisionIndex, int32_t mcCollisionId, T const& selectionObjects, float ptHard, std::vector& flagArray, std::optional>> mcCollisionsOpt = std::nullopt) { if (selectionObjects.size() != 0) { - bool isTrueOutlier = true; - float maxSelectionObjectPt = 0.0; + float selectionObjectPt = 0.0; if constexpr (std::is_same_v, aod::JetTracksMCD> || std::is_same_v, aod::JetParticles>) { for (auto selectionObject : selectionObjects) { - if (selectionObject.pt() > maxSelectionObjectPt) { - maxSelectionObjectPt = selectionObject.pt(); - // may be slow - could save only MC particle then check difference only for tracks IDd as outliers? - if constexpr (std::is_same_v, aod::JetTracksMCD>) { - auto& mcCollisions = mcCollisionsOpt.value().get(); - auto mcParticle = selectionObject.template mcParticle_as>(); - auto mcCollision = mcCollisions.sliceBy(perColParticle, mcParticle.mcCollisionId()); - int subGenID = mcCollision.begin().subGeneratorId(); - int diffCollisionID = mcParticle.mcCollisionId() - mcCollisionId; - if (subGenID != jetderiveddatautilities::JCollisionSubGeneratorId::mbGap && - diffCollisionID != 0) { - isTrueOutlier = true; - } else { - isTrueOutlier = false; + selectionObjectPt = selectionObject.pt(); + // may be slow - could save only MC particle then check difference only for tracks IDd as outliers? + if constexpr (std::is_same_v, aod::JetTracksMCD>) { // tracks + if (!jetderiveddatautilities::selectTrack(selectionObject, trackSelection)) { + continue; + } + auto& mcCollisions = mcCollisionsOpt.value().get(); + auto mcParticle = selectionObject.template mcParticle_as>(); + auto mcCollision = mcCollisions.sliceBy(perColParticle, mcParticle.mcCollisionId()); + int subGenID = mcCollision.begin().subGeneratorId(); + int diffCollisionID = mcParticle.mcCollisionId() - mcCollisionId; + if (diffCollisionID != 0 && + selectionObjectPt > ptHatMax * ptHard) { + if (subGenID != jetderiveddatautilities::JCollisionSubGeneratorId::mbGap && selectionObjectPt > ptHatMax * ptHard) { + flagArray[collisionIndex] = true; } + if (subGenID == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap && selectionObjectPt > ptTrackMaxMinBias) { + flagArray[collisionIndex] = true; + } + } + } else { // particles + if (selectionObjectPt > ptHatMax * ptHard) { + flagArray[collisionIndex] = true; } } } - } else { - maxSelectionObjectPt = selectionObjects.iteratorAt(0).pt(); - } - - if (maxSelectionObjectPt > ptHatMax * ptHard && isTrueOutlier) { - flagArray[collisionIndex] = true; // Currently if running multiple different jet finders, then a single type of jet can veto an event for others. Decide if this is the best way + } else { // jets + selectionObjectPt = selectionObjects.iteratorAt(0).pt(); + if (selectionObjectPt > ptHatMax * ptHard) { + flagArray[collisionIndex] = true; // Currently if running multiple different jet finders, then a single type of jet can veto an event for others. Decide if this is the best way + } } } }