diff --git a/PWGLF/DataModel/LFSlimNucleiTables.h b/PWGLF/DataModel/LFSlimNucleiTables.h index 02e8b90d303..86bdec9b4fc 100644 --- a/PWGLF/DataModel/LFSlimNucleiTables.h +++ b/PWGLF/DataModel/LFSlimNucleiTables.h @@ -16,6 +16,7 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Common/DataModel/Centrality.h" #ifndef PWGLF_DATAMODEL_LFSLIMNUCLEITABLES_H_ #define PWGLF_DATAMODEL_LFSLIMNUCLEITABLES_H_ @@ -46,6 +47,64 @@ DECLARE_SOA_COLUMN(gPhi, genPhi, float); DECLARE_SOA_COLUMN(PDGcode, pdgCode, int); } // namespace NucleiTableNS +namespace NucleiFlowTableNS +{ +DECLARE_SOA_COLUMN(CentFV0A, centFV0A, float); +DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); +DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); +DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); +DECLARE_SOA_COLUMN(XQvecFV0A, xQvecFV0A, float); +DECLARE_SOA_COLUMN(YQvecFV0A, yQvecFV0A, float); +DECLARE_SOA_COLUMN(AmplQvecFV0A, amplQvecFV0A, float); +DECLARE_SOA_COLUMN(XQvecFT0M, xQvecFT0M, float); +DECLARE_SOA_COLUMN(YQvecFT0M, yQvecFT0M, float); +DECLARE_SOA_COLUMN(AmplQvecFT0M, amplQvecFT0M, float); +DECLARE_SOA_COLUMN(XQvecFT0A, xQvecFT0A, float); +DECLARE_SOA_COLUMN(YQvecFT0A, yQvecFT0A, float); +DECLARE_SOA_COLUMN(AmplQvecFT0A, amplQvecFT0A, float); +DECLARE_SOA_COLUMN(XQvecFT0C, xQvecFT0C, float); +DECLARE_SOA_COLUMN(YQvecFT0C, yQvecFT0C, float); +DECLARE_SOA_COLUMN(AmplQvecFT0C, amplQvecFT0C, float); +DECLARE_SOA_COLUMN(XQvecTPCpos, xQvecTPCpos, float); +DECLARE_SOA_COLUMN(YQvecTPCpos, yQvecTPCpos, float); +DECLARE_SOA_COLUMN(AmplQvecTPCpos, amplQvecTPCpos, float); +DECLARE_SOA_COLUMN(XQvecTPCneg, xQvecTPCneg, float); +DECLARE_SOA_COLUMN(YQvecTPCneg, yQvecTPCneg, float); +DECLARE_SOA_COLUMN(AmplQvecTPCneg, amplQvecTPCneg, float); +} // namespace NucleiFlowTableNS + +DECLARE_SOA_TABLE(NucleiFlowColls, "AOD", "NUCLEIFLOWCOLLS", + o2::soa::Index<>, + NucleiFlowTableNS::CentFV0A, + NucleiFlowTableNS::CentFT0M, + NucleiFlowTableNS::CentFT0A, + NucleiFlowTableNS::CentFT0C, + NucleiFlowTableNS::XQvecFV0A, + NucleiFlowTableNS::YQvecFV0A, + NucleiFlowTableNS::AmplQvecFV0A, + NucleiFlowTableNS::XQvecFT0M, + NucleiFlowTableNS::YQvecFT0M, + NucleiFlowTableNS::AmplQvecFT0M, + NucleiFlowTableNS::XQvecFT0A, + NucleiFlowTableNS::YQvecFT0A, + NucleiFlowTableNS::AmplQvecFT0A, + NucleiFlowTableNS::XQvecFT0C, + NucleiFlowTableNS::YQvecFT0C, + NucleiFlowTableNS::AmplQvecFT0C, + NucleiFlowTableNS::XQvecTPCpos, + NucleiFlowTableNS::YQvecTPCpos, + NucleiFlowTableNS::AmplQvecTPCpos, + NucleiFlowTableNS::XQvecTPCneg, + NucleiFlowTableNS::YQvecTPCneg, + NucleiFlowTableNS::AmplQvecTPCneg) + +using NucleiFlowColl = NucleiFlowColls::iterator; + +namespace NucleiTableNS +{ +DECLARE_SOA_INDEX_COLUMN(NucleiFlowColl, nucleiFlowColl); +} + DECLARE_SOA_TABLE(NucleiTable, "AOD", "NUCLEITABLE", NucleiTableNS::Pt, NucleiTableNS::Eta, @@ -62,7 +121,8 @@ DECLARE_SOA_TABLE(NucleiTable, "AOD", "NUCLEITABLE", NucleiTableNS::TPCfindableCls, NucleiTableNS::TPCcrossedRows, NucleiTableNS::ITSclsMap, - NucleiTableNS::TPCnCls) + NucleiTableNS::TPCnCls, + NucleiTableNS::NucleiFlowCollId) DECLARE_SOA_TABLE(NucleiTableMC, "AOD", "NUCLEITABLEMC", NucleiTableNS::Pt, diff --git a/PWGLF/TableProducer/nucleiSpectra.cxx b/PWGLF/TableProducer/nucleiSpectra.cxx index 99c8fc11a4d..13418d09879 100644 --- a/PWGLF/TableProducer/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/nucleiSpectra.cxx @@ -17,6 +17,7 @@ // Data (run3): // o2-analysis-lf-nuclei-spectra, o2-analysis-timestamp // o2-analysis-pid-tof-base, o2-analysis-multiplicity-table, o2-analysis-event-selection +// (to add flow: o2-analysis-qvector-table, o2-analysis-centrality-table) #include @@ -32,6 +33,8 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/Core/PID/PIDTOF.h" #include "Common/TableProducer/PID/pidTOFBase.h" +#include "Common/Core/EventPlaneHelper.h" +#include "Common/DataModel/Qvectors.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" @@ -72,6 +75,7 @@ struct NucleusCandidate { uint8_t TPCcrossedRows; uint8_t ITSclsMap; uint8_t TPCnCls; + int selCollIndex; }; namespace nuclei @@ -161,6 +165,7 @@ struct nucleiSpectra { Produces nucleiTable; Produces nucleiTableMC; + Produces nucleiFlowTable; Service ccdb; Configurable cfgCentralityEstimator{"cfgCentralityEstimator", "V0A", "Centrality estimator name"}; @@ -214,6 +219,9 @@ struct nucleiSpectra { using TrackCandidates = soa::Filtered>; + // Flow analysis + using CollWithQvec = soa::Filtered>::iterator; + HistogramRegistry spectra{"spectra", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; o2::pid::tof::Beta responseBeta; @@ -308,10 +316,10 @@ struct nucleiSpectra { o2::base::Propagator::Instance(true)->setMatLUT(nuclei::lut); } - template - void fillDataInfo(soa::Filtered>::iterator const& collision, TC const& tracks) + template + void fillDataInfo(Tcoll const& collision, Ttrks const& tracks) { - auto bc = collision.bc_as(); + auto bc = collision.template bc_as(); initCCDB(bc); // collision process loop @@ -422,8 +430,34 @@ struct nucleiSpectra { } } if (flag & (kProton | kDeuteron | kTriton | kHe3 | kHe4)) { + if constexpr (std::is_same::value) { + if (nuclei::candidates.empty()) { + nucleiFlowTable(collision.centFV0A(), + collision.centFT0M(), + collision.centFT0A(), + collision.centFT0C(), + collision.qvecFV0ARe(), + collision.qvecFV0AIm(), + collision.sumAmplFV0A(), + collision.qvecFT0MRe(), + collision.qvecFT0MIm(), + collision.sumAmplFT0M(), + collision.qvecFT0ARe(), + collision.qvecFT0AIm(), + collision.sumAmplFT0A(), + collision.qvecFT0CRe(), + collision.qvecFT0CIm(), + collision.sumAmplFT0C(), + collision.qvecBPosRe(), + collision.qvecBPosIm(), + collision.nTrkBPos(), + collision.qvecBNegRe(), + collision.qvecBNegIm(), + collision.nTrkBNeg()); + } + } nuclei::candidates.emplace_back(NucleusCandidate{static_cast(track.globalIndex()), (1 - 2 * iC) * trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), track.tpcInnerParam(), beta, collision.posZ(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), - track.tpcChi2NCl(), flag, track.tpcNClsFindable(), static_cast(track.tpcNClsCrossedRows()), track.itsClusterMap(), static_cast(track.tpcNClsFound())}); + track.tpcChi2NCl(), flag, track.tpcNClsFindable(), static_cast(track.tpcNClsCrossedRows()), track.itsClusterMap(), static_cast(track.tpcNClsFound()), static_cast(nucleiFlowTable.lastIndex())}); } } // end loop over tracks @@ -436,11 +470,21 @@ struct nucleiSpectra { nuclei::candidates.clear(); fillDataInfo(collision, tracks); for (auto& c : nuclei::candidates) { - nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls); + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.selCollIndex); } } PROCESS_SWITCH(nucleiSpectra, processData, "Data analysis", true); + void processDataFlow(CollWithQvec const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + { + nuclei::candidates.clear(); + fillDataInfo(collision, tracks); + for (auto& c : nuclei::candidates) { + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.selCollIndex); + } + } + PROCESS_SWITCH(nucleiSpectra, processDataFlow, "Data analysis with flow", false); + Preslice tracksPerCollisions = aod::track::collisionId; void processMC(soa::Filtered> const& collisions, TrackCandidates const& tracks, aod::McTrackLabels const& trackLabelsMC, aod::McParticles const& particlesMC, aod::BCsWithTimestamps const&) {