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