diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index 5aecd0a5fa4..bd1dcbab82a 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -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" @@ -60,7 +62,7 @@ using namespace std; struct FlowPbpbPikp { Service ccdb; Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; - Configurable ccdbUrl{"ccdbUrl", "http://ccdb-test.cern.ch:8080", "url of the ccdb repository"}; + Configurable 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") @@ -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"}; @@ -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>; - // using AodTracks = soa::Filtered>; - using AodTracks = soa::Filtered>; - - SliceCache cache; - Partition posTracks = aod::track::signed1Pt > 0.0f; - Partition negTracks = aod::track::signed1Pt < 0.0f; + using AodCollisions = soa::Filtered>; + using AodTracksWithoutBayes = soa::Filtered>; OutputObj fFC{FlowContainer("FlowContainer")}; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -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}}}); @@ -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); @@ -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(); } @@ -197,17 +206,6 @@ struct FlowPbpbPikp { PROTONS }; - template - 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 int getNsigmaPID(TTrack track) { @@ -219,6 +217,8 @@ struct FlowPbpbPikp { // Choose which nSigma to use std::array 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) { @@ -266,24 +266,6 @@ struct FlowPbpbPikp { return 0; }*/ - template - void resurrectParticle(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, double minusmass, const ConstStr& 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 void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) { @@ -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);