Skip to content

Commit b32abe2

Browse files
authored
Corr update (#4403)
* adding equidistant binning support for StepTHn * adding control histograms
1 parent bea1e90 commit b32abe2

File tree

5 files changed

+88
-74
lines changed

5 files changed

+88
-74
lines changed

Analysis/Core/include/Analysis/CorrelationContainer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class CorrelationContainer : public TNamed
145145
static TString combineBinning(TString defaultBinning, TString customBinning);
146146

147147
protected:
148-
Double_t* getBinning(const char* configuration, const char* tag, Int_t& nBins);
148+
std::vector<Double_t> getBinning(const char* configuration, const char* tag, Int_t& nBins);
149149
void weightHistogram(TH3* hist1, TH1* hist2);
150150
void multiplyHistograms(THnBase* grid, THnBase* target, TH1* histogram, Int_t var1, Int_t var2);
151151

Analysis/Core/include/Analysis/StepTHn.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class StepTHnBase : public TNamed
2626
{
2727
public:
2828
StepTHnBase() : TNamed() {}
29-
StepTHnBase(const Char_t* name, const Char_t* title, const Int_t nSteps, const Int_t nAxis, Int_t* nBins, Double_t** binLimits, const char** axisTitles) : TNamed(name, title) {}
29+
StepTHnBase(const Char_t* name, const Char_t* title, const Int_t nSteps, const Int_t nAxis, Int_t* nBins, std::vector<Double_t> binLimits[], const char** axisTitles) : TNamed(name, title) {}
3030

3131
virtual void Fill(const Double_t* var, Int_t istep, Double_t weight = 1.) = 0;
3232

@@ -44,14 +44,12 @@ class StepTHnBase : public TNamed
4444
ClassDef(StepTHnBase, 1) // StepTHn base class
4545
};
4646

47-
// TODO equidistant binning for THn
48-
4947
template <class TemplateArray, typename TemplateType>
5048
class StepTHn : public StepTHnBase
5149
{
5250
public:
5351
StepTHn();
54-
StepTHn(const Char_t* name, const Char_t* title, const Int_t nSteps, const Int_t nAxis, Int_t* nBins, Double_t** binLimits, const char** axisTitles);
52+
StepTHn(const Char_t* name, const Char_t* title, const Int_t nSteps, const Int_t nAxis, Int_t* nBins, std::vector<Double_t> binLimits[], const char** axisTitles);
5553
~StepTHn() override;
5654

5755
void Fill(const Double_t* var, Int_t istep, Double_t weight = 1.) override;

Analysis/Core/src/CorrelationContainer.cxx

Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ CorrelationContainer::CorrelationContainer(const char* name, const char* objTitl
8686
{
8787
// Constructor
8888

89+
using BinList = std::vector<Double_t>;
90+
8991
if (strlen(reqHist) == 0)
9092
return;
9193

@@ -96,12 +98,12 @@ CorrelationContainer::CorrelationContainer(const char* name, const char* objTitl
9698
// track level
9799
Int_t nTrackVars = 4; // eta vs pT vs pT,lead (vs delta phi) vs multiplicity
98100
Int_t iTrackBin[7];
99-
Double_t* trackBins[7];
101+
BinList trackBins[7];
100102
const char* trackAxisTitle[7];
101103

102104
// eta
103105
Int_t nEtaBins = -1;
104-
Double_t* etaBins = getBinning(binning, "eta", nEtaBins);
106+
BinList etaBins = getBinning(binning, "eta", nEtaBins);
105107
const char* etaTitle = "#eta";
106108

107109
iTrackBin[0] = nEtaBins;
@@ -110,41 +112,41 @@ CorrelationContainer::CorrelationContainer(const char* name, const char* objTitl
110112

111113
// delta eta
112114
Int_t nDeltaEtaBins = -1;
113-
Double_t* deltaEtaBins = getBinning(binning, "delta_eta", nDeltaEtaBins);
115+
BinList deltaEtaBins = getBinning(binning, "delta_eta", nDeltaEtaBins);
114116

115117
// pT
116118
trackBins[1] = getBinning(binning, "p_t_assoc", iTrackBin[1]);
117119
trackAxisTitle[1] = "p_{T} (GeV/c)";
118120

119121
// pT, fine
120122
Int_t npTBinsFine = -1;
121-
Double_t* pTBinsFine = getBinning(binning, "p_t_eff", npTBinsFine);
123+
BinList pTBinsFine = getBinning(binning, "p_t_eff", npTBinsFine);
122124

123125
// pT,lead binning 1
124126
Int_t nLeadingpTBins = -1;
125-
Double_t* leadingpTBins = getBinning(binning, "p_t_leading", nLeadingpTBins);
127+
BinList leadingpTBins = getBinning(binning, "p_t_leading", nLeadingpTBins);
126128

127129
// pT,lead binning 2
128130
Int_t nLeadingpTBins2 = -1;
129-
Double_t* leadingpTBins2 = getBinning(binning, "p_t_leading_course", nLeadingpTBins2);
131+
BinList leadingpTBins2 = getBinning(binning, "p_t_leading_course", nLeadingpTBins2);
130132

131133
// phi,lead
132134
Int_t nLeadingPhiBins = -1;
133-
Double_t* leadingPhiBins = getBinning(binning, "delta_phi", nLeadingPhiBins);
135+
BinList leadingPhiBins = getBinning(binning, "delta_phi", nLeadingPhiBins);
134136

135137
trackBins[3] = getBinning(binning, "multiplicity", iTrackBin[3]);
136138
trackAxisTitle[3] = "multiplicity";
137139

138140
// particle species
139141
const Int_t kNSpeciesBins = 4; // pi, K, p, rest
140-
Double_t speciesBins[] = {-0.5, 0.5, 1.5, 2.5, 3.5};
142+
BinList speciesBins = {-0.5, 0.5, 1.5, 2.5, 3.5};
141143

142144
// vtx-z axis
143145
const char* vertexTitle = "z-vtx (cm)";
144146
Int_t nVertexBins = -1;
145-
Double_t* vertexBins = getBinning(binning, "vertex", nVertexBins);
147+
BinList vertexBins = getBinning(binning, "vertex", nVertexBins);
146148
Int_t nVertexBinsEff = -1;
147-
Double_t* vertexBinsEff = getBinning(binning, "vertex_eff", nVertexBinsEff);
149+
BinList vertexBinsEff = getBinning(binning, "vertex_eff", nVertexBinsEff);
148150

149151
Int_t useVtxAxis = 0;
150152
Int_t useAliTHn = 1; // 0 = don't use | 1 = with float | 2 = with double
@@ -258,7 +260,7 @@ CorrelationContainer::CorrelationContainer(const char* name, const char* objTitl
258260
// event level
259261
Int_t nEventVars = 2;
260262
Int_t iEventBin[4] = {0};
261-
Double_t* eventBins[4] = {nullptr};
263+
BinList eventBins[4];
262264
const char* eventAxisTitle[4] = {nullptr};
263265

264266
// track 3rd and 4th axis --> event 1st and 2nd axis
@@ -305,15 +307,7 @@ CorrelationContainer::CorrelationContainer(const char* name, const char* objTitl
305307

306308
mTrackHistEfficiency = new StepTHnD("mTrackHistEfficiency", "Tracking efficiency", 6, 5, iTrackBin, trackBins, trackAxisTitle);
307309

308-
mEventCount = new TH2F("mEventCount", ";step;centrality;count", fgkCFSteps + 2, -2.5, -0.5 + fgkCFSteps, iEventBin[1], eventBins[1]);
309-
310-
delete[] deltaEtaBins;
311-
delete[] pTBinsFine;
312-
delete[] leadingpTBins;
313-
delete[] leadingpTBins2;
314-
delete[] leadingPhiBins;
315-
delete[] vertexBins;
316-
delete[] vertexBinsEff;
310+
mEventCount = new TH2F("mEventCount", ";step;centrality;count", fgkCFSteps + 2, -2.5, -0.5 + fgkCFSteps, iEventBin[1], &(eventBins[1])[0]);
317311
}
318312

319313
TString CorrelationContainer::combineBinning(TString defaultBinning, TString customBinning)
@@ -338,29 +332,38 @@ TString CorrelationContainer::combineBinning(TString defaultBinning, TString cus
338332
return binningStr;
339333
}
340334

341-
Double_t* CorrelationContainer::getBinning(const char* configuration, const char* tag, Int_t& nBins)
335+
std::vector<Double_t> CorrelationContainer::getBinning(const char* configuration, const char* tag, Int_t& nBins)
342336
{
343337
// takes the binning from <configuration> identified by <tag>
344338
// configuration syntax example:
345-
// eta: 2.4, -2.3, -2.2, -2.1, -2.0, -1.9, -1.8, -1.7, -1.6, -1.5, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4
346-
// phi: .....
339+
// equidistant binning:
340+
// eta: 48 | -2.4, 2.4
341+
// variable-width binning:
342+
// eta: -2.4, -2.3, -2.2, -2.1, -2.0, -1.9, -1.8, -1.7, -1.6, -1.5, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4
347343
//
348344
// returns bin edges which have to be deleted by the caller
349345

346+
std::vector<Double_t> bins;
350347
TString config(configuration);
351348
TObjArray* lines = config.Tokenize("\n");
352349
for (Int_t i = 0; i < lines->GetEntriesFast(); i++) {
353350
TString line(lines->At(i)->GetName());
354351
if (line.BeginsWith(TString(tag) + ":")) {
355352
line.Remove(0, strlen(tag) + 1);
356353
line.ReplaceAll(" ", "");
354+
if (line.Contains("|")) {
355+
// equidistant binning
356+
nBins = TString(line(0, line.Index("|"))).Atoi();
357+
line.Remove(0, line.Index("|") + 1);
358+
} else {
359+
// variable-width binning
360+
nBins = line.CountChar(',');
361+
}
357362
TObjArray* binning = line.Tokenize(",");
358-
Double_t* bins = new Double_t[binning->GetEntriesFast()];
359-
for (Int_t j = 0; j < binning->GetEntriesFast(); j++)
360-
bins[j] = TString(binning->At(j)->GetName()).Atof();
361-
362-
nBins = binning->GetEntriesFast() - 1;
363-
363+
//Double_t* bins = new Double_t[binning->GetEntriesFast()];
364+
for (Int_t j = 0; j < binning->GetEntriesFast(); j++) {
365+
bins.push_back(TString(binning->At(j)->GetName()).Atof());
366+
}
364367
delete binning;
365368
delete lines;
366369
return bins;
@@ -369,7 +372,7 @@ Double_t* CorrelationContainer::getBinning(const char* configuration, const char
369372

370373
delete lines;
371374
LOGF(fatal, "Tag %s not found in %s", tag, configuration);
372-
return nullptr;
375+
return bins;
373376
}
374377

375378
//_____________________________________________________________________________
@@ -1906,21 +1909,7 @@ THnBase* CorrelationContainer::changeToThn(THnBase* sparse)
19061909
{
19071910
// change the object to THn for faster processing
19081911

1909-
// convert to THn (SEGV's for some strange reason...)
1910-
// x = THn::CreateHn("a", "a", sparse);
1911-
1912-
// own implementation
1913-
Int_t nBins[10];
1914-
for (Int_t i = 0; i < sparse->GetNdimensions(); i++)
1915-
nBins[i] = sparse->GetAxis(i)->GetNbins();
1916-
THn* tmpTHn = new THnF(Form("%s_thn", sparse->GetName()), sparse->GetTitle(), sparse->GetNdimensions(), nBins, nullptr, nullptr);
1917-
for (Int_t i = 0; i < sparse->GetNdimensions(); i++) {
1918-
tmpTHn->SetBinEdges(i, sparse->GetAxis(i)->GetXbins()->GetArray());
1919-
tmpTHn->GetAxis(i)->SetTitle(sparse->GetAxis(i)->GetTitle());
1920-
}
1921-
tmpTHn->RebinnedAdd(sparse);
1922-
1923-
return tmpTHn;
1912+
return THn::CreateHn(Form("%s_thn", sparse->GetName()), sparse->GetTitle(), sparse);
19241913
}
19251914

19261915
void CorrelationContainer::fillEvent(Float_t centrality, CFStep step)

Analysis/Core/src/StepTHn.cxx

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,37 +44,50 @@ templateClassImp(StepTHn)
4444
mLastBins(nullptr),
4545
mPrototype(nullptr)
4646
{
47-
// Constructor
47+
// Default constructor (for streaming)
4848
}
4949

5050
template <class TemplateArray, typename TemplateType>
51-
StepTHn<TemplateArray, TemplateType>::StepTHn(const Char_t* name, const Char_t* title, const Int_t nSteps, const Int_t nAxis, Int_t* nBins, Double_t** binEdges, const char** axisTitles) : StepTHnBase(name, title, nSteps, nAxis, nBins, binEdges, axisTitles),
52-
mNBins(0),
53-
mNVars(nAxis),
54-
mNSteps(nSteps),
55-
mValues(nullptr),
56-
mSumw2(nullptr),
57-
mTarget(nullptr),
58-
mAxisCache(nullptr),
59-
mNbinsCache(nullptr),
60-
mLastVars(nullptr),
61-
mLastBins(nullptr),
62-
mPrototype(nullptr)
51+
StepTHn<TemplateArray, TemplateType>::StepTHn(const Char_t* name, const Char_t* title, const Int_t nSteps, const Int_t nAxis, Int_t* nBins, std::vector<Double_t> binEdges[], const char** axisTitles) : StepTHnBase(name, title, nSteps, nAxis, nBins, binEdges, axisTitles),
52+
mNBins(0),
53+
mNVars(nAxis),
54+
mNSteps(nSteps),
55+
mValues(nullptr),
56+
mSumw2(nullptr),
57+
mTarget(nullptr),
58+
mAxisCache(nullptr),
59+
mNbinsCache(nullptr),
60+
mLastVars(nullptr),
61+
mLastBins(nullptr),
62+
mPrototype(nullptr)
6363
{
6464
// Constructor
65+
//
66+
// This will create a container for <nSteps> steps. The memory for such a step is only allocated once the first value is filled.
67+
// Therefore you can easily create many steps which are only filled under certain analysis settings.
68+
// For each step a <nAxis> dimensional histogram is created.
69+
// The axis have <nBins[i]> bins. The bin edges are given in <binEdges[i]>. If there are only two bin edges, equidistant binning is set.
6570

6671
mNBins = 1;
6772
for (Int_t i = 0; i < mNVars; i++)
6873
mNBins *= nBins[i];
6974

70-
// TODO this should be double for StepTHnD
71-
72-
mPrototype = new THnSparseF(Form("%s_sparse", name), title, nAxis, nBins);
75+
if constexpr (std::is_same_v<TemplateType, Double_t>) {
76+
mPrototype = new THnSparseD(Form("%s_sparse", name), title, nAxis, nBins);
77+
} else {
78+
mPrototype = new THnSparseF(Form("%s_sparse", name), title, nAxis, nBins);
79+
}
7380
for (Int_t i = 0; i < mNVars; i++) {
74-
mPrototype->SetBinEdges(i, binEdges[i]);
81+
if (nBins[i] + 1 == binEdges[i].size()) { // variable-width binning
82+
mPrototype->GetAxis(i)->Set(nBins[i], &(binEdges[i])[0]);
83+
} else if (binEdges[i].size() == 2) { // equidistant binning
84+
mPrototype->GetAxis(i)->Set(nBins[i], binEdges[i][0], binEdges[i][1]);
85+
} else {
86+
LOGF(fatal, "Invalid binning information for axis %d with %d bins and %d entries for bin edges", i, nBins[i], binEdges[i].size());
87+
}
88+
LOGF(debug, "Histogram %s Axis %d created with %d bins and %d edges", name, i, nBins[i], binEdges[i].size());
7589
mPrototype->GetAxis(i)->SetTitle(axisTitles[i]);
7690
}
77-
7891
init();
7992
}
8093

0 commit comments

Comments
 (0)