@@ -936,6 +936,20 @@ struct Phik0shortanalysis {
936936 return true;
937937 }
938938
939+ template <typename T>
940+ bool selectionPhi(const T& posTrack, const T& negTrack)
941+ {
942+ // To be possibly completed
943+ return !posTrack.empty() && !negTrack.empty();
944+ }
945+
946+ template <typename T1, typename T2>
947+ bool selectionPhiWPDG(const T1& posTrack, const T1& negTrack, const T2& mcParticles)
948+ {
949+ // To be possibly completed
950+ return !posTrack.empty() && !negTrack.empty();
951+ }
952+
939953 template <typename T1, typename T2>
940954 bool eventHasRecoPhi(const T1& posTracks, const T2& negTracks)
941955 {
@@ -1108,7 +1122,7 @@ struct Phik0shortanalysis {
11081122 }
11091123
11101124 template <typename T>
1111- bool isGenParticleCharged (const T& mcParticle)
1125+ bool selectionChargedGenParticle (const T& mcParticle)
11121126 {
11131127 if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.eta()) > trackConfigs.etaMax)
11141128 return false;
@@ -2709,7 +2723,7 @@ struct Phik0shortanalysis {
27092723
27102724 if (fillMcPartsForAllReco) {
27112725 for (const auto& mcParticle : mcParticlesThisMcColl) {
2712- if (!isGenParticleCharged (mcParticle))
2726+ if (!selectionChargedGenParticle (mcParticle))
27132727 continue;
27142728
27152729 mcEventHist.fill(HIST("h6GenMCAllAssocRecoEtaDistribution"), collision.posZ(), mcCollision.centFT0M(), mcParticle.eta(), mcParticle.phi(), kSpAll, kNoGenpTVar);
@@ -2745,7 +2759,7 @@ struct Phik0shortanalysis {
27452759 }
27462760
27472761 for (const auto& mcParticle : mcParticlesThisMcColl) {
2748- if (!isGenParticleCharged (mcParticle))
2762+ if (!selectionChargedGenParticle (mcParticle))
27492763 continue;
27502764
27512765 int pid = fromPDGToEnum(mcParticle.pdgCode());
@@ -3019,6 +3033,105 @@ struct Phik0shortanalysis {
30193033
30203034 PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SPionMCClosure2D, "Process function for Phi-K0S and Phi-Pion Correlations in MCClosure2D", false);
30213035
3036+ void processPhiK0SMixingEvent2D(SelCollisions const& collisions, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
3037+ {
3038+ auto tracksV0sTuple = std::make_tuple(fullTracks, V0s);
3039+ Pair<SelCollisions, FullTracks, FullV0s, BinningTypeVertexCent> pairPhiK0S{binningOnVertexAndCent, cfgNoMixedEvents, -1, collisions, tracksV0sTuple, &cache};
3040+
3041+ for (auto const& [collision1, tracks1, collision2, v0s2] : pairPhiK0S) {
3042+ float multiplicity = collision1.centFT0M();
3043+
3044+ Partition<FullTracks> posMixTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge;
3045+ posMixTracks.bindTable(tracks1);
3046+ Partition<FullTracks> negMixTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge;
3047+ negMixTracks.bindTable(tracks1);
3048+
3049+ for (const auto& [posTrack1, negTrack1, v0] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posMixTracks, negMixTracks, v0s2))) {
3050+ if (!selectionTrackResonance<false>(posTrack1, true) || !selectionPIDKaonpTdependent(posTrack1))
3051+ continue;
3052+ if (!selectionTrackResonance<false>(negTrack1, true) || !selectionPIDKaonpTdependent(negTrack1))
3053+ continue;
3054+ if (posTrack1.globalIndex() == negTrack1.globalIndex())
3055+ continue;
3056+
3057+ ROOT::Math::PxPyPzMVector recPhi = recMother(posTrack1, negTrack1, massKa, massKa);
3058+ if (recPhi.Pt() < phiConfigs.minPhiPt)
3059+ continue;
3060+ if (std::abs(recPhi.Rapidity()) > deltaYConfigs.cfgYAcceptance)
3061+ continue;
3062+
3063+ const auto& posDaughterTrack = v0.posTrack_as<V0DauTracks>();
3064+ const auto& negDaughterTrack = v0.negTrack_as<V0DauTracks>();
3065+
3066+ if (!selectionV0(v0, posDaughterTrack, negDaughterTrack))
3067+ continue;
3068+ if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision2))
3069+ continue;
3070+ if (std::abs(v0.yK0Short()) > deltaYConfigs.cfgYAcceptance)
3071+ continue;
3072+
3073+ float efficiencyPhiK0S = 1.0f;
3074+ if (applyEfficiency) {
3075+ efficiencyPhiK0S = effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapK0S->Interpolate(multiplicity, v0.pt(), v0.yK0Short());
3076+ if (efficiencyPhiK0S == 0)
3077+ efficiencyPhiK0S = 1.0f;
3078+ }
3079+ float weightPhiK0S = applyEfficiency ? 1.0f / efficiencyPhiK0S : 1.0f;
3080+ mePhiK0SHist.fill(HIST("h5PhiK0SMENewProc"), v0.yK0Short() - recPhi.Rapidity(), multiplicity, v0.pt(), v0.mK0Short(), recPhi.M(), weightPhiK0S);
3081+ }
3082+ }
3083+ }
3084+
3085+ PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SMixingEvent2D, "Process Mixed Event for Phi-K0S Analysis 2D", false);
3086+
3087+ void processPhiPionMixingEvent2D(SelCollisions const& collisions, FullTracks const& fullTracks)
3088+ {
3089+ auto tracksTuple = std::make_tuple(fullTracks);
3090+ SameKindPair<SelCollisions, FullTracks, BinningTypeVertexCent> pairPhiPion{binningOnVertexAndCent, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache};
3091+
3092+ for (auto const& [collision1, tracks1, collision2, tracks2] : pairPhiPion) {
3093+ float multiplicity = collision1.centFT0M();
3094+
3095+ Partition<FullTracks> posMixTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge;
3096+ posMixTracks.bindTable(tracks1);
3097+ Partition<FullTracks> negMixTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge;
3098+ negMixTracks.bindTable(tracks1);
3099+
3100+ for (const auto& [posTrack1, negTrack1, track] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posMixTracks, negMixTracks, tracks2))) {
3101+ if (!selectionTrackResonance<false>(posTrack1, true) || !selectionPIDKaonpTdependent(posTrack1))
3102+ continue;
3103+ if (!selectionTrackResonance<false>(negTrack1, true) || !selectionPIDKaonpTdependent(negTrack1))
3104+ continue;
3105+ if (posTrack1.globalIndex() == negTrack1.globalIndex())
3106+ continue;
3107+
3108+ ROOT::Math::PxPyPzMVector recPhi = recMother(posTrack1, negTrack1, massKa, massKa);
3109+ if (recPhi.Pt() < phiConfigs.minPhiPt)
3110+ continue;
3111+ if (std::abs(recPhi.Rapidity()) > deltaYConfigs.cfgYAcceptance)
3112+ continue;
3113+
3114+ if (!selectionPion<true, false>(track, false))
3115+ continue;
3116+ if (std::abs(track.rapidity(massPi)) > deltaYConfigs.cfgYAcceptance)
3117+ continue;
3118+
3119+ float efficiencyPhiPion = 1.0f;
3120+ if (applyEfficiency) {
3121+ efficiencyPhiPion = track.pt() < trackConfigs.pTToUseTOF ? effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapPionTPC->Interpolate(multiplicity, track.pt(), track.rapidity(massPi)) : effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapPionTPCTOF->Interpolate(multiplicity, track.pt(), track.rapidity(massPi));
3122+ if (efficiencyPhiPion == 0)
3123+ efficiencyPhiPion = 1.0f;
3124+ }
3125+ float weightPhiPion = applyEfficiency ? 1.0f / efficiencyPhiPion : 1.0f;
3126+ mePhiPionHist.fill(HIST("h5PhiPiTPCMENewProc"), track.rapidity(massPi) - recPhi.Rapidity(), multiplicity, track.pt(), track.tpcNSigmaPi(), recPhi.M(), weightPhiPion);
3127+ if (track.hasTOF())
3128+ mePhiPionHist.fill(HIST("h5PhiPiTOFMENewProc"), track.rapidity(massPi) - recPhi.Rapidity(), multiplicity, track.pt(), track.tofNSigmaPi(), recPhi.M(), weightPhiPion);
3129+ }
3130+ }
3131+ }
3132+
3133+ PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMixingEvent2D, "Process Mixed Event for Phi-Pion Analysis 2D", false);
3134+
30223135 void processAllPartMC(MCCollisions const& mcCollisions, SimCollisions const& collisions, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, aod::McParticles const& mcParticles)
30233136 {
30243137
@@ -3253,104 +3366,125 @@ struct Phik0shortanalysis {
32533366
32543367 PROCESS_SWITCH(Phik0shortanalysis, processAllPartMC, "Process function for all particles (not for phi if triggered on it) in MC", false);
32553368
3256- void processPhiK0SMixingEvent(SelCollisions const& collisions, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
3369+ // New 2D analysis procedure
3370+ void processPhiK0SPionDeltayDeltaphiData2D(SelCollisions::iterator const& collision, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
32573371 {
3258- auto tracksV0sTuple = std::make_tuple(fullTracks, V0s);
3259- Pair<SelCollisions, FullTracks, FullV0s, BinningTypeVertexCent> pairPhiK0S{binningOnVertexAndCent, cfgNoMixedEvents, -1, collisions, tracksV0sTuple, &cache};
3372+ // Check if the event selection is passed
3373+ if (!acceptEventQA<false>(collision, true))
3374+ return;
32603375
3261- for (auto const& [collision1, tracks1, collision2, v0s2] : pairPhiK0S) {
3262- float multiplicity = collision1.centFT0M( );
3376+ float multiplicity = collision.centFT0M();
3377+ dataEventHist.fill(HIST("hMultiplicityPercent"), multiplicity );
32633378
3264- Partition<FullTracks> posMixTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge;
3265- posMixTracks.bindTable(tracks1);
3266- Partition<FullTracks> negMixTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge;
3267- negMixTracks.bindTable(tracks1);
3379+ // Defining positive and negative tracks for phi reconstruction
3380+ auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
3381+ auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
32683382
3269- for (const auto& [posTrack1, negTrack1, v0] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posMixTracks, negMixTracks, v0s2))) {
3270- if (!selectionTrackResonance<false>(posTrack1, true) || !selectionPIDKaonpTdependent(posTrack1))
3271- continue;
3272- if (!selectionTrackResonance<false>(negTrack1, true) || !selectionPIDKaonpTdependent(negTrack1))
3273- continue;
3274- if (posTrack1.globalIndex() == negTrack1.globalIndex())
3275- continue;
3383+ if (!eventHasRecoPhi(posThisColl, negThisColl))
3384+ return;
32763385
3277- ROOT::Math::PxPyPzMVector recPhi = recMother(posTrack1, negTrack1, massKa, massKa);
3278- if (recPhi.Pt() < phiConfigs.minPhiPt)
3279- continue;
3280- if (std::abs(recPhi.Rapidity()) > deltaYConfigs.cfgYAcceptance)
3281- continue;
3386+ dataEventHist.fill(HIST("hEventSelection"), 4); // at least a Phi candidate in the event
32823387
3283- const auto& posDaughterTrack = v0.posTrack_as<V0DauTracks>() ;
3284- const auto& negDaughterTrack = v0.negTrack_as<V0DauTracks>() ;
3388+ bool isCountedPhi = false ;
3389+ bool isFilledhV0 = false ;
32853390
3286- if (!selectionV0(v0, posDaughterTrack, negDaughterTrack))
3287- continue;
3288- if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision2))
3391+ // Loop over all positive tracks
3392+ for (const auto& track1 : posThisColl) {
3393+ if (!selectionTrackResonance<false>(track1, true) || !selectionPIDKaonpTdependent(track1))
3394+ continue; // topological and PID selection
3395+
3396+ dataPhiHist.fill(HIST("hEta"), track1.eta());
3397+ dataPhiHist.fill(HIST("hNsigmaKaonTPC"), track1.tpcInnerParam(), track1.tpcNSigmaKa());
3398+ dataPhiHist.fill(HIST("hNsigmaKaonTOF"), track1.tpcInnerParam(), track1.tofNSigmaKa());
3399+
3400+ auto track1ID = track1.globalIndex();
3401+
3402+ // Loop over all negative tracks
3403+ for (const auto& track2 : negThisColl) {
3404+ if (!selectionTrackResonance<false>(track2, true) || !selectionPIDKaonpTdependent(track2))
3405+ continue; // topological and PID selection
3406+
3407+ auto track2ID = track2.globalIndex();
3408+ if (track2ID == track1ID)
3409+ continue; // condition to avoid double counting of pair
3410+
3411+ ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa);
3412+ if (recPhi.Pt() < phiConfigs.minPhiPt || recPhi.Pt() > phiConfigs.maxPhiPt)
32893413 continue;
3290- if (std::abs(v0.yK0Short ()) > deltaYConfigs.cfgYAcceptance)
3414+ if (std::abs(recPhi.Rapidity ()) > deltaYConfigs.cfgYAcceptance)
32913415 continue;
32923416
3293- float efficiencyPhiK0S = 1.0f;
3417+ if (!isCountedPhi)
3418+ isCountedPhi = true;
3419+
3420+ float efficiencyPhi = 1.0f;
32943421 if (applyEfficiency) {
3295- efficiencyPhiK0S = effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapK0S->Interpolate(multiplicity, v0.pt(), v0.yK0Short ());
3296- if (efficiencyPhiK0S == 0)
3297- efficiencyPhiK0S = 1.0f;
3422+ efficiencyPhi = effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity());
3423+ if (efficiencyPhi == 0)
3424+ efficiencyPhi = 1.0f;
32983425 }
3299- float weightPhiK0S = applyEfficiency ? 1.0f / efficiencyPhiK0S : 1.0f;
3300- mePhiK0SHist.fill(HIST("h5PhiK0SMENewProc"), v0.yK0Short() - recPhi.Rapidity(), multiplicity, v0.pt(), v0.mK0Short(), recPhi.M(), weightPhiK0S);
3301- }
3302- }
3303- }
3426+ float weightPhi = applyEfficiency ? 1.0f / efficiencyPhi : 1.0f;
3427+ dataPhiHist.fill(HIST("h3PhiDataNewProc"), multiplicity, recPhi.Pt(), recPhi.M(), weightPhi);
33043428
3305- PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SMixingEvent, "Process Mixed Event for Phi-K0S Analysis", false);
3429+ // V0 already reconstructed by the builder
3430+ for (const auto& v0 : V0s) {
3431+ const auto& posDaughterTrack = v0.posTrack_as<V0DauTracks>();
3432+ const auto& negDaughterTrack = v0.negTrack_as<V0DauTracks>();
33063433
3307- void processPhiPionMixingEvent(SelCollisions const& collisions, FullTracks const& fullTracks)
3308- {
3309- auto tracksTuple = std::make_tuple(fullTracks);
3310- SameKindPair<SelCollisions, FullTracks, BinningTypeVertexCent> pairPhiPion{binningOnVertexAndCent, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache};
3434+ // Cut on V0 dynamic columns
3435+ if (!selectionV0(v0, posDaughterTrack, negDaughterTrack))
3436+ continue;
3437+ if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision))
3438+ continue;
33113439
3312- for (auto const& [collision1, tracks1, collision2, tracks2] : pairPhiPion) {
3313- float multiplicity = collision1.centFT0M();
3440+ if (!isFilledhV0) {
3441+ dataK0SHist.fill(HIST("hDCAV0Daughters"), v0.dcaV0daughters());
3442+ dataK0SHist.fill(HIST("hV0CosPA"), v0.v0cosPA());
33143443
3315- Partition<FullTracks> posMixTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge;
3316- posMixTracks.bindTable(tracks1);
3317- Partition<FullTracks> negMixTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge;
3318- negMixTracks.bindTable(tracks1);
3444+ // Filling the PID of the V0 daughters in the region of the K0 peak
3445+ if (v0Configs.lowMK0S < v0.mK0Short() && v0.mK0Short() < v0Configs.upMK0S) {
3446+ dataK0SHist.fill(HIST("hNSigmaPosPionFromK0S"), posDaughterTrack.tpcInnerParam(), posDaughterTrack.tpcNSigmaPi());
3447+ dataK0SHist.fill(HIST("hNSigmaNegPionFromK0S"), negDaughterTrack.tpcInnerParam(), negDaughterTrack.tpcNSigmaPi());
3448+ }
3449+ }
33193450
3320- for (const auto& [posTrack1, negTrack1, track] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posMixTracks, negMixTracks, tracks2))) {
3321- if (!selectionTrackResonance<false>(posTrack1, true) || !selectionPIDKaonpTdependent(posTrack1))
3322- continue;
3323- if (!selectionTrackResonance<false>(negTrack1, true) || !selectionPIDKaonpTdependent(negTrack1))
3324- continue;
3325- if (posTrack1.globalIndex() == negTrack1.globalIndex())
3326- continue;
3451+ if (std::abs(v0.yK0Short()) > deltaYConfigs.cfgYAcceptance)
3452+ continue;
33273453
3328- ROOT::Math::PxPyPzMVector recPhi = recMother(posTrack1, negTrack1, massKa, massKa);
3329- if (recPhi.Pt() < phiConfigs.minPhiPt)
3330- continue;
3331- if (std::abs(recPhi.Rapidity()) > deltaYConfigs.cfgYAcceptance)
3332- continue;
3454+ float efficiencyPhiK0S = 1.0f;
3455+ if (applyEfficiency) {
3456+ efficiencyPhiK0S = effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapK0S->Interpolate(multiplicity, v0.pt(), v0.yK0Short());
3457+ if (efficiencyPhiK0S == 0)
3458+ efficiencyPhiK0S = 1.0f;
3459+ }
3460+ float weightPhiK0S = applyEfficiency ? 1.0f / efficiencyPhiK0S : 1.0f;
3461+ dataPhiK0SHist.fill(HIST("h5PhiK0SData2PartCorr"), multiplicity, recPhi.Pt(), v0.pt(), recPhi.Rapidity() - v0.yK0Short(), recPhi.Phi() - v0.phi(), weightPhiK0S);
3462+ }
33333463
3334- if (!selectionPion<true, false>(track, false))
3335- continue;
3336- if (std::abs(track.rapidity(massPi)) > deltaYConfigs.cfgYAcceptance)
3337- continue;
3464+ isFilledhV0 = true;
33383465
3339- float efficiencyPhiPion = 1.0f;
3340- if (applyEfficiency) {
3341- efficiencyPhiPion = track.pt() < trackConfigs.pTToUseTOF ? effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapPionTPC->Interpolate(multiplicity, track.pt(), track.rapidity(massPi)) : effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapPionTPCTOF->Interpolate(multiplicity, track.pt(), track.rapidity(massPi));
3342- if (efficiencyPhiPion == 0)
3343- efficiencyPhiPion = 1.0f;
3466+ // Loop over all primary pion candidates
3467+ for (const auto& track : fullTracks) {
3468+ if (!selectionPion<true, false>(track, false))
3469+ continue;
3470+
3471+ if (std::abs(track.rapidity(massPi)) > deltaYConfigs.cfgYAcceptance)
3472+ continue;
3473+
3474+ float efficiencyPhiPion = 1.0f;
3475+ if (applyEfficiency) {
3476+ efficiencyPhiPion = track.pt() < trackConfigs.pTToUseTOF ? effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapPionTPC->Interpolate(multiplicity, track.pt(), track.rapidity(massPi)) : effMapPhi->Interpolate(multiplicity, recPhi.Pt(), recPhi.Rapidity()) * effMapPionTPCTOF->Interpolate(multiplicity, track.pt(), track.rapidity(massPi));
3477+ if (efficiencyPhiPion == 0)
3478+ efficiencyPhiPion = 1.0f;
3479+ }
3480+ float weightPhiPion = applyEfficiency ? 1.0f / efficiencyPhiPion : 1.0f;
3481+ dataPhiPionHist.fill(HIST("h5PhiPiData2PartCorr"), multiplicity, recPhi.Pt(), track.pt(), recPhi.Rapidity() - track.rapidity(massPi), recPhi.Phi() - track.phi(), weightPhiPion);
33443482 }
3345- float weightPhiPion = applyEfficiency ? 1.0f / efficiencyPhiPion : 1.0f;
3346- mePhiPionHist.fill(HIST("h5PhiPiTPCMENewProc"), track.rapidity(massPi) - recPhi.Rapidity(), multiplicity, track.pt(), track.tpcNSigmaPi(), recPhi.M(), weightPhiPion);
3347- if (track.hasTOF())
3348- mePhiPionHist.fill(HIST("h5PhiPiTOFMENewProc"), track.rapidity(massPi) - recPhi.Rapidity(), multiplicity, track.pt(), track.tofNSigmaPi(), recPhi.M(), weightPhiPion);
33493483 }
33503484 }
33513485 }
33523486
3353- PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMixingEvent , "Process Mixed Event for Phi-Pion Analysis ", false);
3487+ PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SPionDeltayDeltaphiData2D , "Process function for Phi-K0S and Phi- Pion Deltay and Deltaphi 2D Correlations in Data ", false);
33543488};
33553489
33563490WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
0 commit comments