@@ -185,6 +185,8 @@ struct FemtoUniversePairTaskTrackPhi {
185185 HistogramRegistry registryDCA{" registryDCA" , {}, OutputObjHandlingPolicy::AnalysisObject, false , true };
186186 HistogramRegistry registryMCpT{" registryMCpT" , {}, OutputObjHandlingPolicy::AnalysisObject, false , true };
187187
188+ ColumnBinningPolicy<aod::collision::PosZ, aod::femtouniversecollision::MultNtr> colBinning{{ConfBinsVtx, ConfBinsMult}, true };
189+
188190 EfficiencyConfigurableGroup effConfGroup;
189191 EfficiencyCalculator<TH1> efficiencyCalculator{&effConfGroup};
190192
@@ -466,14 +468,9 @@ struct FemtoUniversePairTaskTrackPhi {
466468 }
467469
468470 template <typename PartitionType, typename PartType, typename MCParticles = std::nullptr_t >
469- void doSameEvent (FilteredFDCollision const & col , PartType const & parts, PartitionType& groupPartsOne, PartitionType& groupPartsTwo , [[maybe_unused]] MCParticles mcParts = nullptr )
471+ void doSameEvent (PartitionType groupPartsTrack, PartitionType groupPartsPhi , PartType parts, float magFieldTesla, int multCol , [[maybe_unused]] MCParticles mcParts = nullptr )
470472 {
471- const auto & magFieldTesla = col.magField ();
472- const int multCol = col.multNtr ();
473-
474- eventHisto.fillQA (col);
475-
476- for (auto const & phicandidate : groupPartsTwo) {
473+ for (auto const & phicandidate : groupPartsPhi) {
477474 // TODO: add phi meson minv cut here
478475 const auto & posChild = parts.iteratorAt (phicandidate.index () - 2 );
479476 float tpcNSigmaKp = trackCuts.getNsigmaTPC (posChild, o2::track::PID::Kaon);
@@ -498,7 +495,7 @@ struct FemtoUniversePairTaskTrackPhi {
498495 trackHistoPartPhi.fillQA <false , false >(phicandidate);
499496 }
500497
501- for (auto const & track : groupPartsOne ) {
498+ for (auto const & track : groupPartsTrack ) {
502499 float tpcNSigmaPi = trackCuts.getNsigmaTPC (track, o2::track::PID::Pion);
503500 float tofNSigmaPi = trackCuts.getNsigmaTOF (track, o2::track::PID::Pion);
504501 float tpcNSigmaKa = trackCuts.getNsigmaTPC (track, o2::track::PID::Kaon);
@@ -535,9 +532,7 @@ struct FemtoUniversePairTaskTrackPhi {
535532 }
536533
537534 // / Now build the combinations
538- for (auto const & [track, phicandidate] : combinations (CombinationsFullIndexPolicy (groupPartsOne, groupPartsTwo))) {
539- // TODO: add phi inv mass cut here
540-
535+ for (auto const & [track, phicandidate] : combinations (CombinationsFullIndexPolicy (groupPartsTrack, groupPartsPhi))) {
541536 if (ConfTrackIsIdentified) {
542537 if (!isParticleNSigmaAccepted (track.p (), trackCuts.getNsigmaTPC (track, o2::track::PID::Proton), trackCuts.getNsigmaTOF (track, o2::track::PID::Proton), trackCuts.getNsigmaTPC (track, o2::track::PID::Pion), trackCuts.getNsigmaTOF (track, o2::track::PID::Pion), trackCuts.getNsigmaTPC (track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF (track, o2::track::PID::Kaon))) {
543538 continue ;
@@ -597,74 +592,67 @@ struct FemtoUniversePairTaskTrackPhi {
597592 // }
598593 }
599594
595+ template <typename PartitionType, typename PartType, typename MCParticles = std::nullptr_t >
596+ void doMixedEvent (PartitionType groupPartsTrack, PartitionType groupPartsPhi, PartType parts, float magFieldTesla, int multCol, [[maybe_unused]] MCParticles mcParts = nullptr )
597+ {
598+ for (auto const & [track, phicandidate] : combinations (CombinationsFullIndexPolicy (groupPartsTrack, groupPartsPhi))) {
599+ if (ConfTrackIsIdentified) {
600+ if (!isParticleNSigmaAccepted (track.p (), trackCuts.getNsigmaTPC (track, o2::track::PID::Proton), trackCuts.getNsigmaTOF (track, o2::track::PID::Proton), trackCuts.getNsigmaTPC (track, o2::track::PID::Pion), trackCuts.getNsigmaTOF (track, o2::track::PID::Pion), trackCuts.getNsigmaTPC (track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF (track, o2::track::PID::Kaon))) {
601+ continue ;
602+ }
603+ if (ConfTrackIsRejected) {
604+ if (isParticleNSigmaRejected (track.p (), trackCuts.getNsigmaTPC (track, o2::track::PID::Proton), trackCuts.getNsigmaTOF (track, o2::track::PID::Proton), trackCuts.getNsigmaTPC (track, o2::track::PID::Pion), trackCuts.getNsigmaTOF (track, o2::track::PID::Pion), trackCuts.getNsigmaTPC (track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF (track, o2::track::PID::Kaon))) {
605+ continue ;
606+ }
607+ }
608+ }
609+
610+ if (ConfCPRIsEnabled) {
611+ if (pairCloseRejection.isClosePair (track, phicandidate, parts, magFieldTesla, femto_universe_container::EventType::mixed)) {
612+ continue ;
613+ }
614+ }
615+
616+ weight = efficiencyCalculator.getWeight (ParticleNo::ONE, phicandidate.pt ()) * efficiencyCalculator.getWeight (ParticleNo::TWO, track.pt ());
617+
618+ if constexpr (std::is_same<PartType, FemtoRecoParticles>::value)
619+ mixedEventCont.setPair <true >(track, phicandidate, multCol, ConfUse3D, weight);
620+ else
621+ mixedEventCont.setPair <false >(track, phicandidate, multCol, ConfUse3D, weight);
622+ }
623+ }
624+
600625 void processSameEvent (FilteredFDCollision const & col, FilteredFemtoFullParticles const & parts)
601626 {
602627 auto thegroupPartsTrack = partsTrack->sliceByCached (aod::femtouniverseparticle::fdCollisionId, col.globalIndex (), cache);
603628 auto thegroupPartsPhi = partsPhi->sliceByCached (aod::femtouniverseparticle::fdCollisionId, col.globalIndex (), cache);
604629 // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
605630 // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
606631
607- doSameEvent (col, parts, thegroupPartsTrack, thegroupPartsPhi );
632+ doSameEvent (thegroupPartsTrack, thegroupPartsPhi, parts, col. magField (), col. multNtr () );
608633 }
609634 PROCESS_SWITCH (FemtoUniversePairTaskTrackPhi, processSameEvent, " Enable processing same event" , true );
610635
611- template <typename PartitionType, typename PartType, typename MCParticles = std::nullptr_t >
612- void doMixedEvent (FilteredFDCollisions const & cols, PartType const & parts, PartitionType& partitionPhi, PartitionType& partitionTrack, [[maybe_unused]] MCParticles mcParts = nullptr )
636+ void processMixedEvent (FilteredFDCollisions const & cols, FilteredFemtoFullParticles const & parts)
613637 {
614- ColumnBinningPolicy<aod::collision::PosZ, aod::femtouniversecollision::MultNtr> colBinning{{ConfBinsVtx, ConfBinsMult}, true };
638+ for ( auto const & [collision1, collision2] : soa::selfCombinations ( colBinning, 5 , - 1 , cols, cols)) {
615639
616- auto mixedCollProcessFunc = [&]( auto & collision1, auto & collision2) -> void {
617- const int multCol = collision1.multNtr ( );
640+ const int multiplicityCol = collision1. multNtr ();
641+ mixQaRegistry. fill ( HIST ( " MixingQA/hMECollisionBins " ), colBinning. getBin ({ collision1.posZ (), multiplicityCol}) );
618642
619- auto groupPartsPhi = partitionPhi ->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision1 .globalIndex (), cache);
620- auto groupPartsTrack = partitionTrack ->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex (), cache);
643+ auto groupPartsTrack = partsTrack ->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision2 .globalIndex (), cache);
644+ auto groupPartsPhi = partsPhi ->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex (), cache);
621645
622646 const auto & magFieldTesla1 = collision1.magField ();
623647 const auto & magFieldTesla2 = collision2.magField ();
624648
625649 if (magFieldTesla1 != magFieldTesla2) {
626- return ;
627- }
628-
629- for (const auto & [phicandidate, track] : combinations (CombinationsFullIndexPolicy (groupPartsPhi, groupPartsTrack))) {
630- // TODO: move here phi meson mass cut
631-
632- if (ConfTrackIsIdentified) {
633- if (!isParticleNSigmaAccepted (track.p (), trackCuts.getNsigmaTPC (track, o2::track::PID::Proton), trackCuts.getNsigmaTOF (track, o2::track::PID::Proton), trackCuts.getNsigmaTPC (track, o2::track::PID::Pion), trackCuts.getNsigmaTOF (track, o2::track::PID::Pion), trackCuts.getNsigmaTPC (track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF (track, o2::track::PID::Kaon))) {
634- continue ;
635- }
636- if (ConfTrackIsRejected) {
637- if (isParticleNSigmaRejected (track.p (), trackCuts.getNsigmaTPC (track, o2::track::PID::Proton), trackCuts.getNsigmaTOF (track, o2::track::PID::Proton), trackCuts.getNsigmaTPC (track, o2::track::PID::Pion), trackCuts.getNsigmaTOF (track, o2::track::PID::Pion), trackCuts.getNsigmaTPC (track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF (track, o2::track::PID::Kaon))) {
638- continue ;
639- }
640- }
641- }
642-
643- if (ConfCPRIsEnabled) {
644- if (pairCloseRejection.isClosePair (track, phicandidate, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) {
645- continue ;
646- }
647- }
648-
649- weight = efficiencyCalculator.getWeight (ParticleNo::ONE, phicandidate.pt ()) * efficiencyCalculator.getWeight (ParticleNo::TWO, track.pt ());
650-
651- if constexpr (std::is_same<PartType, FemtoRecoParticles>::value)
652- mixedEventCont.setPair <true >(track, phicandidate, multCol, ConfUse3D, weight);
653- else
654- mixedEventCont.setPair <false >(track, phicandidate, multCol, ConfUse3D, weight);
650+ continue ;
655651 }
656- };
657652
658- for (const auto & [collision1, collision2] : soa::selfCombinations (colBinning, ConfNEventsMix, -1 , cols, cols)) {
659- mixedCollProcessFunc (collision1, collision2);
660- mixQaRegistry.fill (HIST (" MixingQA/hMECollisionBins" ), colBinning.getBin ({collision1.posZ (), collision1.multNtr ()}));
653+ doMixedEvent (groupPartsTrack, groupPartsPhi, parts, magFieldTesla1, multiplicityCol);
661654 }
662655 }
663-
664- void processMixedEvent (FilteredFDCollisions const & cols, FilteredFemtoFullParticles const & parts)
665- {
666- doMixedEvent (cols, parts, partsPhi, partsTrack);
667- }
668656 PROCESS_SWITCH (FemtoUniversePairTaskTrackPhi, processMixedEvent, " Enable processing mixed events" , true );
669657
670658 // /--------------------------------------------MC-------------------------------------------------///
@@ -674,14 +662,29 @@ struct FemtoUniversePairTaskTrackPhi {
674662 auto thegroupPartsPhi = partsPhiMCReco->sliceByCached (aod::femtouniverseparticle::fdCollisionId, col.globalIndex (), cache);
675663 // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
676664 // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
677-
678- doSameEvent (col, parts, thegroupPartsTrack, thegroupPartsPhi, mcparts);
665+ doSameEvent (thegroupPartsTrack, thegroupPartsPhi, parts, col.magField (), col.multNtr (), mcparts);
679666 }
680667 PROCESS_SWITCH (FemtoUniversePairTaskTrackPhi, processSameEventMCReco, " Enable processing same event for MC Reco" , true );
681668
682669 void processMixedEventMCReco (FilteredFDCollisions const & cols, FemtoRecoParticles const & parts, aod::FdMCParticles const & mcparts)
683670 {
684- doMixedEvent (cols, parts, partsPhiMCReco, partsTrackMCReco, mcparts);
671+ for (auto const & [collision1, collision2] : soa::selfCombinations (colBinning, 5 , -1 , cols, cols)) {
672+
673+ const int multiplicityCol = collision1.multNtr ();
674+ mixQaRegistry.fill (HIST (" MixingQA/hMECollisionBins" ), colBinning.getBin ({collision1.posZ (), multiplicityCol}));
675+
676+ const auto & magFieldTesla1 = collision1.magField ();
677+ const auto & magFieldTesla2 = collision2.magField ();
678+
679+ if (magFieldTesla1 != magFieldTesla2) {
680+ continue ;
681+ }
682+
683+ auto groupPartsTrack = partsTrackMCReco->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex (), cache);
684+ auto groupPartsPhi = partsPhiMCReco->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex (), cache);
685+
686+ doMixedEvent (groupPartsTrack, groupPartsPhi, parts, magFieldTesla1, multiplicityCol, mcparts);
687+ }
685688 }
686689 PROCESS_SWITCH (FemtoUniversePairTaskTrackPhi, processMixedEventMCReco, " Enable processing mixed events for MC Reco" , false );
687690
0 commit comments