@@ -76,8 +76,7 @@ struct DiHadronCor {
7676 O2_DEFINE_CONFIGURABLE (cfgRadiusHigh, float , 2.5 , " High radius for merging cut" )
7777 O2_DEFINE_CONFIGURABLE (cfgSampleSize, double , 10 , " Sample size for mixed event" )
7878 O2_DEFINE_CONFIGURABLE (cfgCentEstimator, int , 0 , " 0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A" )
79- O2_DEFINE_CONFIGURABLE (cfgCentFT0CMin, float , 0 .0f , " Minimum centrality (FT0C) to cut events in filter" )
80- O2_DEFINE_CONFIGURABLE (cfgCentFT0CMax, float , 100 .0f , " Maximum centrality (FT0C) to cut events in filter" )
79+ O2_DEFINE_CONFIGURABLE (cfgCentTableUnavailable, bool , false , " if a dataset does not provide centrality information" )
8180 O2_DEFINE_CONFIGURABLE (cfgUseAdditionalEventCut, bool , false , " Use additional event cut on mult correlations" )
8281 O2_DEFINE_CONFIGURABLE (cfgUseTentativeEventCounter, bool , false , " After sel8(), count events regardless of real event selection" )
8382 O2_DEFINE_CONFIGURABLE (cfgEvSelkNoSameBunchPileup, bool , false , " rejects collisions which are associated with the same found-by-T0 bunch crossing" )
@@ -98,23 +97,23 @@ struct DiHadronCor {
9897 SliceCache cache;
9998
10099 ConfigurableAxis axisVertex{" axisVertex" , {10 , -10 , 10 }, " vertex axis for histograms" };
101- ConfigurableAxis axisMultiplicity{" axisMultiplicity" , {VARIABLE_WIDTH, 0 , 5 , 10 , 15 , 20 , 25 , 30 , 35 , 40 , 50 , 60 , 80 , 100 , 120 , 140 , 160 , 180 , 200 , 220 , 240 , 260 , 280 , 300 }, " multiplicity axis for histograms" };
102- ConfigurableAxis axisCentrality{" axisCentrality" , {VARIABLE_WIDTH, 0 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 , 100 }, " centrality axis for histograms" };
103- ConfigurableAxis axisPt{" axisPt" , {VARIABLE_WIDTH, 0.2 , 0.3 , 0.4 , 0. 5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 , 1.2 , 1.4 , 1.6 , 1.8 , 2 , 2.5 , 3 , 4 , 5 , 6 , 8 , 10 }, " pt axis for histograms" };
100+ ConfigurableAxis axisMultiplicity{" axisMultiplicity" , {VARIABLE_WIDTH, 0 , 10 , 20 , 40 , 60 , 80 , 100 , 120 , 140 , 160 , 180 , 200 , 220 , 240 , 260 }, " multiplicity axis for histograms" };
101+ ConfigurableAxis axisCentrality{" axisCentrality" , {VARIABLE_WIDTH, 0 , 5 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 , 100 }, " centrality axis for histograms" };
102+ ConfigurableAxis axisPt{" axisPt" , {VARIABLE_WIDTH, 0.2 , 0.5 , 1 , 1.5 , 2 , 3 , 4 , 6 , 10 }, " pt axis for histograms" };
104103 ConfigurableAxis axisDeltaPhi{" axisDeltaPhi" , {72 , -PIHalf, PIHalf * 3 }, " delta phi axis for histograms" };
105104 ConfigurableAxis axisDeltaEta{" axisDeltaEta" , {48 , -2.4 , 2.4 }, " delta eta axis for histograms" };
106- ConfigurableAxis axisPtTrigger{" axisPtTrigger" , {VARIABLE_WIDTH, 0.2 , 0.3 , 0.4 , 0. 5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 , 1.2 , 1.4 , 1.6 , 1.8 , 2 , 2.5 , 3 , 4 , 5 , 6 , 8 , 10 }, " pt trigger axis for histograms" };
107- ConfigurableAxis axisPtAssoc{" axisPtAssoc" , {VARIABLE_WIDTH, 0.2 , 0.3 , 0.4 , 0. 5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 , 1.2 , 1.4 , 1.6 , 1.8 , 2 , 2.5 , 3 , 4 , 5 , 6 , 8 , 10 }, " pt associated axis for histograms" };
105+ ConfigurableAxis axisPtTrigger{" axisPtTrigger" , {VARIABLE_WIDTH, 0.2 , 0.5 , 1 , 1.5 , 2 , 3 , 4 , 6 , 10 }, " pt trigger axis for histograms" };
106+ ConfigurableAxis axisPtAssoc{" axisPtAssoc" , {VARIABLE_WIDTH, 0.2 , 0.5 , 1 , 1.5 , 2 , 3 , 4 , 6 , 10 }, " pt associated axis for histograms" };
108107 ConfigurableAxis axisVtxMix{" axisVtxMix" , {VARIABLE_WIDTH, -10 , -9 , -8 , -7 , -6 , -5 , -4 , -3 , -2 , -1 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }, " vertex axis for mixed event histograms" };
109- ConfigurableAxis axisMultMix{" axisMultMix" , {VARIABLE_WIDTH, 0 , 5 , 10 , 15 , 20 , 25 , 30 , 35 , 40 , 50 , 60 , 80 , 100 , 120 , 140 , 160 , 180 , 200 , 220 , 240 , 260 , 280 , 300 }, " multiplicity / centrality axis for mixed event histograms" };
108+ ConfigurableAxis axisMultMix{" axisMultMix" , {VARIABLE_WIDTH, 0 , 10 , 20 , 40 , 60 , 80 , 100 , 120 , 140 , 160 , 180 , 200 , 220 , 240 , 260 }, " multiplicity / centrality axis for mixed event histograms" };
110109 ConfigurableAxis axisSample{" axisSample" , {cfgSampleSize, 0 , cfgSampleSize}, " sample axis for histograms" };
111110
112111 ConfigurableAxis axisVertexEfficiency{" axisVertexEfficiency" , {10 , -10 , 10 }, " vertex axis for efficiency histograms" };
113112 ConfigurableAxis axisEtaEfficiency{" axisEtaEfficiency" , {20 , -1.0 , 1.0 }, " eta axis for efficiency histograms" };
114- ConfigurableAxis axisPtEfficiency{" axisPtEfficiency" , {VARIABLE_WIDTH, 0.2 , 0.3 , 0.4 , 0. 5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 , 1.2 , 1.4 , 1.6 , 1.8 , 2 , 2.5 , 3 , 4 , 5 , 6 , 8 , 10 }, " pt axis for efficiency histograms" };
113+ ConfigurableAxis axisPtEfficiency{" axisPtEfficiency" , {VARIABLE_WIDTH, 0.2 , 0.5 , 1 , 1.5 , 2 , 3 , 4 , 6 , 10 }, " pt axis for efficiency histograms" };
115114
116115 // make the filters and cuts.
117- Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax) ;
116+ Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ);
118117 Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t ) true )) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz);
119118 using FilteredCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::EvSel, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::Mults>>;
120119 using FilteredTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra, aod::TracksDCA>>;
@@ -128,7 +127,7 @@ struct DiHadronCor {
128127 Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVtxZ;
129128 using FilteredMcCollisions = soa::Filtered<aod::McCollisions>;
130129
131- using FilteredSmallGroupMcCollisions = soa::SmallGroups<soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSel, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::Mults>>;
130+ using SmallGroupMcCollisions = soa::SmallGroups<soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSel, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::Mults>>;
132131
133132 Preslice<aod::Tracks> perCollision = aod::track::collisionId;
134133 PresliceUnsorted<aod::McCollisionLabels> collisionPerMCCollision = aod::mccollisionlabel::mcCollisionId;
@@ -171,13 +170,14 @@ struct DiHadronCor {
171170
172171 void init (InitContext&)
173172 {
173+ if (cfgCentTableUnavailable && !cfgSelCollByNch) {
174+ LOGF (fatal, " Centrality table is unavailable, cannot select collisions by centrality" );
175+ }
174176 const AxisSpec axisPhi{72 , 0.0 , constants::math::TwoPI, " #varphi" };
175177 const AxisSpec axisEta{40 , -1 ., 1 ., " #eta" };
176178
177179 ccdb->setURL (" http://alice-ccdb.cern.ch" );
178180 ccdb->setCaching (true );
179- ccdb->setLocalObjectValidityChecking ();
180-
181181 auto now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now ().time_since_epoch ()).count ();
182182 ccdb->setCreatedNotAfter (now);
183183
@@ -325,6 +325,24 @@ struct DiHadronCor {
325325 return ((track.tpcNClsFound () >= cfgCutTPCclu) && (track.itsNCls () >= cfgCutITSclu));
326326 }
327327
328+ template <typename TTrack>
329+ bool genTrackSelected (TTrack track)
330+ {
331+ if (!track.isPhysicalPrimary ()) {
332+ return false ;
333+ }
334+ if (!track.producedByGenerator ()) {
335+ return false ;
336+ }
337+ if (std::abs (track.eta ()) > cfgCutEta) {
338+ return false ;
339+ }
340+ if (std::abs (track.pt ()) < cfgCutPtMin || std::abs (track.pt ()) > cfgCutPtMax) {
341+ return false ;
342+ }
343+ return true ;
344+ }
345+
328346 void loadEfficiency (uint64_t timestamp)
329347 {
330348 if (correctionsLoaded) {
@@ -420,7 +438,8 @@ struct DiHadronCor {
420438 }
421439
422440 if (system == SameEvent) {
423- registry.fill (HIST (" Centrality_used" ), cent);
441+ if (!cfgCentTableUnavailable)
442+ registry.fill (HIST (" Centrality_used" ), cent);
424443 registry.fill (HIST (" Nch_used" ), tracks1.size ());
425444 }
426445
@@ -499,14 +518,18 @@ struct DiHadronCor {
499518 for (auto const & track1 : tracks1) {
500519 if (step >= CorrelationContainer::kCFStepTrackedOnlyPrim && !track1.isPhysicalPrimary ())
501520 continue ;
521+ if (doprocessOntheflySame && !genTrackSelected (track1))
522+ continue ;
502523
503- if (system == SameEvent && doprocessMCSame)
524+ if (system == SameEvent && ( doprocessMCSame || doprocessOntheflySame) )
504525 registry.fill (HIST (" MCTrue/MCTrig_hist" ), fSampleIndex , posZ, track1.pt (), triggerWeight);
505526
506527 for (auto const & track2 : tracks2) {
507528
508529 if (step >= CorrelationContainer::kCFStepTrackedOnlyPrim && !track2.isPhysicalPrimary ())
509530 continue ;
531+ if (doprocessOntheflyMixed && !genTrackSelected (track2))
532+ continue ;
510533
511534 if (track1.pt () <= track2.pt ())
512535 continue ; // skip if the trigger pt is less than the associate pt
@@ -517,11 +540,11 @@ struct DiHadronCor {
517540 // fill the right sparse and histograms
518541 if (system == SameEvent) {
519542 same->getPairHist ()->Fill (step, fSampleIndex , posZ, track1.pt (), track2.pt (), deltaPhi, deltaEta, triggerWeight * associatedWeight);
520- if (doprocessMCSame)
543+ if (doprocessMCSame || doprocessOntheflySame )
521544 registry.fill (HIST (" MCTrue/MCdeltaEta_deltaPhi_same" ), deltaPhi, deltaEta, triggerWeight * associatedWeight);
522545 } else if (system == MixedEvent) {
523546 mixed->getPairHist ()->Fill (step, fSampleIndex , posZ, track1.pt (), track2.pt (), deltaPhi, deltaEta, triggerWeight * associatedWeight);
524- if (doprocessMCMixed)
547+ if (doprocessMCMixed || doprocessOntheflyMixed )
525548 registry.fill (HIST (" MCTrue/MCdeltaEta_deltaPhi_mixed" ), deltaPhi, deltaEta, triggerWeight * associatedWeight);
526549 }
527550 }
@@ -603,20 +626,24 @@ struct DiHadronCor {
603626
604627 void processSame (FilteredCollisions::iterator const & collision, FilteredTracks const & tracks, aod::BCsWithTimestamps const &)
605628 {
606-
629+ if (!collision.sel8 ())
630+ return ;
607631 auto bc = collision.bc_as <aod::BCsWithTimestamps>();
608- float cent = getCentrality (collision);
632+ float cent = -1 .;
633+ if (!cfgCentTableUnavailable)
634+ cent = getCentrality (collision);
609635 if (cfgUseAdditionalEventCut && !eventSelected (collision, tracks.size (), cent, true ))
610636 return ;
611637
612- registry.fill (HIST (" Centrality" ), cent);
638+ if (!cfgCentTableUnavailable)
639+ registry.fill (HIST (" Centrality" ), cent);
613640 registry.fill (HIST (" Nch" ), tracks.size ());
614641 registry.fill (HIST (" zVtx" ), collision.posZ ());
615642
616643 if (cfgSelCollByNch && (tracks.size () < cfgCutMultMin || tracks.size () >= cfgCutMultMax)) {
617644 return ;
618645 }
619- if (!cfgSelCollByNch && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) {
646+ if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) {
620647 return ;
621648 }
622649
@@ -646,24 +673,30 @@ struct DiHadronCor {
646673 auto tracksTuple = std::make_tuple (tracks, tracks);
647674 Pair<FilteredCollisions, FilteredTracks, FilteredTracks, MixedBinning> pair{binningOnVtxAndMult, cfgMixEventNumMin, -1 , collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip
648675 for (auto const & [collision1, tracks1, collision2, tracks2] : pair) {
676+ if (!collision1.sel8 () || !collision2.sel8 ())
677+ continue ;
649678
650679 if (cfgSelCollByNch && (tracks1.size () < cfgCutMultMin || tracks1.size () >= cfgCutMultMax))
651680 continue ;
652681
653682 if (cfgSelCollByNch && (tracks2.size () < cfgCutMultMin || tracks2.size () >= cfgCutMultMax))
654683 continue ;
655684
656- float cent1 = getCentrality (collision1);
657- float cent2 = getCentrality (collision2);
685+ float cent1 = -1 ;
686+ float cent2 = -1 ;
687+ if (!cfgCentTableUnavailable) {
688+ cent1 = getCentrality (collision1);
689+ cent2 = getCentrality (collision2);
690+ }
658691 if (cfgUseAdditionalEventCut && !eventSelected (collision1, tracks1.size (), cent1, false ))
659692 continue ;
660693 if (cfgUseAdditionalEventCut && !eventSelected (collision2, tracks2.size (), cent2, false ))
661694 continue ;
662695
663- if (!cfgSelCollByNch && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax))
696+ if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax))
664697 continue ;
665698
666- if (!cfgSelCollByNch && (cent2 < cfgCutCentMin || cent2 >= cfgCutCentMax))
699+ if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent2 < cfgCutCentMin || cent2 >= cfgCutCentMax))
667700 continue ;
668701
669702 registry.fill (HIST (" eventcount" ), MixedEvent); // fill the mixed event in the 3 bin
@@ -724,26 +757,29 @@ struct DiHadronCor {
724757 }
725758 PROCESS_SWITCH (DiHadronCor, processMCEfficiency, " MC: Extract efficiencies" , false );
726759
727- void processMCSame (FilteredMcCollisions::iterator const & mcCollision, FilteredMcParticles const & mcParticles, FilteredSmallGroupMcCollisions const & collisions)
760+ void processMCSame (FilteredMcCollisions::iterator const & mcCollision, FilteredMcParticles const & mcParticles, SmallGroupMcCollisions const & collisions)
728761 {
729762 if (cfgVerbosity) {
730763 LOGF (info, " processMCSame. MC collision: %d, particles: %d, collisions: %d" , mcCollision.globalIndex (), mcParticles.size (), collisions.size ());
731764 }
732765
733766 float cent = -1 ;
734- for (const auto & collision : collisions) {
735- cent = getCentrality (collision);
767+ if (!cfgCentTableUnavailable) {
768+ for (const auto & collision : collisions) {
769+ cent = getCentrality (collision);
770+ }
736771 }
737772
738773 if (cfgSelCollByNch && (mcParticles.size () < cfgCutMultMin || mcParticles.size () >= cfgCutMultMax)) {
739774 return ;
740775 }
741- if (!cfgSelCollByNch && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) {
776+ if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) {
742777 return ;
743778 }
744779
745780 registry.fill (HIST (" MCTrue/MCeventcount" ), SameEvent); // because its same event i put it in the 1 bin
746- registry.fill (HIST (" MCTrue/MCCentrality" ), cent);
781+ if (!cfgCentTableUnavailable)
782+ registry.fill (HIST (" MCTrue/MCCentrality" ), cent);
747783 registry.fill (HIST (" MCTrue/MCNch" ), mcParticles.size ());
748784 registry.fill (HIST (" MCTrue/MCzVtx" ), mcCollision.posZ ());
749785 for (const auto & mcParticle : mcParticles) {
@@ -766,7 +802,7 @@ struct DiHadronCor {
766802 }
767803 PROCESS_SWITCH (DiHadronCor, processMCSame, " Process MC same event" , false );
768804
769- void processMCMixed (FilteredMcCollisions const & mcCollisions, FilteredMcParticles const & mcParticles, FilteredSmallGroupMcCollisions const & collisions)
805+ void processMCMixed (FilteredMcCollisions const & mcCollisions, FilteredMcParticles const & mcParticles, SmallGroupMcCollisions const & collisions)
770806 {
771807 auto getTracksSize = [&mcParticles, this ](FilteredMcCollisions::iterator const & mcCollision) {
772808 auto associatedTracks = mcParticles.sliceByCached (o2::aod::mcparticle::mcCollisionId, mcCollision.globalIndex (), this ->cache );
@@ -793,11 +829,13 @@ struct DiHadronCor {
793829 LOGF (info, " Found %d related collisions" , groupedCollisions.size ());
794830 }
795831 float cent = -1 ;
796- for (const auto & collision : groupedCollisions) {
797- cent = getCentrality (collision);
832+ if (!cfgCentTableUnavailable) {
833+ for (const auto & collision : groupedCollisions) {
834+ cent = getCentrality (collision);
835+ }
798836 }
799837
800- if (!cfgSelCollByNch && groupedCollisions.size () != 0 && (cent < cfgCutCentMin || cent >= cfgCutCentMax))
838+ if (!cfgSelCollByNch && !cfgCentTableUnavailable && groupedCollisions.size () != 0 && (cent < cfgCutCentMin || cent >= cfgCutCentMax))
801839 continue ;
802840
803841 registry.fill (HIST (" MCTrue/MCeventcount" ), MixedEvent); // fill the mixed event in the 3 bin
@@ -813,7 +851,7 @@ struct DiHadronCor {
813851 }
814852 PROCESS_SWITCH (DiHadronCor, processMCMixed, " Process MC mixed events" , false );
815853
816- void processOntheflySame (FilteredMcCollisions:: iterator const & mcCollision, FilteredMcParticles const & mcParticles)
854+ void processOntheflySame (aod::McCollisions:: iterator const & mcCollision, aod::McParticles const & mcParticles)
817855 {
818856 if (cfgVerbosity) {
819857 LOGF (info, " processOntheflySame. MC collision: %d, particles: %d" , mcCollision.globalIndex (), mcParticles.size ());
@@ -842,9 +880,9 @@ struct DiHadronCor {
842880 }
843881 PROCESS_SWITCH (DiHadronCor, processOntheflySame, " Process on-the-fly same event" , false );
844882
845- void processOntheflyMixed (FilteredMcCollisions const & mcCollisions, FilteredMcParticles const & mcParticles)
883+ void processOntheflyMixed (aod::McCollisions const & mcCollisions, aod::McParticles const & mcParticles)
846884 {
847- auto getTracksSize = [&mcParticles, this ](FilteredMcCollisions ::iterator const & mcCollision) {
885+ auto getTracksSize = [&mcParticles, this ](aod::McCollisions ::iterator const & mcCollision) {
848886 auto associatedTracks = mcParticles.sliceByCached (o2::aod::mcparticle::mcCollisionId, mcCollision.globalIndex (), this ->cache );
849887 auto mult = associatedTracks.size ();
850888 return mult;
@@ -855,7 +893,7 @@ struct DiHadronCor {
855893 MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true };
856894
857895 auto tracksTuple = std::make_tuple (mcParticles, mcParticles);
858- Pair<FilteredMcCollisions, FilteredMcParticles, FilteredMcParticles , MixedBinning> pair{binningOnVtxAndMult, cfgMixEventNumMin, -1 , mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip
896+ Pair<aod::McCollisions, aod::McParticles, aod::McParticles , MixedBinning> pair{binningOnVtxAndMult, cfgMixEventNumMin, -1 , mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip
859897 for (auto const & [collision1, tracks1, collision2, tracks2] : pair) {
860898
861899 if (cfgSelCollByNch && (tracks1.size () < cfgCutMultMin || tracks1.size () >= cfgCutMultMax))
0 commit comments