@@ -189,6 +189,12 @@ struct CorrelationTask {
189189 registry.add (" invMassTwoPartDEta" , " 2D 2-prong invariant mass (GeV/c^2)" , {HistType::kTHnSparseF , {axisSpecMass, axisSpecMass, axisPtTrigger, axisPtAssoc, axisDeltaEta}});
190190 }
191191 }
192+ if (doprocessMCReflection2ProngML) {
193+ const AxisSpec& a = AxisSpec (axisInvMass);
194+ AxisSpec axisSpecMass = {1000 , a.binEdges [0 ], a.binEdges [a.getNbins ()]};
195+ registry.add (" invMassSignal" , " 2-prong invariant mass (GeV/c^2)" , {HistType::kTH3F , {axisSpecMass, axisPtTrigger, axisMultiplicity}});
196+ registry.add (" invMassReflected" , " 2-prong invariant mass (GeV/c^2)" , {HistType::kTH3F , {axisSpecMass, axisPtTrigger, axisMultiplicity}});
197+ }
192198 if (doprocessSameDerivedMultSet) {
193199 if (cfgMultCorrelationsMask == 0 )
194200 LOGF (fatal, " cfgMultCorrelationsMask can not be 0 when MultSet process functions are in use." );
@@ -281,7 +287,7 @@ struct CorrelationTask {
281287
282288 if (!cfgEfficiencyAssociated.value .empty ())
283289 efficiencyAssociatedCache.reserve (512 );
284- if (doprocessMCEfficiency2Prong || doprocessMCEfficiency2ProngML) {
290+ if (doprocessMCEfficiency2Prong || doprocessMCEfficiency2ProngML || doprocessMCReflection2ProngML ) {
285291 p2indexCache.reserve (16 );
286292 if (cfgMcTriggerPDGs->empty ())
287293 LOGF (fatal, " At least one PDG code in {} is to be selected to process 2-prong efficiency." , cfgMcTriggerPDGs.name );
@@ -1158,7 +1164,7 @@ struct CorrelationTask {
11581164 }
11591165 PROCESS_SWITCH (CorrelationTask, processMCEfficiency, " MC: Extract efficiencies" , false );
11601166
1161- template <class p2type >
1167+ template <bool reflectionSpec, class p2type >
11621168 void processMCEfficiency2ProngT (soa::Filtered<aod::CFMcCollisions>::iterator const & mcCollision, soa::Join<aod::CFMcParticles, aod::CF2ProngMcParts> const & mcParticles, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions, aod::CFTracksWithLabel const &, p2type const & p2tracks, Preslice<p2type>& perCollision2Prong)
11631169 {
11641170 auto multiplicity = mcCollision.multiplicity ();
@@ -1178,22 +1184,26 @@ struct CorrelationTask {
11781184 continue ; // wrong decay channel
11791185 if (mcParticle.cfParticleDaugh0Id () < 0 && mcParticle.cfParticleDaugh1Id () < 0 )
11801186 continue ; // daughters not found
1181- same->getTrackHistEfficiency ()->Fill (CorrelationContainer::MC, mcParticle.eta (), mcParticle.pt (), 4 , multiplicity, mcCollision.posZ ());
1187+ if constexpr (!reflectionSpec)
1188+ same->getTrackHistEfficiency ()->Fill (CorrelationContainer::MC, mcParticle.eta (), mcParticle.pt (), 4 , multiplicity, mcCollision.posZ ());
11821189 p2indexCache.push_back (mcParticle.globalIndex ());
11831190 }
11841191 }
11851192 for (const auto & collision : collisions) {
11861193 auto grouped2ProngTracks = p2tracks.sliceBy (perCollision2Prong, collision.globalIndex ());
11871194
11881195 for (const auto & p2track : grouped2ProngTracks) {
1189- if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast <uint32_t >(p2track.decay ()))) == 0u )
1190- continue ;
1196+ if constexpr (!reflectionSpec) {
1197+ if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast <uint32_t >(p2track.decay ()))) == 0u )
1198+ continue ;
1199+ }
11911200 // Check if the mc particles of the prongs are found.
11921201 if constexpr (std::experimental::is_detected<HasMlProbD0, typename p2type::iterator>::value) {
11931202 if (!passMLScore (p2track))
11941203 continue ;
11951204 }
1196- same->getTrackHistEfficiency ()->Fill (CorrelationContainer::RecoAll, p2track.eta (), p2track.pt (), 4 , multiplicity, mcCollision.posZ ());
1205+ if constexpr (!reflectionSpec)
1206+ same->getTrackHistEfficiency ()->Fill (CorrelationContainer::RecoAll, p2track.eta (), p2track.pt (), 4 , multiplicity, mcCollision.posZ ());
11971207 auto fillMC2p = [&](const aod::CFTracksWithLabel::iterator& p) -> bool {
11981208 if (!p.has_cfMCParticle ())
11991209 return false ;
@@ -1204,7 +1214,14 @@ struct CorrelationTask {
12041214 if (m == p2indexCache.end ())
12051215 return false ;
12061216 const auto & mcParticle = mcParticles.iteratorAt (*m - mcParticles.begin ().globalIndex ());
1207- same->getTrackHistEfficiency ()->Fill (CorrelationContainer::RecoPrimaries, mcParticle.eta (), mcParticle.pt (), 4 , multiplicity, mcCollision.posZ ());
1217+ if constexpr (!reflectionSpec) {
1218+ same->getTrackHistEfficiency ()->Fill (CorrelationContainer::RecoPrimaries, mcParticle.eta (), mcParticle.pt (), 4 , multiplicity, mcCollision.posZ ());
1219+ } else {
1220+ if (mcParticle.mcDecay () == p2track.decay ())
1221+ registry.fill (HIST (" invMassSignal" ), p2track.invMass (), p2track.pt (), multiplicity);
1222+ else // one particle may be filled into both histograms through duplicates
1223+ registry.fill (HIST (" invMassReflected" ), p2track.invMass (), p2track.pt (), multiplicity);
1224+ }
12081225 return true ;
12091226 };
12101227 if (p2track.has_cfTrackProng0 ()) {
@@ -1218,25 +1235,32 @@ struct CorrelationTask {
12181235 }
12191236
12201237 // fake track
1221- same->getTrackHistEfficiency ()->Fill (CorrelationContainer::Fake, p2track.eta (), p2track.pt (), 4 , multiplicity, mcCollision.posZ ());
1238+ if constexpr (!reflectionSpec)
1239+ same->getTrackHistEfficiency ()->Fill (CorrelationContainer::Fake, p2track.eta (), p2track.pt (), 4 , multiplicity, mcCollision.posZ ());
12221240 }
12231241 }
12241242 }
12251243
12261244 Preslice<aod::CF2ProngTracks> perCollision2Prong = aod::cftrack::cfCollisionId;
12271245 void processMCEfficiency2Prong (soa::Filtered<aod::CFMcCollisions>::iterator const & mcCollision, soa::Join<aod::CFMcParticles, aod::CF2ProngMcParts> const & mcParticles, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions, aod::CFTracksWithLabel const & tracks, aod::CF2ProngTracks const & p2tracks)
12281246 {
1229- processMCEfficiency2ProngT (mcCollision, mcParticles, collisions, tracks, p2tracks, perCollision2Prong);
1247+ processMCEfficiency2ProngT< false > (mcCollision, mcParticles, collisions, tracks, p2tracks, perCollision2Prong);
12301248 }
12311249 PROCESS_SWITCH (CorrelationTask, processMCEfficiency2Prong, " MC: Extract efficiencies for 2-prong particles" , false );
12321250
12331251 Preslice<soa::Join<aod::CF2ProngTracks, aod::CF2ProngTrackmls>> perCollision2ProngML = aod::cftrack::cfCollisionId;
12341252 void processMCEfficiency2ProngML (soa::Filtered<aod::CFMcCollisions>::iterator const & mcCollision, soa::Join<aod::CFMcParticles, aod::CF2ProngMcParts> const & mcParticles, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions, aod::CFTracksWithLabel const & tracks, soa::Join<aod::CF2ProngTracks, aod::CF2ProngTrackmls> const & p2tracks)
12351253 {
1236- processMCEfficiency2ProngT (mcCollision, mcParticles, collisions, tracks, p2tracks, perCollision2ProngML);
1254+ processMCEfficiency2ProngT< false > (mcCollision, mcParticles, collisions, tracks, p2tracks, perCollision2ProngML);
12371255 }
12381256 PROCESS_SWITCH (CorrelationTask, processMCEfficiency2ProngML, " MC: Extract efficiencies for 2-prong particles with ML scores" , false );
12391257
1258+ void processMCReflection2ProngML (soa::Filtered<aod::CFMcCollisions>::iterator const & mcCollision, soa::Join<aod::CFMcParticles, aod::CF2ProngMcParts> const & mcParticles, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions, aod::CFTracksWithLabel const & tracks, soa::Join<aod::CF2ProngTracks, aod::CF2ProngTrackmls> const & p2tracks)
1259+ {
1260+ processMCEfficiency2ProngT<true >(mcCollision, mcParticles, collisions, tracks, p2tracks, perCollision2ProngML);
1261+ }
1262+ PROCESS_SWITCH (CorrelationTask, processMCReflection2ProngML, " MC: Extract reflection distributions for 2-prong particles with ML scores" , false );
1263+
12401264 template <class Particles1 , class Particles2 >
12411265 void processMCSameDerivedT (soa::Filtered<aod::CFMcCollisions>::iterator const & mcCollision, Particles1 const & mcParticles1, Particles2 const & mcParticles2, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions)
12421266 {
0 commit comments