Skip to content

Commit cfa1fd2

Browse files
committed
[PWGCF] Femto: Add D0 QA task
1 parent ba8868c commit cfa1fd2

4 files changed

Lines changed: 347 additions & 18 deletions

File tree

PWGCF/Femto/Core/charmHadronHistManager.h

Lines changed: 211 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,35 @@ enum CharmHadronHist {
4444
kMass,
4545
kSign,
4646
kPtVsMass,
47+
kPtVsEta,
48+
kPtVsPhi,
49+
kPhiVsEta,
50+
kMassD0,
51+
kMassD0bar,
52+
kMlBkg,
53+
kMlPrompt,
54+
kMlNonPrompt,
55+
kCpa,
56+
kCpaXY,
57+
kDecayLength,
58+
kDecayLengthXY,
59+
kImpactParameterProduct,
60+
kCosThetaStar,
4761

4862
kCharmHadronHistLast
4963
};
5064

5165
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
52-
#define CHARMHADRON_DEFAULT_BINNING(defaultMassMin, defaultMassMax) \
53-
o2::framework::ConfigurableAxis pt{"pt", {{600, 0, 6}}, "Pt"}; \
54-
o2::framework::ConfigurableAxis eta{"eta", {{300, -1.5, 1.5}}, "Eta"}; \
55-
o2::framework::ConfigurableAxis phi{"phi", {{720, 0, 1.f * o2::constants::math::TwoPI}}, "Phi"}; \
56-
o2::framework::ConfigurableAxis mass{"mass", {{200, (defaultMassMin), (defaultMassMax)}}, "Mass"}; \
57-
o2::framework::ConfigurableAxis sign{"sign", {{3, -1.5, 1.5}}, "Sign"}; \
58-
o2::framework::ConfigurableAxis charmHadrons{"charmHadrons", {{8001, -4000.5, 4000.5}}, "MC ONLY: CharmHadrons codes of reconstructed D0s"};
66+
#define CHARMHADRON_DEFAULT_BINNING(defaultMassMin, defaultMassMax) \
67+
o2::framework::ConfigurableAxis pt{"pt", {{600, 0, 6}}, "Pt"}; \
68+
o2::framework::ConfigurableAxis eta{"eta", {{300, -1.5, 1.5}}, "Eta"}; \
69+
o2::framework::ConfigurableAxis phi{"phi", {{720, 0, 1.f * o2::constants::math::TwoPI}}, "Phi"}; \
70+
o2::framework::ConfigurableAxis mass{"mass", {{200, (defaultMassMin), (defaultMassMax)}}, "Mass"}; \
71+
o2::framework::ConfigurableAxis sign{"sign", {{3, -1.5, 1.5}}, "Sign"}; \
72+
o2::framework::ConfigurableAxis charmHadrons{"charmHadrons", {{8001, -4000.5, 4000.5}}, "MC ONLY: CharmHadrons codes of reconstructed D0s"}; \
73+
o2::framework::ConfigurableAxis pt2d{"pt2d", {{240, 0, 6}}, "Pt for 2D QA"}; \
74+
o2::framework::ConfigurableAxis eta2d{"eta2d", {{200, -1.5, 1.5}}, "Eta for 2D QA"}; \
75+
o2::framework::ConfigurableAxis phi2d{"phi2d", {{200, 0, 1.f * o2::constants::math::TwoPI}}, "Phi for 2D QA"};
5976

6077
template <auto& Prefix>
6178
struct ConfD0Binning : o2::framework::ConfigurableGroup {
@@ -68,6 +85,21 @@ struct ConfD0Binning : o2::framework::ConfigurableGroup {
6885
constexpr const char PrefixD0Binning1[] = "D0Binning1";
6986
using ConfD0Binning1 = ConfD0Binning<PrefixD0Binning1>;
7087

88+
template <auto& Prefix>
89+
struct ConfD0QaBinning : o2::framework::ConfigurableGroup {
90+
std::string prefix = Prefix;
91+
o2::framework::Configurable<bool> plotTopology{"plotTopology", true, "Generate topological QA plots (cpa, decayLength, impactParameterProduct, cosThetaStar)"};
92+
o2::framework::ConfigurableAxis massD0{"massD0", {{200, 1.7, 2.0}}, "Mass for D0 (Kpi) hypothesis"};
93+
o2::framework::ConfigurableAxis massD0bar{"massD0bar", {{200, 1.7, 2.0}}, "Mass for D0bar (piK) hypothesis"};
94+
o2::framework::ConfigurableAxis mlScore{"mlScore", {{100, 0.f, 1.f}}, "BDT ML score (bkg/prompt/non-prompt)"};
95+
o2::framework::ConfigurableAxis cpa{"cpa", {{100, 0.9f, 1.f}}, "Cosine of pointing angle"};
96+
o2::framework::ConfigurableAxis decayLength{"decayLength", {{200, 0.f, 0.2f}}, "Decay length (cm)"};
97+
o2::framework::ConfigurableAxis impactParameterProduct{"impactParameterProduct", {{200, -0.001f, 0.001f}}, "Product of daughter impact parameters (cm^2)"};
98+
o2::framework::ConfigurableAxis cosThetaStar{"cosThetaStar", {{100, -1.f, 1.f}}, "Cosine of decay angle in D0 rest frame"};
99+
};
100+
101+
constexpr const char PrefixD0QaBinning1[] = "D0QaBinning1";
102+
using ConfD0QaBinning1 = ConfD0QaBinning<PrefixD0QaBinning1>;
71103

72104
// must be in sync with enum CharmHadronHist
73105
// the enum gives the correct index in the array
@@ -77,17 +109,35 @@ constexpr std::array<histmanager::HistInfo<CharmHadronHist>, kCharmHadronHistLas
77109
{kPhi, o2::framework::HistType::kTH1F, "hPhi", "Azimuthal angle; #varphi; Entries"},
78110
{kMass, o2::framework::HistType::kTH1F, "hMass", "Invariant Mass; m_{Inv} (GeV/#it{c}^{2}); Entries"},
79111
{kSign, o2::framework::HistType::kTH1F, "hSign", "Sign (-1 -> D0bar, +1 -> D0); sign; Entries"},
80-
{kPtVsMass, o2::framework::HistType::kTH2F, "hPtVsMass", "Transverse momentum vs invariant mass; p_{T} (GeV/#it{c}); m_{Inv} (GeV/#it{c}^{2})"}},
112+
{kPtVsMass, o2::framework::HistType::kTH2F, "hPtVsMass", "Transverse momentum vs invariant mass; p_{T} (GeV/#it{c}); m_{Inv} (GeV/#it{c}^{2})"},
113+
{kPtVsEta, o2::framework::HistType::kTH2F, "hPtVsEta", "p_{T} vs #eta; p_{T} (GeV/#it{c}); #eta"},
114+
{kPtVsPhi, o2::framework::HistType::kTH2F, "hPtVsPhi", "p_{T} vs #varphi; p_{T} (GeV/#it{c}); #varphi"},
115+
{kPhiVsEta, o2::framework::HistType::kTH2F, "hPhiVsEta", "#varphi vs #eta; #varphi; #eta"},
116+
{kMassD0, o2::framework::HistType::kTH1F, "hMassD0", "D0 (K#pi) mass; m_{K#pi} (GeV/#it{c}^{2}); Entries"},
117+
{kMassD0bar, o2::framework::HistType::kTH1F, "hMassD0bar", "#bar{D0} (#piK) mass; m_{#piK} (GeV/#it{c}^{2}); Entries"},
118+
{kMlBkg, o2::framework::HistType::kTH1F, "hMlBkg", "BDT background score; ML score (bkg); Entries"},
119+
{kMlPrompt, o2::framework::HistType::kTH1F, "hMlPrompt", "BDT prompt score; ML score (prompt); Entries"},
120+
{kMlNonPrompt, o2::framework::HistType::kTH1F, "hMlNonPrompt", "BDT non-prompt score; ML score (non-prompt); Entries"},
121+
{kCpa, o2::framework::HistType::kTH1F, "hCpa", "Cosine of pointing angle; cos(#alpha); Entries"},
122+
{kCpaXY, o2::framework::HistType::kTH1F, "hCpaXY", "Cosine of pointing angle (XY); cos(#alpha)_{XY}; Entries"},
123+
{kDecayLength, o2::framework::HistType::kTH1F, "hDecayLength", "Decay length; L (cm); Entries"},
124+
{kDecayLengthXY, o2::framework::HistType::kTH1F, "hDecayLengthXY", "Decay length (XY); L_{XY} (cm); Entries"},
125+
{kImpactParameterProduct, o2::framework::HistType::kTH1F, "hImpactParameterProduct", "Product of daughter impact parameters; d_{0}^{K} #times d_{0}^{#pi} (cm^{2}); Entries"},
126+
{kCosThetaStar, o2::framework::HistType::kTH1F, "hCosThetaStar", "Cosine of decay angle in D0 rest frame; cos(#theta*); Entries"}},
81127
};
82128

83129
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
84-
#define CHARMHADRON_HIST_ANALYSIS_MAP(conf) \
85-
{kPt, {(conf).pt}}, \
86-
{kEta, {(conf).eta}}, \
87-
{kPhi, {(conf).phi}}, \
88-
{kMass, {(conf).mass}}, \
89-
{kSign, {(conf).sign}}, \
90-
{kPtVsMass, {(conf).pt, (conf).mass}},
130+
#define CHARMHADRON_HIST_ANALYSIS_MAP(conf) \
131+
{kPt, {(conf).pt}}, \
132+
{kEta, {(conf).eta}}, \
133+
{kPhi, {(conf).phi}}, \
134+
{kMass, {(conf).mass}}, \
135+
{kSign, {(conf).sign}}, \
136+
{kPtVsMass, {(conf).pt, (conf).mass}}, \
137+
{kPtVsEta, {(conf).pt2d, (conf).eta2d}}, \
138+
{kPtVsPhi, {(conf).pt2d, (conf).phi2d}}, \
139+
{kPhiVsEta, {(conf).phi2d, (conf).eta2d}},
140+
91141

92142
template <typename T>
93143
auto makeD0HistSpecMap(const T& confBinningAnalysis)
@@ -96,13 +146,37 @@ auto makeD0HistSpecMap(const T& confBinningAnalysis)
96146
CHARMHADRON_HIST_ANALYSIS_MAP(confBinningAnalysis)};
97147
}
98148

149+
150+
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
151+
#define CHARMHADRON_HIST_QA_MAP(conf) \
152+
{kMassD0, {(conf).massD0}}, \
153+
{kMassD0bar, {(conf).massD0bar}}, \
154+
{kMlBkg, {(conf).mlScore}}, \
155+
{kMlPrompt, {(conf).mlScore}}, \
156+
{kMlNonPrompt, {(conf).mlScore}}, \
157+
{kCpa, {(conf).cpa}}, \
158+
{kCpaXY, {(conf).cpa}}, \
159+
{kDecayLength, {(conf).decayLength}}, \
160+
{kDecayLengthXY, {(conf).decayLength}}, \
161+
{kImpactParameterProduct, {(conf).impactParameterProduct}}, \
162+
{kCosThetaStar, {(conf).cosThetaStar}},
163+
164+
template <typename T>
165+
auto makeD0QaHistSpecMap(const T& confBinningQa)
166+
{
167+
return std::map<CharmHadronHist, std::vector<o2::framework::AxisSpec>>{
168+
CHARMHADRON_HIST_QA_MAP(confBinningQa)};
169+
}
170+
99171
#undef CHARMHADRON_HIST_ANALYSIS_MAP
172+
#undef CHARMHADRON_HIST_QA_MAP
100173

101174
// prefixes for the output directories in the histogram registry
102175
constexpr char PrefixD01[] = "D01/";
103176
constexpr char PrefixD02[] = "D02/";
104-
177+
constexpr char PrefixD0Qa[] = "D0QA/";
105178
constexpr std::string_view AnalysisDir = "Analysis/";
179+
constexpr std::string_view QaDir = "QA/";
106180

107181
/// \class CharmHadronHistManager
108182
/// \brief Class for histogramming charm hadron properties
@@ -160,6 +234,58 @@ class CharmHadronHistManager
160234
}
161235
}
162236

237+
// init for analysis and qa
238+
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4>
239+
void init(o2::framework::HistogramRegistry* registry,
240+
std::map<CharmHadronHist, std::vector<o2::framework::AxisSpec>> const& CharmHadronSpecs,
241+
std::map<CharmHadronHist, std::vector<o2::framework::AxisSpec>> const& CharmHadronQaSpecs,
242+
T1 const& ConfCharmHadronSelection,
243+
T2 const& ConfCharmHadronQaBinning,
244+
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> const& Prong0Specs,
245+
T3 const& ConfProng0BinningQa,
246+
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> const& Prong1Specs,
247+
T4 const& ConfProng1BinningQa)
248+
{
249+
mHistogramRegistry = registry;
250+
mPdgCode = std::abs(ConfCharmHadronSelection.pdgCodeAbs.value);
251+
this->enableOptionalHistograms(ConfCharmHadronQaBinning);
252+
253+
// in PWGHF the prong charge is fixed by the reconstruction: prong0 is always the positive
254+
// daughter, prong1 the negative one. The D0/D0bar hypothesis only swaps which prong is the
255+
// pion and which is the kaon, not their charge.
256+
int prong0PdgCodeAbs = 0;
257+
int prong1PdgCodeAbs = 0;
258+
const int absCharge = 1;
259+
const int signPlus = 1;
260+
const int signMinus = -1;
261+
262+
constexpr int pdgD0 = 421; // not defined in ROOT's TPDGCode.h
263+
if (mPdgCode == pdgD0) {
264+
if (ConfCharmHadronSelection.sign.value > 0) {
265+
// D0 -> pi+ K-
266+
prong0PdgCodeAbs = std::abs(PDG_t::kPiPlus);
267+
prong1PdgCodeAbs = std::abs(PDG_t::kKMinus);
268+
} else {
269+
// D0bar -> K+ pi-
270+
mPdgCode = -1 * mPdgCode; // switch sign for D0bar
271+
prong0PdgCodeAbs = std::abs(PDG_t::kKPlus);
272+
prong1PdgCodeAbs = std::abs(PDG_t::kPiMinus);
273+
}
274+
} else {
275+
LOG(fatal) << "PDG code for charm hadron has to be D0 (421)";
276+
}
277+
278+
mProng0Manager.template init<mode>(registry, Prong0Specs, absCharge, signPlus, prong0PdgCodeAbs, ConfProng0BinningQa);
279+
mProng1Manager.template init<mode>(registry, Prong1Specs, absCharge, signMinus, prong1PdgCodeAbs, ConfProng1BinningQa);
280+
281+
if constexpr (modes::isFlagSet(mode, modes::Mode::kReco)) {
282+
this->initAnalysis(CharmHadronSpecs);
283+
}
284+
if constexpr (modes::isFlagSet(mode, modes::Mode::kQa)) {
285+
this->initQa(CharmHadronQaSpecs);
286+
}
287+
}
288+
163289
template <modes::Mode mode, typename T1, typename T2>
164290
void fill(T1 const& charmHadronCandidate, T2 const& tracks)
165291
{
@@ -171,9 +297,18 @@ class CharmHadronHistManager
171297
if constexpr (modes::isFlagSet(mode, modes::Mode::kReco)) {
172298
this->fillAnalysis(charmHadronCandidate);
173299
}
300+
if constexpr (modes::isFlagSet(mode, modes::Mode::kQa)) {
301+
this->fillQa(charmHadronCandidate);
302+
}
174303
}
175304

176305
private:
306+
template <typename T>
307+
void enableOptionalHistograms(T const& ConfCharmHadronQaBinning)
308+
{
309+
mPlotTopology = ConfCharmHadronQaBinning.plotTopology.value;
310+
}
311+
177312
void initAnalysis(std::map<CharmHadronHist, std::vector<o2::framework::AxisSpec>> const& CharmHadronSpecs)
178313
{
179314
std::string analysisDir = std::string(charmHadronPrefix) + std::string(AnalysisDir);
@@ -183,6 +318,9 @@ class CharmHadronHistManager
183318
mHistogramRegistry->add(analysisDir + getHistNameV2(kMass, HistTable), getHistDesc(kMass, HistTable), getHistType(kMass, HistTable), {CharmHadronSpecs.at(kMass)});
184319
mHistogramRegistry->add(analysisDir + getHistNameV2(kSign, HistTable), getHistDesc(kSign, HistTable), getHistType(kSign, HistTable), {CharmHadronSpecs.at(kSign)});
185320
mHistogramRegistry->add(analysisDir + getHistNameV2(kPtVsMass, HistTable), getHistDesc(kPtVsMass, HistTable), getHistType(kPtVsMass, HistTable), {CharmHadronSpecs.at(kPtVsMass)});
321+
mHistogramRegistry->add(analysisDir + getHistNameV2(kPtVsEta, HistTable), getHistDesc(kPtVsEta, HistTable), getHistType(kPtVsEta, HistTable), {CharmHadronSpecs.at(kPtVsEta)});
322+
mHistogramRegistry->add(analysisDir + getHistNameV2(kPtVsPhi, HistTable), getHistDesc(kPtVsPhi, HistTable), getHistType(kPtVsPhi, HistTable), {CharmHadronSpecs.at(kPtVsPhi)});
323+
mHistogramRegistry->add(analysisDir + getHistNameV2(kPhiVsEta, HistTable), getHistDesc(kPhiVsEta, HistTable), getHistType(kPhiVsEta, HistTable), {CharmHadronSpecs.at(kPhiVsEta)});
186324
}
187325

188326
template <typename T>
@@ -194,10 +332,67 @@ class CharmHadronHistManager
194332
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(AnalysisDir) + HIST(getHistName(kMass, HistTable)), charmHadronCandidate.mass());
195333
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(AnalysisDir) + HIST(getHistName(kSign, HistTable)), charmHadronCandidate.sign());
196334
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(AnalysisDir) + HIST(getHistName(kPtVsMass, HistTable)), charmHadronCandidate.pt(), charmHadronCandidate.mass());
335+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(AnalysisDir) + HIST(getHistName(kPtVsEta, HistTable)), charmHadronCandidate.pt(), charmHadronCandidate.eta());
336+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(AnalysisDir) + HIST(getHistName(kPtVsPhi, HistTable)), charmHadronCandidate.pt(), charmHadronCandidate.phi());
337+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(AnalysisDir) + HIST(getHistName(kPhiVsEta, HistTable)), charmHadronCandidate.phi(), charmHadronCandidate.eta());
338+
}
339+
340+
void initQa(std::map<CharmHadronHist, std::vector<o2::framework::AxisSpec>> const& CharmHadronQaSpecs)
341+
{
342+
std::string qaDir = std::string(charmHadronPrefix) + std::string(QaDir);
343+
mHistogramRegistry->add(qaDir + getHistNameV2(kMassD0, HistTable), getHistDesc(kMassD0, HistTable), getHistType(kMassD0, HistTable), {CharmHadronQaSpecs.at(kMassD0)});
344+
mHistogramRegistry->add(qaDir + getHistNameV2(kMassD0bar, HistTable), getHistDesc(kMassD0bar, HistTable), getHistType(kMassD0bar, HistTable), {CharmHadronQaSpecs.at(kMassD0bar)});
345+
mHistogramRegistry->add(qaDir + getHistNameV2(kMlBkg, HistTable), getHistDesc(kMlBkg, HistTable), getHistType(kMlBkg, HistTable), {CharmHadronQaSpecs.at(kMlBkg)});
346+
mHistogramRegistry->add(qaDir + getHistNameV2(kMlPrompt, HistTable), getHistDesc(kMlPrompt, HistTable), getHistType(kMlPrompt, HistTable), {CharmHadronQaSpecs.at(kMlPrompt)});
347+
mHistogramRegistry->add(qaDir + getHistNameV2(kMlNonPrompt, HistTable), getHistDesc(kMlNonPrompt, HistTable), getHistType(kMlNonPrompt, HistTable), {CharmHadronQaSpecs.at(kMlNonPrompt)});
348+
349+
if (mPlotTopology) {
350+
mHistogramRegistry->add(qaDir + getHistNameV2(kCpa, HistTable), getHistDesc(kCpa, HistTable), getHistType(kCpa, HistTable), {CharmHadronQaSpecs.at(kCpa)});
351+
mHistogramRegistry->add(qaDir + getHistNameV2(kCpaXY, HistTable), getHistDesc(kCpaXY, HistTable), getHistType(kCpaXY, HistTable), {CharmHadronQaSpecs.at(kCpaXY)});
352+
mHistogramRegistry->add(qaDir + getHistNameV2(kDecayLength, HistTable), getHistDesc(kDecayLength, HistTable), getHistType(kDecayLength, HistTable), {CharmHadronQaSpecs.at(kDecayLength)});
353+
mHistogramRegistry->add(qaDir + getHistNameV2(kDecayLengthXY, HistTable), getHistDesc(kDecayLengthXY, HistTable), getHistType(kDecayLengthXY, HistTable), {CharmHadronQaSpecs.at(kDecayLengthXY)});
354+
mHistogramRegistry->add(qaDir + getHistNameV2(kImpactParameterProduct, HistTable), getHistDesc(kImpactParameterProduct, HistTable), getHistType(kImpactParameterProduct, HistTable), {CharmHadronQaSpecs.at(kImpactParameterProduct)});
355+
mHistogramRegistry->add(qaDir + getHistNameV2(kCosThetaStar, HistTable), getHistDesc(kCosThetaStar, HistTable), getHistType(kCosThetaStar, HistTable), {CharmHadronQaSpecs.at(kCosThetaStar)});
356+
}
357+
}
358+
359+
template <typename T>
360+
void fillQa(T const& charmHadronCandidate)
361+
{
362+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kMassD0, HistTable)), charmHadronCandidate.massD0());
363+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kMassD0bar, HistTable)), charmHadronCandidate.massD0bar());
364+
365+
// BDT scores of the accepted hypothesis: D0 (sign > 0) uses mlProbD0*, D0bar (sign < 0) uses mlProbD0bar*
366+
float mlBkg = 0.f;
367+
float mlPrompt = 0.f;
368+
float mlNonPrompt = 0.f;
369+
if (charmHadronCandidate.sign() > 0) {
370+
mlBkg = charmHadronCandidate.mlProbD0Bkg();
371+
mlPrompt = charmHadronCandidate.mlProbD0Prompt();
372+
mlNonPrompt = charmHadronCandidate.mlProbD0NonPrompt();
373+
} else {
374+
mlBkg = charmHadronCandidate.mlProbD0barBkg();
375+
mlPrompt = charmHadronCandidate.mlProbD0barPrompt();
376+
mlNonPrompt = charmHadronCandidate.mlProbD0barNonPrompt();
377+
}
378+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kMlBkg, HistTable)), mlBkg);
379+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kMlPrompt, HistTable)), mlPrompt);
380+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kMlNonPrompt, HistTable)), mlNonPrompt);
381+
382+
// topological variables (same discriminators PWGHF selects on)
383+
if (mPlotTopology) {
384+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kCpa, HistTable)), charmHadronCandidate.cpa());
385+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kCpaXY, HistTable)), charmHadronCandidate.cpaXY());
386+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kDecayLength, HistTable)), charmHadronCandidate.decayLength());
387+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kDecayLengthXY, HistTable)), charmHadronCandidate.decayLengthXY());
388+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kImpactParameterProduct, HistTable)), charmHadronCandidate.impactParameterProduct());
389+
mHistogramRegistry->fill(HIST(charmHadronPrefix) + HIST(QaDir) + HIST(getHistName(kCosThetaStar, HistTable)), charmHadronCandidate.cosThetaStar());
390+
}
197391
}
198392

199393
o2::framework::HistogramRegistry* mHistogramRegistry = nullptr;
200394
int mPdgCode = 0;
395+
bool mPlotTopology = true;
201396

202397
trackhistmanager::TrackHistManager<prong0Prefix> mProng0Manager;
203398
trackhistmanager::TrackHistManager<prong1Prefix> mProng1Manager;

0 commit comments

Comments
 (0)