@@ -257,6 +257,7 @@ struct HfTreeCreatorDplusToPiKPi {
257257 Configurable<float > downSampleBkgFactor{" downSampleBkgFactor" , 1 ., " Fraction of background candidates to keep for ML trainings" };
258258 Configurable<float > ptMaxForDownSample{" ptMaxForDownSample" , 10 ., " Maximum pt for the application of the downsampling factor" };
259259 Configurable<std::vector<int >> classMlIndexes{" classMlIndexes" , {0 , 2 }, " Indexes of ML bkg and non-prompt scores." };
260+ Configurable<int > centEstimator{" centEstimator" , 0 , " Centrality estimation (None: 0, FT0C: 2, FT0M: 3)" };
260261
261262 HfHelper hfHelper;
262263
@@ -265,7 +266,7 @@ struct HfTreeCreatorDplusToPiKPi {
265266 using SelectedCandidatesMcWithMl = soa::Filtered<soa::Join<aod::HfCand3Prong, aod::HfCand3ProngMcRec, aod::HfSelDplusToPiKPi, aod::HfMlDplusToPiKPi>>;
266267 using TracksWPid = soa::Join<aod::Tracks, aod::TracksPidPi, aod::PidTpcTofFullPi, aod::TracksPidKa, aod::PidTpcTofFullKa>;
267268
268- using CollisionsCent = soa::Join<aod::Collisions, aod::CentFT0Cs>;
269+ using CollisionsCent = soa::Join<aod::Collisions, aod::CentFT0Cs, aod::CentFT0Ms >;
269270
270271 Filter filterSelectCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus;
271272 Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast <int8_t >(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi));
@@ -291,7 +292,7 @@ struct HfTreeCreatorDplusToPiKPi {
291292 runNumber);
292293 }
293294
294- template <bool doMc = false , bool doMl = false , typename T>
295+ template <typename Coll, bool doMc = false , bool doMl = false , typename T>
295296 void fillCandidateTable (const T& candidate)
296297 {
297298 int8_t flagMc = 0 ;
@@ -316,7 +317,12 @@ struct HfTreeCreatorDplusToPiKPi {
316317 auto prong0 = candidate.template prong0_as <TracksWPid>();
317318 auto prong1 = candidate.template prong1_as <TracksWPid>();
318319 auto prong2 = candidate.template prong2_as <TracksWPid>();
319- auto coll = candidate.template collision_as <CollisionsCent>();
320+
321+ float cent{-1 .};
322+ auto coll = candidate.template collision_as <Coll>();
323+ if (std::is_same_v<Coll, CollisionsCent> && centEstimator != CentralityEstimator::None) {
324+ cent = getCentralityColl (coll, centEstimator);
325+ }
320326
321327 if (fillCandidateLiteTable) {
322328 rowCandidateLite (
@@ -361,7 +367,7 @@ struct HfTreeCreatorDplusToPiKPi {
361367 candidate.eta (),
362368 candidate.phi (),
363369 hfHelper.yDplus (candidate),
364- getCentralityColl (coll, CentralityEstimator::FT0C) ,
370+ cent ,
365371 flagMc,
366372 originMc,
367373 channelMc);
@@ -443,14 +449,14 @@ struct HfTreeCreatorDplusToPiKPi {
443449 candidate.phi (),
444450 hfHelper.yDplus (candidate),
445451 hfHelper.eDplus (candidate),
446- getCentralityColl (coll, CentralityEstimator::FT0C) ,
452+ cent ,
447453 flagMc,
448454 originMc,
449455 channelMc);
450456 }
451457 }
452458
453- void processData (CollisionsCent const & collisions,
459+ void processData (aod::Collisions const & collisions,
454460 soa::Filtered<soa::Join<aod::HfCand3Prong, aod::HfSelDplusToPiKPi>> const & candidates,
455461 TracksWPid const &)
456462 {
@@ -473,13 +479,13 @@ struct HfTreeCreatorDplusToPiKPi {
473479 continue ;
474480 }
475481 }
476- fillCandidateTable (candidate);
482+ fillCandidateTable<aod::Collisions> (candidate);
477483 }
478484 }
479485
480486 PROCESS_SWITCH (HfTreeCreatorDplusToPiKPi, processData, " Process data" , true );
481487
482- void processMc (CollisionsCent const & collisions,
488+ void processMc (aod::Collisions const & collisions,
483489 aod::McCollisions const &,
484490 SelectedCandidatesMc const & candidates,
485491 MatchedGenCandidatesMc const & particles,
@@ -500,7 +506,7 @@ struct HfTreeCreatorDplusToPiKPi {
500506 rowCandidateFull.reserve (reconstructedCandSig.size ());
501507 }
502508 for (const auto & candidate : reconstructedCandSig) {
503- fillCandidateTable<true >(candidate);
509+ fillCandidateTable<aod::Collisions, true >(candidate);
504510 }
505511 } else if (fillOnlySignalMl) {
506512 rowCandidateMl.reserve (reconstructedCandSigMl.size ());
@@ -516,7 +522,7 @@ struct HfTreeCreatorDplusToPiKPi {
516522 continue ;
517523 }
518524 }
519- fillCandidateTable<true , true >(candidate);
525+ fillCandidateTable<aod::Collisions, true , true >(candidate);
520526 }
521527 } else if (fillOnlyBackground) {
522528 if (fillCandidateLiteTable) {
@@ -531,7 +537,7 @@ struct HfTreeCreatorDplusToPiKPi {
531537 continue ;
532538 }
533539 }
534- fillCandidateTable<true >(candidate);
540+ fillCandidateTable<aod::Collisions, true >(candidate);
535541 }
536542 } else {
537543 if (fillCandidateLiteTable) {
@@ -540,7 +546,7 @@ struct HfTreeCreatorDplusToPiKPi {
540546 rowCandidateFull.reserve (candidates.size ());
541547 }
542548 for (const auto & candidate : candidates) {
543- fillCandidateTable<true >(candidate);
549+ fillCandidateTable<aod::Collisions, true >(candidate);
544550 }
545551 }
546552
@@ -558,7 +564,116 @@ struct HfTreeCreatorDplusToPiKPi {
558564 }
559565 }
560566
561- PROCESS_SWITCH (HfTreeCreatorDplusToPiKPi, processMc, " Process MC" , false );
567+ void processDataWCent (CollisionsCent const & collisions,
568+ soa::Filtered<soa::Join<aod::HfCand3Prong, aod::HfSelDplusToPiKPi>> const & candidates,
569+ TracksWPid const &)
570+ {
571+ // Filling event properties
572+ rowCandidateFullEvents.reserve (collisions.size ());
573+ for (const auto & collision : collisions) {
574+ fillEvent (collision, 0 , 1 );
575+ }
576+
577+ // Filling candidate properties
578+ if (fillCandidateLiteTable) {
579+ rowCandidateLite.reserve (candidates.size ());
580+ } else {
581+ rowCandidateFull.reserve (candidates.size ());
582+ }
583+ for (const auto & candidate : candidates) {
584+ if (downSampleBkgFactor < 1 .) {
585+ float pseudoRndm = candidate.ptProng0 () * 1000 . - static_cast <int64_t >(candidate.ptProng0 () * 1000 );
586+ if (candidate.pt () < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) {
587+ continue ;
588+ }
589+ }
590+ fillCandidateTable<CollisionsCent>(candidate);
591+ }
592+ }
593+
594+ PROCESS_SWITCH (HfTreeCreatorDplusToPiKPi, processDataWCent, " Process data with cent" , true );
595+
596+ void processMcWCent (CollisionsCent const & collisions,
597+ aod::McCollisions const &,
598+ SelectedCandidatesMc const & candidates,
599+ MatchedGenCandidatesMc const & particles,
600+ SelectedCandidatesMcWithMl const &,
601+ TracksWPid const &)
602+ {
603+ // Filling event properties
604+ rowCandidateFullEvents.reserve (collisions.size ());
605+ for (const auto & collision : collisions) {
606+ fillEvent (collision, 0 , 1 );
607+ }
608+
609+ // Filling candidate properties
610+ if (fillOnlySignal) {
611+ if (fillCandidateLiteTable) {
612+ rowCandidateLite.reserve (reconstructedCandSig.size ());
613+ } else {
614+ rowCandidateFull.reserve (reconstructedCandSig.size ());
615+ }
616+ for (const auto & candidate : reconstructedCandSig) {
617+ fillCandidateTable<CollisionsCent, true >(candidate);
618+ }
619+ } else if (fillOnlySignalMl) {
620+ rowCandidateMl.reserve (reconstructedCandSigMl.size ());
621+ if (fillCandidateLiteTable) {
622+ rowCandidateLite.reserve (reconstructedCandSigMl.size ());
623+ } else {
624+ rowCandidateFull.reserve (reconstructedCandSigMl.size ());
625+ }
626+ for (const auto & candidate : reconstructedCandSigMl) {
627+ if (downSampleBkgFactor < 1 .) {
628+ float pseudoRndm = candidate.ptProng0 () * 1000 . - static_cast <int64_t >(candidate.ptProng0 () * 1000 );
629+ if (candidate.pt () < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) {
630+ continue ;
631+ }
632+ }
633+ fillCandidateTable<CollisionsCent, true , true >(candidate);
634+ }
635+ } else if (fillOnlyBackground) {
636+ if (fillCandidateLiteTable) {
637+ rowCandidateLite.reserve (reconstructedCandBkg.size ());
638+ } else {
639+ rowCandidateFull.reserve (reconstructedCandBkg.size ());
640+ }
641+ for (const auto & candidate : reconstructedCandBkg) {
642+ if (downSampleBkgFactor < 1 .) {
643+ float pseudoRndm = candidate.ptProng0 () * 1000 . - static_cast <int64_t >(candidate.ptProng0 () * 1000 );
644+ if (candidate.pt () < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) {
645+ continue ;
646+ }
647+ }
648+ fillCandidateTable<CollisionsCent, true >(candidate);
649+ }
650+ } else {
651+ if (fillCandidateLiteTable) {
652+ rowCandidateLite.reserve (candidates.size ());
653+ } else {
654+ rowCandidateFull.reserve (candidates.size ());
655+ }
656+ for (const auto & candidate : candidates) {
657+ fillCandidateTable<CollisionsCent, true >(candidate);
658+ }
659+ }
660+
661+ // Filling particle properties
662+ rowCandidateFullParticles.reserve (particles.size ());
663+ for (const auto & particle : particles) {
664+ rowCandidateFullParticles (
665+ particle.mcCollision ().bcId (),
666+ particle.pt (),
667+ particle.eta (),
668+ particle.phi (),
669+ RecoDecay::y (particle.pVector (), o2::constants::physics::MassDPlus),
670+ particle.flagMcMatchGen (),
671+ particle.originMcGen ());
672+ }
673+ }
674+
675+
676+ PROCESS_SWITCH (HfTreeCreatorDplusToPiKPi, processMcWCent, " Process MC with cent" , false );
562677};
563678
564679WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments