diff --git a/PWGCF/Femto/FemtoNuclei/DataModel/HadronNucleiTables.h b/PWGCF/Femto/FemtoNuclei/DataModel/HadronNucleiTables.h index 250fb7f2308..98b3e7e14dc 100644 --- a/PWGCF/Femto/FemtoNuclei/DataModel/HadronNucleiTables.h +++ b/PWGCF/Femto/FemtoNuclei/DataModel/HadronNucleiTables.h @@ -183,6 +183,7 @@ DECLARE_SOA_COLUMN(ZVertex, zVertex, float); DECLARE_SOA_COLUMN(Multiplicity, multiplicity, uint16_t); DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); DECLARE_SOA_COLUMN(MultiplicityFT0C, multiplicityFT0C, float); +DECLARE_SOA_COLUMN(MultNTracksPV, multNTracksPV, int32_t); } // namespace hadron_nuclei_tables @@ -268,7 +269,8 @@ DECLARE_SOA_TABLE(HadronNucleiMult, "AOD", "HADNUCLEIMULT", hadron_nuclei_tables::ZVertex, hadron_nuclei_tables::Multiplicity, hadron_nuclei_tables::CentFT0C, - hadron_nuclei_tables::MultiplicityFT0C) + hadron_nuclei_tables::MultiplicityFT0C, + hadron_nuclei_tables::MultNTracksPV) // Reduced hadron-hypertriton pair output. Reconstructable quantities such as // k*, invariant mass and pointing variables are intentionally derived offline. diff --git a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx index 44a92a9ff16..6a77e7bd814 100644 --- a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx +++ b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx @@ -89,12 +89,11 @@ using std::array; using CollBracket = o2::math_utils::Bracket; using HyperCandidates = aod::DataHypCandsWColl; using HyperCandidatesMC = aod::MCHypCandsWColl; -using CollisionsFull = soa::Join; -// The standard Femto producer stores multNTracksPV as its collision -// multiplicity. Subscribe to PVMults only in the mixed-event process so the -// same vertex--multiplicity pool definition can optionally be reproduced. -using CollisionsFullWithPVMult = soa::Join; -using CollisionsFullMC = soa::Join; +// Save the PV-track multiplicity alongside numContrib in the event-info output +// for both same-event and mixed-event pairs. +using CollisionsFull = soa::Join; +using CollisionsFullWithPVMult = CollisionsFull; +using CollisionsFullMC = soa::Join; using HadHyperCollisionsFull = soa::Join; using HadHyperCollisionsFullMC = soa::Join; using TrackCandidates = soa::Join; @@ -317,6 +316,7 @@ struct BufferedCollision { uint16_t numContrib{0u}; float centFT0C{0.f}; float multFT0C{0.f}; + int32_t multNTracksPV{0}; std::vector nuclei; std::vector hadrons; }; @@ -403,6 +403,12 @@ struct HadNucleiFemto { // cppcheck-suppress unusedStructMember std::string prefix{"deuteronPid"}; // Deuteron purity and PID cuts + Configurable settingTPCNClsFoundMinDe{"settingTPCNClsFoundMinDe", 110, "Minimum found TPC clusters for deuterons"}; + Configurable settingTPCCrossedRowsMinDe{"settingTPCCrossedRowsMinDe", 100, "Minimum crossed TPC rows for deuterons"}; + Configurable settingDeDCAxyOffset{"settingDeDCAxyOffset", 0.004f, "Deuteron DCAxy cut offset in cm"}; + Configurable settingDeDCAxyPtCoeff{"settingDeDCAxyPtCoeff", 0.013f, "Deuteron DCAxy inverse-pT cut coefficient"}; + Configurable settingDeDCAzOffset{"settingDeDCAzOffset", 0.004f, "Deuteron DCAz cut offset in cm"}; + Configurable settingDeDCAzPtCoeff{"settingDeDCAzPtCoeff", 0.013f, "Deuteron DCAz inverse-pT cut coefficient"}; Configurable settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"}; Configurable settingCutDeptMin{"settingCutDeptMin", 0.6f, "Minimum PT cut on De"}; Configurable settingCutDeptMax{"settingCutDeptMax", 1.6f, "Maximum PT cut on De"}; @@ -1230,16 +1236,14 @@ struct HadNucleiFemto { return false; } - constexpr int minTPCNClsFound = 110; - constexpr int minTPCNClsCrossedRows = 100; constexpr float minTPCCrossedRowsOverFound = 0.f; constexpr int maxTPCNClsShared = 160; constexpr float maxSharedTPCFraction = 1.f; constexpr int minITSNClsInnerBarrel = 1; const float tpcCrossedRowsOverFound = candidate.tpcNClsFound() > 0 ? static_cast(candidate.tpcNClsCrossedRows()) / candidate.tpcNClsFound() : 0.f; - return !(candidate.tpcNClsFound() < minTPCNClsFound || - candidate.tpcNClsCrossedRows() < minTPCNClsCrossedRows || + return !(candidate.tpcNClsFound() < deuteronPid.settingTPCNClsFoundMinDe || + candidate.tpcNClsCrossedRows() < deuteronPid.settingTPCCrossedRowsMinDe || tpcCrossedRowsOverFound < minTPCCrossedRowsOverFound || candidate.tpcNClsShared() > maxTPCNClsShared || candidate.tpcFractionSharedCls() > maxSharedTPCFraction || @@ -1840,8 +1844,8 @@ struct HadNucleiFemto { if (absPt <= 0.f) { return false; } - const float deDCAxyMax = 0.004f + 0.013f / absPt; - const float deDCAzMax = 0.004f + 0.013f / absPt; + const float deDCAxyMax = deuteronPid.settingDeDCAxyOffset + deuteronPid.settingDeDCAxyPtCoeff / absPt; + const float deDCAzMax = deuteronPid.settingDeDCAzOffset + deuteronPid.settingDeDCAzPtCoeff / absPt; if (std::abs(candidate.dcaXY()) > deDCAxyMax || std::abs(candidate.dcaZ()) > deDCAzMax) { return false; } @@ -2645,7 +2649,8 @@ struct HadNucleiFemto { collision.posZ(), collision.numContrib(), collision.centFT0C(), - collision.multFT0C()); + collision.multFT0C(), + collision.multNTracksPV()); } } @@ -2658,7 +2663,8 @@ struct HadNucleiFemto { collision.posZ, collision.numContrib, collision.centFT0C, - collision.multFT0C); + collision.multFT0C, + collision.multNTracksPV); } } @@ -3371,6 +3377,7 @@ struct HadNucleiFemto { currentCollision.numContrib = collision.numContrib(); currentCollision.centFT0C = collision.centFT0C(); currentCollision.multFT0C = collision.multFT0C(); + currentCollision.multNTracksPV = collision.multNTracksPV(); const uint64_t collIdx = collision.globalIndex(); auto tracksThisCollision = tracks.sliceBy(mPerCol, collIdx); @@ -3548,6 +3555,7 @@ struct HadNucleiFemto { current.numContrib = collision.numContrib(); current.centFT0C = collision.centFT0C(); current.multFT0C = collision.multFT0C(); + current.multNTracksPV = collision.multNTracksPV(); row.eventId = current.eventId; auto tracksThisCollision = tracks.sliceBy(mPerCol, collision.globalIndex()); tracksThisCollision.bindExternalIndices(&tracks);