Skip to content

Commit 71fe91a

Browse files
scattaruvkucera
andauthored
[PWGHF] Ds-h correlation, adding histograms in MC Gen processes (#11464)
Co-authored-by: Vít Kučera <vit.kucera@cern.ch>
1 parent 6500938 commit 71fe91a

File tree

2 files changed

+98
-57
lines changed

2 files changed

+98
-57
lines changed

PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,15 @@ struct HfCorrelatorDsHadrons {
175175
Configurable<float> ptCandMax{"ptCandMax", 50., "max. cand pT"};
176176
Configurable<float> ptTrackMin{"ptTrackMin", 0.3, "min. track pT"};
177177
Configurable<float> ptTrackMax{"ptTrackMax", 50., "max. track pT"};
178+
Configurable<float> zVtxMax{"zVtxMax", 10., "max. position-z of the reconstructed collision"};
178179
Configurable<std::vector<int>> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."};
179180
Configurable<std::vector<double>> binsPtD{"binsPtD", std::vector<double>{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots"};
180181
Configurable<std::vector<double>> binsPtHadron{"binsPtHadron", std::vector<double>{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"};
181182
Configurable<std::vector<double>> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector<double>{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for efficiency"};
182183
Configurable<std::vector<double>> efficiencyD{"efficiencyD", {1., 1., 1., 1., 1., 1.}, "efficiency values for Ds meson"};
183184

184185
int hfcReducedCollisionIndex = 0;
186+
static constexpr std::size_t NDaughtersDs{3u};
185187

186188
HfHelper hfHelper;
187189
SliceCache cache;
@@ -284,6 +286,11 @@ struct HfCorrelatorDsHadrons {
284286
registry.add("hEtaMcGen", "Ds,Hadron particles - MC Gen", {HistType::kTH1F, {axisEta}});
285287
registry.add("hPhiMcGen", "Ds,Hadron particles - MC Gen", {HistType::kTH1F, {axisPhi}});
286288
registry.add("hMultFT0AMcGen", "Ds,Hadron multiplicity FT0A - MC Gen", {HistType::kTH1F, {axisMultiplicity}});
289+
registry.add("hCorrAllPrimaryParticles", "Ds-ch. part. correlations MC Gen", {HistType::kTH3F, {{axisPhi}, {axisPtD}, {axisPtHadron}}});
290+
registry.add("hCorrAllPrimaryHadrons", "Ds-h correlations MC Gen", {HistType::kTH3F, {{axisPhi}, {axisPtD}, {axisPtHadron}}});
291+
registry.add("hCorrAllPrimaryPions", "Ds-pion correlations MC Gen", {HistType::kTH3F, {{axisPhi}, {axisPtD}, {axisPtHadron}}});
292+
registry.add("hCorrAllPrimaryKaons", "Ds-kaon correlations MC Gen", {HistType::kTH3F, {{axisPhi}, {axisPtD}, {axisPtHadron}}});
293+
registry.add("hCorrAllPrimaryProtons", "Ds-proton correlations MC Gen", {HistType::kTH3F, {{axisPhi}, {axisPtD}, {axisPtHadron}}});
287294
}
288295
}
289296

@@ -633,7 +640,7 @@ struct HfCorrelatorDsHadrons {
633640
if (useSel8 && !collision.sel8()) {
634641
continue;
635642
}
636-
if (std::abs(collision.posZ()) > 10.) {
643+
if (std::abs(collision.posZ()) > zVtxMax) {
637644
continue;
638645
}
639646
if (selNoSameBunchPileUpColl && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) {
@@ -666,7 +673,7 @@ struct HfCorrelatorDsHadrons {
666673
listDaughters.clear();
667674
RecoDecay::getDaughters(particle, &listDaughters, arrDaughDsPDG, 2);
668675
int counterDaughters = 0;
669-
if (listDaughters.size() == 3) {
676+
if (listDaughters.size() == NDaughtersDs) {
670677
for (const auto& dauIdx : listDaughters) {
671678
// auto daughI = mcParticles.rawIteratorAt(dauIdx - mcParticles.offset());
672679
auto daughI = groupedMcParticles.rawIteratorAt(dauIdx - groupedMcParticles.offset());
@@ -688,6 +695,19 @@ struct HfCorrelatorDsHadrons {
688695
if (!particleAssoc.isPhysicalPrimary()) {
689696
continue;
690697
}
698+
699+
registry.fill(HIST("hCorrAllPrimaryParticles"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
700+
if (std::abs(particleAssoc.pdgCode()) == kPiPlus) {
701+
registry.fill(HIST("hCorrAllPrimaryHadrons"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
702+
registry.fill(HIST("hCorrAllPrimaryPions"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
703+
} else if (std::abs(particleAssoc.pdgCode()) == kKPlus) {
704+
registry.fill(HIST("hCorrAllPrimaryHadrons"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
705+
registry.fill(HIST("hCorrAllPrimaryKaons"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
706+
} else if (std::abs(particleAssoc.pdgCode()) == kProton) {
707+
registry.fill(HIST("hCorrAllPrimaryHadrons"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
708+
registry.fill(HIST("hCorrAllPrimaryProtons"), getDeltaPhi(particleAssoc.phi(), particle.phi()), particle.pt(), particleAssoc.pt());
709+
}
710+
691711
// trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true);
692712
trackOrigin = RecoDecay::getCharmHadronOrigin(groupedMcParticles, particleAssoc, true);
693713
registry.fill(HIST("hPtParticleAssocMcGen"), particleAssoc.pt());

PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx

Lines changed: 76 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <memory>
1818
#include <string>
1919
#include <vector>
20+
#include <optional>
2021

2122
#include "CCDB/BasicCCDBManager.h"
2223
#include "Framework/AnalysisTask.h"
@@ -87,8 +88,9 @@ struct HfTaskCorrelationDsHadrons {
8788
Configurable<std::string> fdEffCcdbPath{"fdEffCcdbPath", "", "CCDB path for trigger efficiency"};
8889
Configurable<int64_t> timestampCcdb{"timestampCcdb", -1, "timestamp of the efficiency files used to query in CCDB"};
8990

90-
std::shared_ptr<TH1> mEfficiencyD = nullptr;
91-
std::shared_ptr<TH1> mEfficiencyAssociated = nullptr;
91+
std::shared_ptr<TH1> hEfficiencyD = nullptr;
92+
std::shared_ptr<TH1> hEfficiencyAssociated = nullptr;
93+
const float epsilon = 1.e-8;
9294

9395
enum CandidateStep {
9496
kCandidateStepMcGenDsToKKPi = 0,
@@ -254,26 +256,79 @@ struct HfTaskCorrelationDsHadrons {
254256
ccdb->setLocalObjectValidityChecking();
255257
ccdb->setCreatedNotAfter(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
256258

257-
mEfficiencyD = std::shared_ptr<TH1>(ccdb->getForTimeStamp<TH1F>(promptEffCcdbPath, timestampCcdb));
258-
if (mEfficiencyD == nullptr) {
259+
hEfficiencyD = std::shared_ptr<TH1>(ccdb->getForTimeStamp<TH1F>(promptEffCcdbPath, timestampCcdb));
260+
if (hEfficiencyD == nullptr) {
259261
LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", promptEffCcdbPath.value.c_str());
260262
}
261263
LOGF(info, "Loaded trigger efficiency (prompt D) histogram from %s", promptEffCcdbPath.value.c_str());
262264

263-
mEfficiencyAssociated = std::shared_ptr<TH1>(ccdb->getForTimeStamp<TH1F>(associatedEffCcdbPath, timestampCcdb));
264-
if (mEfficiencyAssociated == nullptr) {
265+
hEfficiencyAssociated = std::shared_ptr<TH1>(ccdb->getForTimeStamp<TH1F>(associatedEffCcdbPath, timestampCcdb));
266+
if (hEfficiencyAssociated == nullptr) {
265267
LOGF(fatal, "Could not load efficiency histogram for associated particles from %s", associatedEffCcdbPath.value.c_str());
266268
}
267269
LOGF(info, "Loaded associated efficiency histogram from %s", associatedEffCcdbPath.value.c_str());
268270
}
269271
}
270272

273+
enum class EfficiencyMode {
274+
DsOnly = 1,
275+
DsHadronPair = 2
276+
};
277+
271278
bool isSelectedCandidate(const int ptBinD, const float bdtScorePrompt, const float bdtScoreBkg)
272279
{
273280

274281
return (ptBinD != -1 && bdtScorePrompt >= mlOutputPromptMin->at(ptBinD) && bdtScorePrompt <= mlOutputPromptMax->at(ptBinD) && bdtScoreBkg <= mlOutputBkg->at(ptBinD));
275282
}
276283

284+
// template <typename T1, typename EfficiencyContainer, typename Histogram, typename T2>
285+
double getEfficiencyWeight(float ptD, std::optional<float> ptAssoc = std::nullopt, EfficiencyMode mode = EfficiencyMode::DsOnly)
286+
{
287+
if (!applyEfficiency) {
288+
return 1.;
289+
}
290+
291+
double weight = 1.;
292+
293+
switch (mode) {
294+
case EfficiencyMode::DsOnly:
295+
if (loadAccXEffFromCCDB) {
296+
if (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) <= epsilon) {
297+
LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!";
298+
}
299+
weight = 1. / hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD));
300+
} else {
301+
if (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) <= epsilon) {
302+
LOG(fatal) << "A bin content in Ds-meson efficiency vector is zero!";
303+
}
304+
weight = 1. / efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD));
305+
}
306+
break;
307+
case EfficiencyMode::DsHadronPair:
308+
if (loadAccXEffFromCCDB) {
309+
if (ptAssoc && hEfficiencyAssociated) {
310+
if (hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc)) <= epsilon) {
311+
LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!";
312+
}
313+
weight = 1. / (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) * hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc)));
314+
}
315+
} else {
316+
if (ptAssoc) {
317+
if (efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, *ptAssoc)) <= epsilon) {
318+
LOG(fatal) << "A bin content in associated particle efficiency vector is zero!";
319+
}
320+
weight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, *ptAssoc)));
321+
}
322+
}
323+
break;
324+
default:
325+
LOG(fatal) << "Unknown efficiency mode!";
326+
break;
327+
}
328+
329+
return weight;
330+
}
331+
277332
void processData(DsHadronPairWithMl const& pairEntries,
278333
aod::DsCandRecoInfo const& candidates)
279334
{
@@ -288,13 +343,8 @@ struct HfTaskCorrelationDsHadrons {
288343
continue;
289344
}
290345

291-
double efficiencyWeightD = 1.;
292-
if (applyEfficiency) {
293-
efficiencyWeightD = 1. / efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD));
294-
if (loadAccXEffFromCCDB) {
295-
efficiencyWeightD = 1. / mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD));
296-
}
297-
}
346+
double efficiencyWeightD = getEfficiencyWeight(ptD);
347+
298348
registry.fill(HIST("hMassDsVsPt"), massD, ptD, efficiencyWeightD);
299349
registry.fill(HIST("hBdtScorePrompt"), bdtScorePrompt);
300350
registry.fill(HIST("hBdtScoreBkg"), bdtScoreBkg);
@@ -322,13 +372,8 @@ struct HfTaskCorrelationDsHadrons {
322372
if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) {
323373
continue;
324374
}
325-
double efficiencyWeight = 1.;
326-
if (applyEfficiency) {
327-
efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron)));
328-
if (loadAccXEffFromCCDB) {
329-
efficiencyWeight = 1. / (mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron)));
330-
}
331-
}
375+
376+
double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair);
332377

333378
// in signal region
334379
if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) {
@@ -368,13 +413,8 @@ struct HfTaskCorrelationDsHadrons {
368413
continue;
369414
}
370415

371-
double efficiencyWeightD = 1.;
372-
if (applyEfficiency) {
373-
efficiencyWeightD = 1. / efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD));
374-
if (loadAccXEffFromCCDB) {
375-
efficiencyWeightD = 1. / mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD));
376-
}
377-
}
416+
double efficiencyWeightD = getEfficiencyWeight(ptD);
417+
378418
if (isDsPrompt) {
379419
registry.fill(HIST("hMassPromptDsVsPt"), massD, ptD, efficiencyWeightD);
380420
registry.fill(HIST("hBdtScorePrompt"), bdtScorePrompt);
@@ -411,13 +451,9 @@ struct HfTaskCorrelationDsHadrons {
411451
if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) {
412452
continue;
413453
}
414-
double efficiencyWeight = 1.;
415-
if (applyEfficiency) {
416-
efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron)));
417-
if (loadAccXEffFromCCDB) {
418-
efficiencyWeight = 1. / (mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron)));
419-
}
420-
}
454+
455+
double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair);
456+
421457
// in signal region
422458
if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) {
423459
// prompt and non-prompt division
@@ -506,13 +542,8 @@ struct HfTaskCorrelationDsHadrons {
506542
if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) {
507543
continue;
508544
}
509-
double efficiencyWeight = 1.;
510-
if (applyEfficiency) {
511-
efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron)));
512-
if (loadAccXEffFromCCDB) {
513-
efficiencyWeight = 1. / (mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron)));
514-
}
515-
}
545+
546+
double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair);
516547

517548
// in signal region
518549
if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) {
@@ -548,13 +579,7 @@ struct HfTaskCorrelationDsHadrons {
548579
int poolBin = pairEntry.poolBin();
549580
int ptBinD = o2::analysis::findBin(binsPtD, ptD);
550581

551-
double efficiencyWeight = 1.;
552-
if (applyEfficiency) {
553-
efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron)));
554-
if (loadAccXEffFromCCDB) {
555-
efficiencyWeight = 1. / (mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron)));
556-
}
557-
}
582+
double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair);
558583

559584
// in signal region
560585
if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) {
@@ -606,13 +631,9 @@ struct HfTaskCorrelationDsHadrons {
606631
if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) {
607632
continue;
608633
}
609-
double efficiencyWeight = 1.;
610-
if (applyEfficiency) {
611-
efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron)));
612-
if (loadAccXEffFromCCDB) {
613-
efficiencyWeight = 1. / (mEfficiencyD->GetBinContent(mEfficiencyD->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron)));
614-
}
615-
}
634+
635+
double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair);
636+
616637
// in signal region
617638
if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) {
618639
// prompt and non-prompt division

0 commit comments

Comments
 (0)