Skip to content

Commit e85859a

Browse files
authored
[PWGLF] omega2012Analysis.cxx - improve loop condition (#13314)
1 parent 2d2e92a commit e85859a

File tree

1 file changed

+108
-48
lines changed

1 file changed

+108
-48
lines changed

PWGLF/Tasks/Resonances/omega2012Analysis.cxx

Lines changed: 108 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
#include <Math/Vector4D.h>
3030

31+
#include <set>
32+
3133
using namespace o2;
3234
using namespace o2::framework;
3335
using namespace o2::framework::expressions;
@@ -129,6 +131,10 @@ struct Omega2012Analysis {
129131
Configurable<std::vector<float>> cPionTOFNSigmaCuts{"cPionTOFNSigmaCuts", {3.0f, 3.0f, 3.0f, 3.0f}, "TOF NSigma cuts per pT bin (pion)"};
130132
Configurable<std::vector<int>> cPionTOFRequired{"cPionTOFRequired", {0, 0, 1, 1}, "Require TOF per pT bin (pion)"};
131133

134+
// Xi1530 mass window cut
135+
Configurable<float> cXi1530Mass{"cXi1530Mass", 1.53, "Xi(1530) mass (GeV/c^2)"};
136+
Configurable<float> cXi1530MassWindow{"cXi1530MassWindow", 0.01, "Xi(1530) mass window (GeV/c^2)"};
137+
132138
// PDG masses
133139
double massK0 = MassK0Short;
134140

@@ -475,6 +481,21 @@ struct Omega2012Analysis {
475481
return true;
476482
}
477483

484+
// Xi1530 mass window cut
485+
template <typename XiType, typename PionType>
486+
bool xi1530MassCut(const XiType& xi, const PionType& pion)
487+
{
488+
// Calculate Xi + pion invariant mass
489+
ROOT::Math::PxPyPzEVector pXi, pPion, pXi1530;
490+
pXi = ROOT::Math::PxPyPzEVector(ROOT::Math::PtEtaPhiMVector(xi.pt(), xi.eta(), xi.phi(), xi.mXi()));
491+
pPion = ROOT::Math::PxPyPzEVector(ROOT::Math::PtEtaPhiMVector(pion.pt(), pion.eta(), pion.phi(), MassPionCharged));
492+
pXi1530 = pXi + pPion;
493+
494+
// Check if mass is within Xi(1530) window
495+
float massDiff = std::abs(pXi1530.M() - cXi1530Mass);
496+
return massDiff < cXi1530MassWindow;
497+
}
498+
478499
// Primary-level cascade kinematics
479500
template <typename CascT>
480501
bool cascprimaryTrackCut(const CascT& c)
@@ -801,67 +822,106 @@ struct Omega2012Analysis {
801822
{
802823
auto cent = collision.cent();
803824

825+
// Collect track IDs used in xi and v0 construction to exclude them from pion selection
826+
std::set<int> usedTrackIds;
827+
828+
// Collect track IDs from xi cascades
804829
for (const auto& xi : cascades) {
805830
if (!cascprimaryTrackCut(xi))
806831
continue;
807832
if (!casctopCut(xi))
808833
continue;
809834

810-
for (const auto& v0 : v0s) {
811-
if (!v0CutEnhanced(collision, v0))
835+
// Add xi daughter track IDs from cascadeIndices array (ordered: positive, negative, bachelor)
836+
auto cascIndices = xi.cascadeIndices();
837+
usedTrackIds.insert(cascIndices[0]); // positive track
838+
usedTrackIds.insert(cascIndices[1]); // negative track
839+
usedTrackIds.insert(cascIndices[2]); // bachelor track
840+
}
841+
842+
// Collect track IDs from v0s
843+
for (const auto& v0 : v0s) {
844+
if (!v0CutEnhanced(collision, v0))
845+
continue;
846+
847+
// Add v0 daughter track IDs from indices array
848+
auto v0Indices = v0.indices();
849+
usedTrackIds.insert(v0Indices[0]); // positive track
850+
usedTrackIds.insert(v0Indices[1]); // negative track
851+
}
852+
853+
// First loop: xi + pion to check xi1530 mass window
854+
for (const auto& xi : cascades) {
855+
if (!cascprimaryTrackCut(xi))
856+
continue;
857+
if (!casctopCut(xi))
858+
continue;
859+
860+
for (const auto& pion : tracks) {
861+
// Skip pion tracks that are already used in xi construction
862+
if (usedTrackIds.find(pion.globalIndex()) != usedTrackIds.end()) {
812863
continue;
864+
}
865+
866+
// Pion QA before cuts
867+
histos.fill(HIST("QAbefore/pionPt"), pion.pt());
868+
histos.fill(HIST("QAbefore/pionEta"), pion.eta());
813869

814-
for (const auto& pion : tracks) {
815-
// Pion QA before cuts
816-
histos.fill(HIST("QAbefore/pionPt"), pion.pt());
817-
histos.fill(HIST("QAbefore/pionEta"), pion.eta());
818-
819-
if constexpr (IsResoMicrotrack) {
820-
histos.fill(HIST("QAbefore/pionDCAxy"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAxy(pion.trackSelectionFlags()));
821-
histos.fill(HIST("QAbefore/pionDCAz"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAz(pion.trackSelectionFlags()));
822-
histos.fill(HIST("QAbefore/pionTPCNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTPCnSigma(pion.pidNSigmaPiFlag()));
823-
if (pion.hasTOF()) {
824-
histos.fill(HIST("QAbefore/pionTOFNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTOFnSigma(pion.pidNSigmaPiFlag()));
825-
}
826-
} else {
827-
histos.fill(HIST("QAbefore/pionDCAxy"), pion.pt(), pion.dcaXY());
828-
histos.fill(HIST("QAbefore/pionDCAz"), pion.pt(), pion.dcaZ());
829-
histos.fill(HIST("QAbefore/pionTPCNSigma"), pion.pt(), pion.tpcNSigmaPi());
830-
if (pion.hasTOF()) {
831-
histos.fill(HIST("QAbefore/pionTOFNSigma"), pion.pt(), pion.tofNSigmaPi());
832-
}
833-
if constexpr (requires { pion.tpcNClsFound(); }) {
834-
histos.fill(HIST("QAbefore/pionTPCNcls"), pion.tpcNClsFound());
835-
}
870+
if constexpr (IsResoMicrotrack) {
871+
histos.fill(HIST("QAbefore/pionDCAxy"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAxy(pion.trackSelectionFlags()));
872+
histos.fill(HIST("QAbefore/pionDCAz"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAz(pion.trackSelectionFlags()));
873+
histos.fill(HIST("QAbefore/pionTPCNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTPCnSigma(pion.pidNSigmaPiFlag()));
874+
if (pion.hasTOF()) {
875+
histos.fill(HIST("QAbefore/pionTOFNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTOFnSigma(pion.pidNSigmaPiFlag()));
876+
}
877+
} else {
878+
histos.fill(HIST("QAbefore/pionDCAxy"), pion.pt(), pion.dcaXY());
879+
histos.fill(HIST("QAbefore/pionDCAz"), pion.pt(), pion.dcaZ());
880+
histos.fill(HIST("QAbefore/pionTPCNSigma"), pion.pt(), pion.tpcNSigmaPi());
881+
if (pion.hasTOF()) {
882+
histos.fill(HIST("QAbefore/pionTOFNSigma"), pion.pt(), pion.tofNSigmaPi());
836883
}
884+
if constexpr (requires { pion.tpcNClsFound(); }) {
885+
histos.fill(HIST("QAbefore/pionTPCNcls"), pion.tpcNClsFound());
886+
}
887+
}
837888

838-
if (!pionCut<IsResoMicrotrack>(pion))
839-
continue;
889+
if (!pionCut<IsResoMicrotrack>(pion))
890+
continue;
840891

841-
// Pion QA after cuts
842-
histos.fill(HIST("QAafter/pionPt"), pion.pt());
843-
histos.fill(HIST("QAafter/pionEta"), pion.eta());
844-
845-
if constexpr (IsResoMicrotrack) {
846-
histos.fill(HIST("QAafter/pionDCAxy"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAxy(pion.trackSelectionFlags()));
847-
histos.fill(HIST("QAafter/pionDCAz"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAz(pion.trackSelectionFlags()));
848-
histos.fill(HIST("QAafter/pionTPCNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTPCnSigma(pion.pidNSigmaPiFlag()));
849-
if (pion.hasTOF()) {
850-
histos.fill(HIST("QAafter/pionTOFNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTOFnSigma(pion.pidNSigmaPiFlag()));
851-
}
852-
} else {
853-
histos.fill(HIST("QAafter/pionDCAxy"), pion.pt(), pion.dcaXY());
854-
histos.fill(HIST("QAafter/pionDCAz"), pion.pt(), pion.dcaZ());
855-
histos.fill(HIST("QAafter/pionTPCNSigma"), pion.pt(), pion.tpcNSigmaPi());
856-
if (pion.hasTOF()) {
857-
histos.fill(HIST("QAafter/pionTOFNSigma"), pion.pt(), pion.tofNSigmaPi());
858-
}
859-
if constexpr (requires { pion.tpcNClsFound(); }) {
860-
histos.fill(HIST("QAafter/pionTPCNcls"), pion.tpcNClsFound());
861-
}
892+
// Pion QA after cuts
893+
histos.fill(HIST("QAafter/pionPt"), pion.pt());
894+
histos.fill(HIST("QAafter/pionEta"), pion.eta());
895+
896+
if constexpr (IsResoMicrotrack) {
897+
histos.fill(HIST("QAafter/pionDCAxy"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAxy(pion.trackSelectionFlags()));
898+
histos.fill(HIST("QAafter/pionDCAz"), pion.pt(), o2::aod::resomicrodaughter::ResoMicroTrackSelFlag::decodeDCAz(pion.trackSelectionFlags()));
899+
histos.fill(HIST("QAafter/pionTPCNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTPCnSigma(pion.pidNSigmaPiFlag()));
900+
if (pion.hasTOF()) {
901+
histos.fill(HIST("QAafter/pionTOFNSigma"), pion.pt(), o2::aod::resomicrodaughter::PidNSigma::getTOFnSigma(pion.pidNSigmaPiFlag()));
902+
}
903+
} else {
904+
histos.fill(HIST("QAafter/pionDCAxy"), pion.pt(), pion.dcaXY());
905+
histos.fill(HIST("QAafter/pionDCAz"), pion.pt(), pion.dcaZ());
906+
histos.fill(HIST("QAafter/pionTPCNSigma"), pion.pt(), pion.tpcNSigmaPi());
907+
if (pion.hasTOF()) {
908+
histos.fill(HIST("QAafter/pionTOFNSigma"), pion.pt(), pion.tofNSigmaPi());
862909
}
910+
if constexpr (requires { pion.tpcNClsFound(); }) {
911+
histos.fill(HIST("QAafter/pionTPCNcls"), pion.tpcNClsFound());
912+
}
913+
}
914+
915+
// Check xi1530 mass window cut
916+
if (!xi1530MassCut(xi, pion))
917+
continue;
918+
919+
// Second loop: v0 for the selected xi-pion pair
920+
for (const auto& v0 : v0s) {
921+
if (!v0CutEnhanced(collision, v0))
922+
continue;
863923

864-
// 4-vectors for 3-body
924+
// 4-vectors for 3-body decay: Xi + K0s + pion
865925
ROOT::Math::PxPyPzEVector pXi, pK0s, pPion, pRes;
866926
pXi = ROOT::Math::PxPyPzEVector(ROOT::Math::PtEtaPhiMVector(xi.pt(), xi.eta(), xi.phi(), xi.mXi()));
867927
pK0s = ROOT::Math::PxPyPzEVector(ROOT::Math::PtEtaPhiMVector(v0.pt(), v0.eta(), v0.phi(), massK0));

0 commit comments

Comments
 (0)