From 7ff186a8d60b99c7f0056d9b649eb7f1089a7e00 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Wed, 4 Nov 2026 18:14:57 +0530 Subject: [PATCH 1/3] [PWGCF] Lambda R2 correlation update on close lambda pairs Modified close pair rejection Added histograms for QA --- .../Tasks/lambdaR2Correlation.cxx | 268 ++++++++++-------- 1 file changed, 147 insertions(+), 121 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index cb608859637..96ff6c8789a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -128,11 +128,15 @@ namespace lambdatrackext DECLARE_SOA_COLUMN(LambdaSharingDaughter, lambdaSharingDaughter, bool); DECLARE_SOA_COLUMN(LambdaSharingDauIds, lambdaSharingDauIds, std::vector); DECLARE_SOA_COLUMN(TrueLambdaFlag, trueLambdaFlag, bool); +DECLARE_SOA_COLUMN(CloseLambdaTrackIds, closeLambdaTrackIds, std::vector); +DECLARE_SOA_COLUMN(CloseLambdaFlag, closeLambdaFlag, bool); } // namespace lambdatrackext DECLARE_SOA_TABLE(LambdaTracksExt, "AOD", "LAMBDATRACKSEXT", lambdatrackext::LambdaSharingDaughter, lambdatrackext::LambdaSharingDauIds, - lambdatrackext::TrueLambdaFlag); + lambdatrackext::TrueLambdaFlag, + lambdatrackext::CloseLambdaTrackIds, + lambdatrackext::CloseLambdaFlag); using LambdaTrackExt = LambdaTracksExt::iterator; @@ -160,6 +164,11 @@ using LambdaMcGenTrack = LambdaMcGenTracks::iterator; enum CollisionLabels { kTotColBeforeHasMcCollision = 1, kTotCol, + kPassVzCut, + kPassSel8, + kPassPileUpRej, + kPassGoodZVtx, + kPassGoodITSLayerAll, kPassSelCol }; @@ -182,7 +191,8 @@ enum EffCorrType { enum CentEstType { kCentFT0M = 0, - kCentFT0C + kCentFT0C, + kCentFV0A }; enum ParticleType { @@ -222,7 +232,7 @@ struct LambdaTableProducer { ConfigurableAxis cCentBins{"cCentBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.f, 60.0f, 70.0f, 80.0f, 90.0f, 100.f}, "Variable Centrality Bins"}; // Collisions - Configurable cCentEstimator{"cCentEstimator", 1, "Centrality Estimator : 0-FT0M, 1-FT0C"}; + Configurable cCentEstimator{"cCentEstimator", 0, "Centrality Estimator : 0-FT0M, 1-FT0C, 2-FV0A"}; Configurable cZVtxCut{"cZVtxCut", 10.0, "Z-Vtx cut"}; Configurable cSel8Trig{"cSel8Trig", true, "Sel8 (T0A + T0C) Selection Run3"}; Configurable cPileupReject{"cPileupReject", true, "Pileup rejection"}; @@ -314,7 +324,7 @@ struct LambdaTableProducer { ccdb->setCreatedNotAfter(nolaterthan.value); // Initialize axis specifications - const AxisSpec axisCols(5, 0.5, 5.5, ""); + const AxisSpec axisCols(10, 0.5, 10.5, ""); const AxisSpec axisTrks(15, 0.5, 15.5, ""); const AxisSpec axisFwdMult(cFwdMult, 0, cFwdMult, "N_{ch}^{FWD}"); const AxisSpec axisEffChecks(3, 0, 3, ""); @@ -329,6 +339,7 @@ struct LambdaTableProducer { const AxisSpec axisV0Rap(48, -1.2, 1.2, "y"); const AxisSpec axisV0Eta(48, -1.2, 1.2, "#eta"); const AxisSpec axisV0Phi(36, 0., TwoPI, "#phi (rad)"); + const AxisSpec axisK0SMass(200, 0.4, 0.6, "M_{#pi#pi} (GeV/#it{c}^{2})"); const AxisSpec axisRadius(5000, 0, 5, "r(cm)"); const AxisSpec axisCosPA(100, 0.99, 1.0, "cos(#theta_{PA})"); @@ -358,6 +369,8 @@ struct LambdaTableProducer { histos.add("Tracks/h1f_effcorr_info", "Efficiency correction info", kTH1F, {axisEffChecks}); histos.add("Tracks/h2f_armpod_before_sel", "Armentros-Podolanski Plot", kTH2F, {axisAlpha, axisQtarm}); histos.add("Tracks/h2f_armpod_after_sel", "Armentros-Podolanski Plot", kTH2F, {axisAlpha, axisQtarm}); + histos.add("Tracks/h1f_mass_k0s", "M_{#pi#pi}", kTH1F, {axisK0SMass}); + histos.add("Tracks/h1f_mass_rejk0s", "M_{#pi#pi}", kTH1F, {axisK0SMass}); // QA Lambda histos.add("QA/Lambda/h3f_centmasspt", "Invariant Mass", kTH3F, {axisCent, axisV0Pt, axisV0Mass}); @@ -379,14 +392,14 @@ struct LambdaTableProducer { histos.add("QA/Lambda/h2f_neg_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Neg Prong", kTH2F, {axisMomPID, axisTrackNsigma}); // Dca analysis histogram - histos.add("QA/Lambda/DCA/h3f_Dca_vs_pT_cent", "DCA", kTH3F, {axisCent, axisV0Pt, axisDcaLambda}); + histos.add("QA/Lambda/DCA/h2f_Dca_vs_pT_cent", "DCA", kTH2F, {axisV0Pt, axisDcaLambda}); // MC Generated Histograms if (doprocessMCRecoGen || doprocessMCReco) { // DCA analysis - histos.add("QA/Lambda/DCA/h3f_Prm_Dca_vs_pT_cent", "Primary DCA", kTH3F, {axisCent, axisV0Pt, axisDcaLambda}); - histos.add("QA/Lambda/DCA/h3f_Scd_Dca_vs_pT_cent", "Weak Decay DCA", kTH3F, {axisCent, axisV0Pt, axisDcaLambda}); - histos.add("QA/Lambda/DCA/h3f_Mat_Dca_vs_pT_cent", "Material DCA", kTH3F, {axisCent, axisV0Pt, axisDcaLambda}); + histos.add("QA/Lambda/DCA/h2f_Prm_Dca_vs_pT_cent", "Primary DCA", kTH2F, {axisV0Pt, axisDcaLambda}); + histos.add("QA/Lambda/DCA/h2f_Scd_Dca_vs_pT_cent", "Weak Decay DCA", kTH2F, {axisV0Pt, axisDcaLambda}); + histos.add("QA/Lambda/DCA/h2f_Mat_Dca_vs_pT_cent", "Material DCA", kTH2F, {axisV0Pt, axisDcaLambda}); // McGen Histos histos.add("McGen/h1f_collision_recgen", "# of Reco Collision Associated to One Mc Generator Collision", kTH1F, {axisMult}); @@ -411,6 +424,13 @@ struct LambdaTableProducer { // Set bin labels histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassVzCut, "kPassVzCut"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSel8, "kPassSel8"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassPileUpRej, "kPassPileUpRej"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassGoodZVtx, "kPassGoodZVtx"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassGoodITSLayerAll, "kPassGoodITSLayerAll"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); histos.get(HIST("Tracks/h1f_lambda_info"))->GetXaxis()->SetBinLabel(LambdaLabels::kAllV0Tracks, "kAllV0Tracks"); histos.get(HIST("Tracks/h1f_lambda_info"))->GetXaxis()->SetBinLabel(LambdaLabels::kPassK0ShortMassRej, "kPassK0ShortMassRej"); @@ -486,33 +506,40 @@ struct LambdaTableProducer { if (std::abs(col.posZ()) >= cZVtxCut) { return false; } + histos.fill(HIST("Events/h1f_collisions_info"), kPassVzCut); // Run 3 Min-Bias Trigger if (cSel8Trig && !col.sel8()) { return false; } + histos.fill(HIST("Events/h1f_collisions_info"), kPassSel8); // Centrality estimator if (cCentEstimator == kCentFT0M) { cent = col.centFT0M(); } else if (cCentEstimator == kCentFT0C) { cent = col.centFT0C(); + } else if (cCentEstimator == kCentFV0A) { + cent = col.centFV0A(); } // Pileup rejection if (cPileupReject && !col.selection_bit(aod::evsel::kNoSameBunchPileup)) { return false; } + histos.fill(HIST("Events/h1f_collisions_info"), kPassPileUpRej); // Zvtx from FT0 time difference if (cZVtxTimeDiff && !col.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } + histos.fill(HIST("Events/h1f_collisions_info"), kPassGoodZVtx); // Hit all layers in ITS if (cIsGoodITSLayers && !col.selection_bit(aod::evsel::kIsGoodITSLayersAll)) { return false; } + histos.fill(HIST("Events/h1f_collisions_info"), kPassGoodITSLayerAll); return true; } @@ -607,6 +634,7 @@ struct LambdaTableProducer { } histos.fill(HIST("Tracks/h1f_lambda_info"), kPassV0TopoSel); + histos.fill(HIST("Tracks/h1f_mass_k0s"), v0.mK0Short()); // K0s mass rejection if (std::abs(v0.mK0Short() - MassK0Short) <= cKshortRejMassWindow) { @@ -745,6 +773,7 @@ struct LambdaTableProducer { // Decay length float ctau = v0.distovertotmom(col.posX(), col.posY(), col.posZ()) * MassLambda0; + histos.fill(HIST("Tracks/h1f_mass_rejk0s"), v0.mK0Short()); histos.fill(HIST(SubDir[part]) + HIST("h2f_qt_vs_alpha"), v0.alpha(), v0.qtarm()); histos.fill(HIST(SubDir[part]) + HIST("h1f_dca_V0_daughters"), v0.dcaV0daughters()); histos.fill(HIST(SubDir[part]) + HIST("h1f_dca_pos_to_PV"), v0.dcapostopv()); @@ -768,17 +797,17 @@ struct LambdaTableProducer { void getDcaHist(T const& track, float const& dca) { // Fill histograms - histos.fill(HIST(SubDir[part]) + HIST("DCA/h3f_Dca_vs_pT_cent"), cent, track.pt(), dca); + histos.fill(HIST(SubDir[part]) + HIST("DCA/h2f_Dca_vs_pT_cent"), track.pt(), dca); if constexpr (dmc == kMC) { auto mcpart = track.mcParticle(); if (mcpart.isPhysicalPrimary()) { - histos.fill(HIST(SubDir[part]) + HIST("DCA/h3f_Prm_Dca_vs_pT_cent"), cent, track.pt(), dca); + histos.fill(HIST(SubDir[part]) + HIST("DCA/h2f_Prm_Dca_vs_pT_cent"), track.pt(), dca); } else { if (mcpart.getProcess() == cWeakDecayProcess) { // Weak decay - histos.fill(HIST(SubDir[part]) + HIST("DCA/h3f_Scd_Dca_vs_pT_cent"), cent, track.pt(), dca); + histos.fill(HIST(SubDir[part]) + HIST("DCA/h2f_Scd_Dca_vs_pT_cent"), track.pt(), dca); } else { // Material - histos.fill(HIST(SubDir[part]) + HIST("DCA/h3f_Mat_Dca_vs_pT_cent"), cent, track.pt(), dca); + histos.fill(HIST(SubDir[part]) + HIST("DCA/h2f_Mat_Dca_vs_pT_cent"), track.pt(), dca); } } } @@ -957,7 +986,7 @@ struct LambdaTableProducer { // BC, Collision, tracks and V0s using BCsRun3 = soa::Join; - using Collisions = soa::Join; + using Collisions = soa::Join; using Tracks = soa::Join; using TracksMC = soa::Join; using McV0Tracks = soa::Join; @@ -1052,10 +1081,16 @@ struct LambdaTracksExtProducer { // Configurables Configurable cAcceptAllLambda{"cAcceptAllLambda", false, "Accept all Lambda"}; Configurable cRejAllLambdaShaDau{"cRejAllLambdaShaDau", true, "Reject all Lambda sharing daughters"}; + Configurable cDEtaCut{"cDEtaCut", 0.02, "DEta cut"}; + Configurable cDPhiStarCut{"cDPhiStarCut", 0.02, "DPhiStar cut"}; // Histogram Registry. HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + // Objects + float magField = 0.; + std::array tpcRadii = {0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4}; + void init(InitContext const&) { // Axis Specifications @@ -1073,18 +1108,69 @@ struct LambdaTracksExtProducer { histos.add("h2d_n2_etaphi_LaM_LaM", "#rho_{2}^{SharePair}", kTH2D, {axisDEta, axisDPhi}); } + template + bool checkClosePair(A const& v1, A const& v2, int charge1, int charge2) + { + // DPhiStar average over different TPC radius + float dphistar = 0., n = 0.; + for (auto const& radius : tpcRadii) { + float arg1 = 0.15 * magField * radius / v1[0]; + float arg2 = 0.15 * magField * radius / v2[0]; + if (std::abs(arg1) < 1.0 && std::abs(arg2) < 1.0) { + dphistar += v1[2] - v2[2] - (charge1 * std::abs(std::asin(arg1))) + (charge2 * std::abs(std::asin(arg2))); + ++n; + } + } + + // Inf check + if (n == 0) { + return false; + } + + // DPhiStar + dphistar = RecoDecay::constrainAngle(dphistar / n, -PIHalf); + + // DEta + float deta = v1[1] - v2[1]; + + // Return + return (std::abs(deta) < cDEtaCut && std::abs(dphistar) < cDPhiStarCut); + } + + template + bool isClosePair(V const& l1, V const& l2) + { + // Assign kinematics + std::array posTrackKinLambda1 = {l1.posTrackKin()[0], l1.posTrackKin()[1], l1.posTrackKin()[2]}; + std::array negTrackKinLambda1 = {l1.negTrackKin()[0], l1.negTrackKin()[1], l1.negTrackKin()[2]}; + std::array posTrackKinLambda2 = {l2.posTrackKin()[0], l2.posTrackKin()[1], l2.posTrackKin()[2]}; + std::array negTrackKinLambda2 = {l2.negTrackKin()[0], l2.negTrackKin()[1], l2.negTrackKin()[2]}; + + // Check close pair + bool retFlag = checkClosePair(posTrackKinLambda1, posTrackKinLambda2, 1, 1) && checkClosePair(negTrackKinLambda1, negTrackKinLambda2, -1, -1); + + // Pair reject + return retFlag; + } + void processDummy(aod::LambdaCollisions::iterator const&) {} PROCESS_SWITCH(LambdaTracksExtProducer, processDummy, "Dummy Process", true); - void processLambdaTrackExt(aod::LambdaCollisions::iterator const&, aod::LambdaTracks const& tracks) + void processLambdaTrackExt(aod::LambdaCollisions::iterator const& collision, aod::LambdaTracks const& tracks) { int nTotLambda = 0, nTotAntiLambda = 0, nSelLambda = 0, nSelAntiLambda = 0; + magField = collision.bField(); for (auto const& lambda : tracks) { + // Shared daughter objects bool lambdaSharingDauFlag = false, trueLambdaFlag = false; std::vector vSharedDauLambdaIndex; + // Index of lambda track close to current lambda + bool isCloseLambdaFlag = false; + std::vector vCloseLambdaTrackIndex; + if (lambda.partType() == kLambda) { ++nTotLambda; } else if (lambda.partType() == kAntiLambda) { @@ -1092,12 +1178,12 @@ struct LambdaTracksExtProducer { } for (auto const& track : tracks) { - // check lambda index (don't analyze same lambda track !!!) + // Check lambda index (don't analyze same lambda track !!!) if (lambda.index() == track.index()) { continue; } - // check if lambda shares daughters with any other track + // Check if lambda shares daughters with any other lambda track if (lambda.posTrackId() == track.posTrackId() || lambda.negTrackId() == track.negTrackId()) { vSharedDauLambdaIndex.push_back(track.index()); lambdaSharingDauFlag = true; @@ -1111,6 +1197,13 @@ struct LambdaTracksExtProducer { histos.fill(HIST("h2d_n2_etaphi_LaM_LaM"), lambda.eta() - track.eta(), RecoDecay::constrainAngle((lambda.phi() - track.phi()), -PIHalf)); } } + + // Check if this lambda is close to lambda track + // Keep the index of this lambda track + if (isClosePair(lambda, track)) { + isCloseLambdaFlag = true; + vCloseLambdaTrackIndex.push_back(track.index()); + } } // Accept / Reject @@ -1126,7 +1219,7 @@ struct LambdaTracksExtProducer { } // Fill LambdaTrackExt table - lambdaTrackExtTable(lambdaSharingDauFlag, vSharedDauLambdaIndex, trueLambdaFlag); + lambdaTrackExtTable(lambdaSharingDauFlag, vSharedDauLambdaIndex, trueLambdaFlag, vCloseLambdaTrackIndex, isCloseLambdaFlag); } // fill multiplicity histograms @@ -1165,14 +1258,8 @@ struct LambdaR2Correlation { Configurable cAnaPairs{"cAnaPairs", false, "Analyze Pairs Flag"}; Configurable cAnaEff{"cAnaEff", false, "Analyze efficiency flag"}; - // Lambda Kaon femtoscopic correction - Configurable cApplyFemtoSel{"cApplyFemtoSel", false, "Femto qinv selection"}; - Configurable cFemtoCut{"cFemtoCut", 0.1, "Femto qinv cut"}; - - // Lambda Kaon two-track cuts - Configurable cApplyTwoTrackCut{"cApplyTwoTrackCut", false, "Flag for two track cut"}; - Configurable cDEtaCut{"cDEtaCut", 0.02, "DEta cut"}; - Configurable cDPhiStarCut{"cDPhiStarCut", 0.02, "DPhiStar cut"}; + // Lambda close pair rejection + Configurable cRejCloseLambda{"cRejCloseLambda", false, "Flag close Lambda rej"}; // Centrality Axis ConfigurableAxis cCentBins{"cCentBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.f, 60.0f, 70.0f, 80.0f, 90.0f, 100.f}, "Variable Mult-Bins"}; @@ -1192,8 +1279,10 @@ struct LambdaR2Correlation { float phibinwidth = 0.; float q = 0., e = 0., qinv = 0.; float cent = 0., posZ = 0.; - float magField = 0.; - std::array tpcRadii = {0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4}; + + static constexpr auto SubDirRecGen = std::array{"Reco/", "McGen/"}; + static constexpr auto SubDirHist = std::array{"LaP", "LaM"}; + static constexpr auto SubDirPairHist = std::array{"LaP_LaM", "LaP_LaP", "LaM_LaM"}; void init(InitContext const&) { @@ -1228,11 +1317,17 @@ struct LambdaR2Correlation { histos.add("Event/Reco/h1f_collision_posz", "V_{Z} Distribution", kTH1F, {axisPosZ}); histos.add("Event/Reco/h1f_ft0m_mult_percentile", "FT0M (%)", kTH1F, {axisCent}); - // Two track cut - histos.add("QA/TwoTrackCut/Before/h2d_n2_detadphi", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); - histos.add("QA/TwoTrackCut/After/h2d_n2_detadphi", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); - histos.add("QA/FemtoCut/Before/h2d_n2_detadphi", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); - histos.add("QA/FemtoCut/After/h2d_n2_detadphi", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); + // Close pair checks + histos.add("QA/CloseLambda/Before/h2d_n1_centpt_LaP", "#rho_{1}", kTH2D, {axisCent, axisPtLambda}); + histos.add("QA/CloseLambda/Before/h2d_n1_centpt_LaM", "#rho_{1}", kTH2D, {axisCent, axisPtLambda}); + histos.add("QA/CloseLambda/Before/h2d_n2_detadphi_LaP_LaM", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); + histos.add("QA/CloseLambda/Before/h2d_n2_detadphi_LaP_LaP", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); + histos.add("QA/CloseLambda/Before/h2d_n2_detadphi_LaM_LaM", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); + histos.add("QA/CloseLambda/After/h2d_n1_centpt_LaP", "#rho_{1}", kTH2D, {axisCent, axisPtLambda}); + histos.add("QA/CloseLambda/After/h2d_n1_centpt_LaM", "#rho_{1}", kTH2D, {axisCent, axisPtLambda}); + histos.add("QA/CloseLambda/After/h2d_n2_detadphi_LaP_LaM", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); + histos.add("QA/CloseLambda/After/h2d_n2_detadphi_LaP_LaP", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); + histos.add("QA/CloseLambda/After/h2d_n2_detadphi_LaM_LaM", "#rho_{2}", kTH2D, {axisDEta, axisDPhi}); // Efficiency Histograms // Single Particle Efficiencies @@ -1270,86 +1365,9 @@ struct LambdaR2Correlation { } } - template - bool checkClosePair(A const& v1, A const& v2, int charge1, int charge2) - { - // DPhiStar average over different TPC radius - float dphistar = 0., n = 0.; - for (auto const& radius : tpcRadii) { - float arg1 = 0.15 * magField * radius / v1[0]; - float arg2 = 0.15 * magField * radius / v2[0]; - if (std::abs(arg1) < 1.0 && std::abs(arg2) < 1.0) { - dphistar += v1[2] - v2[2] - (charge1 * std::abs(std::asin(arg1))) + (charge2 * std::abs(std::asin(arg2))); - ++n; - } - } - - // Inf check - if (n == 0) { - return false; - } - - // DPhiStar - dphistar = RecoDecay::constrainAngle(dphistar / n, -PIHalf); - - // DEta - float deta = v1[1] - v2[1]; - - // Return - return (std::abs(deta) < cDEtaCut && std::abs(dphistar) < cDPhiStarCut); - } - - template - bool isClosePair(V const& l1, V const& l2) - { - // Before - histos.fill(HIST("QA/TwoTrackCut/Before/h2d_n2_detadphi"), l1.eta() - l2.eta(), RecoDecay::constrainAngle(l1.phi() - l2.phi(), -PIHalf)); - - // Assign kinematics - std::array posTrackKinLambda1 = {l1.posTrackKin()[0], l1.posTrackKin()[1], l1.posTrackKin()[2]}; - std::array negTrackKinLambda1 = {l1.negTrackKin()[0], l1.negTrackKin()[1], l1.negTrackKin()[2]}; - std::array posTrackKinLambda2 = {l2.posTrackKin()[0], l2.posTrackKin()[1], l2.posTrackKin()[2]}; - std::array negTrackKinLambda2 = {l2.negTrackKin()[0], l2.negTrackKin()[1], l2.negTrackKin()[2]}; - - // Check close pair - bool retFlag = checkClosePair(posTrackKinLambda1, posTrackKinLambda2, 1, 1) && checkClosePair(negTrackKinLambda1, negTrackKinLambda2, -1, -1); - - // Fill QA - if (!retFlag) { // Pair accept - histos.fill(HIST("QA/TwoTrackCut/After/h2d_n2_detadphi"), l1.eta() - l2.eta(), RecoDecay::constrainAngle(l1.phi() - l2.phi(), -PIHalf)); - } - - // Pair reject - return retFlag; - } - - template - bool isCloseQinv(V const& p1, T const& p2) - { - // Before - histos.fill(HIST("QA/FemtoCut/Before/h2d_n2_detadphi"), p1.eta() - p2.eta(), RecoDecay::constrainAngle(p1.phi() - p2.phi(), -PIHalf)); - - // Calculate qinv - q = RecoDecay::p((p1.px() - p2.px()), (p1.py() - p2.py()), (p1.pz() - p2.pz())); - e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2.px(), p2.py(), p2.pz(), MassKaonCharged); - qinv = std::sqrt(-RecoDecay::m2(q, e)); - - // Pair accept - if (qinv > cFemtoCut) { - histos.fill(HIST("QA/FemtoCut/After/h2d_n2_detadphi"), p1.eta() - p2.eta(), RecoDecay::constrainAngle(p1.phi() - p2.phi(), -PIHalf)); - return false; - } - - // Pair reject - return true; - } - template void fillPairHistos(T1& p1, T2& p2) { - static constexpr auto SubDirRecGen = std::array{"Reco/", "McGen/"}; - static constexpr auto SubDirHist = std::array{"LaP_LaM", "LaP_LaP", "LaM_LaM"}; - const auto rapbin1 = static_cast((p1.rap() - kminrap) / rapbinwidth); const auto rapbin2 = static_cast((p2.rap() - kminrap) / rapbinwidth); @@ -1363,17 +1381,24 @@ struct LambdaR2Correlation { const int rapphix = rapbin1 * nphibins + phibin1; const int rapphiy = rapbin2 * nphibins + phibin2; - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h3f_n2_rapphi_") + HIST(SubDirHist[part_pair]), cent, rapphix + 0.5, rapphiy + 0.5, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h3f_n2_rapphi_") + HIST(SubDirPairHist[part_pair]), cent, rapphix + 0.5, rapphiy + 0.5, corfac); } } template void analyzeSingles(T const& tracks) { - static constexpr auto SubDirRecGen = std::array{"Reco/", "McGen/"}; - static constexpr auto SubDirHist = std::array{"LaP", "LaM"}; - for (auto const& track : tracks) { + if constexpr (rec_gen == kRec) { + // Close pair lambda + histos.fill(HIST("QA/CloseLambda/Before/h2d_n1_centpt_") + HIST(SubDirHist[part]), cent, track.pt()); + if (track.closeLambdaFlag()) { + histos.fill(HIST("QA/CloseLambda/After/h2d_n1_centpt_") + HIST(SubDirHist[part]), cent, track.pt()); + if (cRejCloseLambda) + continue; + } + } + // Efficiency Plots if (cAnaEff) { histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h2f_n1_centpt_") + HIST(SubDirHist[part]), cent, track.pt()); @@ -1395,19 +1420,21 @@ struct LambdaR2Correlation { { for (auto const& trk_1 : trks_1) { for (auto const& trk_2 : trks_2) { - // check for same index for Lambda-Lambda / AntiLambda-AntiLambda + // Check for same index for Lambda-Lambda / AntiLambda-AntiLambda if (same && ((trk_1.index() == trk_2.index()))) { continue; } - // Lambda close pair rejection + // Close pair if constexpr (rec_gen == kRec) { - // Close pair - if (cApplyTwoTrackCut && isClosePair(trk_1, trk_2)) { - continue; + // Close pair histograms + histos.fill(HIST("QA/CloseLambda/Before/h2d_n2_detadphi_") + HIST(SubDirPairHist[partpair]), trk_1.eta() - trk_2.eta(), RecoDecay::constrainAngle(trk_1.phi() - trk_2.phi(), -PIHalf)); + if (trk_1.closeLambdaFlag() && trk_2.closeLambdaFlag()) { + histos.fill(HIST("QA/CloseLambda/After/h2d_n2_detadphi_") + HIST(SubDirPairHist[partpair]), trk_1.eta() - trk_2.eta(), RecoDecay::constrainAngle(trk_1.phi() - trk_2.phi(), -PIHalf)); } - // Femto selection - if (cApplyFemtoSel && isCloseQinv(trk_1, trk_2)) { + + // Close pair lambda rejection + if (cRejCloseLambda && (trk_1.closeLambdaFlag() || trk_2.closeLambdaFlag())) { continue; } } @@ -1436,7 +1463,6 @@ struct LambdaR2Correlation { posZ = collision.posZ(); cent = collision.cent(); - magField = collision.bField(); auto lambdaTracks = partLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); auto antiLambdaTracks = partAntiLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); From 8b7a42e64138c0eff3b5900b44540b042fc8cc0f Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Wed, 4 Nov 2026 22:07:01 +0530 Subject: [PATCH 2/3] Replace C-style casts with static_cast for type safety --- .../Tasks/lambdaR2Correlation.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 96ff6c8789a..f40f593cf5a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -900,7 +900,7 @@ struct LambdaTableProducer { // Fill Lambda/AntiLambda Table lambdaTrackTable(lambdaCollisionTable.lastIndex(), v0.pt(), v0.eta(), v0.phi(), v0.yLambda(), v0.px(), v0.py(), v0.pz(), lambdaMass, v0.template posTrack_as().index(), v0.template negTrack_as().index(), posTrackKin, negTrackKin, - (int8_t)partType, lambdaCorrFact); + static_cast(partType), lambdaCorrFact); } } @@ -955,7 +955,7 @@ struct LambdaTableProducer { } // Fill table lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), mcpart.px(), mcpart.py(), mcpart.pz(), RecoDecay::m(mcpart.p(), mcpart.e()), - daughterIDs[0], daughterIDs[1], (int8_t)partType, 1.); + daughterIDs[0], daughterIDs[1], static_cast(partType), 1.); } } @@ -1067,7 +1067,7 @@ struct LambdaTableProducer { // Fill table lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), mcpart.px(), mcpart.py(), mcpart.pz(), RecoDecay::m(mcpart.p(), mcpart.e()), - -1, -1, (int8_t)partType, 1.); + -1, -1, static_cast(partType), 1.); } } @@ -1449,8 +1449,8 @@ struct LambdaR2Correlation { using LambdaTracks = soa::Join; SliceCache cache; - Partition partLambdaTracks = (aod::lambdatrack::partType == (int8_t)kLambda) && (aod::lambdatrackext::trueLambdaFlag == true); - Partition partAntiLambdaTracks = (aod::lambdatrack::partType == (int8_t)kAntiLambda) && (aod::lambdatrackext::trueLambdaFlag == true); + Partition partLambdaTracks = (aod::lambdatrack::partType == static_cast(kLambda)) && (aod::lambdatrackext::trueLambdaFlag == true); + Partition partAntiLambdaTracks = (aod::lambdatrack::partType == static_cast(kAntiLambda)) && (aod::lambdatrackext::trueLambdaFlag == true); void processDummy(aod::LambdaCollisions::iterator const&) {} @@ -1484,8 +1484,8 @@ struct LambdaR2Correlation { using LambdaMcGenTracks = aod::LambdaMcGenTracks; SliceCache cachemc; - Partition partMcLambdaTracks = (aod::lambdatrack::partType == (int8_t)kLambda); - Partition partMcAntiLambdaTracks = (aod::lambdatrack::partType == (int8_t)kAntiLambda); + Partition partMcLambdaTracks = (aod::lambdatrack::partType == static_cast(kLambda)); + Partition partMcAntiLambdaTracks = (aod::lambdatrack::partType == static_cast(kAntiLambda)); void processMCGen(LambdaMcGenCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) { From 1d287657b42ec1cb52fa22739b966881775f1e61 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Wed, 4 Nov 2026 22:32:09 +0530 Subject: [PATCH 3/3] Update lambdaR2Correlation.cxx --- .../Tasks/lambdaR2Correlation.cxx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index f40f593cf5a..4a5bf4ce66a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -742,11 +742,7 @@ struct LambdaTableProducer { fwdMult = multFT0M; // Minimum bias trigger (1 track in A side, 1 track in C side, 1 track in central barrel) - if (multFT0A > 0 && multFT0C > 0 && multTPC > 0) { - return true; - } - - return false; + return (multFT0A > 0 && multFT0C > 0 && multTPC > 0); } // MC generator centrality @@ -1394,8 +1390,9 @@ struct LambdaR2Correlation { histos.fill(HIST("QA/CloseLambda/Before/h2d_n1_centpt_") + HIST(SubDirHist[part]), cent, track.pt()); if (track.closeLambdaFlag()) { histos.fill(HIST("QA/CloseLambda/After/h2d_n1_centpt_") + HIST(SubDirHist[part]), cent, track.pt()); - if (cRejCloseLambda) + if (cRejCloseLambda) { continue; + } } }