Skip to content

Commit

Permalink
[PWGCF] Adding v2 four particle cumulants (AliceO2Group#9600)
Browse files Browse the repository at this point in the history
Co-authored-by: Preet Pati <[email protected]>
  • Loading branch information
Preet-Bhanjan and Preet Pati authored Jan 30, 2025
1 parent 24b9f59 commit 6da4285
Showing 1 changed file with 59 additions and 108 deletions.
167 changes: 59 additions & 108 deletions PWGCF/Flow/Tasks/flowPbpbPikp.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
#include "PWGCF/GenericFramework/Core/GFW.h"
#include "PWGCF/GenericFramework/Core/GFWCumulant.h"
#include "PWGCF/GenericFramework/Core/FlowContainer.h"
#include "PWGCF/GenericFramework/Core/GFWWeights.h"
#include "PWGCF/GenericFramework/Core/GFWWeightsList.h"

#include "ReconstructionDataFormats/Track.h"
#include "ReconstructionDataFormats/PID.h"
Expand All @@ -60,7 +62,7 @@ using namespace std;
struct FlowPbpbPikp {
Service<ccdb::BasicCCDBManager> ccdb;
Configurable<int64_t> noLaterThan{"noLaterThan", std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"};
Configurable<std::string> ccdbUrl{"ccdbUrl", "http://ccdb-test.cern.ch:8080", "url of the ccdb repository"};
Configurable<std::string> ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};

O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range")
O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks")
Expand All @@ -71,8 +73,11 @@ struct FlowPbpbPikp {
O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters")
O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables")
O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples")
O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, true, "Fill NUA weights")
O2_DEFINE_CONFIGURABLE(cfgTpcNsigmaCut, float, 2.0f, "TPC N-sigma cut for pions, kaons, protons")
O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 1.8f, "Minimum pt to use TOF N-sigma")
O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5f, "Minimum pt to use TOF N-sigma")
O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 2.0f, "DCAxy range for tracks")
O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "DCAz range for tracks")

ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"};
ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"};
Expand All @@ -82,19 +87,13 @@ struct FlowPbpbPikp {
ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {80, -5, 5}, "nsigmaTPC axis"};
ConfigurableAxis axisNsigmaTOF{"axisNsigmaTOF", {80, -5, 5}, "nsigmaTOF axis"};
ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"};
ConfigurableAxis axisPhiMass{"axisPhiMass", {10000, 0, 2}, "axis for invariant mass distibution for Phi"};
ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"};

Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex;
Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls);
Filter trackFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls);

using AodCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::MultZeqs, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>>;
// using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra, aod::pidBayes, aod::pidBayesPi, aod::pidBayesKa, aod::pidBayesPr, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>>;
using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>>;

SliceCache cache;
Partition<AodTracks> posTracks = aod::track::signed1Pt > 0.0f;
Partition<AodTracks> negTracks = aod::track::signed1Pt < 0.0f;
using AodCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::TPCMults, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0Cs, aod::CentFT0As, aod::Mults>>;
using AodTracksWithoutBayes = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra, aod::TracksDCA, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTOFbeta, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>>;

OutputObj<FlowContainer> fFC{FlowContainer("FlowContainer")};
HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject};
Expand All @@ -110,20 +109,21 @@ struct FlowPbpbPikp {
ccdb->setCaching(true);
ccdb->setCreatedNotAfter(noLaterThan.value);

histos.add("hPhi", "", {HistType::kTH1D, {axisPhi}});
histos.add("hEta", "", {HistType::kTH1D, {axisEta}});
histos.add("hVtxZ", "", {HistType::kTH1D, {axisVertex}});
histos.add("hMult", "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}});
histos.add("hCent", "", {HistType::kTH1D, {{90, 0, 90}}});
histos.add("hPhi", "", {HistType::kTH1D, {axisPhi}});
histos.add("hEta", "", {HistType::kTH1D, {axisEta}});
histos.add("hPt", "", {HistType::kTH1D, {axisPt}});
histos.add("hPhiMass", "", {HistType::kTH1D, {axisPhiMass}});
histos.add("c22_gap08", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c22_gap08_pi", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c22_gap08_ka", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c22_gap08_pr", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c24_full", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("KplusTPC", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}});
histos.add("KminusTPC", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}});
histos.add("c24_gap08", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c24_gap08_pi", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c24_gap08_ka", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("c24_gap08_pr", "", {HistType::kTProfile, {axisMultiplicity}});
histos.add("TofTpcNsigma", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}});
histos.add("partCount", "", {HistType::kTHnSparseD, {{axisParticles, axisMultiplicity, axisPt}}});

Expand Down Expand Up @@ -154,15 +154,16 @@ struct FlowPbpbPikp {
fFC->Initialize(oba, axisMultiplicity, cfgNbootstrap);
delete oba;

// reference particles
fGFW->AddRegion("refN08", -0.8, -0.4, 1, 1);
fGFW->AddRegion("refP08", 0.4, 0.8, 1, 1);
fGFW->AddRegion("full", -0.8, 0.8, 1, 512);
fGFW->AddRegion("poi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 1024);
fGFW->AddRegion("ol", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2048);

// charged parts
// pt dependent charged particles
fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 128);
fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 256);
fGFW->AddRegion("poi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 1024);
fGFW->AddRegion("ol", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2048);

// pion
fGFW->AddRegion("poiNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2);
Expand All @@ -180,14 +181,22 @@ struct FlowPbpbPikp {
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pi08Gap22", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ka08Gap22", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pr08Gap22", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "ChFull24", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ch08Gap24", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Pi08Gap24", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ka08Gap24", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Pr08Gap24", kFALSE));

corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN refN08 | olN {2} refP08 {-2}", "Ch08Gap22", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpi refN08 | olNpi {2} refP08 {-2}", "Pi08Gap22", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2} refP08 {-2}", "Ka08Gap22", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2} refP08 {-2}", "Pr08Gap22", kTRUE));

corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "ChFull24", kFALSE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poi full | ol {2 2 -2 -2}", "ChFull24", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN refN08 | olN {2 2} refP08 {-2 -2}", "Ch08Gap24", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpi refN08 | olNpi {2 2} refP08 {-2 -2}", "Pi08Gap24", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2 2} refP08 {-2 -2}", "Ka08Gap24", kTRUE));
corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2 2} refP08 {-2 -2}", "Pr08Gap24", kTRUE));

fGFW->CreateRegions();
}

Expand All @@ -197,17 +206,6 @@ struct FlowPbpbPikp {
PROTONS
};

template <typename TTrack>
bool isFakeKaon(TTrack track)
{
const auto pglobal = track.p();
const auto ptpc = track.tpcInnerParam();
if (std::abs(pglobal - ptpc) > 0.1) {
return true;
}
return false;
}

template <typename TTrack>
int getNsigmaPID(TTrack track)
{
Expand All @@ -219,6 +217,8 @@ struct FlowPbpbPikp {

// Choose which nSigma to use
std::array<float, 3> nSigmaToUse = (track.pt() > cfgTofPtCut && track.hasTOF()) ? nSigmaCombined : nSigmaTPC;
if (track.pt() >= cfgTofPtCut && !track.hasTOF())
return -1;

// Select particle with the lowest nsigma
for (int i = 0; i < 3; ++i) {
Expand Down Expand Up @@ -266,24 +266,6 @@ struct FlowPbpbPikp {
return 0;
}*/

template <typename TTrack, typename vector, char... chars>
void resurrectParticle(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, double minusmass, const ConstStr<chars...>& hist)
{
for (auto const& [partplus, partminus] : o2::soa::combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(trackplus, trackminus))) {
if (getNsigmaPID(partplus) != 2)
continue;
if (getNsigmaPID(partminus) != 2)
continue;

plusdaug = ROOT::Math::PxPyPzMVector(partplus.px(), partplus.py(), partplus.pz(), plusmass);
minusdaug = ROOT::Math::PxPyPzMVector(partminus.px(), partminus.py(), partminus.pz(), minusmass);
mom = plusdaug + minusdaug;

histos.fill(hist, mom.M());
}
return;
}

template <char... chars>
void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr<chars...>& tarName, const double& cent)
{
Expand Down Expand Up @@ -333,104 +315,73 @@ struct FlowPbpbPikp {
return;
}

ROOT::Math::PxPyPzMVector Phimom, kplusdaug, kminusdaug;
double massKplus = o2::constants::physics::MassKPlus;
double massKminus = o2::constants::physics::MassKMinus;

void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks)
void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracksWithoutBayes const& tracks)
{
int nTot = tracks.size();
if (nTot < 1)
return;
if (!collision.sel8())
return;
float lRandom = fRndm->Rndm();

float lRandom = fRndm->Rndm();
float vtxz = collision.posZ();
const auto cent = collision.centFT0C();

histos.fill(HIST("hVtxZ"), vtxz);
histos.fill(HIST("hMult"), nTot);
histos.fill(HIST("hCent"), collision.centFT0C());
fGFW->Clear();
const auto cent = collision.centFT0C();

auto posSlicedTracks = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);
auto negSlicedTracks = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache);

float weff = 1, wacc = 1;
int pidIndex;

// resurrectParticle(posSlicedTracks, negSlicedTracks, kplusdaug, kminusdaug, Phimom, massKplus, massKminus, HIST("hPhiMass"));

for (auto const& trackA : posSlicedTracks) {
if (getNsigmaPID(trackA) != 2)
continue;
if (isFakeKaon(trackA))
continue;
auto trackAID = trackA.globalIndex();

for (auto const& trackB : negSlicedTracks) {
auto trackBID = trackB.globalIndex();
if (getNsigmaPID(trackB) != 2)
continue;
if (isFakeKaon(trackB))
continue;
if (trackAID == trackBID)
continue;

histos.fill(HIST("KplusTPC"), trackA.pt(), trackA.tpcSignal());
histos.fill(HIST("KminusTPC"), trackB.pt(), trackB.tpcSignal());

kplusdaug = ROOT::Math::PxPyPzMVector(trackA.px(), trackA.py(), trackA.pz(), massKplus);
kminusdaug = ROOT::Math::PxPyPzMVector(trackB.px(), trackB.py(), trackB.pz(), massKminus);
Phimom = kplusdaug + kminusdaug;

histos.fill(HIST("hPhiMass"), Phimom.M());
}
}

for (auto const& track1 : tracks) {
double pt = track1.pt();
histos.fill(HIST("hPhi"), track1.phi());
histos.fill(HIST("hEta"), track1.eta());
for (auto const& track : tracks) {
double pt = track.pt();
histos.fill(HIST("hPhi"), track.phi());
histos.fill(HIST("hEta"), track.eta());
histos.fill(HIST("hPt"), pt);

histos.fill(HIST("TofTpcNsigma"), PIONS, track1.tpcNSigmaPi(), track1.tofNSigmaPi(), pt);
histos.fill(HIST("TofTpcNsigma"), KAONS, track1.tpcNSigmaKa(), track1.tofNSigmaKa(), pt);
histos.fill(HIST("TofTpcNsigma"), PROTONS, track1.tpcNSigmaPr(), track1.tofNSigmaPr(), pt);
histos.fill(HIST("TofTpcNsigma"), PIONS, track.tpcNSigmaPi(), track.tofNSigmaPi(), pt);
histos.fill(HIST("TofTpcNsigma"), KAONS, track.tpcNSigmaKa(), track.tofNSigmaKa(), pt);
histos.fill(HIST("TofTpcNsigma"), PROTONS, track.tpcNSigmaPr(), track.tofNSigmaPr(), pt);

bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range
bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range

// pidIndex = getBayesPIDIndex(track1);
pidIndex = getNsigmaPID(track1);
// pidIndex = getBayesPIDIndex(track);
pidIndex = getNsigmaPID(track);
if (withinPtRef) {
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 1);
fGFW->Fill(track1.eta(), 1, track1.phi(), wacc * weff, 512);
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1);
fGFW->Fill(track.eta(), 1, track.phi(), wacc * weff, 512);
}
if (withinPtPOI) {
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 128);
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 1024);
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 128);
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1024);
}
if (withinPtPOI && withinPtRef) {
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 256);
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 2048);
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 256);
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 2048);
}

if (pidIndex) {
histos.fill(HIST("partCount"), pidIndex - 1, cent, pt);
if (withinPtPOI)
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 1 << (pidIndex));
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1 << (pidIndex));
if (withinPtPOI && withinPtRef)
fGFW->Fill(track1.eta(), fPtAxis->FindBin(pt) - 1, track1.phi(), wacc * weff, 1 << (pidIndex + 3));
fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1 << (pidIndex + 3));
}
} // track1 loop ends
} // track loop ends

// Filling c22 with ROOT TProfile
// Filling cumulants with ROOT TProfile
fillProfile(corrconfigs.at(0), HIST("c22_gap08"), cent);
fillProfile(corrconfigs.at(1), HIST("c22_gap08_pi"), cent);
fillProfile(corrconfigs.at(2), HIST("c22_gap08_ka"), cent);
fillProfile(corrconfigs.at(3), HIST("c22_gap08_pr"), cent);
fillProfile(corrconfigs.at(4), HIST("c24_full"), cent);
fillProfile(corrconfigs.at(5), HIST("c24_gap08"), cent);
fillProfile(corrconfigs.at(6), HIST("c24_gap08_pi"), cent);
fillProfile(corrconfigs.at(7), HIST("c24_gap08_ka"), cent);
fillProfile(corrconfigs.at(8), HIST("c24_gap08_pr"), cent);

for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) {
fillFC(corrconfigs.at(l_ind), cent, lRandom);
Expand Down

0 comments on commit 6da4285

Please sign in to comment.