Skip to content

Commit 2ad29a9

Browse files
authored
[PWGCF] CF correlations and JCorran multiplicity correlations (#12508)
1 parent 331f5af commit 2ad29a9

File tree

8 files changed

+149
-59
lines changed

8 files changed

+149
-59
lines changed

PWGCF/DataModel/CorrelationsDerived.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,14 @@ DECLARE_SOA_TABLE(CFCollRefs, "AOD", "CFCOLLREF", o2::soa::Index<>, track::Colli
9090
namespace cfmultset
9191
{
9292
DECLARE_SOA_COLUMN(Multiplicities, multiplicities, std::vector<float>); //! List of auxiliary multiplicities
93-
}
93+
enum MultiplicityEstimators : uint8_t {
94+
CentFT0C = 0x1,
95+
MultFV0A = 0x2,
96+
MultNTracksPV = 0x4,
97+
MultNTracksGlobal = 0x8
98+
};
99+
100+
} // namespace cfmultset
94101
DECLARE_SOA_TABLE(CFMultSets, "AOD", "CFMULTSET", cfmultset::Multiplicities); //! Auxilary multiplicity set table
95102

96103
using CFMultSet = CFMultSets::iterator;

PWGCF/JCorran/Core/JFFlucAnalysis.cxx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
/// \author Jasper Parkkila (jparkkil@cern.ch)
1313
/// \since Sep 2022
1414

15-
#include <TMath.h>
15+
#include "JFFlucAnalysis.h"
16+
1617
#include <TComplex.h>
18+
#include <TMath.h>
19+
1720
#include <algorithm>
18-
#include "JFFlucAnalysis.h"
1921

2022
JFFlucAnalysis::JFFlucAnalysis() : TNamed(),
2123
fVertex(0),

PWGCF/JCorran/Core/JFFlucAnalysis.h

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@
1515
#ifndef PWGCF_JCORRAN_CORE_JFFLUCANALYSIS_H_
1616
#define PWGCF_JCORRAN_CORE_JFFLUCANALYSIS_H_
1717

18-
#include <experimental/type_traits>
1918
#include "JQVectors.h"
19+
2020
#include <TComplex.h>
21-
#include <TNamed.h>
2221
#include <TH1.h>
2322
#include <THn.h>
2423
#include <THnSparse.h>
24+
#include <TNamed.h>
25+
26+
#include <experimental/type_traits>
27+
#include <vector>
2528

2629
class JFFlucAnalysis : public TNamed
2730
{
@@ -61,7 +64,6 @@ class JFFlucAnalysis : public TNamed
6164
enum HIST_THN {
6265
HIST_THN_PHIETAZ,
6366
HIST_THN_PTETA,
64-
HIST_THN_PHIETA,
6567
HIST_THN_SC_with_QC_4corr,
6668
HIST_THN_SC_with_QC_2corr,
6769
HIST_THN_SC_with_QC_2corr_gap,
@@ -98,6 +100,7 @@ class JFFlucAnalysis : public TNamed
98100
enum HIST_THN_SPARSE {
99101
HIST_THN_SPARSE_VN,
100102
HIST_THN_SPARSE_VN_VN,
103+
HIST_THN_SPARSE_MULTCORR,
101104
HIST_THN_SPARSE_COUNT
102105
};
103106
enum {
@@ -144,12 +147,17 @@ class JFFlucAnalysis : public TNamed
144147
using hasWeightEff = decltype(std::declval<T&>().weightEff());
145148
template <class T>
146149
using hasSign = decltype(std::declval<T&>().sign());
150+
template <class T>
151+
using hasMultSet = decltype(std::declval<T&>().multiplicities());
147152

148153
template <class JInputClass>
149154
inline void FillQA(JInputClass& inputInst, UInt_t type = 0u)
150155
{
151-
ph1[HIST_TH1_CENTRALITY]->Fill(fCent);
152-
ph1[HIST_TH1_IMPACTPARAM]->Fill(fImpactParameter);
156+
if (type == 0u) {
157+
ph1[HIST_TH1_CENTRALITY]->Fill(fCent);
158+
ph1[HIST_TH1_ZVERTEX]->Fill(fVertex);
159+
ph1[HIST_TH1_IMPACTPARAM]->Fill(fImpactParameter);
160+
}
153161

154162
for (auto& track : inputInst) {
155163
Double_t corrInv = 1.0;
@@ -162,11 +170,19 @@ class JFFlucAnalysis : public TNamed
162170
pht[HIST_THN_PTETA]->Fill(fCent, track.pt(), track.eta(), 0.0, corrInv);
163171
if constexpr (std::experimental::is_detected<hasWeightNUA, const JInputClassIter>::value)
164172
corrInv /= track.weightNUA();
165-
pht[HIST_THN_PHIETA]->Fill(fCent, track.phi(), track.eta(), corrInv);
166173
pht[HIST_THN_PHIETAZ]->Fill(fCent, static_cast<Double_t>(type), track.phi(), track.eta(), fVertex, corrInv);
167174
}
175+
}
168176

169-
ph1[HIST_TH1_ZVERTEX]->Fill(fVertex);
177+
template <class JEventClass>
178+
inline void FillMultSet(JEventClass& event)
179+
{
180+
//
181+
if constexpr (std::experimental::is_detected<hasMultSet, const JEventClass>::value) {
182+
// need to convert to vec of doubles since THnSparse has no way to fill vec of floats directly
183+
std::vector<double> v(event.multiplicities().begin(), event.multiplicities().end());
184+
phs[HIST_THN_SPARSE_MULTCORR]->Fill(v.data());
185+
}
170186
}
171187

172188
#define kcNH kH4 // max second dimension + 1

PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.cxx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,41 @@
1212
/// \since Sep 2024
1313

1414
#include "JFFlucAnalysisO2Hist.h"
15-
#include <vector>
16-
#include <memory>
15+
16+
#include "PWGCF/DataModel/CorrelationsDerived.h"
17+
1718
#include "CommonConstants/MathConstants.h"
1819

20+
#include <memory>
21+
#include <vector>
22+
1923
using namespace o2;
2024

21-
JFFlucAnalysisO2Hist::JFFlucAnalysisO2Hist(HistogramRegistry& registry, AxisSpec& axisMultiplicity, AxisSpec& phiAxis, AxisSpec& etaAxis, AxisSpec& zvtAxis, AxisSpec& ptAxis, AxisSpec& massAxis, const TString& folder) : JFFlucAnalysis()
25+
JFFlucAnalysisO2Hist::JFFlucAnalysisO2Hist(HistogramRegistry& registry, AxisSpec& axisMultiplicity, AxisSpec& phiAxis, AxisSpec& etaAxis, AxisSpec& zvtAxis, AxisSpec& ptAxis, AxisSpec& massAxis, uint16_t multCorrMask, const TString& folder) : JFFlucAnalysis()
2226
{
2327

2428
ph1[HIST_TH1_CENTRALITY] = std::get<std::shared_ptr<TH1>>(registry.add(Form("%s/h_cent", folder.Data()), "multiplicity/centrality", {HistType::kTH1F, {axisMultiplicity}})).get();
2529
ph1[HIST_TH1_IMPACTPARAM] = std::get<std::shared_ptr<TH1>>(registry.add(Form("%s/h_IP", folder.Data()), "impact parameter", {HistType::kTH1F, {{400, -2.0, 20.0}}})).get();
2630
ph1[HIST_TH1_ZVERTEX] = std::get<std::shared_ptr<TH1>>(registry.add(Form("%s/h_vertex", folder.Data()), "z vertex", {HistType::kTH1F, {{100, -20.0, 20.0}}})).get();
2731

32+
if (multCorrMask != 0) {
33+
std::vector<AxisSpec> multAxes;
34+
if (multCorrMask & aod::cfmultset::CentFT0C)
35+
multAxes.emplace_back(100, 0, 100, "FT0C centrality");
36+
if (multCorrMask & aod::cfmultset::MultFV0A)
37+
multAxes.emplace_back(100, 0, 100000, "V0A multiplicity");
38+
if (multCorrMask & aod::cfmultset::MultNTracksPV)
39+
multAxes.emplace_back(100, 0, 1000, "Nch PV");
40+
if (multCorrMask & aod::cfmultset::MultNTracksGlobal)
41+
multAxes.emplace_back(100, 0, 1000, "Nch Global");
42+
registry.add("multCorrelations", "Multiplicity correlations", {HistType::kTHnSparseF, multAxes});
43+
phs[HIST_THN_SPARSE_MULTCORR] = std::get<std::shared_ptr<THnSparse>>(registry.add(Form("%s/h_multcorr", folder.Data()), "multiplicity/centrality correlations", {HistType::kTHnSparseF, multAxes})).get();
44+
}
45+
2846
AxisSpec chgAxis = {3, -1.5, 1.5, "charge"};
2947
AxisSpec typeAxis = {2, -0.5, 1.5, "type"};
30-
pht[HIST_THN_PHIETAZ] = std::get<std::shared_ptr<THnSparse>>(registry.add(Form("%s/h_phietaz", folder.Data()), "multiplicity/centrality, type, phi, eta, z", {HistType::kTHnSparseF, {axisMultiplicity, typeAxis, phiAxis, etaAxis, zvtAxis}})).get();
48+
pht[HIST_THN_PHIETAZ] = std::get<std::shared_ptr<THnSparse>>(registry.add(Form("%s/h_phietaz", folder.Data()), "(corrected) multiplicity/centrality, type, phi, eta, z", {HistType::kTHnSparseF, {axisMultiplicity, typeAxis, phiAxis, etaAxis, zvtAxis}})).get();
3149
pht[HIST_THN_PTETA] = std::get<std::shared_ptr<THnSparse>>(registry.add(Form("%s/h_pteta", folder.Data()), "(corrected) multiplicity/centrality, pT, eta, charge", {HistType::kTHnSparseF, {axisMultiplicity, ptAxis, etaAxis, chgAxis}})).get();
32-
pht[HIST_THN_PHIETA] = std::get<std::shared_ptr<THnSparse>>(registry.add(Form("%s/h_phieta", folder.Data()), "(corrected) multiplicity/centrality, phi, eta", {HistType::kTHnSparseF, {axisMultiplicity, phiAxis, etaAxis}})).get();
3350
AxisSpec hAxis = {kNH, -0.5, static_cast<double>(kNH - 1) + 0.5, "#it{n}"};
3451
AxisSpec kAxis = {nKL, -0.5, static_cast<double>(nKL - 1) + 0.5, "#it{k}"};
3552
AxisSpec vnAxis = {2048, -0.1, 0.1, "#it{V}_#it{n}"};

PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define PWGCF_JCORRAN_CORE_JFFLUCANALYSISO2HIST_H_
1616

1717
#include "JFFlucAnalysis.h"
18+
1819
#include "Framework/HistogramRegistry.h"
1920

2021
using namespace o2;
@@ -23,7 +24,7 @@ using namespace o2::framework;
2324
class JFFlucAnalysisO2Hist : public JFFlucAnalysis
2425
{
2526
public:
26-
JFFlucAnalysisO2Hist(HistogramRegistry&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, const TString&);
27+
JFFlucAnalysisO2Hist(HistogramRegistry&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, uint16_t, const TString&);
2728
~JFFlucAnalysisO2Hist();
2829
};
2930

PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct jflucAnalysisTask {
5555
O2_DEFINE_CONFIGURABLE(ptmin, float, 0.2, "Minimum pt for tracks");
5656
O2_DEFINE_CONFIGURABLE(ptmax, float, 5.0, "Maximum pt for tracks");
5757
O2_DEFINE_CONFIGURABLE(cfgCentBinsForMC, int, 0, "0 = OFF and 1 = ON for data like multiplicity/centrality bins for MC process");
58+
O2_DEFINE_CONFIGURABLE(cfgMultCorrelationsMask, uint16_t, 0, "Selection bitmask for the multiplicity correlations. This should match the filter selection cfgEstimatorBitMask.")
5859

5960
ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity / centrality axis for histograms"};
6061
ConfigurableAxis phiAxis{"axisPhi", {50, 0.0, o2::constants::math::TwoPI}, "phi axis for histograms"};
@@ -78,15 +79,15 @@ struct jflucAnalysisTask {
7879
auto axisSpecZvt = AxisSpec(zvtAxis);
7980
auto axisSpecPt = AxisSpec(ptAxis);
8081
auto axisSpecMass = AxisSpec(massAxis);
81-
if (doprocessJDerived || doprocessJDerivedCorrected || doprocessCFDerived || doprocessCFDerivedCorrected || doprocessMCCFDerived) {
82-
pcf = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecPt, axisSpecMass, "jfluc");
82+
if (doprocessJDerived || doprocessJDerivedCorrected || doprocessCFDerived || doprocessCFDerivedCorrected || doprocessCFDerivedMultSet || doprocessCFDerivedMultSetCorrected || doprocessMCCFDerived) {
83+
pcf = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecPt, axisSpecMass, cfgMultCorrelationsMask, "jfluc");
8384
pcf->AddFlags(JFFlucAnalysis::kFlucEbEWeighting);
8485
pcf->UserCreateOutputObjects();
8586
} else {
8687
pcf = 0;
8788
}
8889
if (doprocessCF2ProngDerived || doprocessCF2ProngDerivedCorrected) {
89-
pcf2Prong = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecPt, axisSpecMass, "jfluc2prong");
90+
pcf2Prong = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecPt, axisSpecMass, cfgMultCorrelationsMask, "jfluc2prong");
9091
pcf2Prong->AddFlags(JFFlucAnalysis::kFlucEbEWeighting);
9192
pcf2Prong->UserCreateOutputObjects();
9293

@@ -95,6 +96,8 @@ struct jflucAnalysisTask {
9596
} else {
9697
pcf2Prong = 0;
9798
}
99+
if ((doprocessCFDerivedMultSet || doprocessCFDerivedMultSetCorrected) && cfgMultCorrelationsMask == 0)
100+
LOGF(fatal, "cfgMultCorrelationsMask can not be 0 when MultSet process functions are in use.");
98101
}
99102

100103
template <class T>
@@ -107,6 +110,7 @@ struct jflucAnalysisTask {
107110
pcf->SetEventCentrality(collision.multiplicity());
108111
pcf->SetEventVertex(collision.posZ());
109112
pcf->FillQA(tracks);
113+
pcf->FillMultSet(collision);
110114
qvecs.Calculate(tracks, etamin, etamax);
111115
pcf->SetJQVectors(&qvecs);
112116
pcf->UserExec("");
@@ -158,6 +162,22 @@ struct jflucAnalysisTask {
158162
}
159163
PROCESS_SWITCH(jflucAnalysisTask, processCFDerivedCorrected, "Process CF derived data with corrections", true);
160164

165+
void processCFDerivedMultSet(soa::Join<aod::CFCollisions, aod::CFMultSets>::iterator const& collision, soa::Filtered<aod::CFTracks> const& tracks)
166+
{
167+
if (std::popcount(cfgMultCorrelationsMask.value) != static_cast<int>(collision.multiplicities().size()))
168+
LOGF(fatal, "Multiplicity selections (cfgMultCorrelationsMask = 0x%x) do not match the size of the table column (%ld). The histogram filling relies on the preservation of order.", cfgMultCorrelationsMask.value, collision.multiplicities().size());
169+
analyze(collision, tracks);
170+
}
171+
PROCESS_SWITCH(jflucAnalysisTask, processCFDerivedMultSet, "Process CF derived data with multiplicity sets", false);
172+
173+
void processCFDerivedMultSetCorrected(soa::Join<aod::CFCollisions, aod::CFMultSets>::iterator const& collision, soa::Filtered<soa::Join<aod::CFTracks, aod::JWeights>> const& tracks)
174+
{
175+
if (std::popcount(cfgMultCorrelationsMask.value) != static_cast<int>(collision.multiplicities().size()))
176+
LOGF(fatal, "Multiplicity selections (cfgMultCorrelationsMask = 0x%x) do not match the size of the table column (%ld). The histogram filling relies on the preservation of order.", cfgMultCorrelationsMask.value, collision.multiplicities().size());
177+
analyze(collision, tracks);
178+
}
179+
PROCESS_SWITCH(jflucAnalysisTask, processCFDerivedMultSetCorrected, "Process CF derived data with corrections and multiplicity sets", false);
180+
161181
void processCF2ProngDerived(aod::CFCollision const& collision, soa::Filtered<aod::CFTracks> const& tracks, soa::Filtered<aod::CF2ProngTracks> const& p2tracks)
162182
{
163183
analyze(collision, p2tracks, tracks);

PWGCF/TableProducer/filterCorrelations.cxx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,6 @@ struct FilterCF {
6464
kPIDProton = BIT(1)
6565
};
6666

67-
enum MultiplicityEstimators : uint8_t {
68-
kCentFT0C = BIT(0),
69-
kMultFV0A = BIT(1),
70-
kMultNTracksPV = BIT(2),
71-
kMultNTracksGlobal = BIT(3),
72-
};
73-
7467
// Configuration
7568
O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 7.0f, "Accepted z-vertex range")
7669
O2_DEFINE_CONFIGURABLE(cfgCutPt, float, 0.5f, "Minimal pT for tracks")
@@ -271,13 +264,13 @@ struct FilterCF {
271264

272265
if constexpr (std::experimental::is_detected<HasMultTables, C1>::value) {
273266
multiplicities.clear();
274-
if (cfgEstimatorBitMask & kCentFT0C)
267+
if (cfgEstimatorBitMask & aod::cfmultset::CentFT0C)
275268
multiplicities.push_back(collision.centFT0C());
276-
if (cfgEstimatorBitMask & kMultFV0A)
269+
if (cfgEstimatorBitMask & aod::cfmultset::MultFV0A)
277270
multiplicities.push_back(collision.multFV0A());
278-
if (cfgEstimatorBitMask & kMultNTracksPV)
271+
if (cfgEstimatorBitMask & aod::cfmultset::MultNTracksPV)
279272
multiplicities.push_back(collision.multNTracksPV());
280-
if (cfgEstimatorBitMask & kMultNTracksGlobal)
273+
if (cfgEstimatorBitMask & aod::cfmultset::MultNTracksGlobal)
281274
multiplicities.push_back(collision.multNTracksGlobal());
282275
outputMultSets(multiplicities);
283276
}

0 commit comments

Comments
 (0)