Skip to content

Commit 87c6b02

Browse files
committed
move processMCEfficiency changes to correlations.cxx, use tablehelper for passing configuration
1 parent 094c22e commit 87c6b02

4 files changed

Lines changed: 53 additions & 149 deletions

File tree

PWGCF/DataModel/CorrelationsDerived.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,8 @@ using CFMcParticle = CFMcParticles::iterator;
5858
namespace cfmultiplicity
5959
{
6060
DECLARE_SOA_COLUMN(Multiplicity, multiplicity, float);
61-
DECLARE_SOA_COLUMN(IsTrackMultiplicity, isTrackMultiplicity, bool); //! Whether MultiplicitySelector::processTracks produced the multiplicity
6261
} // namespace cfmultiplicity
63-
DECLARE_SOA_TABLE(CFMultiplicities, "AOD", "CFMULTIPLICITY", cfmultiplicity::Multiplicity, cfmultiplicity::IsTrackMultiplicity);
62+
DECLARE_SOA_TABLE(CFMultiplicities, "AOD", "CFMULTIPLICITY", cfmultiplicity::Multiplicity);
6463

6564
using CFMultiplicity = CFMultiplicities::iterator;
6665

PWGCF/TableProducer/filterCorrelations.cxx

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "Common/CCDB/EventSelectionParams.h"
1616
#include "Common/CCDB/TriggerAliases.h"
17+
#include "Common/Core/TableHelper.h"
1718
#include "Common/DataModel/Centrality.h"
1819
#include "Common/DataModel/EventSelection.h"
1920
#include "Common/DataModel/Multiplicity.h"
@@ -161,9 +162,16 @@ struct FilterCF {
161162
std::vector<bool> mcReconstructedCache;
162163
std::vector<int> mcParticleLabelsCache;
163164

164-
void init(InitContext&)
165+
void init(InitContext& initContext)
165166
{
166167
if (!cfgEfficiencyMultiplicity.value.empty()) {
168+
bool processTracksEnabled = false;
169+
if (!o2::common::core::getTaskOptionValue(initContext, "multiplicity-selector", "processTracks", processTracksEnabled, false)) {
170+
LOGF(fatal, "Could not determine whether MultiplicitySelector::processTracks is enabled");
171+
}
172+
if (!processTracksEnabled) {
173+
LOGF(fatal, "Efficiency-corrected multiplicity requires MultiplicitySelector::processTracks");
174+
}
167175
if (cfgLocalEfficiency != 0 && cfgLocalEfficiency != 1) {
168176
LOGF(fatal, "cfgLocalEfficiency must be 0 (CCDB) or 1 (local ROOT file)");
169177
}
@@ -358,9 +366,6 @@ struct FilterCF {
358366
template <typename TCollision, typename TTracks>
359367
float getCorrectedMultiplicity(const TCollision& collision, const TTracks& tracks, uint64_t timestamp)
360368
{
361-
if (!collision.isTrackMultiplicity()) {
362-
LOGF(fatal, "Efficiency-corrected multiplicity requires MultiplicitySelector::processTracks");
363-
}
364369
auto* efficiency = loadMultiplicityEfficiency(timestamp);
365370
double correctedMultiplicity = 0.;
366371
size_t skippedTracks = 0;
@@ -778,69 +783,69 @@ struct MultiplicitySelector {
778783

779784
void processTracks(aod::Collision const&, soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection>> const& tracks)
780785
{
781-
output(tracks.size(), true);
786+
output(tracks.size());
782787
}
783788
PROCESS_SWITCH(MultiplicitySelector, processTracks, "Select track count as multiplicity", false);
784789

785790
void processFT0M(aod::CentFT0Ms const& centralities)
786791
{
787792
for (const auto& c : centralities) {
788-
output(c.centFT0M(), false);
793+
output(c.centFT0M());
789794
}
790795
}
791796
PROCESS_SWITCH(MultiplicitySelector, processFT0M, "Select FT0M centrality as multiplicity", false);
792797

793798
void processFT0C(aod::CentFT0Cs const& centralities)
794799
{
795800
for (const auto& c : centralities) {
796-
output(c.centFT0C(), false);
801+
output(c.centFT0C());
797802
}
798803
}
799804
PROCESS_SWITCH(MultiplicitySelector, processFT0C, "Select FT0C centrality as multiplicity", false);
800805

801806
void processFT0CVariant1(aod::CentFT0CVariant1s const& centralities)
802807
{
803808
for (const auto& c : centralities) {
804-
output(c.centFT0CVariant1(), false);
809+
output(c.centFT0CVariant1());
805810
}
806811
}
807812
PROCESS_SWITCH(MultiplicitySelector, processFT0CVariant1, "Select FT0CVariant1 centrality as multiplicity", false);
808813

809814
void processFT0CVariant2(aod::CentFT0CVariant2s const& centralities)
810815
{
811816
for (const auto& c : centralities) {
812-
output(c.centFT0CVariant2(), false);
817+
output(c.centFT0CVariant2());
813818
}
814819
}
815820
PROCESS_SWITCH(MultiplicitySelector, processFT0CVariant2, "Select FT0CVariant2 centrality as multiplicity", false);
816821

817822
void processFT0A(aod::CentFT0As const& centralities)
818823
{
819824
for (const auto& c : centralities) {
820-
output(c.centFT0A(), false);
825+
output(c.centFT0A());
821826
}
822827
}
823828
PROCESS_SWITCH(MultiplicitySelector, processFT0A, "Select FT0A centrality as multiplicity", false);
824829

825830
void processCentNGlobal(aod::CentNGlobals const& centralities)
826831
{
827832
for (const auto& c : centralities) {
828-
output(c.centNGlobal(), false);
833+
output(c.centNGlobal());
829834
}
830835
}
831836
PROCESS_SWITCH(MultiplicitySelector, processCentNGlobal, "Select CentNGlobal centrality as multiplicity", false);
832837

833838
void processRun2V0M(aod::CentRun2V0Ms const& centralities)
834839
{
835840
for (const auto& c : centralities) {
836-
output(c.centRun2V0M(), false);
841+
output(c.centRun2V0M());
837842
}
838843
}
839844
PROCESS_SWITCH(MultiplicitySelector, processRun2V0M, "Select V0M centrality as multiplicity", true);
840845

841846
void processMCGen(aod::McCollision const&, aod::McParticles const& particles)
842847
{
843-
output(particles.size(), false);
848+
output(particles.size());
844849
}
845850
PROCESS_SWITCH(MultiplicitySelector, processMCGen, "Select MC particle count as multiplicity", false);
846851
};

PWGCF/Tasks/correlations.cxx

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ struct CorrelationTask {
105105
O2_DEFINE_CONFIGURABLE(cfgLocalEfficiency, int, 0, "0 = OFF and 1 = ON for local efficiency");
106106
O2_DEFINE_CONFIGURABLE(cfgDropStepRECO, bool, false, "choice to drop step RECO if efficiency correction is used")
107107
O2_DEFINE_CONFIGURABLE(cfgCentBinsForMC, int, 0, "0 = OFF and 1 = ON for data like multiplicity/centrality bins for MC steps");
108+
O2_DEFINE_CONFIGURABLE(cfgRequireRecoCollision, int, 1, "0 = all generated collisions; 1 = only generated collisions with exactly 1 reconstructed collision; 2 = select reconstructed collision with largest number of contributors per generated collision")
108109
O2_DEFINE_CONFIGURABLE(cfgTrackBitMask, uint16_t, 0, "BitMask for track selection systematics; refer to the enum TrackSelectionCuts in filtering task");
109110
O2_DEFINE_CONFIGURABLE(cfgMultCorrelationsMask, uint16_t, 0, "Selection bitmask for the multiplicity correlations. This should match the filter selection cfgEstimatorBitMask.")
110111
O2_DEFINE_CONFIGURABLE(cfgMultCutFormula, std::string, "", "Multiplicity correlations cut formula. A result greater than zero results in accepted event. Parameters: [cFT0C] FT0C centrality, [mFV0A] V0A multiplicity, [mGlob] global track multiplicity, [mPV] PV track multiplicity, [cFT0M] FT0M centrality")
@@ -193,8 +194,17 @@ struct CorrelationTask {
193194
using DerivedCollisions = soa::Filtered<aod::CFCollisions>;
194195
using DerivedTracks = soa::Filtered<aod::CFTracks>;
195196

197+
enum RecoCollisionSelection {
198+
AllGeneratedCollisions = 0,
199+
RequireOneRecoCollision,
200+
RequireBestRecoCollision
201+
};
202+
196203
void init(o2::framework::InitContext&)
197204
{
205+
if (cfgRequireRecoCollision < 0 || cfgRequireRecoCollision > RecoCollisionSelection::RequireBestRecoCollision) {
206+
LOGF(fatal, "Unsupported cfgRequireRecoCollision=%d; use 0 (no reco. collision required), 1 (exactly one reco. collision required), 2 (at least one. reco, and best reco. collision selected)", cfgRequireRecoCollision.value);
207+
}
198208
if (doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML || doprocessMCEfficiency2ProngML || doprocessMCReflection2ProngML) {
199209
if (cfgPtDepMLbkg->empty() || cfgPtCentDepMLbkgSel->empty())
200210
LOGF(fatal, "cfgPtDepMLbkg or cfgPtCentDepMLbkgSel can not be empty when ML 2-prong selections are used.");
@@ -1211,13 +1221,30 @@ struct CorrelationTask {
12111221
LOGF(info, "MC collision at vtx-z = %f with %d mc particles and %d reconstructed collisions", mcCollision.posZ(), mcParticles.size(), collisions.size());
12121222
}
12131223

1224+
// Select reconstructed collisions as specified by cfgRequireRecoCollision
12141225
auto multiplicity = mcCollision.multiplicity();
1215-
if (cfgCentBinsForMC > 0) {
1226+
if (cfgRequireRecoCollision > 0) {
12161227
if (collisions.size() == 0) {
12171228
return;
12181229
}
1219-
for (const auto& collision : collisions) {
1220-
multiplicity = collision.multiplicity();
1230+
if (cfgRequireRecoCollision == RecoCollisionSelection::RequireOneRecoCollision) { // cfgRequireRecoCollision == 1
1231+
if (collisions.size() != 1) {
1232+
return;
1233+
}
1234+
multiplicity = collisions.begin().multiplicity();
1235+
}
1236+
if (cfgRequireRecoCollision == RecoCollisionSelection::RequireBestRecoCollision) { // cfgRequireRecoCollision == 2
1237+
bool foundBestCollision = false;
1238+
for (const auto& collision : collisions) {
1239+
if (collision.bestRecoCollision()) {
1240+
multiplicity = collision.multiplicity();
1241+
foundBestCollision = true;
1242+
break;
1243+
}
1244+
}
1245+
if (!foundBestCollision) {
1246+
return;
1247+
}
12211248
}
12221249
}
12231250
// Primaries
@@ -1226,7 +1253,11 @@ struct CorrelationTask {
12261253
same->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ());
12271254
}
12281255
}
1256+
const bool useBestCollision = cfgRequireRecoCollision == RecoCollisionSelection::AllGeneratedCollisions || cfgRequireRecoCollision == RecoCollisionSelection::RequireBestRecoCollision; // For cfgRequireRecoCollision == 0 still need to reject split vertices
12291257
for (const auto& collision : collisions) {
1258+
if (useBestCollision && !collision.bestRecoCollision()) {
1259+
continue;
1260+
}
12301261
auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex());
12311262
if (cfgVerbosity > 0) {
12321263
LOGF(info, " Reconstructed collision at vtx-z = %f", collision.posZ());

0 commit comments

Comments
 (0)