Skip to content

Commit 11467c6

Browse files
committed
Polished mixing event for both associated particles
1 parent e88703c commit 11467c6

File tree

1 file changed

+60
-108
lines changed

1 file changed

+60
-108
lines changed

PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx

Lines changed: 60 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ struct Phik0shortanalysis {
7979
HistogramRegistry dataPhiPionHist{"dataPhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
8080
HistogramRegistry mcPhiPionHist{"mcPhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
8181
HistogramRegistry closureMCPhiPionHist{"closureMCPhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
82+
HistogramRegistry mePhiK0SHist{"mePhiK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
83+
HistogramRegistry mePhiPionHist{"mePhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
8284

8385
// Configurable for event selection
8486
Configurable<float> cutZVertex{"cutZVertex", 10.0f, "Accepted z-vertex range (cm)"};
@@ -569,12 +571,12 @@ struct Phik0shortanalysis {
569571

570572
// Histograms for new analysis procedure (to be finalized and renamed deleting other histograms)
571573
dataPhiHist.add("h3PhiDataNewProc", "Invariant mass of Phi in Data", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis});
572-
dataPhiK0SHist.add("h5PhiK0SDataNewProc", "2D Invariant mass of Phi and K0Short for Data", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptK0SAxis, massK0SAxis, massPhiAxis});
573-
dataPhiPionHist.add("h6PhiPiDataNewProc", "Phi Invariant mass vs Pion nSigma TPC/TOF for Data", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, massPhiAxis});
574+
dataPhiK0SHist.add("h5PhiK0SDataNewProc", "2D Invariant mass of Phi and K0Short in Data", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptK0SAxis, massK0SAxis, massPhiAxis});
575+
dataPhiPionHist.add("h6PhiPiDataNewProc", "Phi Invariant mass vs Pion nSigma TPC/TOF in Data", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, massPhiAxis});
574576

575-
closureMCPhiHist.add("h3PhiMCClosureNewProc", "Invariant mass of Phi", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis});
576-
closureMCPhiK0SHist.add("h5PhiK0SMCClosureNewProc", "2D Invariant mass of Phi and K0Short for MC Closure Test", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptK0SAxis, massK0SAxis, massPhiAxis});
577-
closureMCPhiPionHist.add("h6PhiPiMCClosureNewProc", "Phi Invariant mass vs Pion nSigma TPC/TOF for MC Closure Test", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, massPhiAxis});
577+
closureMCPhiHist.add("h3PhiMCClosureNewProc", "Invariant mass of Phi in MC Closure test", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis});
578+
closureMCPhiK0SHist.add("h5PhiK0SMCClosureNewProc", "2D Invariant mass of Phi and K0Short in MC Closure Test", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptK0SAxis, massK0SAxis, massPhiAxis});
579+
closureMCPhiPionHist.add("h6PhiPiMCClosureNewProc", "Phi Invariant mass vs Pion nSigma TPC/TOF in MC Closure Test", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, massPhiAxis});
578580

579581
mcPhiHist.add("h2PhiMCRecoNewProc", "Phi in MCReco", kTH2F, {binnedmultAxis, binnedpTPhiAxis});
580582
mcK0SHist.add("h2K0SMCRecoNewProc", "K0S in MCReco", kTH2F, {binnedmultAxis, binnedptK0SAxis});
@@ -593,6 +595,9 @@ struct Phik0shortanalysis {
593595
mcK0SHist.add("h2K0SMCGenAssocRecoCheckNewProc", "K0S in MCGen Associated MCReco Check", kTH2F, {binnedmultAxis, binnedptK0SAxis});
594596
mcPionHist.add("h2PiMCGenAssocRecoCheckNewProc", "Pion in MCGen Associated MCReco Check", kTH2F, {binnedmultAxis, binnedptPiAxis});
595597

598+
mePhiK0SHist.add("h5PhiK0SMENewProc", "2D Invariant mass of Phi and K0Short in ME", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptK0SAxis, massK0SAxis, massPhiAxis});
599+
mePhiPionHist.add("h6PhiPiMENewProc", "Phi Invariant mass vs Pion nSigma TPC/TOF in ME", kTHnSparseF, {deltayAxis, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, massPhiAxis});
600+
596601
// Initialize CCDB only if purity or efficiencies are requested in the task
597602
if (useCCDB) {
598603
ccdb->setURL(ccdbUrl);
@@ -2885,133 +2890,80 @@ struct Phik0shortanalysis {
28852890

28862891
PROCESS_SWITCH(Phik0shortanalysis, processAllPartMCGen, "Process function for all particles in MCGen", false);
28872892

2888-
void processMixingEvent(SelCollisions const& collisions, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
2893+
void processPhiK0SMixingEvent(SelCollisions const& collisions, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
28892894
{
2890-
for (auto const& [collision1, tracks1, collision2, v0s2] : o2::soa::selfCombinations(binningOnPositions, cfgNoMixedEvents, -1, collisions, collisions)) {
2891-
if (!collision1.isInelGt0() || !collision2.isInelGt0())
2892-
continue;
2895+
for (auto const& [collision1, tracks1, collision2, v0s2] : pairPhiK0S) {
2896+
float multiplicity = collision1.centFT0M();
28932897

2894-
// Defining V0s from collision1
2895-
auto V0ThisColl = V0s.sliceByCached(aod::v0::collisionId, collision1.globalIndex(), cache);
2898+
auto posMixColl = posTracks->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache);
2899+
auto negMixColl = negTracks->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache);
28962900

2897-
// Defining positive and negative tracks for phi reconstruction from collision1 and collision2, respectively
2898-
auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache);
2899-
auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache);
2901+
for (const auto& [track1, track2, v0] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posMixColl, negMixColl, v0s2))) {
2902+
if (!selectionTrackResonance<false>(track1, true) || !selectionPIDKaonpTdependent(track1))
2903+
continue;
2904+
if (!selectionTrackResonance<false>(track2, true) || !selectionPIDKaonpTdependent(track2))
2905+
continue;
2906+
if (track1.globalIndex() == track2.globalIndex())
2907+
continue;
2908+
2909+
ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa);
2910+
if (recPhi.Pt() < minPhiPt)
2911+
continue;
2912+
if (std::abs(recPhi.Rapidity()) > cfgYAcceptance)
2913+
continue;
29002914

2901-
for (const auto& v0 : V0ThisColl) {
29022915
const auto& posDaughterTrack = v0.posTrack_as<V0DauTracks>();
29032916
const auto& negDaughterTrack = v0.negTrack_as<V0DauTracks>();
29042917

2905-
// Cut on V0 dynamic columns
29062918
if (!selectionV0(v0, posDaughterTrack, negDaughterTrack))
29072919
continue;
2908-
2909-
TLorentzVector recK0S;
2910-
recK0S.SetXYZM(v0.px(), v0.py(), v0.pz(), v0.mK0Short());
2911-
if (std::abs(recK0S.Rapidity()) > cfgInclusiveDeltay)
2920+
if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision2))
2921+
continue;
2922+
if (std::abs(v0.yK0Short()) > cfgYAcceptance)
29122923
continue;
29132924

2914-
// Combinatorial background simulation
2915-
for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posThisColl, negThisColl))) {
2916-
if (!selectionTrackResonance(track1) || !selectionPIDKaon(track1) || !selectionTrackResonance(track2) || !selectionPIDKaon(track2))
2917-
continue; // topological and PID selection
2918-
2919-
TLorentzVector recPhi;
2920-
recPhi = recMother(track1, track2, massKa, massKa);
2921-
if (std::abs(recPhi.Rapidity()) > cfgInclusiveDeltay)
2922-
continue;
2923-
}
2925+
mePhiK0SHist.fill(HIST("h5PhiK0SMENewProc"), v0.yK0Short() - recPhi.Rapidity(), multiplicity, v0.pt(), v0.mK0Short(), recPhi.M());
29242926
}
2927+
}
2928+
}
29252929

2926-
// Defining positive and negative tracks for phi reconstruction
2927-
auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
2928-
auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
2929-
2930-
bool isCountedPhi = false;
2931-
bool isFilledhV0 = false;
2932-
2933-
// Loop over all positive tracks
2934-
for (const auto& track1 : posThisColl) {
2935-
if (!selectionTrackResonance<false>(track1, true) || !selectionPIDKaonpTdependent(track1))
2936-
continue; // topological and PID selection
2937-
2938-
dataPhiHist.fill(HIST("hEta"), track1.eta());
2939-
dataPhiHist.fill(HIST("hNsigmaKaonTPC"), track1.tpcInnerParam(), track1.tpcNSigmaKa());
2940-
dataPhiHist.fill(HIST("hNsigmaKaonTOF"), track1.tpcInnerParam(), track1.tofNSigmaKa());
2941-
2942-
auto track1ID = track1.globalIndex();
2943-
2944-
// Loop over all negative tracks
2945-
for (const auto& track2 : negThisColl) {
2946-
if (!selectionTrackResonance<false>(track2, true) || !selectionPIDKaonpTdependent(track2))
2947-
continue; // topological and PID selection
2948-
2949-
auto track2ID = track2.globalIndex();
2950-
if (track2ID == track1ID)
2951-
continue; // condition to avoid double counting of pair
2952-
2953-
ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa);
2954-
if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt)
2955-
continue;
2956-
if (std::abs(recPhi.Rapidity()) > cfgYAcceptance)
2957-
continue;
2958-
2959-
if (!isCountedPhi) {
2960-
dataEventHist.fill(HIST("hEventSelection"), 4); // at least a Phi candidate in the event
2961-
dataEventHist.fill(HIST("hMultiplicityPercentWithPhi"), multiplicity);
2962-
isCountedPhi = true;
2963-
}
2964-
2965-
dataPhiHist.fill(HIST("h3PhiDataNewProc"), multiplicity, recPhi.Pt(), recPhi.M());
2966-
2967-
// V0 already reconstructed by the builder
2968-
for (const auto& v0 : V0s) {
2969-
const auto& posDaughterTrack = v0.posTrack_as<V0DauTracks>();
2970-
const auto& negDaughterTrack = v0.negTrack_as<V0DauTracks>();
2971-
2972-
// Cut on V0 dynamic columns
2973-
if (!selectionV0(v0, posDaughterTrack, negDaughterTrack))
2974-
continue;
2975-
if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision))
2976-
continue;
2977-
2978-
if (!isFilledhV0) {
2979-
dataK0SHist.fill(HIST("hDCAV0Daughters"), v0.dcaV0daughters());
2980-
dataK0SHist.fill(HIST("hV0CosPA"), v0.v0cosPA());
2981-
2982-
// Filling the PID of the V0 daughters in the region of the K0 peak
2983-
if (lowMK0S < v0.mK0Short() && v0.mK0Short() < upMK0S) {
2984-
dataK0SHist.fill(HIST("hNSigmaPosPionFromK0S"), posDaughterTrack.tpcInnerParam(), posDaughterTrack.tpcNSigmaPi());
2985-
dataK0SHist.fill(HIST("hNSigmaNegPionFromK0S"), negDaughterTrack.tpcInnerParam(), negDaughterTrack.tpcNSigmaPi());
2986-
}
2987-
}
2930+
PROCESS_SWITCH(phik0shortanalysis, processPhiK0SMixingEvent, "Process Mixed Event for Phi-K0S Analysis", false);
29882931

2989-
if (std::abs(v0.yK0Short()) > cfgYAcceptance)
2990-
continue;
2932+
void processPhiPionMixingEvent(SelCollisions const& collisions, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
2933+
{
2934+
for (auto const& [collision1, tracks1, collision2, tracks2] : pairPhiPion) {
2935+
float multiplicity = collision1.centFT0M();
29912936

2992-
dataPhiK0SHist.fill(HIST("h5PhiK0SDataNewProc"), v0.yK0Short() - recPhi.Rapidity(), multiplicity, v0.pt(), v0.mK0Short(), recPhi.M());
2993-
}
2937+
auto posMixColl = posTracks->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache);
2938+
auto negMixColl = negTracks->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache);
29942939

2995-
isFilledhV0 = true;
2940+
for (const auto& [track1, track2, track] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posMixColl, negMixColl, tracks2))) {
2941+
if (!selectionTrackResonance<false>(track1, true) || !selectionPIDKaonpTdependent(track1))
2942+
continue;
2943+
if (!selectionTrackResonance<false>(track2, true) || !selectionPIDKaonpTdependent(track2))
2944+
continue;
2945+
if (track1.globalIndex() == track2.globalIndex())
2946+
continue;
29962947

2997-
// Loop over all primary pion candidates
2998-
for (const auto& track : fullTracks) {
2999-
if (!selectionPion<true, false>(track, false))
3000-
continue;
2948+
ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa);
2949+
if (recPhi.Pt() < minPhiPt)
2950+
continue;
2951+
if (std::abs(recPhi.Rapidity()) > cfgYAcceptance)
2952+
continue;
30012953

3002-
if (std::abs(track.rapidity(massPi)) > cfgYAcceptance)
3003-
continue;
2954+
if (!selectionPion<true, false>(track, false))
2955+
continue;
2956+
if (std::abs(track.rapidity(massPi)) > cfgYAcceptance)
2957+
continue;
30042958

3005-
float nSigmaTOFPi = (track.hasTOF() ? track.tofNSigmaPi() : -999);
2959+
float nSigmaTOFPi = (track.hasTOF() ? track.tofNSigmaPi() : -999);
30062960

3007-
dataPhiPionHist.fill(HIST("h6PhiPiDataNewProc"), track.rapidity(massPi) - recPhi.Rapidity(), multiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M());
3008-
}
3009-
}
2961+
mePhiPionHist.fill(HIST("h6PhiPiMENewProc"), track.rapidity(massPi) - recPhi.Rapidity(), multiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M());
30102962
}
30112963
}
30122964
}
30132965

3014-
PROCESS_SWITCH(phik0shortanalysis, processMEPhiK0S, "Process Mixed Event for Phi-K0S Analysis", false);
2966+
PROCESS_SWITCH(phik0shortanalysis, processPhiPionMixingEvent, "Process Mixed Event for Phi-Pion Analysis", false);
30152967
};
30162968

30172969
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)