99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
1111#include < experimental/type_traits>
12+ #include < vector>
13+ #include < string>
1214
1315#include < TH1F.h>
1416#include < cmath>
@@ -104,7 +106,7 @@ struct CorrelationTask {
104106 // This filter is applied to AOD and derived data (column names are identical)
105107 Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgCutVertex;
106108 // This filter is only applied to AOD
107- Filter collisionVertexTypeFilter = (aod::collision::flags & ( uint16_t ) aod::collision::CollisionFlagsRun2::Run2VertexerTracks) == ( uint16_t ) aod::collision::CollisionFlagsRun2::Run2VertexerTracks;
109+ Filter collisionVertexTypeFilter = (aod::collision::flags & static_cast < uint16_t >( aod::collision::CollisionFlagsRun2::Run2VertexerTracks)) == static_cast < uint16_t >( aod::collision::CollisionFlagsRun2::Run2VertexerTracks) ;
108110
109111 // Track filters
110112 Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPt) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t ) true ));
@@ -185,6 +187,9 @@ struct CorrelationTask {
185187 std::vector<AxisSpec> userAxis;
186188 if (cfgMassAxis != 0 )
187189 userAxis.emplace_back (axisInvMass, " m (GeV/c^2)" );
190+ if (doprocessSame2Prong2Prong)
191+ userAxis.emplace_back (axisInvMass, " m (GeV/c^2)" );
192+
188193 same.setObject (new CorrelationContainer (" sameEvent" , " sameEvent" , corrAxis, effAxis, userAxis));
189194 mixed.setObject (new CorrelationContainer (" mixedEvent" , " mixedEvent" , corrAxis, effAxis, userAxis));
190195
@@ -241,7 +246,7 @@ struct CorrelationTask {
241246 for (auto & track1 : tracks1) {
242247 if constexpr (std::experimental::is_detected<hasInvMass, typename TTracks1::iterator>::value) {
243248 if constexpr (std::experimental::is_detected<hasDecay, typename TTracks1::iterator>::value) {
244- if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << ( uint32_t ) track1.decay ())) == 0u )
249+ if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast < uint32_t >( track1.decay () ))) == 0u )
245250 continue ;
246251 }
247252 registry.fill (HIST (" invMass" ), track1.invMass (), track1.pt (), multiplicity);
@@ -317,7 +322,7 @@ struct CorrelationTask {
317322 }
318323
319324 if constexpr (std::experimental::is_detected<hasDecay, typename TTracks1::iterator>::value) {
320- if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << ( uint32_t ) track1.decay ())) == 0u )
325+ if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast < uint32_t >( track1.decay () ))) == 0u )
321326 continue ;
322327 }
323328
@@ -375,28 +380,68 @@ struct CorrelationTask {
375380 }
376381 }
377382
383+ if constexpr (std::experimental::is_detected<hasDecay, typename TTracks2::iterator>::value) {
384+ if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast <uint32_t >(track2.decay ()))) == 0u )
385+ continue ;
386+ }
387+
388+ if constexpr (std::experimental::is_detected<hasDecay, typename TTracks1::iterator>::value && std::experimental::is_detected<hasDecay, typename TTracks2::iterator>::value) {
389+ if (doprocessSame2Prong2Prong && (track1.decay () == track2.decay () || track1.decay () > 1 || track2.decay () > 1 )) {
390+ continue ;
391+ }
392+ } // D0 and anti-D0 selection
393+
394+ if constexpr (std::experimental::is_detected<hasProng0Id, typename TTracks1::iterator>::value) {
395+ if constexpr (std::experimental::is_detected<hasProng0Id, typename TTracks2::iterator>::value) {
396+ if (track1.cfTrackProng0Id () == track2.cfTrackProng0Id ()) {
397+ continue ;
398+ }
399+ }
400+ if constexpr (std::experimental::is_detected<hasProng1Id, typename TTracks2::iterator>::value) {
401+ if (track1.cfTrackProng0Id () == track2.cfTrackProng1Id ()) {
402+ continue ;
403+ }
404+ }
405+ }
406+
407+ if constexpr (std::experimental::is_detected<hasProng1Id, typename TTracks1::iterator>::value) {
408+ if constexpr (std::experimental::is_detected<hasProng0Id, typename TTracks2::iterator>::value) {
409+ if (track1.cfTrackProng1Id () == track2.cfTrackProng0Id ()) {
410+ continue ;
411+ }
412+ }
413+ if constexpr (std::experimental::is_detected<hasProng1Id, typename TTracks2::iterator>::value) {
414+ if (track1.cfTrackProng1Id () == track2.cfTrackProng1Id ()) {
415+ continue ;
416+ }
417+ }
418+ } // no shared prong for two mothers
419+
378420 if (cfgPtOrder != 0 && track2.pt () >= track1.pt ()) {
379421 continue ;
380422 }
381423
382- if (cfgAssociatedCharge != 0 && cfgAssociatedCharge * track2.sign () < 0 ) {
383- continue ;
424+ if constexpr (std::experimental::is_detected<hasSign, typename TTracks2::iterator>::value) {
425+ if (cfgAssociatedCharge != 0 && cfgAssociatedCharge * track2.sign () < 0 ) {
426+ continue ;
427+ }
384428 }
385429
386- if constexpr (std::experimental::is_detected<hasSign, typename TTracks1::iterator>::value) {
430+ if constexpr (std::experimental::is_detected<hasSign, typename TTracks1::iterator>::value && std::experimental::is_detected<hasSign, typename TTracks2::iterator>::value ) {
387431 if (cfgPairCharge != 0 && cfgPairCharge * track1.sign () * track2.sign () < 0 ) {
388432 continue ;
389433 }
390434 }
391435
392436 if constexpr (std::is_same<TTracks1, TTracks2>::value) {
393437 if constexpr (step >= CorrelationContainer::kCFStepReconstructed ) {
394- if (cfg.mPairCuts && mPairCuts .conversionCuts (track1, track2)) {
395- continue ;
396- }
397-
398- if (cfgTwoTrackCut > 0 && mPairCuts .twoTrackCut (track1, track2, magField)) {
399- continue ;
438+ if constexpr (std::experimental::is_detected<hasSign, typename TTracks1::iterator>::value && std::experimental::is_detected<hasSign, typename TTracks2::iterator>::value) {
439+ if (cfg.mPairCuts && mPairCuts .conversionCuts (track1, track2)) {
440+ continue ;
441+ }
442+ if (cfgTwoTrackCut > 0 && mPairCuts .twoTrackCut (track1, track2, magField)) {
443+ continue ;
444+ }
400445 }
401446 }
402447 }
@@ -417,7 +462,12 @@ struct CorrelationTask {
417462 }
418463
419464 // last param is the weight
420- if (cfgMassAxis) {
465+ if (cfgMassAxis && doprocessSame2Prong2Prong) {
466+ if constexpr (std::experimental::is_detected<hasInvMass, typename TTracks1::iterator>::value && std::experimental::is_detected<hasInvMass, typename TTracks2::iterator>::value)
467+ target->getPairHist ()->Fill (step, track1.eta () - track2.eta (), track2.pt (), track1.pt (), multiplicity, deltaPhi, posZ, track2.invMass (), track1.invMass (), associatedWeight);
468+ else
469+ LOGF (fatal, " Can not fill mass axis without invMass column. \n no mass for two particles" );
470+ } else if (cfgMassAxis) {
421471 if constexpr (std::experimental::is_detected<hasInvMass, typename TTracks1::iterator>::value)
422472 target->getPairHist ()->Fill (step, track1.eta () - track2.eta (), track2.pt (), track1.pt (), multiplicity, deltaPhi, posZ, track1.invMass (), associatedWeight);
423473 else
@@ -547,6 +597,30 @@ struct CorrelationTask {
547597 }
548598 PROCESS_SWITCH (CorrelationTask, processSame2ProngDerived, " Process same event on derived data" , false );
549599
600+ void processSame2Prong2Prong (derivedCollisions::iterator const & collision, soa::Filtered<aod::CF2ProngTracks> const & p2tracks)
601+ {
602+ BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true }; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1.
603+ if (cfgVerbosity > 0 ) {
604+ LOGF (info, " processSame2ProngDerived: 2-prong candidates: %d | Vertex: %.1f | Multiplicity/Centrality: %.1f" , p2tracks.size (), collision.posZ (), collision.multiplicity ());
605+ }
606+ loadEfficiency (collision.timestamp ());
607+
608+ const auto multiplicity = collision.multiplicity ();
609+
610+ int bin = configurableBinningDerived.getBin ({collision.posZ (), collision.multiplicity ()});
611+ registry.fill (HIST (" eventcount_same" ), bin);
612+ fillQA (collision, multiplicity, p2tracks, p2tracks);
613+
614+ same->fillEvent (multiplicity, CorrelationContainer::kCFStepReconstructed );
615+ fillCorrelations<CorrelationContainer::kCFStepReconstructed >(same, p2tracks, p2tracks, multiplicity, collision.posZ (), 0 , 1 .0f );
616+
617+ if (cfg.mEfficiencyAssociated || cfg.mEfficiencyTrigger ) {
618+ same->fillEvent (multiplicity, CorrelationContainer::kCFStepCorrected );
619+ fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, p2tracks, p2tracks, multiplicity, collision.posZ (), 0 , 1 .0f );
620+ }
621+ }
622+ PROCESS_SWITCH (CorrelationTask, processSame2Prong2Prong, " Process same event on derived data" , false );
623+
550624 using BinningTypeAOD = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentRun2V0M>;
551625 void processMixedAOD (aodCollisions& collisions, aodTracks const & tracks, aod::BCsWithTimestamps const &)
552626 {
0 commit comments