1717// / \author Krista Smith <krista.lizbeth.smith@cern.ch>, Pusan National University
1818
1919#include " PWGHF/Core/CentralityEstimation.h"
20+ #include " PWGHF/Core/DecayChannelsLegacy.h"
2021#include " PWGHF/DataModel/CandidateReconstructionTables.h"
2122#include " PWGHF/DataModel/CandidateSelectionTables.h"
2223
3839
3940using namespace o2 ;
4041using namespace o2 ::framework;
42+ using namespace o2 ::framework::expressions;
4143
4244// SV Reco method
4345enum {
@@ -124,6 +126,8 @@ DECLARE_SOA_COLUMN(EtaPiFromCasc, etaPiFromCasc, float);
124126DECLARE_SOA_COLUMN (EtaPiFromCharmBaryon, etaPiFromCharmBaryon, float );
125127DECLARE_SOA_COLUMN (EtaCharmBaryon, etaCharmBaryon, float );
126128DECLARE_SOA_COLUMN (EtaCascade, etaCascade, float );
129+ DECLARE_SOA_COLUMN (PhiCharmBaryon, phiCharmBaryon, float );
130+ DECLARE_SOA_COLUMN (YCharmBaryon, yCharmBaryon, float );
127131DECLARE_SOA_COLUMN (EtaV0, etaV0, float );
128132DECLARE_SOA_COLUMN (DcaXYToPvV0Dau0, dcaXYToPvV0Dau0, float );
129133DECLARE_SOA_COLUMN (DcaXYToPvV0Dau1, dcaXYToPvV0Dau1, float );
@@ -212,6 +216,8 @@ DECLARE_SOA_COLUMN(CascChi2OverNdf, cascChi2OverNdf, float);
212216DECLARE_SOA_COLUMN (XicChi2OverNdf, xicChi2OverNdf, float );
213217DECLARE_SOA_COLUMN (MassV0Chi2OverNdf, massV0Chi2OverNdf, float );
214218DECLARE_SOA_COLUMN (MassCascChi2OverNdf, massCascChi2OverNdf, float );
219+ // MC
220+ DECLARE_SOA_COLUMN (ParticlePdg, particlePdg, int );
215221} // namespace full
216222
217223DECLARE_SOA_TABLE (HfToXiPiEvs, " AOD" , " HFTOXIPIEV" ,
@@ -303,6 +309,15 @@ DECLARE_SOA_TABLE(HfKfXicFulls, "AOD", "HFKFXICFULL",
303309 full::ResultSelections,
304310 full::FlagMcMatchRec, full::DebugMcRec, full::OriginRec, full::CollisionMatched);
305311
312+ DECLARE_SOA_TABLE (HfCandToXiPiGen, " AOD" , " HFCANDTOXIPIGEN" ,
313+ full::InvMassCharmBaryon,
314+ full::PtCharmBaryon,
315+ full::EtaCharmBaryon,
316+ full::PhiCharmBaryon,
317+ full::YCharmBaryon,
318+ full::FlagMcMatchRec,
319+ full::OriginRec,
320+ full::ParticlePdg)
306321} // namespace o2::aod
307322
308323// / Writes the full information in an output TTree
@@ -311,15 +326,21 @@ struct HfTreeCreatorToXiPiQa {
311326 Produces<o2::aod::HfToXiPiFulls> rowCandidateFull;
312327 Produces<o2::aod::HfToXiPiLites> rowCandidateLite;
313328 Produces<o2::aod::HfKfXicFulls> rowKfCandidate;
329+ Produces<o2::aod::HfCandToXiPiGen> rowCandidateParticles;
314330 Produces<o2::aod::HfToXiPiEvs> rowEv;
315331
316332 Configurable<float > zPvCut{" zPvCut" , 10 ., " Cut on absolute value of primary vertex z coordinate" };
333+ Configurable<int8_t > genSelection{" genSelection" , o2::aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi, " Decay channel to be used to match particle information" };
334+ Configurable<bool > fillGenTable{" fillGenTable" , true , " Fill generated MC information if requested" };
317335
318336 using MyTrackTable = soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra>;
319337 using MyEventTable = soa::Join<aod::Collisions, aod::EvSels>;
320338 using MyEventTableWithFT0C = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs>;
321339 using MyEventTableWithFT0M = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Ms>;
322340 using MyEventTableWithNTracksPV = soa::Join<aod::Collisions, aod::EvSels, aod::CentNTPVs>;
341+ using MatchedGenXiPi = soa::Filtered<soa::Join<aod::McParticles, aod::HfXicToXiPiMCGen>>;
342+
343+ Filter filterGenXiPi = nabs(aod::hf_cand_mc_flag::flagMcMatchGen) == static_cast <int8_t >(BIT(genSelection));
323344
324345 void init (InitContext const &)
325346 {
@@ -611,6 +632,19 @@ struct HfTreeCreatorToXiPiQa {
611632 }
612633 }
613634
635+ template <typename T>
636+ void fillParticle (const T& particle, double massCharmBaryon)
637+ {
638+ rowCandidateParticles (RecoDecay::m (particle.pVector (), particle.e ()),
639+ particle.pt (),
640+ particle.eta (),
641+ particle.phi (),
642+ RecoDecay::y (particle.pVector (), massCharmBaryon),
643+ particle.flagMcMatchGen (),
644+ particle.originMcGen (),
645+ particle.pdgCode ());
646+ }
647+
614648 // //////////////////////////////////
615649 // //
616650 // Process functions //
@@ -783,8 +817,10 @@ struct HfTreeCreatorToXiPiQa {
783817 // *~~~~~~~MC with DCAFitter~~~~~~~~*//
784818 // *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*//
785819
786- void processMcFullXic0 (MyEventTable const & collisions, MyTrackTable const &,
787- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates)
820+ void processMcFullXic0 (MyEventTable const & collisions,
821+ MyTrackTable const &,
822+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates,
823+ MatchedGenXiPi const & mcParticles)
788824 {
789825 // Filling event properties
790826 rowEv.reserve (collisions.size ());
@@ -797,10 +833,20 @@ struct HfTreeCreatorToXiPiQa {
797833 for (const auto & candidate : candidates) {
798834 fillCandidate<DCAFITTER, FULL, false , MyEventTable>(candidate, candidate.flagMcMatchRec (), candidate.debugMcRec (), candidate.originMcRec (), candidate.collisionMatched ());
799835 }
836+
837+ // Filling particle properties if requested
838+ if (fillGenTable) {
839+ rowCandidateParticles.reserve (mcParticles.size ());
840+ for (const auto & particle : mcParticles) {
841+ fillParticle (particle, o2::constants::physics::MassXiC0);
842+ }
843+ }
800844 }
801845
802- void processMcFullOmegac0 (MyEventTable const & collisions, MyTrackTable const &,
803- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfOmegacToXiPiMCRec> const & candidates)
846+ void processMcFullOmegac0 (MyEventTable const & collisions,
847+ MyTrackTable const &,
848+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfOmegacToXiPiMCRec> const & candidates,
849+ MatchedGenXiPi const & mcParticles)
804850 {
805851 // Filling event properties
806852 rowEv.reserve (collisions.size ());
@@ -813,10 +859,20 @@ struct HfTreeCreatorToXiPiQa {
813859 for (const auto & candidate : candidates) {
814860 fillCandidate<DCAFITTER, FULL, false , MyEventTable>(candidate, candidate.flagMcMatchRec (), candidate.debugMcRec (), candidate.originMcRec (), candidate.collisionMatched ());
815861 }
862+
863+ // Filling particle properties if requested
864+ if (fillGenTable) {
865+ rowCandidateParticles.reserve (mcParticles.size ());
866+ for (const auto & particle : mcParticles) {
867+ fillParticle (particle, o2::constants::physics::MassOmegaC0);
868+ }
869+ }
816870 }
817871
818- void processMcLiteXic0 (MyEventTable const & collisions, MyTrackTable const &,
819- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates)
872+ void processMcLiteXic0 (MyEventTable const & collisions,
873+ MyTrackTable const &,
874+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates,
875+ MatchedGenXiPi const & mcParticles)
820876 {
821877 // Filling event properties
822878 rowEv.reserve (collisions.size ());
@@ -829,10 +885,20 @@ struct HfTreeCreatorToXiPiQa {
829885 for (const auto & candidate : candidates) {
830886 fillCandidate<DCAFITTER, LITE, false , MyEventTable>(candidate, candidate.flagMcMatchRec (), -7 , candidate.originMcRec (), candidate.collisionMatched ());
831887 }
888+
889+ // Filling particle properties if requested
890+ if (fillGenTable) {
891+ rowCandidateParticles.reserve (mcParticles.size ());
892+ for (const auto & particle : mcParticles) {
893+ fillParticle (particle, o2::constants::physics::MassXiC0);
894+ }
895+ }
832896 }
833897
834- void processMcLiteXic0WithFT0C (MyEventTableWithFT0C const & collisions, MyTrackTable const &,
835- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates)
898+ void processMcLiteXic0WithFT0C (MyEventTableWithFT0C const & collisions,
899+ MyTrackTable const &,
900+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates,
901+ MatchedGenXiPi const & mcParticles)
836902 {
837903 // Filling event properties
838904 rowEv.reserve (collisions.size ());
@@ -845,10 +911,20 @@ struct HfTreeCreatorToXiPiQa {
845911 for (const auto & candidate : candidates) {
846912 fillCandidate<DCAFITTER, LITE, true , MyEventTableWithFT0C>(candidate, candidate.flagMcMatchRec (), -7 , candidate.originMcRec (), candidate.collisionMatched ());
847913 }
914+
915+ // Filling particle properties if requested
916+ if (fillGenTable) {
917+ rowCandidateParticles.reserve (mcParticles.size ());
918+ for (const auto & particle : mcParticles) {
919+ fillParticle (particle, o2::constants::physics::MassXiC0);
920+ }
921+ }
848922 }
849923
850- void processMcLiteXic0WithFT0M (MyEventTableWithFT0M const & collisions, MyTrackTable const &,
851- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates)
924+ void processMcLiteXic0WithFT0M (MyEventTableWithFT0M const & collisions,
925+ MyTrackTable const &,
926+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates,
927+ MatchedGenXiPi const & mcParticles)
852928 {
853929 // Filling event properties
854930 rowEv.reserve (collisions.size ());
@@ -861,10 +937,20 @@ struct HfTreeCreatorToXiPiQa {
861937 for (const auto & candidate : candidates) {
862938 fillCandidate<DCAFITTER, LITE, true , MyEventTableWithFT0M>(candidate, candidate.flagMcMatchRec (), -7 , candidate.originMcRec (), candidate.collisionMatched ());
863939 }
940+
941+ // Filling particle properties if requested
942+ if (fillGenTable) {
943+ rowCandidateParticles.reserve (mcParticles.size ());
944+ for (const auto & particle : mcParticles) {
945+ fillParticle (particle, o2::constants::physics::MassXiC0);
946+ }
947+ }
864948 }
865949
866- void processMcLiteXic0WithNTracksPV (MyEventTableWithNTracksPV const & collisions, MyTrackTable const &,
867- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates)
950+ void processMcLiteXic0WithNTracksPV (MyEventTableWithNTracksPV const & collisions,
951+ MyTrackTable const &,
952+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfXicToXiPiMCRec> const & candidates,
953+ MatchedGenXiPi const & mcParticles)
868954 {
869955 // Filling event properties
870956 rowEv.reserve (collisions.size ());
@@ -877,10 +963,20 @@ struct HfTreeCreatorToXiPiQa {
877963 for (const auto & candidate : candidates) {
878964 fillCandidate<DCAFITTER, LITE, true , MyEventTableWithNTracksPV>(candidate, candidate.flagMcMatchRec (), -7 , candidate.originMcRec (), candidate.collisionMatched ());
879965 }
966+
967+ // Filling particle properties if requested
968+ if (fillGenTable) {
969+ rowCandidateParticles.reserve (mcParticles.size ());
970+ for (const auto & particle : mcParticles) {
971+ fillParticle (particle, o2::constants::physics::MassXiC0);
972+ }
973+ }
880974 }
881975
882- void processMcLiteOmegac0 (MyEventTable const & collisions, MyTrackTable const &,
883- soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfOmegacToXiPiMCRec> const & candidates)
976+ void processMcLiteOmegac0 (MyEventTable const & collisions,
977+ MyTrackTable const &,
978+ soa::Join<aod::HfCandToXiPi, aod::HfSelToXiPi, aod::HfOmegacToXiPiMCRec> const & candidates,
979+ MatchedGenXiPi const & mcParticles)
884980 {
885981 // Filling event properties
886982 rowEv.reserve (collisions.size ());
@@ -893,6 +989,14 @@ struct HfTreeCreatorToXiPiQa {
893989 for (const auto & candidate : candidates) {
894990 fillCandidate<DCAFITTER, LITE, false , MyEventTable>(candidate, candidate.flagMcMatchRec (), -7 , candidate.originMcRec (), candidate.collisionMatched ());
895991 }
992+
993+ // Filling particle properties if requested
994+ if (fillGenTable) {
995+ rowCandidateParticles.reserve (mcParticles.size ());
996+ for (const auto & particle : mcParticles) {
997+ fillParticle (particle, o2::constants::physics::MassOmegaC0);
998+ }
999+ }
8961000 }
8971001
8981002 PROCESS_SWITCH (HfTreeCreatorToXiPiQa, processMcFullXic0, " Process MC with full information for xic0 w/o centrality" , false );
@@ -906,8 +1010,10 @@ struct HfTreeCreatorToXiPiQa {
9061010 // *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*//
9071011 // *~~~~~~~MC with KFParticle~~~~~~~~*//
9081012 // *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*//
909- void processKfMcXic0 (MyEventTable const & collisions, MyTrackTable const &,
910- soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates)
1013+ void processKfMcXic0 (MyEventTable const & collisions,
1014+ MyTrackTable const &,
1015+ soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates,
1016+ MatchedGenXiPi const & mcParticles)
9111017 {
9121018 // Filling event properties
9131019 rowEv.reserve (collisions.size ());
@@ -920,10 +1026,20 @@ struct HfTreeCreatorToXiPiQa {
9201026 for (const auto & candidate : candidates) {
9211027 fillCandidate<KFPARTICLE, FULL, false , MyEventTable>(candidate, candidate.flagMcMatchRec (), candidate.debugMcRec (), candidate.originMcRec (), candidate.collisionMatched ());
9221028 }
1029+
1030+ // Filling particle properties if requested
1031+ if (fillGenTable) {
1032+ rowCandidateParticles.reserve (mcParticles.size ());
1033+ for (const auto & particle : mcParticles) {
1034+ fillParticle (particle, o2::constants::physics::MassXiC0);
1035+ }
1036+ }
9231037 }
9241038
925- void processKfMcXic0WithFT0C (MyEventTableWithFT0C const & collisions, MyTrackTable const &,
926- soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates)
1039+ void processKfMcXic0WithFT0C (MyEventTableWithFT0C const & collisions,
1040+ MyTrackTable const &,
1041+ soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates,
1042+ MatchedGenXiPi const & mcParticles)
9271043 {
9281044 // Filling event properties
9291045 rowEv.reserve (collisions.size ());
@@ -936,10 +1052,20 @@ struct HfTreeCreatorToXiPiQa {
9361052 for (const auto & candidate : candidates) {
9371053 fillCandidate<KFPARTICLE, FULL, true , MyEventTableWithFT0C>(candidate, candidate.flagMcMatchRec (), candidate.debugMcRec (), candidate.originMcRec (), candidate.collisionMatched ());
9381054 }
1055+
1056+ // Filling particle properties if requested
1057+ if (fillGenTable) {
1058+ rowCandidateParticles.reserve (mcParticles.size ());
1059+ for (const auto & particle : mcParticles) {
1060+ fillParticle (particle, o2::constants::physics::MassXiC0);
1061+ }
1062+ }
9391063 }
9401064
941- void processKfMcXic0WithFT0M (MyEventTableWithFT0M const & collisions, MyTrackTable const &,
942- soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates)
1065+ void processKfMcXic0WithFT0M (MyEventTableWithFT0M const & collisions,
1066+ MyTrackTable const &,
1067+ soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates,
1068+ MatchedGenXiPi const & mcParticles)
9431069 {
9441070 // Filling event properties
9451071 rowEv.reserve (collisions.size ());
@@ -952,10 +1078,20 @@ struct HfTreeCreatorToXiPiQa {
9521078 for (const auto & candidate : candidates) {
9531079 fillCandidate<KFPARTICLE, FULL, true , MyEventTableWithFT0M>(candidate, candidate.flagMcMatchRec (), candidate.debugMcRec (), candidate.originMcRec (), candidate.collisionMatched ());
9541080 }
1081+
1082+ // Filling particle properties if requested
1083+ if (fillGenTable) {
1084+ rowCandidateParticles.reserve (mcParticles.size ());
1085+ for (const auto & particle : mcParticles) {
1086+ fillParticle (particle, o2::constants::physics::MassXiC0);
1087+ }
1088+ }
9551089 }
9561090
957- void processKfMcXic0WithNTracksPV (MyEventTableWithNTracksPV const & collisions, MyTrackTable const &,
958- soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates)
1091+ void processKfMcXic0WithNTracksPV (MyEventTableWithNTracksPV const & collisions,
1092+ MyTrackTable const &,
1093+ soa::Join<aod::HfCandToXiPiKf, aod::HfSelToXiPiKf, aod::HfXicToXiPiMCRec> const & candidates,
1094+ MatchedGenXiPi const & mcParticles)
9591095 {
9601096 // Filling event properties
9611097 rowEv.reserve (collisions.size ());
@@ -968,6 +1104,14 @@ struct HfTreeCreatorToXiPiQa {
9681104 for (const auto & candidate : candidates) {
9691105 fillCandidate<KFPARTICLE, FULL, true , MyEventTableWithNTracksPV>(candidate, candidate.flagMcMatchRec (), candidate.debugMcRec (), candidate.originMcRec (), candidate.collisionMatched ());
9701106 }
1107+
1108+ // Filling particle properties if requested
1109+ if (fillGenTable) {
1110+ rowCandidateParticles.reserve (mcParticles.size ());
1111+ for (const auto & particle : mcParticles) {
1112+ fillParticle (particle, o2::constants::physics::MassXiC0);
1113+ }
1114+ }
9711115 }
9721116
9731117 PROCESS_SWITCH (HfTreeCreatorToXiPiQa, processKfMcXic0, " Process MC with information for xic0" , false );
0 commit comments