@@ -102,6 +102,7 @@ struct Phik0shortanalysis {
102102 // Configurables for track selection (not necessarily common for trigger and the two associated particles)
103103 struct : ConfigurableGroup {
104104 Configurable<float > cfgCutCharge{" cfgCutCharge" , 0 .0f , " Cut on charge" };
105+ Configurable<float > cfgMinAbsCharge{" cfgMinAbsCharge" , 3 .0f , " Cut on absolute charge" };
105106 Configurable<bool > cfgGlobalWoDCATrack{" cfgGlobalWoDCATrack" , true , " Global track selection without DCA" };
106107 Configurable<bool > cfgPVContributor{" cfgPVContributor" , true , " PV contributor track selection" };
107108 Configurable<float > cMinKaonPtcut{" cMinKaonPtcut" , 0 .15f , " Track minimum pt cut" };
@@ -259,7 +260,10 @@ struct Phik0shortanalysis {
259260 SliceCache cache;
260261
261262 // Preslice for manual slicing
262- Preslice<aod::McParticles> perMCColl = aod::mcparticle::mcCollisionId;
263+ struct : PresliceGroup {
264+ Preslice<aod::Tracks> perColl = aod::track::collisionId;
265+ Preslice<aod::McParticles> perMCColl = aod::mcparticle::mcCollisionId;
266+ } preslices;
263267
264268 // Positive and negative tracks partitions
265269 Partition<FullTracks> posTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge;
@@ -957,6 +961,21 @@ struct Phik0shortanalysis {
957961 return false ;
958962 }
959963
964+ template <typename T>
965+ bool isGenParticleCharged (const T& mcParticle)
966+ {
967+ if (!mcParticle.isPhysicalPrimary () || std::abs (mcParticle.eta ()) > trackConfigs.etaMax )
968+ return false ;
969+
970+ auto pdgTrack = pdgDB->GetParticle (mcParticle.pdgCode ());
971+ if (pdgTrack == nullptr )
972+ return false ;
973+ if (std::abs (pdgTrack->Charge ()) < trackConfigs.cfgMinAbsCharge )
974+ return false ;
975+
976+ return true ;
977+ }
978+
960979 // Get phi-meson purity functions from CCDB
961980 void getPhiPurityFunctionsFromCCDB ()
962981 {
@@ -2436,7 +2455,7 @@ struct Phik0shortanalysis {
24362455 return ;
24372456 const auto & mcCollision = collision.mcCollision_as <MCCollisions>();
24382457
2439- auto mcParticlesThisColl = mcParticles.sliceBy (perMCColl, mcCollision.globalIndex ());
2458+ auto mcParticlesThisColl = mcParticles.sliceBy (preslices. perMCColl , mcCollision.globalIndex ());
24402459
24412460 if (filterOnMcPhi && !eventHasMCPhi (mcParticlesThisColl))
24422461 return ;
@@ -2456,13 +2475,7 @@ struct Phik0shortanalysis {
24562475 }
24572476
24582477 for (const auto & mcParticle : mcParticlesThisColl) {
2459- if (!mcParticle.isPhysicalPrimary () || std::abs (mcParticle.eta ()) > trackConfigs.etaMax )
2460- continue ;
2461-
2462- auto pdgTrack = pdgDB->GetParticle (mcParticle.pdgCode ());
2463- if (pdgTrack == nullptr )
2464- continue ;
2465- if (pdgTrack->Charge () == trackConfigs.cfgCutCharge )
2478+ if (!isGenParticleCharged (mcParticle))
24662479 continue ;
24672480
24682481 mcEventHist.fill (HIST (" h2GenMCEtaDistributionReco" ), genmultiplicity, mcParticle.eta ());
@@ -2471,7 +2484,7 @@ struct Phik0shortanalysis {
24712484
24722485 PROCESS_SWITCH (Phik0shortanalysis, processdNdetaWPhiMCReco, " Process function for dN/deta values in MCReco" , false );
24732486
2474- void processdNdetaWPhiMCGen (MCCollisions::iterator const & mcCollision, soa::SmallGroups<SimCollisions> const & collisions, aod::McParticles const & mcParticles)
2487+ void processdNdetaWPhiMCGen (MCCollisions::iterator const & mcCollision, soa::SmallGroups<SimCollisions> const & collisions, FilteredMCTracks const & filteredMCTracks, aod::McParticles const & mcParticles)
24752488 {
24762489 if (std::abs (mcCollision.posZ ()) > cutZVertex)
24772490 return ;
@@ -2487,14 +2500,20 @@ struct Phik0shortanalysis {
24872500 if (acceptEventQA<true >(collision, false )) {
24882501 mcEventHist.fill (HIST (" hGenMCRecoMultiplicityPercent" ), genmultiplicity);
24892502
2490- for (const auto & mcParticle : mcParticles) {
2491- if (!mcParticle.isPhysicalPrimary () || std::abs (mcParticle.eta ()) > trackConfigs.etaMax )
2503+ auto filteredMCTracksThisColl = filteredMCTracks.sliceBy (preslices.perColl , collision.globalIndex ());
2504+ for (const auto & track : filteredMCTracksThisColl) {
2505+ if (!track.has_mcParticle ())
24922506 continue ;
24932507
2494- auto pdgTrack = pdgDB-> GetParticle (mcParticle. pdgCode () );
2495- if (pdgTrack == nullptr )
2508+ auto mcTrack = track. mcParticle ( );
2509+ if (!mcTrack. isPhysicalPrimary () || std::abs (mcTrack. eta ()) > trackConfigs. etaMax )
24962510 continue ;
2497- if (pdgTrack->Charge () == trackConfigs.cfgCutCharge )
2511+
2512+ mcEventHist.fill (HIST (" h2RecoCheckMCEtaDistribution" ), genmultiplicity, mcTrack.eta ());
2513+ }
2514+
2515+ for (const auto & mcParticle : mcParticles) {
2516+ if (!isGenParticleCharged (mcParticle))
24982517 continue ;
24992518
25002519 mcEventHist.fill (HIST (" h2GenMCEtaDistributionRecoCheck" ), genmultiplicity, mcParticle.eta ());
@@ -2509,13 +2528,7 @@ struct Phik0shortanalysis {
25092528 mcEventHist.fill (HIST (" hGenMCAssocRecoMultiplicityPercent" ), genmultiplicity);
25102529
25112530 for (const auto & mcParticle : mcParticles) {
2512- if (!mcParticle.isPhysicalPrimary () || std::abs (mcParticle.eta ()) > trackConfigs.etaMax )
2513- continue ;
2514-
2515- auto pdgTrack = pdgDB->GetParticle (mcParticle.pdgCode ());
2516- if (pdgTrack == nullptr )
2517- continue ;
2518- if (pdgTrack->Charge () == trackConfigs.cfgCutCharge )
2531+ if (!isGenParticleCharged (mcParticle))
25192532 continue ;
25202533
25212534 mcEventHist.fill (HIST (" h2GenMCEtaDistribution" ), genmultiplicity, mcParticle.eta ());
0 commit comments