@@ -285,6 +285,7 @@ struct TwoParticleCorrelationsMpi {
285285 using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection>>;
286286
287287 using DerivedCollisions = soa::Filtered<aod::CFCollisions>;
288+ using DerivedCollisionsCorrected = soa::Filtered<aod::CFCollisionsWithExtra>;
288289 using DerivedTracks = soa::Filtered<aod::CFTracks>;
289290
290291 void init (o2::framework::InitContext&)
@@ -295,7 +296,15 @@ struct TwoParticleCorrelationsMpi {
295296 if (cfgCentBinsForMC < 0 || cfgCentBinsForMC > 2 ) {
296297 LOGF (fatal, " Unsupported cfgCentBinsForMC=%d; use 0 (generated multiplicity), 1 (all reconstructed collisions), or 2 (first reconstructed collision only for efficiency)" , cfgCentBinsForMC.value );
297298 }
298- if (doprocessMCSameDerived && (doprocessSameDerived || doprocessSameDerivedMultSet)) {
299+ const int enabledDerivedSameProcesses = doprocessSameDerived + doprocessSameDerivedCorrected + doprocessSameDerivedMultSet + doprocessSameDerivedMultSetCorrected;
300+ if (enabledDerivedSameProcesses > 1 ) {
301+ LOGF (fatal, " Only one reconstructed derived same-event process can be enabled" );
302+ }
303+ const int enabledDerivedMixedProcesses = doprocessMixedDerived + doprocessMixedDerivedCorrected + doprocessMixedDerivedMultSet + doprocessMixedDerivedMultSetCorrected;
304+ if (enabledDerivedMixedProcesses > 1 ) {
305+ LOGF (fatal, " Only one reconstructed derived mixed-event process can be enabled" );
306+ }
307+ if (doprocessMCSameDerived && enabledDerivedSameProcesses > 0 ) {
299308 LOGF (fatal, " processMCSameDerived is mutually exclusive with the reconstructed derived same-event processes because it also fills those outputs" );
300309 }
301310 if (doprocessSameGenMC && doprocessMCSameDerived) {
@@ -351,7 +360,7 @@ struct TwoParticleCorrelationsMpi {
351360
352361 registry.add (" yields" , " multiplicity/centrality vs pT vs eta" , {HistType::kTH3F , {{100 , 0 , 100 , " /multiplicity/centrality" }, {40 , 0 , 20 , " p_{T}" }, {100 , -2 , 2 , " #eta" }}});
353362 registry.add (" etaphi" , " multiplicity/centrality vs eta vs phi" , {HistType::kTH3F , {{100 , 0 , 100 , " multiplicity/centrality" }, {100 , -2 , 2 , " #eta" }, {200 , 0 , o2::constants::math::TwoPI, " #varphi" }}});
354- if (doprocessSameDerivedMultSet) {
363+ if (doprocessSameDerivedMultSet || doprocessSameDerivedMultSetCorrected ) {
355364 if (cfgMultCorrelationsMask == 0 ) {
356365 LOGF (fatal, " cfgMultCorrelationsMask can not be 0 when MultSet process functions are in use." );
357366 }
@@ -569,6 +578,18 @@ struct TwoParticleCorrelationsMpi {
569578 template <class T >
570579 using HasMultSet = decltype (std::declval<T&>().multiplicities());
571580
581+ template <class T >
582+ using HasCorrectedMultiplicity = decltype (std::declval<T&>().multiplicityCorrected());
583+
584+ template <typename TCollision>
585+ static float getAnalysisMultiplicity (const TCollision& collision)
586+ {
587+ if constexpr (std::experimental::is_detected<HasCorrectedMultiplicity, TCollision>::value) {
588+ return collision.multiplicityCorrected ();
589+ }
590+ return collision.multiplicity ();
591+ }
592+
572593 template <typename TCollision, typename TTracks>
573594 void fillQA (const TCollision& collision, float multiplicity, const TTracks& tracks)
574595 {
@@ -1684,22 +1705,22 @@ struct TwoParticleCorrelationsMpi {
16841705 template <class CollType , class TTracks1 , class TTracks2 >
16851706 void processSameDerivedT (CollType const & collision, TTracks1 const & tracks1, TTracks2 const & tracks2, const int * trueNMPI = nullptr )
16861707 {
1687- using BinningTypeDerived = ColumnBinningPolicy<aod::collision::PosZ, aod::cfcollision::Multiplicity>;
1688- BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true }; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1.
1708+ auto getMultiplicity = [](auto & col) { return getAnalysisMultiplicity (col); };
1709+ using BinningTypeDerived = FlexibleBinningPolicy<std::tuple<decltype (getMultiplicity)>, aod::collision::PosZ, decltype (getMultiplicity)>;
1710+ BinningTypeDerived configurableBinningDerived{{getMultiplicity}, {axisVertex, axisMultiplicity}, true }; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1.
1711+ const auto multiplicity = getAnalysisMultiplicity (collision);
16891712 if (cfgVerbosity > 0 ) {
1690- LOGF (info, " processSameDerivedT: Tracks for collision: %d/%d | Vertex: %.1f | Multiplicity/Centrality: %.1f" , tracks1.size (), tracks2.size (), collision.posZ (), collision. multiplicity () );
1713+ LOGF (info, " processSameDerivedT: Tracks for collision: %d/%d | Vertex: %.1f | Multiplicity/Centrality: %.1f" , tracks1.size (), tracks2.size (), collision.posZ (), multiplicity);
16911714 }
16921715 loadEfficiency (collision.timestamp ());
16931716 loadCcdbYieldTemplates (collision.timestamp ());
16941717
1695- const auto multiplicity = collision.multiplicity ();
1696-
16971718 int field = 0 ;
16981719 if (cfgTwoTrackCut > 0 ) {
16991720 field = getMagneticField (collision.timestamp ());
17001721 }
17011722
1702- int bin = configurableBinningDerived.getBin ({ collision.posZ (), collision. multiplicity ()} );
1723+ int bin = configurableBinningDerived.getBin (std::tuple ( collision.posZ (), multiplicity) );
17031724 registry.fill (HIST (" eventcount_same" ), bin);
17041725 registry.fill (HIST (" trackcount_same" ), bin, tracks1.size ());
17051726 if constexpr (std::experimental::is_detected<HasDecay, typename TTracks1::iterator>::value) {
@@ -1762,6 +1783,12 @@ struct TwoParticleCorrelationsMpi {
17621783 }
17631784 PROCESS_SWITCH (TwoParticleCorrelationsMpi, processSameDerived, " Process same event on derived data" , false );
17641785
1786+ void processSameDerivedCorrected (DerivedCollisionsCorrected::iterator const & collision, soa::Filtered<aod::CFTracks> const & tracks)
1787+ {
1788+ processSameDerivedT (collision, tracks, tracks);
1789+ }
1790+ PROCESS_SWITCH (TwoParticleCorrelationsMpi, processSameDerivedCorrected, " Process same event on derived data with corrected multiplicity" , false );
1791+
17651792 void processSameDerivedMultSet (soa::Filtered<soa::Join<aod::CFCollisions, aod::CFMultSets>>::iterator const & collision, soa::Filtered<aod::CFTracks> const & tracks)
17661793 {
17671794 if (!passOutlier (collision)) {
@@ -1771,6 +1798,15 @@ struct TwoParticleCorrelationsMpi {
17711798 }
17721799 PROCESS_SWITCH (TwoParticleCorrelationsMpi, processSameDerivedMultSet, " Process same event on derived data with multiplicity sets" , false );
17731800
1801+ void processSameDerivedMultSetCorrected (soa::Filtered<soa::Join<aod::CFCollisions, aod::CFCollisionsExtra, aod::CFMultSets>>::iterator const & collision, soa::Filtered<aod::CFTracks> const & tracks)
1802+ {
1803+ if (!passOutlier (collision)) {
1804+ return ;
1805+ }
1806+ processSameDerivedT (collision, tracks, tracks);
1807+ }
1808+ PROCESS_SWITCH (TwoParticleCorrelationsMpi, processSameDerivedMultSetCorrected, " Process same event on derived data with corrected multiplicity and multiplicity sets" , false );
1809+
17741810 using BinningTypeAOD = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentRun2V0M>;
17751811 void processMixedAOD (AodCollisions const & collisions, AodTracks const & tracks, aod::BCsWithTimestamps const &)
17761812 {
@@ -1832,7 +1868,7 @@ struct TwoParticleCorrelationsMpi {
18321868 } else {
18331869 (void )this ; // fix compile error on unused 'this' capture
18341870 }
1835- return col. multiplicity ( );
1871+ return getAnalysisMultiplicity (col );
18361872 };
18371873
18381874 using BinningTypeDerived = FlexibleBinningPolicy<std::tuple<decltype (getMultiplicity)>, aod::collision::PosZ, decltype (getMultiplicity)>;
@@ -1855,7 +1891,7 @@ struct TwoParticleCorrelationsMpi {
18551891 }
18561892
18571893 if (cfgVerbosity > 0 ) {
1858- LOGF (info, " processMixedDerived: Mixed collisions bin: %d pair: [%d, %d] %d (%.3f, %.3f), %d (%.3f, %.3f)" , bin, it.isNewWindow (), it.currentWindowNeighbours (), collision1.globalIndex (), collision1.posZ (), collision1. multiplicity () , collision2.globalIndex (), collision2.posZ (), collision2. multiplicity ( ));
1894+ LOGF (info, " processMixedDerived: Mixed collisions bin: %d pair: [%d, %d] %d (%.3f, %.3f), %d (%.3f, %.3f)" , bin, it.isNewWindow (), it.currentWindowNeighbours (), collision1.globalIndex (), collision1.posZ (), multiplicity, collision2.globalIndex (), collision2.posZ (), getAnalysisMultiplicity (collision2 ));
18591895 }
18601896
18611897 bool hasEfficiencyMixed = (cfg.mEfficiencyAssociated != nullptr || cfg.mEfficiencyTrigger != nullptr );
@@ -1869,14 +1905,14 @@ struct TwoParticleCorrelationsMpi {
18691905 if (cfgUserAxis == EventSeedAxis) {
18701906 loadCcdbYieldTemplates (collision1.timestamp ());
18711907 if constexpr (std::is_same_v<std::remove_cvref_t <TA >, std::remove_cvref_t <TB >>) {
1872- triggerEventSeed = getEventSeedUserAxisValue (collision1. multiplicity () , estimateEventSeedWithoutFilling<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, collision1. multiplicity () , collision1.posZ (), field));
1908+ triggerEventSeed = getEventSeedUserAxisValue (multiplicity, estimateEventSeedWithoutFilling<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, multiplicity, collision1.posZ (), field));
18731909 } else {
18741910 LOGF (fatal, " Event-seed user axis for mixed events requires the same trigger and associated track table so the trigger event can be estimated independently" );
18751911 }
18761912 }
18771913
18781914 if (fillRecoMixed) {
1879- fillContainerEvent (mixed, collision1. multiplicity () , CorrelationContainer::kCFStepReconstructed );
1915+ fillContainerEvent (mixed, multiplicity, CorrelationContainer::kCFStepReconstructed );
18801916 }
18811917 }
18821918
@@ -1885,14 +1921,14 @@ struct TwoParticleCorrelationsMpi {
18851921 registry.fill (HIST (" eventcount_mixed" ), bin);
18861922 registry.fill (HIST (" trackcount_mixed" ), bin, tracks1.size (), tracks2.size ());
18871923 if (fillRecoMixed) {
1888- fillCorrelations<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, tracks2, collision1. multiplicity () , collision1.posZ (), field, eventWeight, nullptr , nullptr , nullptr , triggerEventSeed);
1924+ fillCorrelations<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, tracks2, multiplicity, collision1.posZ (), field, eventWeight, nullptr , nullptr , nullptr , triggerEventSeed);
18891925 }
18901926
18911927 if (hasEfficiencyMixed) {
18921928 if (it.isNewWindow ()) {
1893- fillContainerEvent (mixed, collision1. multiplicity () , CorrelationContainer::kCFStepCorrected );
1929+ fillContainerEvent (mixed, multiplicity, CorrelationContainer::kCFStepCorrected );
18941930 }
1895- fillCorrelations<CorrelationContainer::kCFStepCorrected >(mixed, tracks1, tracks2, collision1. multiplicity () , collision1.posZ (), field, eventWeight, nullptr , nullptr , nullptr , triggerEventSeed);
1931+ fillCorrelations<CorrelationContainer::kCFStepCorrected >(mixed, tracks1, tracks2, multiplicity, collision1.posZ (), field, eventWeight, nullptr , nullptr , nullptr , triggerEventSeed);
18961932 }
18971933 }
18981934 }
@@ -1903,12 +1939,24 @@ struct TwoParticleCorrelationsMpi {
19031939 }
19041940 PROCESS_SWITCH (TwoParticleCorrelationsMpi, processMixedDerived, " Process mixed events on derived data" , false );
19051941
1942+ void processMixedDerivedCorrected (DerivedCollisionsCorrected const & collisions, DerivedTracks const & tracks)
1943+ {
1944+ processMixedDerivedT (collisions, tracks);
1945+ }
1946+ PROCESS_SWITCH (TwoParticleCorrelationsMpi, processMixedDerivedCorrected, " Process mixed events on derived data with corrected multiplicity" , false );
1947+
19061948 void processMixedDerivedMultSet (soa::Filtered<soa::Join<aod::CFCollisions, aod::CFMultSets>> const & collisions, DerivedTracks const & tracks)
19071949 {
19081950 processMixedDerivedT (collisions, tracks);
19091951 }
19101952 PROCESS_SWITCH (TwoParticleCorrelationsMpi, processMixedDerivedMultSet, " Process mixed events on derived data with multiplicity sets" , false );
19111953
1954+ void processMixedDerivedMultSetCorrected (soa::Filtered<soa::Join<aod::CFCollisions, aod::CFCollisionsExtra, aod::CFMultSets>> const & collisions, DerivedTracks const & tracks)
1955+ {
1956+ processMixedDerivedT (collisions, tracks);
1957+ }
1958+ PROCESS_SWITCH (TwoParticleCorrelationsMpi, processMixedDerivedMultSetCorrected, " Process mixed events on derived data with corrected multiplicity and multiplicity sets" , false );
1959+
19121960 int getSpecies (int pdgCode)
19131961 {
19141962 switch (pdgCode) {
@@ -2029,7 +2077,7 @@ struct TwoParticleCorrelationsMpi {
20292077 }
20302078 }
20312079
2032- if (!(doprocessMCSameDerived || doprocessSameDerived || doprocessSameDerivedMultSet)) {
2080+ if (!(doprocessMCSameDerived || doprocessSameDerived || doprocessSameDerivedCorrected || doprocessSameDerivedMultSet || doprocessSameDerivedMultSetCorrected )) {
20332081 if constexpr (std::experimental::is_detected<HasDecay, typename Particles1::iterator>::value) {
20342082 fillQA (mcCollision, multiplicity, mcCollision.posZ (), mcParticles1, mcParticles2);
20352083 } else {
0 commit comments