Skip to content

Commit 905436b

Browse files
committed
Process function in Data and MC for dNdeta value computation with phi
1 parent 39ada46 commit 905436b

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ struct Phik0shortanalysis {
193193
// Defining filters on V0s (cannot filter on dynamic columns)
194194
Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0Configs.v0SettingDCAPosToPV && nabs(aod::v0data::dcanegtopv) > v0Configs.v0SettingDCANegToPV && aod::v0data::dcaV0daughters < v0Configs.v0SettingDCAV0Dau);
195195

196+
// Defining filters on tracks (cannot filter on dynamic columns)
197+
Filter trackFilter = requireGlobalTrackWoDCAInFilter();
198+
196199
// Defining the type of the collisions for data and MC
197200
using SelCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Ms, aod::PVMults>;
198201
using SimCollisions = soa::Join<SelCollisions, aod::McCollisionLabels>;
@@ -236,6 +239,7 @@ struct Phik0shortanalysis {
236239
AxisSpec massPhiAxis = {200, 0.9f, 1.2f, "#it{M}_{inv} [GeV/#it{c}^{2}]"};
237240
AxisSpec sigmassPhiAxis = {nBinsMPhi, lowMPhi, upMPhi, "#it{M}_{inv} [GeV/#it{c}^{2}]"};
238241
AxisSpec vertexZAxis = {100, -15.f, 15.f, "vrtx_{Z} [cm]"};
242+
AxisSpec etaAxis = {16, -trackConfigs.etaMax, trackConfigs.etaMax, "#eta"};
239243
AxisSpec yAxis = {nBinsY, -cfgYAcceptanceSmear, cfgYAcceptanceSmear, "#it{y}"};
240244
AxisSpec deltayAxis = {nBinsDeltaY, -1.2f, 1.2f, "#Delta#it{y}"};
241245
AxisSpec multAxis = {120, 0.0f, 120.0f, "centFT0M"};
@@ -261,6 +265,9 @@ struct Phik0shortanalysis {
261265
dataEventHist.add("hMultiplicityPercent", "Multiplicity Percentile", kTH1F, {multAxis});
262266
dataEventHist.add("hMultiplicityPercentWithPhi", "Multiplicity Percentile in Events with a Phi Candidate", kTH1F, {multAxis});
263267

268+
// Eta distribution for dN/deta values estimation in Data
269+
dataEventHist.add("h2EtaDistribution", "Eta vs multiplicity in Data", kTH2F, {binnedmultAxis, etaAxis});
270+
264271
// Number of MC events per selection for Rec and Gen
265272
mcEventHist.add("hRecMCEventSelection", "hRecMCEventSelection", kTH1F, {{9, -0.5f, 8.5f}});
266273
mcEventHist.get<TH1>(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions");
@@ -289,6 +296,11 @@ struct Phik0shortanalysis {
289296
mcEventHist.add("hGenMCVertexZ", "hGenMCVertexZ", kTH1F, {vertexZAxis});
290297
mcEventHist.add("hGenMCMultiplicityPercent", "GenMC Multiplicity Percentile", kTH1F, {binnedmultAxis});
291298

299+
// Eta distribution for dN/deta values estimation in MC
300+
mcEventHist.add("h2RecMCEtaDistribution", "Eta vs multiplicity in MCReco", kTH2F, {binnedmultAxis, etaAxis});
301+
mcEventHist.add("h2GenMCEtaDistribution", "Eta vs multiplicity in MCGen", kTH2F, {binnedmultAxis, etaAxis});
302+
mcEventHist.add("h2GenMCEtaDistributionAssocReco", "Eta vs multiplicity in MCGen Assoc Reco", kTH2F, {binnedmultAxis, etaAxis});
303+
292304
// Phi topological/PID cuts
293305
dataPhiHist.add("h2DauTracksPhiDCAxyPreCutData", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}});
294306
dataPhiHist.add("h2DauTracksPhiDCAzPreCutData", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}});
@@ -769,6 +781,63 @@ struct Phik0shortanalysis {
769781
return true;
770782
}
771783

784+
template <typename T1, typename T2>
785+
bool eventHasPhi(const T1& posTracks, const T2& negTracks)
786+
{
787+
int nPhi = 0;
788+
789+
for (const auto& track1 : posTracks) {
790+
if (!selectionTrackResonance<false>(track1, false) || !selectionPIDKaonpTdependent(track1))
791+
continue; // topological and PID selection
792+
793+
auto track1ID = track1.globalIndex();
794+
795+
for (const auto& track2 : negTracks) {
796+
if (!selectionTrackResonance<false>(track2, false) || !selectionPIDKaonpTdependent(track2))
797+
continue; // topological and PID selection
798+
799+
auto track2ID = track2.globalIndex();
800+
if (track2ID == track1ID)
801+
continue; // condition to avoid double counting of pair
802+
803+
ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa);
804+
if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt)
805+
continue;
806+
if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi)
807+
continue;
808+
if (std::abs(recPhi.Rapidity()) > cfgYAcceptance)
809+
continue;
810+
811+
nPhi++;
812+
}
813+
}
814+
815+
if (nPhi > 0)
816+
return true;
817+
return false;
818+
}
819+
820+
template <typename T>
821+
bool eventHasMCPhi(const T& mcParticles)
822+
{
823+
int nPhi = 0;
824+
825+
for (const auto& mcParticle : mcParticles) {
826+
if (mcParticle.pdgCode() != o2::constants::physics::Pdg::kPhi)
827+
continue;
828+
if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt)
829+
continue;
830+
if (std::abs(mcParticle.y()) > cfgYAcceptance)
831+
continue
832+
833+
nPhi++;
834+
}
835+
836+
if (nPhi > 0)
837+
return true;
838+
return false;
839+
}
840+
772841
// Get phi-meson purity functions from CCDB
773842
void getPhiPurityFunctionsFromCCDB()
774843
{
@@ -2189,6 +2258,91 @@ struct Phik0shortanalysis {
21892258

21902259
PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMCGen, "Process function for Phi-Pion Correlations Efficiency correction in MCGen", false);
21912260

2261+
void processdNdetaWPhiData(SelCollisions::iterator const& collision, soa::Filtered<FullTracks> const& fullTracks)
2262+
{
2263+
// Check if the event selection is passed
2264+
if (!acceptEventQA<false>(collision, true))
2265+
return;
2266+
2267+
auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
2268+
auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
2269+
2270+
// Check if the event contains a phi candidate
2271+
if (!eventHasPhi(posThisColl, negThisColl))
2272+
return;
2273+
2274+
float multiplicity = collision.centFT0M();
2275+
2276+
for (const auto& track : fullTracks)
2277+
dataEventHist.fill(HIST("h2EtaDistribution"), multiplicity, track.eta());
2278+
}
2279+
2280+
PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiData, "Process function for dN/deta values in Data", false);
2281+
2282+
void processdNdetaWPhiMCReco(SimCollisions const& collisions, soa::Filtered<FullMCTracks> const& fullMCTracks, MCCollisions const&, aod::McParticles const& mcParticles)
2283+
{
2284+
for (const auto& collision : collisions) {
2285+
if (!acceptEventQA<true>(collision, true))
2286+
continue;
2287+
if (!collision.has_mcCollision())
2288+
continue;
2289+
const auto& mcCollision = collision.mcCollision_as<MCCollisions>();
2290+
2291+
auto mcParticlesThisColl = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache);
2292+
2293+
if (!eventHasMCPhi(mcParticlesThisColl))
2294+
continue;
2295+
2296+
float genmultiplicity = mcCollision.centFT0M();
2297+
2298+
auto mcTracksThisColl = fullMCTracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
2299+
2300+
for (const auto& track : mcTracksThisColl) {
2301+
if (!track.has_mcParticle())
2302+
continue;
2303+
2304+
auto mcTrack = track.mcParticle_as<aod::McParticles>();
2305+
if (!mcTrack.isPhysicalPrimary() || std::abs(mcTrack.eta()) > trackConfigs.etaMax)
2306+
continue;
2307+
2308+
mcEventHist.fill(HIST("h2RecMCEtaDistribution"), genmultiplicity, mcTrack.eta());
2309+
}
2310+
}
2311+
}
2312+
2313+
PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiMCReco, "Process function for dN/deta values in MCReco", false);
2314+
2315+
void processdNdetaWPhiMCGen(MCCollisions::iterator const& mcCollision, soa::SmallGroups<SimCollisions> const& collisions, aod::McParticles const& mcParticles)
2316+
{
2317+
if (std::abs(mcCollision.posZ()) > cutZVertex)
2318+
return;
2319+
if (!pwglf::isINELgtNmc(mcParticles, 0, pdgDB))
2320+
return;
2321+
if (!eventHasMCPhi(mcParticles))
2322+
return;
2323+
2324+
bool isAssocColl = false;
2325+
for (const auto& collision : collisions) {
2326+
if (acceptEventQA<true>(collision, false)) {
2327+
isAssocColl = true;
2328+
break;
2329+
}
2330+
}
2331+
2332+
float genmultiplicity = mcCollision.centFT0M();
2333+
2334+
for (const auto& mcParticle : mcParticles) {
2335+
if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.eta()) > trackConfigs.etaMax || std::abs(mcParticle.signed1Pt()) == trackConfigs.cfgCutCharge)
2336+
continue;
2337+
2338+
mcEventHist.fill(HIST("h2GenMCEtaDistribution"), genmultiplicity, mcParticle.eta());
2339+
if (isAssocColl)
2340+
mcEventHist.fill(HIST("h2GenMCEtaDistributionAssocReco"), genmultiplicity, mcParticle.eta());
2341+
}
2342+
}
2343+
2344+
PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiMCGen, "Process function for dN/deta values in MCGen", false);
2345+
21922346
void processPhiK0SPionData2D(SelCollisions::iterator const& collision, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&)
21932347
{
21942348
// Check if the event selection is passed

0 commit comments

Comments
 (0)