From 48f3f6e52c0704b71050cafa664789cadd2c21c4 Mon Sep 17 00:00:00 2001 From: sarjeeta gami Date: Wed, 12 Aug 2026 20:44:02 +0530 Subject: [PATCH 1/3] [PWGLF] Added mixed event v2 table for kstarpbpb task and optimize event selection in phyanalysisrun3pbpb task --- PWGLF/DataModel/LFKaonDaughterTables.h | 78 +++++++ PWGLF/TableProducer/Resonances/CMakeLists.txt | 5 + .../Resonances/kaDaughterProducer.cxx | 210 ++++++++++++++++++ PWGLF/Tasks/Resonances/kstarpbpb.cxx | 155 +++---------- .../Tasks/Resonances/phianalysisrun3pbpb.cxx | 139 +++++++++--- 5 files changed, 433 insertions(+), 154 deletions(-) create mode 100644 PWGLF/DataModel/LFKaonDaughterTables.h create mode 100644 PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx diff --git a/PWGLF/DataModel/LFKaonDaughterTables.h b/PWGLF/DataModel/LFKaonDaughterTables.h new file mode 100644 index 00000000000..3e3bd66590f --- /dev/null +++ b/PWGLF/DataModel/LFKaonDaughterTables.h @@ -0,0 +1,78 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file LFKaonDaughterTables.h +/// \brief DataModel for shared kaon/pion daughter derived data (K*(892), phi) +/// +/// \author sarjeeta.gami@cern.ch + +#ifndef PWGLF_DATAMODEL_LFKAONDAUGHTERTABLES_H_ +#define PWGLF_DATAMODEL_LFKAONDAUGHTERTABLES_H_ + +#include "Common/Core/RecoDecay.h" + +#include +#include + +#include +#include + +namespace o2::aod +{ +namespace kadaughterevent +{ +DECLARE_SOA_COLUMN(Cent, cent, float); +DECLARE_SOA_COLUMN(Posz, posz, float); +DECLARE_SOA_COLUMN(Occupancy, occupancy, int); +DECLARE_SOA_COLUMN(PsiFT0C, psiFT0C, float); +DECLARE_SOA_COLUMN(QFT0C, qFT0C, float); +DECLARE_SOA_COLUMN(PsiZDCC, psiZDCC, float); // reserved for a future phi/SP consumer; 0 for kstar +DECLARE_SOA_COLUMN(BcId, bcId, int); // mirrors collision.bcId(), used to dedup mixed pairs sharing a BC +DECLARE_SOA_COLUMN(RunNumber, runNumber, int); +DECLARE_SOA_COLUMN(Timestamp, timestamp, int64_t); // for CCDB EP-weight fetch +} // namespace kadaughterevent +DECLARE_SOA_TABLE(KaDaughterEvents, "AOD", "KADEVENT", o2::soa::Index<>, + kadaughterevent::Cent, kadaughterevent::Posz, kadaughterevent::Occupancy, + kadaughterevent::PsiFT0C, kadaughterevent::QFT0C, kadaughterevent::PsiZDCC, + kadaughterevent::BcId, kadaughterevent::RunNumber, kadaughterevent::Timestamp); +using KaDaughterEvent = KaDaughterEvents::iterator; + +namespace kadaughtertrack +{ +DECLARE_SOA_INDEX_COLUMN(KaDaughterEvent, kaDaughterEvent); +DECLARE_SOA_COLUMN(Px, px, float); +DECLARE_SOA_COLUMN(Py, py, float); +DECLARE_SOA_COLUMN(Pz, pz, float); +DECLARE_SOA_COLUMN(Sign, sign, int8_t); +DECLARE_SOA_COLUMN(TrackId, trackId, int64_t); // original AOD track global index, for bookkeeping only +DECLARE_SOA_COLUMN(DcaXY, dcaXY, float); +DECLARE_SOA_COLUMN(DcaZ, dcaZ, float); +DECLARE_SOA_COLUMN(TpcNSigmaKa, tpcNSigmaKa, float); +DECLARE_SOA_COLUMN(TofNSigmaKa, tofNSigmaKa, float); +DECLARE_SOA_COLUMN(TpcNSigmaPi, tpcNSigmaPi, float); +DECLARE_SOA_COLUMN(TofNSigmaPi, tofNSigmaPi, float); +DECLARE_SOA_COLUMN(HasTOF, hasTOF, bool); +DECLARE_SOA_COLUMN(Beta, beta, float); +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) -> float { return std::hypot(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) -> float { return RecoDecay::constrainAngle(std::atan2(py, px)); }); +} // namespace kadaughtertrack +DECLARE_SOA_TABLE(KaDaughterTracks, "AOD", "KADTRACK", o2::soa::Index<>, + kadaughtertrack::KaDaughterEventId, kadaughtertrack::Px, kadaughtertrack::Py, + kadaughtertrack::Pz, kadaughtertrack::Sign, kadaughtertrack::TrackId, + kadaughtertrack::DcaXY, kadaughtertrack::DcaZ, + kadaughtertrack::TpcNSigmaKa, kadaughtertrack::TofNSigmaKa, + kadaughtertrack::TpcNSigmaPi, kadaughtertrack::TofNSigmaPi, + kadaughtertrack::HasTOF, kadaughtertrack::Beta, + kadaughtertrack::Pt, + kadaughtertrack::Phi); +using KaDaughterTrack = KaDaughterTracks::iterator; +} // namespace o2::aod +#endif // PWGLF_DATAMODEL_LFKAONDAUGHTERTABLES_H_ diff --git a/PWGLF/TableProducer/Resonances/CMakeLists.txt b/PWGLF/TableProducer/Resonances/CMakeLists.txt index a2776b9dedf..6073291e6fc 100644 --- a/PWGLF/TableProducer/Resonances/CMakeLists.txt +++ b/PWGLF/TableProducer/Resonances/CMakeLists.txt @@ -64,3 +64,8 @@ o2physics_add_dpl_workflow(resonance-tree-creator SOURCES resonanceTreeCreator.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(ka-daughter-producer + SOURCES kaDaughterProducer.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx b/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx new file mode 100644 index 00000000000..53fa02b83ce --- /dev/null +++ b/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx @@ -0,0 +1,210 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file kaDaughterProducer.cxx +/// \brief Table producer for shared kaon/pion daughter derived data (K*(892), phi) +/// +/// \author sarjeeta.gami@cern.ch + +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGLF/DataModel/LFKaonDaughterTables.h" + +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/RCTSelectionFlags.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::rctsel; + +struct KaDaughterProducer { + Produces kaEvent; + Produces kaTrack; + + struct RCTCut : ConfigurableGroup { + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + RCTFlagsChecker rctChecker; + }; + RCTCut rctCut; + + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Accepted maximum Centrality"}; + Configurable cfgCutPT{"cfgCutPT", 0.2, "PT cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable useGlobalTrack{"useGlobalTrack", true, "use Global track"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + Configurable additionalEvSel1{"additionalEvSel1", true, "Additional evsel1"}; + Configurable additionalEvSel2{"additionalEvSel2", true, "Additional evsel2"}; + Configurable additionalEvSel3{"additionalEvSel3", true, "Additional evsel3"}; + Configurable additionalEvSel4{"additionalEvSel4", true, "Additional evsel4"}; + Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; + Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; + Configurable additionalQAplots1{"additionalQAplots1", true, "Additional QA plots (event-plane resolution etc.)"}; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCutCentrality; + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPT); + Filter dcacutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(InitContext&) + { + rctCut.rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + + histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); + if (additionalQAplots1) { + std::vector occupancyBinning = {0.0, 500.0, 1000.0, 1500.0, 2000.0, 3000.0, 4000.0, 5000.0, 50000.0}; + AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; + AxisSpec resAxis = {6000, -30, 30, "Res"}; + AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; + AxisSpec occupancyAxis = {occupancyBinning, "Occupancy"}; + histos.add("hFTOCvsTPCSelected", "Mult correlation FT0C vs. TPC after selection", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); + histos.add("hCentrality", "Centrality distribution", kTH1F, {{200, 0.0, 200.0}}); + histos.add("hOccupancy", "Occupancy distribution", kTH1F, {occupancyAxis}); + histos.add("hVtxZ", "Vertex distribution in Z;Z (cm)", kTH1F, {{400, -20.0, 20.0}}); + histos.add("hPsiFT0C", "PsiFT0C", kTH2F, {centAxis, phiAxis}); + histos.add("hPsiFT0A", "PsiFT0A", kTH2F, {centAxis, phiAxis}); + histos.add("hPsiTPC", "PsiTPC", kTH2F, {centAxis, phiAxis}); + histos.add("ResFT0CTPC", "ResFT0CTPC", kTH2F, {centAxis, resAxis}); + histos.add("ResFT0CFT0A", "ResFT0CFT0A", kTH2F, {centAxis, resAxis}); + histos.add("ResFT0ATPC", "ResFT0ATPC", kTH2F, {centAxis, resAxis}); + histos.add("ResFT0CTPCSP", "ResFT0CTPCSP", kTH2F, {centAxis, resAxis}); + histos.add("ResFT0CFT0ASP", "ResFT0CFT0ASP", kTH2F, {centAxis, resAxis}); + histos.add("ResFT0ATPCSP", "ResFT0ATPCSP", kTH2F, {centAxis, resAxis}); + histos.add("ResTrackSPFT0CTPC", "ResTrackSPFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CFT0A", "ResTrackSPFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0ATPC", "ResTrackSPFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + } + } + + template + bool selectionTrack(const T& candidate) + { + if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { + return false; + } + if (!useGlobalTrack && !(candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { + return false; + } + return true; + } + + void processData(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + { + histos.fill(HIST("hEvtSelInfo"), 0.5); + if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision)) return; + histos.fill(HIST("hEvtSelInfo"), 1.5); + if (!collision.sel8()) return; + if (!collision.triggereventep()) return; + if (additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) return; + if (additionalEvSel2 && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) return; + if (additionalEvSel3 && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) return; + if (additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; + histos.fill(HIST("hEvtSelInfo"), 2.5); + + auto centrality = collision.centFT0C(); + int occupancy = collision.trackOccupancyInTimeRange(); + auto psiFT0C = collision.psiFT0C(); + auto qFT0C = collision.qFT0C(); + + if (fillOccupancy && occupancy > cfgOccupancyCut) return; + histos.fill(HIST("hEvtSelInfo"), 3.5); + + if (additionalQAplots1) { + auto multTPC = collision.multNTracksPV(); + auto psiFT0A = collision.psiFT0A(); + auto psiTPC = collision.psiTPC(); + auto qFT0A = collision.qFT0A(); + auto qTPC = collision.qTPC(); + histos.fill(HIST("hFTOCvsTPCSelected"), centrality, multTPC); + histos.fill(HIST("hPsiFT0C"), centrality, psiFT0C); + histos.fill(HIST("hPsiFT0A"), centrality, psiFT0A); + histos.fill(HIST("hPsiTPC"), centrality, psiTPC); + histos.fill(HIST("ResFT0CTPC"), centrality, std::cos(2.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("ResFT0CFT0A"), centrality, std::cos(2.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("ResFT0ATPC"), centrality, std::cos(2.0 * (psiTPC - psiFT0A))); + histos.fill(HIST("ResFT0CTPCSP"), centrality, qFT0C * qTPC * std::cos(2.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("ResFT0CFT0ASP"), centrality, qFT0C * qFT0A * std::cos(2.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("ResFT0ATPCSP"), centrality, qTPC * qFT0A * std::cos(2.0 * (psiTPC - psiFT0A))); + histos.fill(HIST("hCentrality"), centrality); + histos.fill(HIST("hOccupancy"), occupancy); + histos.fill(HIST("hVtxZ"), collision.posZ()); + // filled once per event now, instead of once per track-pair as in the original processSE + histos.fill(HIST("ResTrackSPFT0CTPC"), centrality, occupancy, qFT0C * qTPC * std::cos(2.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("ResTrackSPFT0CFT0A"), centrality, occupancy, qFT0C * qFT0A * std::cos(2.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("ResTrackSPFT0ATPC"), centrality, occupancy, qTPC * qFT0A * std::cos(2.0 * (psiTPC - psiFT0A))); + } + + struct Stored { + float px, py, pz, dcaXY, dcaZ, tpcKa, tofKa, tpcPi, tofPi, beta; + int8_t sign; + int64_t id; + bool hasTOF; + }; + std::vector sel; + for (const auto& t : tracks) { + if (!selectionTrack(t)) continue; + sel.push_back({t.px(), t.py(), t.pz(), t.dcaXY(), t.dcaZ(), + t.tpcNSigmaKa(), t.tofNSigmaKa(), t.tpcNSigmaPi(), t.tofNSigmaPi(), + t.hasTOF() ? t.beta() : -999.f, static_cast(t.sign()), t.globalIndex(), t.hasTOF()}); + } + if (sel.empty()) return; + + auto bc = collision.bc_as(); + kaEvent(centrality, collision.posZ(), occupancy, psiFT0C, qFT0C, /*psiZDCC=*/0.f, + collision.bcId(), bc.runNumber(), bc.timestamp()); + const int64_t idx = kaEvent.lastIndex(); + for (const auto& s : sel) { + kaTrack(idx, s.px, s.py, s.pz, s.sign, s.id, s.dcaXY, s.dcaZ, + s.tpcKa, s.tofKa, s.tpcPi, s.tofPi, s.hasTOF, s.beta); + } + } + PROCESS_SWITCH(KaDaughterProducer, processData, "Produce shared kaon/pion daughter candidates", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index 0a36e123a3d..e8e26845b92 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -15,6 +15,7 @@ /// #include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGLF/DataModel/LFKaonDaughterTables.h" #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/RCTSelectionFlags.h" @@ -422,6 +423,7 @@ struct Kstarpbpb { double v2Rot = 0.; using BinningTypeVertexContributor = ColumnBinningPolicy; + using BinningTypeVertexContributorDerived = ColumnBinningPolicy; ROOT::Math::PxPyPzMVector kstarMother, fourVecDauCM, daughter1, daughter2, kaonrot, kstarrot, kaonPlus, pionMinus; ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY, eventplaneVec, eventplaneVecNorm; ROOT::Math::PxPyPzMVector daughter2rot, fourVecDauCMrot; @@ -430,77 +432,21 @@ struct Kstarpbpb { int currentRunNumber = -999; int lastRunNumber = -999; TH2D* hweight = nullptr; - void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + + void processSE(aod::KaDaughterEvents::iterator const& collision, aod::KaDaughterTracks const& tracks) { - histos.fill(HIST("hEvtSelInfo"), 0.5); - if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision)) { - return; - } - histos.fill(HIST("hEvtSelInfo"), 1.5); - if (!collision.sel8()) { - return; - } - if (!collision.triggereventep()) { - return; - } - if (additionalEvSel1 && - !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { - return; - } - if (additionalEvSel2 && - !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { - return; - } - if (additionalEvSel3 && - !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { - return; - } - if (additionalEvSel4 && - !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - return; - } - histos.fill(HIST("hEvtSelInfo"), 2.5); - auto centrality = collision.centFT0C(); - auto multTPC = collision.multNTracksPV(); - int occupancy = collision.trackOccupancyInTimeRange(); + auto centrality = collision.cent(); auto psiFT0C = collision.psiFT0C(); - auto psiFT0A = collision.psiFT0A(); - auto psiTPC = collision.psiTPC(); auto qFT0C = collision.qFT0C(); - auto qFT0A = collision.qFT0A(); - auto qTPC = collision.qTPC(); - if (fillOccupancy && occupancy > cfgOccupancyCut) { - return; - } - histos.fill(HIST("hEvtSelInfo"), 3.5); - if (additionalQAplots1) { - histos.fill(HIST("hFTOCvsTPCSelected"), centrality, multTPC); - histos.fill(HIST("hPsiFT0C"), centrality, psiFT0C); - histos.fill(HIST("hPsiFT0A"), centrality, psiFT0A); - histos.fill(HIST("hPsiTPC"), centrality, psiTPC); - histos.fill(HIST("ResFT0CTPC"), centrality, std::cos(2.0 * (psiFT0C - psiTPC))); - histos.fill(HIST("ResFT0CFT0A"), centrality, std::cos(2.0 * (psiFT0C - psiFT0A))); - histos.fill(HIST("ResFT0ATPC"), centrality, std::cos(2.0 * (psiTPC - psiFT0A))); - histos.fill(HIST("ResFT0CTPCSP"), centrality, qFT0C * qTPC * std::cos(2.0 * (psiFT0C - psiTPC))); - histos.fill(HIST("ResFT0CFT0ASP"), centrality, qFT0C * qFT0A * std::cos(2.0 * (psiFT0C - psiFT0A))); - histos.fill(HIST("ResFT0ATPCSP"), centrality, qTPC * qFT0A * std::cos(2.0 * (psiTPC - psiFT0A))); - histos.fill(HIST("hCentrality"), centrality); - histos.fill(HIST("hOccupancy"), occupancy); - histos.fill(HIST("hVtxZ"), collision.posZ()); - } - auto bc = collision.bc_as(); - currentRunNumber = collision.bc_as().runNumber(); + + currentRunNumber = collision.runNumber(); if (useWeight && (currentRunNumber != lastRunNumber)) { - hweight = ccdb->getForTimeStamp(confWeightPath.value, bc.timestamp()); + hweight = ccdb->getForTimeStamp(confWeightPath.value, collision.timestamp()); } lastRunNumber = currentRunNumber; float weight1 = 1.0; float weight2 = 1.0; for (const auto& track1 : tracks) { - if (!selectionTrack(track1)) { - continue; - } - auto track1ID = track1.globalIndex(); if (!isTOFOnly && !strategySelectionPID(track1, 0, strategyPID)) { continue; @@ -518,10 +464,6 @@ struct Kstarpbpb { } } for (const auto& track2 : tracks) { - if (!selectionTrack(track2)) { - continue; - } - auto track2ID = track2.globalIndex(); if (!isTOFOnly && !strategySelectionPID(track2, 1, strategyPID)) { continue; @@ -573,11 +515,6 @@ struct Kstarpbpb { if (totalweight <= MinTotalWeight) { totalweight = 1.0; } - if (additionalQAplots1) { - histos.fill(HIST("ResTrackSPFT0CTPC"), centrality, occupancy, qFT0C * qTPC * std::cos(2.0 * (psiFT0C - psiTPC))); - histos.fill(HIST("ResTrackSPFT0CFT0A"), centrality, occupancy, qFT0C * qFT0A * std::cos(2.0 * (psiFT0C - psiFT0A))); - histos.fill(HIST("ResTrackSPFT0ATPC"), centrality, occupancy, qTPC * qFT0A * std::cos(2.0 * (psiTPC - psiFT0A))); - } if (!fillSA) { if (useWeight) { @@ -673,53 +610,17 @@ struct Kstarpbpb { } PROCESS_SWITCH(Kstarpbpb, processSE, "Process Same event latest", true); - void processMixedEvent(EventCandidates const& collisions, TrackCandidates const& tracks) + void processMixedEvent(aod::KaDaughterEvents const& collisions, aod::KaDaughterTracks const& tracks) { auto tracksTuple = std::make_tuple(tracks); - BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; - SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; + BinningTypeVertexContributorDerived binningOnPositions{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; + SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; for (const auto& [collision1, tracks1, collision2, tracks2] : pair) { - if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision1)) { - continue; - } - if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision2)) { - continue; - } - - if (!collision1.sel8() || - !collision2.sel8() || - - !collision1.triggereventep() || - !collision2.triggereventep() || - - (additionalEvSel1 && - (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || - !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder))) || - - (additionalEvSel2 && - (!collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || - !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) || - - (additionalEvSel3 && - (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || - !collision2.selection_bit(aod::evsel::kNoSameBunchPileup))) || - - (additionalEvSel4 && - (!collision1.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV) || - !collision2.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)))) { - continue; - } if (collision1.bcId() == collision2.bcId()) { continue; } - int occupancy1 = collision1.trackOccupancyInTimeRange(); - int occupancy2 = collision2.trackOccupancyInTimeRange(); - if (fillOccupancy && occupancy1 >= cfgOccupancyCut && occupancy2 >= cfgOccupancyCut) // occupancy info is available for this collision (*) - { - continue; - } - auto centrality = collision1.centFT0C(); + auto centrality = collision1.cent(); auto psiFT0C1 = collision1.psiFT0C(); auto qFT0C1 = collision1.qFT0C(); auto psiFT0C2 = collision2.psiFT0C(); @@ -727,9 +628,6 @@ struct Kstarpbpb { for (const auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - if (!selectionTrack(track1) || !selectionTrack(track2)) { - continue; - } if (!isTOFOnly && !strategySelectionPID(track1, 0, strategyPID)) { continue; } @@ -919,14 +817,12 @@ struct Kstarpbpb { continue; } oldindex = mothertrack1.globalIndex(); - if (track1.sign() > 0 && track2.sign() < 0) { - kaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - pionMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); - } - if (track1.sign() < 0 && track2.sign() > 0) { - pionMinus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - kaonPlus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); - } + // track1 is guaranteed to be the kaon and track2 the pion by the PDG check above + // (track1PDG == kKPlus, track2PDG == kPiPlus), independent of charge sign. Branching on + // sign here previously put the pion into kaonPlus for K-pi+ pairs, flipping the sign of + // cosThetaStar for anti-K*(892)^0 candidates in the boost(kaonPlus) below. + kaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + pionMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); kstarMother = kaonPlus + pionMinus; if (std::abs(kstarMother.Rapidity()) > confRapidity) { continue; @@ -960,7 +856,7 @@ struct Kstarpbpb { if (std::abs(mcParticle.y()) > confRapidity) { continue; } - if (pdgcheck && mcParticle.pdgCode() != o2::constants::physics::kK0Star892) { + if (pdgcheck && std::abs(mcParticle.pdgCode()) != o2::constants::physics::kK0Star892) { continue; } auto kDaughters = mcParticle.daughters_as(); @@ -975,7 +871,9 @@ struct Kstarpbpb { if (!kCurrentDaughter.isPhysicalPrimary()) { continue; } - if (kCurrentDaughter.pdgCode() == +PDG_t::kKPlus) { + // std::abs() so both K*(892)^0 -> K+pi- and anti-K*(892)^0 -> K-pi+ are picked up; + // kaonPlus/pionMinus always hold the kaon/pion by species, regardless of charge. + if (std::abs(kCurrentDaughter.pdgCode()) == PDG_t::kKPlus) { if (genacceptancecut && kCurrentDaughter.pt() > cfgCutPT && std::abs(kCurrentDaughter.eta()) < cfgCutEta) { daughtp = true; } @@ -983,7 +881,7 @@ struct Kstarpbpb { daughtp = true; } kaonPlus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); - } else if (kCurrentDaughter.pdgCode() == -PDG_t::kPiPlus) { + } else if (std::abs(kCurrentDaughter.pdgCode()) == PDG_t::kPiPlus) { if (genacceptancecut && kCurrentDaughter.pt() > cfgCutPT && std::abs(kCurrentDaughter.eta()) < cfgCutEta) { daughtm = true; } @@ -1159,7 +1057,7 @@ struct Kstarpbpb { if (std::abs(mcParticle.y()) > confRapidity) { continue; } - if (mcParticle.pdgCode() != o2::constants::physics::kK0Star892) { + if (std::abs(mcParticle.pdgCode()) != o2::constants::physics::kK0Star892) { continue; } auto kDaughters = mcParticle.daughters_as(); @@ -1174,12 +1072,13 @@ struct Kstarpbpb { if (!kCurrentDaughter.isPhysicalPrimary()) { continue; } - if (kCurrentDaughter.pdgCode() == +PDG_t::kKPlus) { + // std::abs() so both K*(892)^0 -> K+pi- and anti-K*(892)^0 -> K-pi+ are picked up. + if (std::abs(kCurrentDaughter.pdgCode()) == PDG_t::kKPlus) { if (kCurrentDaughter.pt() > cfgCutPT && std::abs(kCurrentDaughter.eta()) < cfgCutEta) { daughtp = true; } kaonPlus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); - } else if (kCurrentDaughter.pdgCode() == -PDG_t::kPiPlus) { + } else if (std::abs(kCurrentDaughter.pdgCode()) == PDG_t::kPiPlus) { if (kCurrentDaughter.pt() > cfgCutPT && std::abs(kCurrentDaughter.eta()) < cfgCutEta) { daughtm = true; } diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx index f3acbe51ff3..cd1fc223dd4 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx @@ -86,6 +86,8 @@ struct Phianalysisrun3pbpb { Configurable additionalEvSel4{"additionalEvSel4", true, "Additional evsel4"}; Configurable additionalEvSel5{"additionalEvSel5", true, "Additional evsel5"}; Configurable additionalEvSel6{"additionalEvSel6", true, "Additional evsel6"}; + Configurable selHasBC{"selHasBC", true, "Has BC?"}; + Configurable selHasFT0{"selHasFT0", true, "Has FT0?"}; Configurable cutvz{"cutvz", true, "Vz cut"}; Configurable cutvzgen{"cutvzgen", true, "Vz cut"}; Configurable isINELgt0{"isINELgt0", true, "INEL>0 selection"}; @@ -193,7 +195,7 @@ struct Phianalysisrun3pbpb { histos.add("QAafter/TPC_Nsigma_all_pos", "TPC NSigma for positive Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{K^{+}}", {HistType::kTH3D, {{200, -12, 12}, centAxisphi, ptAxisphi}}); histos.add("QAafter/TPC_Nsigma_all_neg", "TPC NSigma for negative Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{K^{-}}", {HistType::kTH3D, {{200, -12, 12}, centAxisphi, ptAxisphi}}); - } else if (isMC) { + } else { histos.add("hMC", "MC Event statistics", kTH1F, {{15, 0.0f, 15.0f}}); histos.add("EL1", "MC Event statistics", kTH1F, {impactParAxis}); histos.add("EL2", "MC Event statistics", kTH1F, {centAxis}); @@ -297,16 +299,15 @@ struct Phianalysisrun3pbpb { } double massKa = o2::constants::physics::MassKPlus; - double rapidity; - double genMass, recMass, resolution; + double rapidity{0.}; + double genMass{0.}; + double recMass{0.}; ROOT::Math::PxPyPzMVector phiMother, daughter1, daughter2; ROOT::Math::PxPyPzMVector d1, d2, mother; double mass{0.}; - double massrotation{0.}; double pT{0.}; - array pvec0; - array pvec1; - array pvec1rotation; + array pvec0{}; + array pvec1{}; template bool selectionTrack(const T& candidate) { @@ -337,9 +338,9 @@ struct Phianalysisrun3pbpb { return false; } template - bool selectionPIDpTdependent(const T& candidate, int pid) + bool selectionPIDpTdependent(const T& candidate, int pidHypothesis) { - if (pid == 0) { + if (pidHypothesis == 0) { if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaKa()) < selectionConfig.nsigmacutTPC) { return true; } @@ -349,7 +350,7 @@ struct Phianalysisrun3pbpb { } return false; - } else if (pid == 1) { + } else if (pidHypothesis == 1) { constexpr double PtThresholdForTOF = 0.5; if (candidate.pt() < PtThresholdForTOF && std::abs(candidate.tpcNSigmaKa()) < selectionConfig.nsigmacutTPC) { return true; @@ -375,6 +376,12 @@ struct Phianalysisrun3pbpb { if (!collision.sel8()) return false; + if (selectionConfig.selHasBC && !collision.has_foundBC()) + return false; + + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) + return false; + if (selectionConfig.additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) return false; @@ -519,6 +526,12 @@ struct Phianalysisrun3pbpb { if (cfgDoSel8 && !collision.sel8()) { return; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + return; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + return; + } histos.fill(HIST("hEvtSelInfo"), 2.5); if (selectionConfig.additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { return; @@ -613,8 +626,6 @@ struct Phianalysisrun3pbpb { bool unlike = true; bool mix = false; if (!ispTdepPID && selectionPID(track1) && selectionPID(track2)) { - int track1Sign = track1.sign(); // Assuming `charge()` gives +1 or -1 - if (track1Sign > 0) { // Positive kaon histos.fill(HIST("QAafter/TPC_Nsigma_all_pos"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("QAafter/TOF_Nsigma_all_pos"), track1.tofNSigmaKa(), multiplicity, track1.pt()); @@ -639,8 +650,6 @@ struct Phianalysisrun3pbpb { if (ispTdepPID && (selectionPIDpTdependent(track1, 0) || selectionPIDpTdependent(track1, 1)) && (selectionPIDpTdependent(track2, 0) || selectionPIDpTdependent(track2, 1))) { - int track1Sign = track1.sign(); // Same assumption as above - if (track1Sign > 0) { // Positive kaon histos.fill(HIST("QAafter/TPC_Nsigma_all_pos"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("QAafter/TOF_Nsigma_all_pos"), track1.tofNSigmaKa(), multiplicity, track1.pt()); @@ -685,6 +694,12 @@ struct Phianalysisrun3pbpb { if (!c2.sel8()) { continue; } + if (selectionConfig.selHasBC && (!c1.has_foundBC() || !c2.has_foundBC())) { + continue; + } + if (selectionConfig.selHasFT0 && (!c1.has_foundFT0() || !c2.has_foundFT0())) { + continue; + } if (selectionConfig.additionalEvSel1 && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } @@ -761,6 +776,12 @@ struct Phianalysisrun3pbpb { if (!c2.sel8()) { continue; } + if (selectionConfig.selHasBC && (!c1.has_foundBC() || !c2.has_foundBC())) { + continue; + } + if (selectionConfig.selHasFT0 && (!c1.has_foundFT0() || !c2.has_foundFT0())) { + continue; + } if (selectionConfig.additionalEvSel1 && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } @@ -838,6 +859,12 @@ struct Phianalysisrun3pbpb { if (!c2.sel8()) { continue; } + if (selectionConfig.selHasBC && (!c1.has_foundBC() || !c2.has_foundBC())) { + continue; + } + if (selectionConfig.selHasFT0 && (!c1.has_foundFT0() || !c2.has_foundFT0())) { + continue; + } if (selectionConfig.additionalEvSel1 && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } @@ -915,6 +942,12 @@ struct Phianalysisrun3pbpb { if (!c2.sel8()) { continue; } + if (selectionConfig.selHasBC && (!c1.has_foundBC() || !c2.has_foundBC())) { + continue; + } + if (selectionConfig.selHasFT0 && (!c1.has_foundFT0() || !c2.has_foundFT0())) { + continue; + } if (selectionConfig.additionalEvSel1 && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } @@ -978,6 +1011,12 @@ struct Phianalysisrun3pbpb { if (!collision.sel8()) { return; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + return; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + return; + } if (selectionConfig.additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { return; } @@ -1075,6 +1114,12 @@ struct Phianalysisrun3pbpb { if (cfgDoSel8 && !RecCollision.sel8()) { continue; } + if (selectionConfig.selHasBC && !RecCollision.has_foundBC()) { + continue; + } + if (selectionConfig.selHasFT0 && !RecCollision.has_foundFT0()) { + continue; + } if (std::abs(RecCollision.posZ()) > selectionConfig.cfgCutVertex) { continue; } @@ -1288,6 +1333,12 @@ struct Phianalysisrun3pbpb { if (cfgDoSel8 && !collision.sel8()) { continue; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + continue; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + continue; + } if (std::abs(collision.mcCollision().posZ()) > selectionConfig.cfgCutVertex) { continue; } @@ -1368,6 +1419,12 @@ struct Phianalysisrun3pbpb { if (cfgDoSel8 && !collision.sel8()) { return; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + return; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + return; + } if (std::abs(collision.mcCollision().posZ()) > selectionConfig.cfgCutVertex) { return; } @@ -1494,6 +1551,12 @@ struct Phianalysisrun3pbpb { if (!collision.sel8()) { return; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + return; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + return; + } if (selectionConfig.additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { return; } @@ -1615,6 +1678,12 @@ struct Phianalysisrun3pbpb { if (!c2.sel8()) { continue; } + if (selectionConfig.selHasBC && (!c1.has_foundBC() || !c2.has_foundBC())) { + continue; + } + if (selectionConfig.selHasFT0 && (!c1.has_foundFT0() || !c2.has_foundFT0())) { + continue; + } if (selectionConfig.additionalEvSel1 && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } @@ -1691,11 +1760,10 @@ struct Phianalysisrun3pbpb { // all events histos.fill(HIST("hMC1"), 0.5); - // vertex QA (not selection) - if (!selectionConfig.cutvzgen || - std::abs(mcCollision.posZ()) < selectionConfig.cfgCutVertex) { - histos.fill(HIST("hMC1"), 1.5); + if (selectionConfig.cutvzgen && std::abs(mcCollision.posZ()) > selectionConfig.cfgCutVertex) { + return; } + histos.fill(HIST("hMC1"), 1.5); // INEL>0 selection if (isApplyInelgt0 && !mcCollision.isInelGt0()) @@ -1717,6 +1785,12 @@ struct Phianalysisrun3pbpb { if (cfgDoSel8 && !collision.sel8()) { continue; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + continue; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + continue; + } histos.fill(HIST("hMC1"), 5.5); if (selectionConfig.cutvz && std::abs(collision.posZ()) > selectionConfig.cfgCutVertex) { @@ -1825,6 +1899,12 @@ struct Phianalysisrun3pbpb { if (cfgDoSel8 && !collision.sel8()) { return; } + if (selectionConfig.selHasBC && !collision.has_foundBC()) { + return; + } + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { + return; + } if (selectionConfig.cutvz && std::abs(collision.posZ()) > selectionConfig.cfgCutVertex) { return; @@ -1932,29 +2012,36 @@ struct Phianalysisrun3pbpb { if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { continue; } - if (ispTdepPID && - (selectionPIDpTdependent(track1, 0) || selectionPIDpTdependent(track1, 1)) && - (selectionPIDpTdependent(track2, 0) || selectionPIDpTdependent(track2, 1))) { - + if (ispTdepPID && !(selectionPIDpTdependent(track1, 0) || selectionPIDpTdependent(track1, 1))) { + continue; + } + if (ispTdepPID && !(selectionPIDpTdependent(track2, 0) || selectionPIDpTdependent(track2, 1))) { continue; } histos.fill(HIST("TPC_Nsigma1_MC"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("TOF_Nsigma1_MC"), track1.tofNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("trkDCAxy"), track1.dcaXY(), multiplicity, track1.pt()); histos.fill(HIST("trkDCAz"), track1.dcaZ(), multiplicity, track1.pt()); + std::array pvec0Rec = {track1.px(), track1.py(), track1.pz()}; + std::array pvec1Rec = {track2.px(), track2.py(), track2.pz()}; + std::array, 2> arrMomrec = {pvec0Rec, pvec1Rec}; + recMass = RecoDecay::m(arrMomrec, std::array{massKa, massKa}); + + // reconstructed-pair rapidity, cut with the same rapiditycut1/rapiditycut2 that fillinvMass() applies to data + auto recRapidity = RecoDecay::y(std::array{track1.px() + track2.px(), track1.py() + track2.py(), track1.pz() + track2.pz()}, recMass); + if (recRapidity < rapiditycut1 || recRapidity > rapiditycut2) { + continue; + } + if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { histos.fill(HIST("h1PhiRecsplit1"), mothertrack1.pt()); continue; } oldindex = mothertrack1.globalIndex(); - std::array pvec0 = {track1.px(), track1.py(), track1.pz()}; - std::array pvec1 = {track2.px(), track2.py(), track2.pz()}; - std::array, 2> arrMomrec = {pvec0, pvec1}; auto motherP = mothertrack1.p(); auto motherE = mothertrack1.e(); genMass = std::sqrt(motherE * motherE - motherP * motherP); - recMass = RecoDecay::m(arrMomrec, std::array{massKa, massKa}); histos.fill(HIST("h1PhifinalRec"), mothertrack1.pt()); histos.fill(HIST("h3PhifinalRec"), mothertrack1.pt(), multiplicity, recMass); From 83b82dd06cd0897df0da1bcb4523da375ad8942c Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 12 Aug 2026 15:20:21 +0000 Subject: [PATCH 2/3] Please consider the following formatting changes --- .../Resonances/kaDaughterProducer.cxx | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx b/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx index 53fa02b83ce..1cb3084c298 100644 --- a/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx +++ b/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx @@ -134,14 +134,21 @@ struct KaDaughterProducer { void processData(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { histos.fill(HIST("hEvtSelInfo"), 0.5); - if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision)) return; + if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision)) + return; histos.fill(HIST("hEvtSelInfo"), 1.5); - if (!collision.sel8()) return; - if (!collision.triggereventep()) return; - if (additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) return; - if (additionalEvSel2 && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) return; - if (additionalEvSel3 && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) return; - if (additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) return; + if (!collision.sel8()) + return; + if (!collision.triggereventep()) + return; + if (additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) + return; + if (additionalEvSel2 && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) + return; + if (additionalEvSel3 && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) + return; + if (additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + return; histos.fill(HIST("hEvtSelInfo"), 2.5); auto centrality = collision.centFT0C(); @@ -149,7 +156,8 @@ struct KaDaughterProducer { auto psiFT0C = collision.psiFT0C(); auto qFT0C = collision.qFT0C(); - if (fillOccupancy && occupancy > cfgOccupancyCut) return; + if (fillOccupancy && occupancy > cfgOccupancyCut) + return; histos.fill(HIST("hEvtSelInfo"), 3.5); if (additionalQAplots1) { @@ -185,20 +193,22 @@ struct KaDaughterProducer { }; std::vector sel; for (const auto& t : tracks) { - if (!selectionTrack(t)) continue; + if (!selectionTrack(t)) + continue; sel.push_back({t.px(), t.py(), t.pz(), t.dcaXY(), t.dcaZ(), t.tpcNSigmaKa(), t.tofNSigmaKa(), t.tpcNSigmaPi(), t.tofNSigmaPi(), t.hasTOF() ? t.beta() : -999.f, static_cast(t.sign()), t.globalIndex(), t.hasTOF()}); } - if (sel.empty()) return; + if (sel.empty()) + return; auto bc = collision.bc_as(); kaEvent(centrality, collision.posZ(), occupancy, psiFT0C, qFT0C, /*psiZDCC=*/0.f, - collision.bcId(), bc.runNumber(), bc.timestamp()); + collision.bcId(), bc.runNumber(), bc.timestamp()); const int64_t idx = kaEvent.lastIndex(); for (const auto& s : sel) { kaTrack(idx, s.px, s.py, s.pz, s.sign, s.id, s.dcaXY, s.dcaZ, - s.tpcKa, s.tofKa, s.tpcPi, s.tofPi, s.hasTOF, s.beta); + s.tpcKa, s.tofKa, s.tpcPi, s.tofPi, s.hasTOF, s.beta); } } PROCESS_SWITCH(KaDaughterProducer, processData, "Produce shared kaon/pion daughter candidates", true); From db08910960e93e188969354ae8925ca0c2a0a0a1 Mon Sep 17 00:00:00 2001 From: sarjeeta gami Date: Thu, 13 Aug 2026 10:14:02 +0530 Subject: [PATCH 3/3] Fix errors --- .../Resonances/kaDaughterProducer.cxx | 3 +- .../Tasks/Resonances/phianalysisrun3pbpb.cxx | 116 ++++++++++-------- 2 files changed, 65 insertions(+), 54 deletions(-) diff --git a/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx b/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx index 1cb3084c298..87dde3c4ae2 100644 --- a/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx +++ b/PWGLF/TableProducer/Resonances/kaDaughterProducer.cxx @@ -26,13 +26,14 @@ #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" -#include #include +#include #include #include #include #include #include +#include #include #include diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx index cd1fc223dd4..dfbc367b4ff 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3pbpb.cxx @@ -349,8 +349,8 @@ struct Phianalysisrun3pbpb { return true; } return false; - - } else if (pidHypothesis == 1) { + } + if (pidHypothesis == 1) { constexpr double PtThresholdForTOF = 0.5; if (candidate.pt() < PtThresholdForTOF && std::abs(candidate.tpcNSigmaKa()) < selectionConfig.nsigmacutTPC) { return true; @@ -370,41 +370,48 @@ struct Phianalysisrun3pbpb { template bool myEventSelections(const CollType& collision) { - if (selectionConfig.cutvz && !(std::abs(collision.posZ()) < selectionConfig.cfgCutVertex)) + if (selectionConfig.cutvz && !(std::abs(collision.posZ()) < selectionConfig.cfgCutVertex)) { return false; + } - if (!collision.sel8()) + if (!collision.sel8()) { return false; + } - if (selectionConfig.selHasBC && !collision.has_foundBC()) + if (selectionConfig.selHasBC && !collision.has_foundBC()) { return false; + } - if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) + if (selectionConfig.selHasFT0 && !collision.has_foundFT0()) { return false; + } - if (selectionConfig.additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) + if (selectionConfig.additionalEvSel1 && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { return false; + } - if (selectionConfig.additionalEvSel2 && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) + if (selectionConfig.additionalEvSel2 && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { return false; + } - if (selectionConfig.additionalEvSel3 && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) + if (selectionConfig.additionalEvSel3 && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return false; + } - if (selectionConfig.additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) + if (selectionConfig.additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { return false; - if (selectionConfig.additionalEvSel5 && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) + } + if (selectionConfig.additionalEvSel5 && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; - if (selectionConfig.additionalEvSel6 && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + } + if (selectionConfig.additionalEvSel6 && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; + } if (selectionConfig.isINELgt0 && !collision.isInelGt0()) { return false; } int occupancy = collision.trackOccupancyInTimeRange(); - if (selectionConfig.fillOccupancy && (occupancy < cfgMinOccupancy || occupancy > cfgMaxOccupancy)) - return false; - - return true; + return !(selectionConfig.fillOccupancy && (occupancy < cfgMinOccupancy || occupancy > cfgMaxOccupancy)); } template float selColMultMC(CheckColCent const& col) @@ -435,18 +442,14 @@ struct Phianalysisrun3pbpb { template bool selectionPair(const T1& candidate1, const T2& candidate2) { - double pt1, pt2, pz1, pz2, p1, p2, angle; - pt1 = candidate1.pt(); - pt2 = candidate2.pt(); - pz1 = candidate1.pz(); - pz2 = candidate2.pz(); - p1 = candidate1.p(); - p2 = candidate2.p(); - angle = std::acos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); - if (isDeepAngle && angle < cfgDeepAngle) { - return false; - } - return true; + double pt1 = candidate1.pt(); + double pt2 = candidate2.pt(); + double pz1 = candidate1.pz(); + double pz2 = candidate2.pz(); + double p1 = candidate1.p(); + double p2 = candidate2.p(); + double angle = std::acos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); + return !(isDeepAngle && angle < cfgDeepAngle); } template void fillinvMass(const T1& candidate1, const T2& candidate2, float multiplicity, bool unlike, bool mix, float massd1, float massd2) @@ -731,8 +734,7 @@ struct Phianalysisrun3pbpb { (occupancy2 < cfgMinOccupancy || occupancy2 > cfgMaxOccupancy))) { continue; } - float multiplicity; - multiplicity = c1.centFT0C(); + float multiplicity = c1.centFT0C(); for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { bool unlike = false; bool mix = true; @@ -813,8 +815,7 @@ struct Phianalysisrun3pbpb { (occupancy2 < cfgMinOccupancy || occupancy2 > cfgMaxOccupancy))) { continue; } - float multiplicity; - multiplicity = c1.centFT0A(); + float multiplicity = c1.centFT0A(); for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { bool unlike = false; bool mix = true; @@ -896,8 +897,7 @@ struct Phianalysisrun3pbpb { (occupancy2 < cfgMinOccupancy || occupancy2 > cfgMaxOccupancy))) { continue; } - float multiplicity; - multiplicity = c1.centFT0M(); + float multiplicity = c1.centFT0M(); for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { bool unlike = false; bool mix = true; @@ -979,8 +979,7 @@ struct Phianalysisrun3pbpb { (occupancy2 < cfgMinOccupancy || occupancy2 > cfgMaxOccupancy))) { continue; } - float multiplicity; - multiplicity = c1.centFV0A(); + float multiplicity = c1.centFV0A(); for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { bool unlike = false; bool mix = true; @@ -1028,8 +1027,9 @@ struct Phianalysisrun3pbpb { return; } float multiplicity{-1}; - if (cfgMultFT0) + if (cfgMultFT0) { multiplicity = collision.centFT0C(); + } histos.fill(HIST("hCentrality"), multiplicity); histos.fill(HIST("hVtxZ"), collision.posZ()); histos.fill(HIST("hOccupancy"), occupancy); @@ -1230,7 +1230,7 @@ struct Phianalysisrun3pbpb { histos.fill(HIST("h3PhiInvMassSameMC1"), centrality, phiMesonMother.pt(), phiMesonMother.M()); int track1PDG = std::abs(mctrack1.pdgCode()); int track2PDG = std::abs(mctrack2.pdgCode()); - if (!(track1PDG == PDG_t::kKPlus && track2PDG == PDG_t::kKPlus)) { + if (track1PDG != PDG_t::kKPlus || track2PDG != PDG_t::kKPlus) { continue; } for (const auto& mothertrack1 : mctrack1.mothers_as()) { @@ -1328,7 +1328,7 @@ struct Phianalysisrun3pbpb { histos.fill(HIST("hImpactParameterGen"), imp); std::vector selectedEvents(collisions.size()); int nevts = 0; - auto multiplicity = 0; + float multiplicity = 0.f; for (const auto& collision : collisions) { if (cfgDoSel8 && !collision.sel8()) { continue; @@ -1480,7 +1480,7 @@ struct Phianalysisrun3pbpb { if (!mctrack2.isPhysicalPrimary()) { continue; } - if (!(track1PDG == PDG_t::kKPlus && track2PDG == PDG_t::kKPlus)) { + if (track1PDG != PDG_t::kKPlus || track2PDG != PDG_t::kKPlus) { continue; } daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); @@ -1766,15 +1766,17 @@ struct Phianalysisrun3pbpb { histos.fill(HIST("hMC1"), 1.5); // INEL>0 selection - if (isApplyInelgt0 && !mcCollision.isInelGt0()) + if (isApplyInelgt0 && !mcCollision.isInelGt0()) { return; + } histos.fill(HIST("hMC1"), 2.5); // TVX selection if (isApplyTVX && - !(mcCollision.multMCFT0C() > 0 && mcCollision.multMCFT0A() > 0)) + (mcCollision.multMCFT0C() <= 0 || mcCollision.multMCFT0A() <= 0)) { return; + } histos.fill(HIST("hMC1"), 3.5); std::vector selectedEvents(collisions.size()); @@ -1989,7 +1991,7 @@ struct Phianalysisrun3pbpb { if (!mctrack2.isPhysicalPrimary()) { continue; } - if (!(track1PDG == PDG_t::kKPlus && track2PDG == PDG_t::kKPlus)) { + if (track1PDG != PDG_t::kKPlus || track2PDG != PDG_t::kKPlus) { continue; } for (const auto& mothertrack1 : mctrack1.mothers_as()) { @@ -2064,7 +2066,7 @@ struct Phianalysisrun3pbpb { return; } - if (isApplyTVX && !(mcCollision.multMCFT0C() > 0 && mcCollision.multMCFT0A() > 0)) { + if (isApplyTVX && (mcCollision.multMCFT0C() <= 0 || mcCollision.multMCFT0A() <= 0)) { return; } // Event loss estimation @@ -2075,8 +2077,9 @@ struct Phianalysisrun3pbpb { bool isSel = false; auto centrality = -999.; for (const auto& RecCollision : recCollisions) { - if (!myEventSelections(RecCollision)) + if (!myEventSelections(RecCollision)) { continue; + } const int kCentFT0C = 0; const int kCentFT0A = 1; const int kCentFT0M = 2; @@ -2109,12 +2112,14 @@ struct Phianalysisrun3pbpb { // Generated MC for (const auto& mcPart : mcParticles) { - if (mcPart.y() < rapiditycut1 || mcPart.y() > rapiditycut2) + if (mcPart.y() < rapiditycut1 || mcPart.y() > rapiditycut2) { continue; + } // select phi meson - if (std::abs(mcPart.pdgCode()) != o2::constants::physics::kPhi) + if (std::abs(mcPart.pdgCode()) != o2::constants::physics::kPhi) { continue; + } // signal loss estimation histos.fill(HIST("QAevent/phigenBeforeEvtSel"), mcPart.pt(), impactPar); @@ -2139,7 +2144,7 @@ struct Phianalysisrun3pbpb { return; } - if (isApplyTVX && !(mcCollision.multMCFT0C() > 0 && mcCollision.multMCFT0A() > 0)) { + if (isApplyTVX && (mcCollision.multMCFT0C() <= 0 || mcCollision.multMCFT0A() <= 0)) { return; } // All generated events @@ -2156,8 +2161,9 @@ struct Phianalysisrun3pbpb { bool atLeastOne = false; auto centrality = -999.; for (auto const& collision : collisions) { - if (!myEventSelections(collision)) + if (!myEventSelections(collision)) { continue; + } centrality = selColCent(collision); atLeastOne = true; } @@ -2173,16 +2179,19 @@ struct Phianalysisrun3pbpb { } for (const auto& particle : GenParticles) { - if (particle.y() < rapiditycut1 || particle.y() > rapiditycut2) + if (particle.y() < rapiditycut1 || particle.y() > rapiditycut2) { continue; + } - if (particle.pdgCode() != o2::constants::physics::kPhi) + if (particle.pdgCode() != o2::constants::physics::kPhi) { continue; + } auto daughters = particle.daughters_as(); static constexpr int PhiNDaughters = 2; - if (daughters.size() != PhiNDaughters) + if (daughters.size() != PhiNDaughters) { continue; + } bool daup = false, daun = false; @@ -2196,8 +2205,9 @@ struct Phianalysisrun3pbpb { } } - if (!daup || !daun) + if (!daup || !daun) { continue; + } mother = d1 + d2;