1818// / \author Fabio Catalano <fabio.catalano@cern.ch>, University of Houston
1919// / \author Ruiqi Yin <ruiqi.yin@cern.ch>, Fudan University
2020
21+ #include " PWGHF/Core/CentralityEstimation.h"
2122#include " PWGHF/DataModel/CandidateReconstructionTables.h"
2223#include " PWGHF/DataModel/CandidateSelectionTables.h"
24+ #include " PWGLF/DataModel/mcCentrality.h"
2325
2426#include " Common/Core/RecoDecay.h"
27+ #include " Common/DataModel/Centrality.h"
2528#include " Common/DataModel/EventSelection.h"
2629#include " Common/DataModel/TrackSelectionTables.h"
2730
@@ -169,7 +172,7 @@ DECLARE_SOA_TABLE(HfToOmegaPiEvs, "AOD", "HFTOOMEPIEV",
169172 full::IsEventSel8, full::IsEventSelZ);
170173
171174DECLARE_SOA_TABLE (HfOmegac0ToOmegaPiLites, " AOD" , " HFTOOMEPILITE" ,
172- full::XPv, full::YPv, full::ZPv, collision::NumContrib, collision::Chi2, , cent::CentFT0M,
175+ full::XPv, full::YPv, full::ZPv, collision::NumContrib, collision::Chi2, cent::CentFT0M,
173176 full::XDecayVtxCharmBaryon, full::YDecayVtxCharmBaryon, full::ZDecayVtxCharmBaryon,
174177 full::XDecayVtxCascade, full::YDecayVtxCascade, full::ZDecayVtxCascade,
175178 full::XDecayVtxV0, full::YDecayVtxV0, full::ZDecayVtxV0,
@@ -228,6 +231,15 @@ DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE",
228231 full::FlagMcMatchRec, full::OriginMcRec, full::CollisionMatched, hf_track_index::HFflag, collision::NumContrib, cent::CentFT0M);
229232} // namespace o2::aod
230233
234+ // / Evaluate centrality/multiplicity percentile (centrality estimator is automatically selected based on the used table)
235+ // / \param candidate is candidate
236+ // / \return centrality/multiplicity percentile of the collision
237+ template <typename Coll>
238+ float evaluateCentralityColl (const Coll& collision)
239+ {
240+ return o2::hf_centrality::getCentralityColl<Coll>(collision);
241+ }
242+
231243// / Writes the full information in an output TTree
232244struct HfTreeCreatorOmegac0ToOmegaPi {
233245
@@ -240,24 +252,31 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
240252 Configurable<bool > keepOnlyMcSignal{" keepOnlyMcSignal" , true , " Fill MC tree only with signal candidates" };
241253
242254 using Tracks = soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra>;
243- using Colls = soa::Join<aod::Collisions, aod::EvSels>;
255+
256+ using CandSel = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi>>;
244257 using CandKfSel = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfOmegacKf, aod::HfSelToOmegaPi>>;
245- using CascKfMcSel = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfOmegacKf, aod::HfSelToOmegaPi, aod::HfToOmegaPiMCRec>>;
258+ using CandMcSel = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfToOmegaPiMCRec>>;
259+ using CandKfMcSel = soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfOmegacKf, aod::HfSelToOmegaPi, aod::HfToOmegaPiMCRec>>;
260+
261+ using Colls = soa::Join<aod::Collisions, aod::EvSels>;
262+ using CollsWithFT0M = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Ms>;
263+ using CollsWithMcLabels = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
264+ using McCollsWithFT0M = soa::Join<aod::McCollisions, aod::McCentFT0Ms>;
246265
247266 Filter filterOmegaCToOmegaPiFlag = (o2::aod::hf_track_index::hfflag & static_cast <uint8_t >(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast <uint8_t >(0 );
248267
249268 void init (InitContext const &)
250269 {
251270 }
252271
253- template <typename T >
254- void fillEvent (const T & collision, float cutZPv)
272+ template <typename Colls >
273+ void fillEvent (const Colls & collision, float cutZPv)
255274 {
256275 rowEv (collision.sel8 (), std::abs (collision.posZ ()) < cutZPv);
257276 }
258277
259- template <typename T >
260- void fillCandidateLite (const T & candidate, int8_t flagMc, int8_t originMc, bool collisionMatched, float centFt0m)
278+ template <typename Cands, typename Colls >
279+ void fillCandidateLite (const Cands & candidate, const Colls& , int8_t flagMc, int8_t originMc, bool collisionMatched, float centFt0m)
261280 {
262281 if (candidate.resultSelections () && candidate.statusPidCharmBaryon () && candidate.statusInvMassLambda () && candidate.statusInvMassCascade () && candidate.statusInvMassCharmBaryon ()) {
263282
@@ -332,8 +351,8 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
332351 }
333352 }
334353
335- template <typename T >
336- void fillKfCandidate (const T & candidate, int8_t flagMc, int8_t originMc, bool collisionMatched, float centFt0m)
354+ template <typename Cands, typename Colls >
355+ void fillKfCandidate (const Cands & candidate, const Colls& , int8_t flagMc, int8_t originMc, bool collisionMatched, float centFt0m)
337356 {
338357 if (candidate.resultSelections () && candidate.statusPidCharmBaryon () && candidate.statusInvMassLambda () && candidate.statusInvMassCascade () && candidate.statusInvMassCharmBaryon ()) {
339358
@@ -403,8 +422,8 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
403422 }
404423 }
405424
406- template <typename T >
407- void fillKfCandidateLite (const T & candidate, int8_t flagMc, int8_t originMc, bool collisionMatched, float centFt0m)
425+ template <typename Cands, typename Colls >
426+ void fillKfCandidateLite (const Cands & candidate, const Colls& , int8_t flagMc, int8_t originMc, bool collisionMatched, float centFt0m)
408427 {
409428 if (candidate.resultSelections () && candidate.statusPidCharmBaryon () && candidate.statusInvMassLambda () && candidate.statusInvMassCascade () && candidate.statusInvMassCharmBaryon ()) {
410429
@@ -448,8 +467,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
448467 }
449468 } // fillKfCandidateLite end
450469
451- void processDataLite (Colls const & collisions, Tracks const &,
452- soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi>> const & candidates)
470+ void processData (Colls const & collisions, CandSel const & candidates, Tracks const &)
453471 {
454472 // Filling event properties
455473 rowEv.reserve (collisions.size ());
@@ -460,12 +478,12 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
460478 // Filling candidate properties
461479 rowCandidateLite.reserve (candidates.size ());
462480 for (const auto & candidate : candidates) {
463- fillCandidateLite (candidate, -7 , RecoDecay::OriginType::None, false , -1 .);
481+ fillCandidateLite (candidate, collisions, -7 , RecoDecay::OriginType::None, false , -1 .);
464482 }
465483 }
466- PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processDataLite , " Process data" , false );
484+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processData , " Process data" , false );
467485
468- void processKfDataFull (Colls const & collisions, Tracks const & , CandKfSel const & candidates)
486+ void processKfData (Colls const & collisions, CandKfSel const & candidates)
469487 {
470488 // Filling event properties
471489 rowEv.reserve (collisions.size ());
@@ -476,12 +494,12 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
476494 // Filling candidate properties
477495 rowKfCandidateFull.reserve (candidates.size ());
478496 for (const auto & candidate : candidates) {
479- fillKfCandidate (candidate, -7 , RecoDecay::OriginType::None, false ) , -1 .;
497+ fillKfCandidate (candidate, collisions, -7 , RecoDecay::OriginType::None, false , -1 .) ;
480498 }
481499 }
482- PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKfDataFull , " Process KF data" , false );
500+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKfData , " Process KF data" , false );
483501
484- void processKfDataLite (Colls const & collisions, Tracks const &, CandKfSel const & candidates)
502+ void processKfDataLite (Colls const & collisions, CandKfSel const & candidates)
485503 {
486504 // Filling event properties
487505 rowEv.reserve (collisions.size ());
@@ -492,13 +510,66 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
492510 // Filling candidate properties
493511 rowKfCandidateFull.reserve (candidates.size ());
494512 for (const auto & candidate : candidates) {
495- fillKfCandidateLite (candidate, -7 , RecoDecay::OriginType::None, false , -1 .);
513+ fillKfCandidateLite (candidate, collisions, -7 , RecoDecay::OriginType::None, false , -1 .);
496514 }
497515 }
498- PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKfDataLite, " Process KF data Lite " , false );
516+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKfDataLite, " Process KF data lite " , false );
499517
500- void processMcLite (Colls const & collisions, Tracks const &,
501- soa::Filtered<soa::Join<aod::HfCandToOmegaPi, aod::HfSelToOmegaPi, aod::HfToOmegaPiMCRec>> const & candidates)
518+ void processDataCent (CollsWithFT0M const & collisions, CandSel const & candidates, Tracks const &)
519+ {
520+ // Filling event properties
521+ rowEv.reserve (collisions.size ());
522+ for (const auto & collision : collisions) {
523+ fillEvent (collision, zPvCut);
524+ }
525+
526+ // Filling candidate properties
527+ rowCandidateLite.reserve (candidates.size ());
528+ for (const auto & candidate : candidates) {
529+ auto collision = candidate.collision_as <CollsWithFT0M>();
530+ float centFt0m = evaluateCentralityColl (collision);
531+ fillCandidateLite (candidate, collisions, -7 , RecoDecay::OriginType::None, false , centFt0m);
532+ }
533+ }
534+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processDataCent, " Process data with FT0M info" , false );
535+
536+ void processKfDataCent (CollsWithFT0M const & collisions, CandKfSel const & candidates)
537+ {
538+ // Filling event properties
539+ rowEv.reserve (collisions.size ());
540+ for (const auto & collision : collisions) {
541+ fillEvent (collision, zPvCut);
542+ }
543+
544+ // Filling candidate properties
545+ rowKfCandidateFull.reserve (candidates.size ());
546+ for (const auto & candidate : candidates) {
547+ auto collision = candidate.collision_as <CollsWithFT0M>();
548+ float centFt0m = evaluateCentralityColl (collision);
549+ fillKfCandidate (candidate, collisions, -7 , RecoDecay::OriginType::None, false , centFt0m);
550+ }
551+ }
552+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKfDataCent, " Process KF data with FT0M info" , false );
553+
554+ void processKfDataCentLite (CollsWithFT0M const & collisions, CandKfSel const & candidates)
555+ {
556+ // Filling event properties
557+ rowEv.reserve (collisions.size ());
558+ for (const auto & collision : collisions) {
559+ fillEvent (collision, zPvCut);
560+ }
561+
562+ // Filling candidate properties
563+ rowKfCandidateFull.reserve (candidates.size ());
564+ for (const auto & candidate : candidates) {
565+ auto collision = candidate.collision_as <CollsWithFT0M>();
566+ float centFt0m = evaluateCentralityColl (collision);
567+ fillKfCandidateLite (candidate, collisions, -7 , RecoDecay::OriginType::None, false , centFt0m);
568+ }
569+ }
570+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKfDataCentLite, " Process KF data lite with FT0M info" , false );
571+
572+ void processMc (Colls const & collisions, CandMcSel const & candidates, Tracks const &)
502573 {
503574 // Filling event properties
504575 rowEv.reserve (collisions.size ());
@@ -512,12 +583,12 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
512583 if (keepOnlyMcSignal && candidate.originMcRec () == 0 ) {
513584 continue ;
514585 }
515- fillCandidateLite (candidate, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), -1 .);
586+ fillCandidateLite (candidate, collisions, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), -1 .);
516587 }
517588 }
518- PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processMcLite , " Process MC" , false );
589+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processMc , " Process MC" , false );
519590
520- void processKFMcFull (Colls const & collisions, Tracks const &, CascKfMcSel const & candidates)
591+ void processKFMc (Colls const & collisions, CandKfMcSel const & candidates)
521592 {
522593 // Filling event properties
523594 rowEv.reserve (collisions.size ());
@@ -531,12 +602,12 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
531602 if (keepOnlyMcSignal && candidate.originMcRec () == 0 ) {
532603 continue ;
533604 }
534- fillKfCandidate (candidate, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), -1 .);
605+ fillKfCandidate (candidate, collisions, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), -1 .);
535606 }
536607 }
537- PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKFMcFull , " Process KF MC" , false );
608+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKFMc , " Process KF MC" , false );
538609
539- void processKFMcLite (Colls const & collisions, Tracks const &, CascKfMcSel const & candidates)
610+ void processKFMcLite (Colls const & collisions, CandKfMcSel const & candidates)
540611 {
541612 // Filling event properties
542613 rowEv.reserve (collisions.size ());
@@ -550,11 +621,74 @@ struct HfTreeCreatorOmegac0ToOmegaPi {
550621 if (keepOnlyMcSignal && candidate.originMcRec () == 0 ) {
551622 continue ;
552623 }
553- fillKfCandidateLite (candidate, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), -1 .);
624+ fillKfCandidateLite (candidate, collisions, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), -1 .);
554625 }
555626 }
556627 PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKFMcLite, " Process KF MC Lite" , false );
557628
629+ void processMcCent (CollsWithMcLabels const & collisions, CandMcSel const & candidates, Tracks const &, McCollsWithFT0M const &)
630+ {
631+ // Filling event properties
632+ rowEv.reserve (collisions.size ());
633+ for (const auto & collision : collisions) {
634+ fillEvent (collision, zPvCut);
635+ }
636+
637+ // Filling candidate properties
638+ rowCandidateLite.reserve (candidates.size ());
639+ for (const auto & candidate : candidates) {
640+ if (keepOnlyMcSignal && candidate.originMcRec () == 0 ) {
641+ continue ;
642+ }
643+ auto mcCollision = candidate.collision_as <CollsWithMcLabels>().mcCollision_as <McCollsWithFT0M>();
644+ float centFt0m = evaluateCentralityColl (mcCollision);
645+ fillCandidateLite (candidate, collisions, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), centFt0m);
646+ }
647+ }
648+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processMcCent, " Process MC with FT0M info" , false );
649+
650+ void processKFMcCent (CollsWithMcLabels const & collisions, CandKfMcSel const & candidates, McCollsWithFT0M const &)
651+ {
652+ // Filling event properties
653+ rowEv.reserve (collisions.size ());
654+ for (const auto & collision : collisions) {
655+ fillEvent (collision, zPvCut);
656+ }
657+
658+ // Filling candidate properties
659+ rowCandidateLite.reserve (candidates.size ());
660+ for (const auto & candidate : candidates) {
661+ if (keepOnlyMcSignal && candidate.originMcRec () == 0 ) {
662+ continue ;
663+ }
664+ auto mcCollision = candidate.collision_as <CollsWithMcLabels>().mcCollision_as <McCollsWithFT0M>();
665+ float centFt0m = evaluateCentralityColl (mcCollision);
666+ fillKfCandidate (candidate, collisions, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), centFt0m);
667+ }
668+ }
669+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKFMcCent, " Process KF MC with FT0M info" , false );
670+
671+ void processKFMcCentLite (CollsWithMcLabels const & collisions, CandKfMcSel const & candidates, McCollsWithFT0M const &)
672+ {
673+ // Filling event properties
674+ rowEv.reserve (collisions.size ());
675+ for (const auto & collision : collisions) {
676+ fillEvent (collision, zPvCut);
677+ }
678+
679+ // Filling candidate properties
680+ rowCandidateLite.reserve (candidates.size ());
681+ for (const auto & candidate : candidates) {
682+ if (keepOnlyMcSignal && candidate.originMcRec () == 0 ) {
683+ continue ;
684+ }
685+ auto mcCollision = candidate.collision_as <CollsWithMcLabels>().mcCollision_as <McCollsWithFT0M>();
686+ float centFt0m = evaluateCentralityColl (mcCollision);
687+ fillKfCandidateLite (candidate, collisions, candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.collisionMatched (), centFt0m);
688+ }
689+ }
690+ PROCESS_SWITCH (HfTreeCreatorOmegac0ToOmegaPi, processKFMcCentLite, " Process KF MC Lite with FT0M info" , false );
691+
558692}; // end of struct
559693
560694WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments