Skip to content

Commit e70b10a

Browse files
committed
Use efficiency corrected multiplicity for dedicated processes
1 parent 9ca2128 commit e70b10a

1 file changed

Lines changed: 64 additions & 16 deletions

File tree

PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)