1919#include " PWGHF/DataModel/TrackIndexSkimmingTables.h"
2020#include " PWGLF/DataModel/LFStrangenessTables.h"
2121
22- #include " Common/CCDB/EventSelectionParams.h"
2322#include " Common/Core/RecoDecay.h"
24- #include " Common/DataModel/EventSelection.h"
2523#include " Common/DataModel/PIDResponseITS.h"
2624#include " Common/DataModel/PIDResponseTOF.h"
2725#include " Common/DataModel/PIDResponseTPC.h"
3129#include < Framework/AnalysisDataModel.h>
3230#include < Framework/AnalysisHelpers.h>
3331#include < Framework/AnalysisTask.h>
34- #include < Framework/BinningPolicy.h>
3532#include < Framework/Configurable.h>
36- #include < Framework/GroupedCombinations.h>
37- #include < Framework/HistogramSpec.h>
3833#include < Framework/InitContext.h>
3934#include < Framework/runDataProcessing.h>
4035#include < ReconstructionDataFormats/PID.h>
4944#include < algorithm>
5045#include < array>
5146#include < cstddef>
52- #include < cstdint>
5347#include < experimental/type_traits>
5448#include < iterator>
5549#include < memory>
@@ -71,6 +65,7 @@ enum LambdaPid { kLambda = 0,
7165struct Filter2Prong {
7266 SliceCache cache;
7367 Preslice<aod::CFTrackRefs> perCollisionCFTrackRefs = aod::track::collisionId;
68+ Preslice<aod::CFCollRefs> perCollisionCFCollRefs = aod::track::collisionId;
7469
7570 O2_DEFINE_CONFIGURABLE (cfgVerbosity, int , 0 , " Verbosity level (0 = major, 1 = per collision)" )
7671 O2_DEFINE_CONFIGURABLE (cfgYMax, float , -1 .0f , " Maximum candidate rapidity" )
@@ -806,8 +801,23 @@ struct Filter2Prong {
806801 PROCESS_SWITCH (Filter2Prong, processDataPhiV0, " Process data Phi and V0 candidates with invariant mass method" , false );
807802
808803 using DerivedCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::CFMultiplicities>;
809- void processDataPhiMixed (DerivedCollisions const & collisions, Filter2Prong::PIDTrack const & /* tracksP*/ , aod::CFTrackRefs const & cftracks)
804+ void processDataPhiMixed (DerivedCollisions const & collisions, Filter2Prong::PIDTrack const & /* tracksP*/ , aod::CFCollRefs const & cfcollrefs, aod:: CFTrackRefs const & cftracks)
810805 {
806+ struct MixedPhiCandidate {
807+ int64_t cfCollisionId;
808+ int64_t cfTrackProng0Id;
809+ int64_t cfTrackProng1Id;
810+ float pt;
811+ float eta;
812+ float phi;
813+ float invMass;
814+ uint8_t decay;
815+ };
816+
817+ if (cfcollrefs.size () <= 0 || cftracks.size () <= 0 ) {
818+ return ;
819+ }
820+
811821 auto getMultiplicity = [](auto const & col) {
812822 return col.multiplicity ();
813823 };
@@ -819,11 +829,23 @@ struct Filter2Prong {
819829 using TB = std::tuple_element<std::tuple_size_v<decltype (tracksTuple)> - 1 , decltype (tracksTuple)>::type;
820830 Pair<DerivedCollisions, TA, TB, BinningTypeDerived> pairs{configurableBinningDerived, cfgNoMixedEvents, -1 , collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip
821831
832+ std::unordered_map<int64_t , int64_t > collToCF;
833+ collToCF.reserve (cfcollrefs.size ());
834+ for (const auto & cfcollref : cfcollrefs) {
835+ collToCF.emplace (cfcollref.collisionId (), cfcollref.globalIndex ());
836+ }
837+
838+ std::vector<MixedPhiCandidate> mixedPhiCandidates;
822839 o2::aod::ITSResponse itsResponse;
823840
824841 for (auto it = pairs.begin (); it != pairs.end (); it++) {
825842 auto & [collision1, tracks1, collision2, tracks2] = *it;
826843
844+ auto cfColl1 = collToCF.find (collision1.globalIndex ());
845+ if (cfColl1 == collToCF.end () || collToCF.find (collision2.globalIndex ()) == collToCF.end ()) {
846+ continue ;
847+ }
848+
827849 if (!(collision1.sel8 () &&
828850 collision1.selection_bit (aod::evsel::kNoSameBunchPileup ) &&
829851 collision1.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV ) &&
@@ -890,16 +912,40 @@ struct Filter2Prong {
890912 }
891913
892914 float phi = RecoDecay::constrainAngle (s.Phi (), 0 .0f );
893-
894- output2ProngTracks (collision1.globalIndex (),
895- cftrack1.globalIndex (), cftrack2.globalIndex (),
896- s.pt (), s.eta (), phi, s.M (),
897- aod::cf2prongtrack::PhiToKKPID3Mixed);
915+ mixedPhiCandidates.push_back ({cfColl1->second ,
916+ cftrack1.globalIndex (),
917+ cftrack2.globalIndex (),
918+ s.pt (),
919+ s.eta (),
920+ phi,
921+ s.M (),
922+ aod::cf2prongtrack::PhiToKKPID3Mixed});
898923 }
899924 }
900925 }
901926 }
902927 }
928+
929+ std::sort (mixedPhiCandidates.begin (), mixedPhiCandidates.end (), [](const auto & lhs, const auto & rhs) {
930+ if (lhs.cfCollisionId != rhs.cfCollisionId ) {
931+ return lhs.cfCollisionId < rhs.cfCollisionId ;
932+ }
933+ if (lhs.cfTrackProng0Id != rhs.cfTrackProng0Id ) {
934+ return lhs.cfTrackProng0Id < rhs.cfTrackProng0Id ;
935+ }
936+ return lhs.cfTrackProng1Id < rhs.cfTrackProng1Id ;
937+ });
938+
939+ for (const auto & candidate : mixedPhiCandidates) {
940+ output2ProngTracks (candidate.cfCollisionId ,
941+ candidate.cfTrackProng0Id ,
942+ candidate.cfTrackProng1Id ,
943+ candidate.pt ,
944+ candidate.eta ,
945+ candidate.phi ,
946+ candidate.invMass ,
947+ candidate.decay );
948+ }
903949 }
904950
905951 PROCESS_SWITCH (Filter2Prong, processDataPhiMixed, " Process mixed-event phi candidates using O2 framework" , false );
0 commit comments