Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 61 additions & 48 deletions PWGCF/Flow/Tasks/flowZdcEnergy.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
/// \file flowZdcEnergy.cxx
/// \author Kegang Xiong
/// \since 03/2026
/// \brief Study ZDC energy observables versus centrality for Run 2 / Run 3.
/// \brief Study ZDC energy observables versus multiplicity for Run 2 / Run 3.

#include "Common/DataModel/Centrality.h"
#include "Common/DataModel/EventSelection.h"
Expand Down Expand Up @@ -44,23 +44,18 @@ using namespace o2::framework::expressions;

#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable<TYPE> NAME{#NAME, DEFAULT, HELP};

struct flowZdcEnergy {

struct : ConfigurableGroup{
O2_DEFINE_CONFIGURABLE(cfgUseEvsel, bool, true, "whether to enable event selection")
O2_DEFINE_CONFIGURABLE(cfgCentMin, float, 0.f, "Minimum centrality for selected events")
O2_DEFINE_CONFIGURABLE(cfgCentMax, float, 90.f, "Maximum centrality for selected events")
O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10.f, "Accepted z-vertex range")} evsel;
struct FlowZdcEnergy {

O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10.f, "Event cut: accepted z-vertex range")
O2_DEFINE_CONFIGURABLE(cfgEtaMax, float, 0.8f, "Maximum track #eta")
O2_DEFINE_CONFIGURABLE(cfgPtMin, float, 0.2f, "Minimum track #P_{t}")
O2_DEFINE_CONFIGURABLE(cfgPtMax, float, 10.0f, "Maximum track #P_{t}")
O2_DEFINE_CONFIGURABLE(cfgDcaXYMax, float, 0.2f, "Maximum DCAxy")
O2_DEFINE_CONFIGURABLE(cfgDcaZMax, float, 2.0f, "Maximum DCAz")

ConfigurableAxis axisCent{"axisCent", {90, 0, 90}, "Centrality (%)"};
ConfigurableAxis axisMult{"axisMult", {100, 0, 100000}, "Multiplicity"};
ConfigurableAxis axisMultDivided{"axisMultDivided", {30, 0, 15000}, "Multiplicity bins for ZN energy"};
ConfigurableAxis axisMult{"axisMult", {500, 0, 15000}, "Multiplicity"};
ConfigurableAxis axisMultDivided{"axisMultDivided", {500, 0, 10000}, "Multiplicity bins for ZN energy"};
ConfigurableAxis axisPt{"axisPt", {100, 0, 15}, "#P_{t}"};
ConfigurableAxis axisEta{"axisEta", {64, -1.6, 1.6}, "#eta"};
ConfigurableAxis axisEnergy{"axisEnergy", {300, 0, 300}, "Energy"};
Expand All @@ -71,7 +66,6 @@ struct flowZdcEnergy {
kAllEvents = 0,
kSeln,
kZvtx,
kCentrality,
kBCHasZDC,
kSelectedZDC,
kNSelections
Expand Down Expand Up @@ -105,13 +99,17 @@ struct flowZdcEnergy {
hCount->GetXaxis()->SetBinLabel(kAllEvents + 1, "All events");
hCount->GetXaxis()->SetBinLabel(kSeln + 1, "Sel7/8");
hCount->GetXaxis()->SetBinLabel(kZvtx + 1, "Zvtx");
hCount->GetXaxis()->SetBinLabel(kCentrality + 1, "Centrality");
hCount->GetXaxis()->SetBinLabel(kBCHasZDC + 1, "BC has ZDC");
hCount->GetXaxis()->SetBinLabel(kSelectedZDC + 1, "Selected ZDC");

registry.add("QA/hCentrality", "", {HistType::kTH1D, {axisCent}});
registry.add("QA/hMultiplicity", "", {HistType::kTH1D, {axisMult}});
registry.add("QA/hMultiplicity_TPC", "", {HistType::kTH1D, {axisMult}});
registry.add("QA/hCentrality_beforeCut", "", {HistType::kTH1D, {axisCent}});
registry.add("QA/hMultiplicity_beforeCut", "", {HistType::kTH1D, {axisMult}});
registry.add("QA/hMultiplicity_TPC_beforeCut", "", {HistType::kTH1D, {axisMult}});

registry.add("QA/hCentrality_afterCut", "", {HistType::kTH1D, {axisCent}});
registry.add("QA/hMultiplicity_afterCut", "", {HistType::kTH1D, {axisMult}});
registry.add("QA/hMultiplicity_TPC_afterCut", "", {HistType::kTH1D, {axisMult}});

registry.add("QA/hPt", "", {HistType::kTH1D, {axisPt}});
registry.add("QA/hEta", "", {HistType::kTH1D, {axisEta}});

Expand Down Expand Up @@ -148,28 +146,34 @@ struct flowZdcEnergy {

// Helper: event selection
template <typename TCollision>
bool acceptEvent(TCollision const& collision, bool UseEvsel, float centrality, const int runmode)
bool acceptEventRun2(TCollision const& collision)
{
if (!UseEvsel) {
registry.fill(HIST("QA/hEventCount"), kAllEvents);
} else {
registry.fill(HIST("QA/hEventCount"), kAllEvents);
if (runmode == 2 && !collision.sel7()) {
return false;
}
if (runmode == 3 && !collision.sel8()) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kSeln);
if (std::abs(collision.posZ()) > evsel.cfgVtxZ) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kZvtx);
if (centrality < evsel.cfgCentMin || centrality > evsel.cfgCentMax) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kCentrality);
registry.fill(HIST("QA/hEventCount"), kAllEvents);
if (!collision.sel7()) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kSeln);
if (std::abs(collision.posZ()) > cfgVtxZ) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kZvtx);

return true;
}

template <typename TCollision>
bool acceptEventRun3(TCollision const& collision)
{
registry.fill(HIST("QA/hEventCount"), kAllEvents);
if (!collision.sel8()) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kSeln);
if (std::abs(collision.posZ()) > cfgVtxZ) {
return false;
}
registry.fill(HIST("QA/hEventCount"), kZvtx);

return true;
}

Expand Down Expand Up @@ -232,11 +236,12 @@ struct flowZdcEnergy {
registry.fill(HIST("hEnergyWithMult_ZNA_SumSectors"), sumEnergyZNA, multiTPC);
registry.fill(HIST("hEnergyWithMult_ZNC_SumSectors"), sumEnergyZNC, multiTPC);

if (commonDen > 1.e-6f) {
const float nonZero = 1.e-6f;
if (commonDen > nonZero) {
registry.fill(HIST("hEnergyWithCent_RescaledDiff"), (energyCommonZNA - energyCommonZNC) / commonDen, centrality);
registry.fill(HIST("hEnergyWithMult_RescaledDiff"), (energyCommonZNA - energyCommonZNC) / commonDen, multiTPC);
}
if (sumDen > 1.e-6f) {
if (sumDen > nonZero) {
registry.fill(HIST("hEnergyWithCent_RescaledSumDiff"), (sumEnergyZNA - sumEnergyZNC) / sumDen, centrality);
registry.fill(HIST("hEnergyWithMult_RescaledSumDiff"), (sumEnergyZNA - sumEnergyZNC) / sumDen, multiTPC);
}
Expand All @@ -252,12 +257,16 @@ struct flowZdcEnergy {
const float multi = collision.multFT0C();
const float multiTPC = collision.multTPC();

if (!acceptEvent(collision, evsel.cfgUseEvsel, centrality, 3)) {
registry.fill(HIST("QA/hCentrality_beforeCut"), centrality);
registry.fill(HIST("QA/hMultiplicity_beforeCut"), multi);
registry.fill(HIST("QA/hMultiplicity_TPC_beforeCut"), multiTPC);

if (!acceptEventRun3(collision)) {
return;
}
registry.fill(HIST("QA/hCentrality"), centrality);
registry.fill(HIST("QA/hMultiplicity"), multi);
registry.fill(HIST("QA/hMultiplicity_TPC"), multiTPC);
registry.fill(HIST("QA/hCentrality_afterCut"), centrality);
registry.fill(HIST("QA/hMultiplicity_afterCut"), multi);
registry.fill(HIST("QA/hMultiplicity_TPC_afterCut"), multiTPC);
fillZDCObservables<CollisionsRun3::iterator, BCsRun3>(collision, centrality, multiTPC);

for (const auto& track : tracks) {
Expand All @@ -276,12 +285,16 @@ struct flowZdcEnergy {
const float multi = collision.multFV0M();
const float multiTPC = collision.multTPC();

if (!acceptEvent(collision, evsel.cfgUseEvsel, centrality, 2)) {
registry.fill(HIST("QA/hCentrality_beforeCut"), centrality);
registry.fill(HIST("QA/hMultiplicity_beforeCut"), multi);
registry.fill(HIST("QA/hMultiplicity_TPC_beforeCut"), multiTPC);

if (!acceptEventRun2(collision)) {
return;
}
registry.fill(HIST("QA/hCentrality"), centrality);
registry.fill(HIST("QA/hMultiplicity"), multi);
registry.fill(HIST("QA/hMultiplicity_TPC"), multiTPC);
registry.fill(HIST("QA/hCentrality_afterCut"), centrality);
registry.fill(HIST("QA/hMultiplicity_afterCut"), multi);
registry.fill(HIST("QA/hMultiplicity_TPC_afterCut"), multiTPC);
fillZDCObservables<CollisionsRun2::iterator, BCsRun2>(collision, centrality, multiTPC);

for (const auto& track : tracks) {
Expand All @@ -291,12 +304,12 @@ struct flowZdcEnergy {
}

// Process switches
PROCESS_SWITCH(flowZdcEnergy, processRun3, "Process Run 3 data", true);
PROCESS_SWITCH(flowZdcEnergy, processRun2, "Process Run 2 data", false);
PROCESS_SWITCH(FlowZdcEnergy, processRun3, "Process Run 3 data", true);
PROCESS_SWITCH(FlowZdcEnergy, processRun2, "Process Run 2 data", false);
};

WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
{
return WorkflowSpec{
adaptAnalysisTask<flowZdcEnergy>(cfgc)};
adaptAnalysisTask<FlowZdcEnergy>(cfgc)};
}
Loading