@@ -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