@@ -1009,6 +1009,159 @@ class PairTrackD0Builder
10091009 int mMixingDepth = 5 ;
10101010};
10111011
1012+ template <auto & prefixTrack,
1013+ auto & prefixLc,
1014+ auto & prefixProtonDau,
1015+ auto & prefixKaonDau,
1016+ auto & prefixPionDau,
1017+ auto & prefixSe,
1018+ auto & prefixMe,
1019+ auto & prefixCprProtonSe,
1020+ auto & prefixCprKaonSe,
1021+ auto & prefixCprPionSe,
1022+ auto & prefixCprProtonMe,
1023+ auto & prefixCprKaonMe,
1024+ auto & prefixCprPionMe,
1025+ modes::CharmHadron charmHadronType>
1026+ class PairTrackLcBuilder
1027+ {
1028+ public:
1029+ PairTrackLcBuilder () = default ;
1030+ ~PairTrackLcBuilder () = default ;
1031+
1032+ template <modes::Mode modeSe,
1033+ modes::Mode modeMe,
1034+ typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 ,
1035+ typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 ,
1036+ typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
1037+ void init (o2::framework::HistogramRegistry* registry,
1038+ T1 const & confCollisionBinning,
1039+ T2 const & confTrackSelection,
1040+ T3 const & confTrackCleaner,
1041+ T4 const & confLcSelection,
1042+ T5 const & confLcCleaner,
1043+ T6 const & confCprProton,
1044+ T7 const & confCprKaon,
1045+ T8 const & confCprPion,
1046+ T9 const & confMixing,
1047+ T10 const & confPairBinning,
1048+ T11 const & confPairCuts,
1049+ std::map<T12 , std::vector<o2::framework::AxisSpec>>& colHistSpec,
1050+ std::map<T13 , std::vector<o2::framework::AxisSpec>>& trackHistSpec,
1051+ std::map<T14 , std::vector<o2::framework::AxisSpec>>& lcHistSpec,
1052+ std::map<T15 , std::vector<o2::framework::AxisSpec>>& protonDauHistSpec,
1053+ std::map<T16 , std::vector<o2::framework::AxisSpec>>& kaonDauHistSpec,
1054+ std::map<T17 , std::vector<o2::framework::AxisSpec>>& pionDauHistSpec,
1055+ std::map<T18 , std::vector<o2::framework::AxisSpec>>& pairHistSpec,
1056+ std::map<T19 , std::vector<o2::framework::AxisSpec>>& cprHistSpec)
1057+ {
1058+ mColHistManager .template init <modeSe>(registry, colHistSpec, confCollisionBinning);
1059+
1060+ mTrackHistManager .template init <modeSe>(registry, trackHistSpec, confTrackSelection);
1061+ mLcHistManager .template init <modeSe>(registry, lcHistSpec, confLcSelection, protonDauHistSpec, kaonDauHistSpec, pionDauHistSpec);
1062+
1063+ mTrackCleaner .init (confTrackCleaner);
1064+ mLcCleaner .init (confLcCleaner);
1065+
1066+ // prongs are stored remapped onto the accepted hypothesis, so the roles are fixed:
1067+ // Lc -> p+ K- pi+
1068+ // Lcbar -> p- K+ pi-
1069+ const int protonDauPdg = (confLcSelection.sign .value > 0 ) ? PDG_t::kProton : -PDG_t::kProton ;
1070+ const int kaonDauPdg = (confLcSelection.sign .value > 0 ) ? PDG_t::kKMinus : PDG_t::kKPlus ;
1071+
1072+ mPairHistManagerSe .template init <modeSe>(registry, pairHistSpec, confPairBinning, confPairCuts, confMixing);
1073+ mPairHistManagerSe .setMass (confTrackSelection.pdgCodeAbs .value , 0 , 0 , confLcSelection.pdgCodeAbs .value , protonDauPdg, kaonDauPdg);
1074+ mPairHistManagerSe .setCharge (confTrackSelection.chargeAbs .value , 1 );
1075+ mCprSe .init (registry, cprHistSpec, cprHistSpec, cprHistSpec, confCprProton, confCprKaon, confCprPion, confTrackSelection.chargeAbs .value );
1076+
1077+ mPairHistManagerMe .template init <modeMe>(registry, pairHistSpec, confPairBinning, confPairCuts, confMixing);
1078+ mPairHistManagerMe .setMass (confTrackSelection.pdgCodeAbs .value , 0 , 0 , confLcSelection.pdgCodeAbs .value , protonDauPdg, kaonDauPdg);
1079+ mPairHistManagerMe .setCharge (confTrackSelection.chargeAbs .value , 1 );
1080+ mCprMe .init (registry, cprHistSpec, cprHistSpec, cprHistSpec, confCprProton, confCprKaon, confCprPion, confTrackSelection.chargeAbs .value );
1081+ mPc .template init <modeSe>(confPairCuts);
1082+
1083+ // setup mixing
1084+ mMixingPolicy = static_cast <pairhistmanager::MixingPolicy>(confMixing.policy .value );
1085+ mMixingDepth = confMixing.depth .value ;
1086+ }
1087+
1088+ template <modes::Mode mode, typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
1089+ void processSameEvent (T1 const & col, T2 & trackTable, T3 & trackPartition, T4 & /* lcTable*/ , T5 & lcPartition, T6 & cache)
1090+ {
1091+ auto trackSlice = trackPartition->sliceByCached (o2::aod::femtobase::stored::fColId , col.globalIndex (), cache);
1092+ auto lcSlice = lcPartition->sliceByCached (o2::aod::femtobase::stored::fColId , col.globalIndex (), cache);
1093+ if (trackSlice.size () < nLimitPartitionParticles || lcSlice.size () < nLimitPartitionParticles) {
1094+ return ;
1095+ }
1096+ mColHistManager .template fill <mode>(col);
1097+ mCprSe .setMagField (col.magField ());
1098+ pairprocesshelpers::processSameEvent<mode>(trackSlice, lcSlice, trackTable, col, mTrackHistManager , mLcHistManager , mPairHistManagerSe , mCprSe , mPc );
1099+ }
1100+
1101+ template <modes::Mode mode, typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
1102+ void processMixedEvent (T1 const & cols, T2 & trackTable, T3 & trackPartition, T4 & lcPartition, T5 & cache, T6 & binsVtxMult, T7 & binsVtxCent, T8 & binsVtxMultCent)
1103+ {
1104+ switch (mMixingPolicy ) {
1105+ case static_cast <int >(pairhistmanager::kVtxMult ):
1106+ pairprocesshelpers::processMixedEvent<mode>(cols, trackPartition, lcPartition, trackTable, cache, binsVtxMult, mMixingDepth , mPairHistManagerMe , mCprMe , mPc );
1107+ break ;
1108+ case static_cast <int >(pairhistmanager::kVtxCent ):
1109+ pairprocesshelpers::processMixedEvent<mode>(cols, trackPartition, lcPartition, trackTable, cache, binsVtxCent, mMixingDepth , mPairHistManagerMe , mCprMe , mPc );
1110+ break ;
1111+ case static_cast <int >(pairhistmanager::kVtxMultCent ):
1112+ pairprocesshelpers::processMixedEvent<mode>(cols, trackPartition, lcPartition, trackTable, cache, binsVtxMultCent, mMixingDepth , mPairHistManagerMe , mCprMe , mPc );
1113+ break ;
1114+ default :
1115+ LOG (fatal) << " Invalid binning policiy specifed. Breaking..." ;
1116+ }
1117+ }
1118+
1119+ template <modes::Mode mode, typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
1120+ void processSameEvent (T1 const & col, T2 const & mcCols, T3 const & trackTable, T4 & trackPartition, T5 const & /* lcTable*/ , T6 & lcPartition, T7 const & mcParticles, T8 const & mcMothers, T9 const & mcPartonicMothers, T10 & cache)
1121+ {
1122+ auto trackSlice = trackPartition->sliceByCached (o2::aod::femtobase::stored::fColId , col.globalIndex (), cache);
1123+ auto lcSlice = lcPartition->sliceByCached (o2::aod::femtobase::stored::fColId , col.globalIndex (), cache);
1124+ if (trackSlice.size () < nLimitPartitionParticles || lcSlice.size () < nLimitPartitionParticles) {
1125+ return ;
1126+ }
1127+ mColHistManager .template fill <mode>(col, mcCols);
1128+ mCprSe .setMagField (col.magField ());
1129+ pairprocesshelpers::processSameEvent<mode>(trackSlice, lcSlice, trackTable, mcParticles, mcMothers, mcPartonicMothers, col, mcCols, mTrackHistManager , mLcHistManager , mPairHistManagerSe , mTrackCleaner , mLcCleaner , mCprSe , mPc );
1130+ }
1131+
1132+ template <modes::Mode mode, typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
1133+ void processMixedEvent (T1 const & cols, T2 const & mcCols, T3 & trackTable, T4 & trackPartition, T5 & lcPartition, T6 const & mcParticles, T7 const & mcMothers, T8 const & mcPartonicMothers, T9 & cache, T10 & binsVtxMult, T11 & binsVtxCent, T12 & binsVtxMultCent)
1134+ {
1135+ switch (mMixingPolicy ) {
1136+ case static_cast <int >(pairhistmanager::kVtxMult ):
1137+ pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, trackPartition, lcPartition, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxMult, mMixingDepth , mPairHistManagerMe , mTrackCleaner , mLcCleaner , mCprMe , mPc );
1138+ break ;
1139+ case static_cast <int >(pairhistmanager::kVtxCent ):
1140+ pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, trackPartition, lcPartition, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxCent, mMixingDepth , mPairHistManagerMe , mTrackCleaner , mLcCleaner , mCprMe , mPc );
1141+ break ;
1142+ case static_cast <int >(pairhistmanager::kVtxMultCent ):
1143+ pairprocesshelpers::processMixedEvent<mode>(cols, mcCols, trackPartition, lcPartition, trackTable, mcParticles, mcMothers, mcPartonicMothers, cache, binsVtxMultCent, mMixingDepth , mPairHistManagerMe , mTrackCleaner , mLcCleaner , mCprMe , mPc );
1144+ break ;
1145+ default :
1146+ LOG (fatal) << " Invalid binning policiy specifed. Breaking..." ;
1147+ }
1148+ }
1149+
1150+ private:
1151+ colhistmanager::CollisionHistManager mColHistManager ;
1152+ trackhistmanager::TrackHistManager<prefixTrack> mTrackHistManager ;
1153+ charmhadronhistmanager::CharmHadronHistManager<prefixLc, prefixProtonDau, prefixKaonDau, prefixPionDau, charmHadronType> mLcHistManager ;
1154+ particlecleaner::ParticleCleaner mTrackCleaner ;
1155+ particlecleaner::ParticleCleaner mLcCleaner ;
1156+ pairhistmanager::PairHistManager<prefixSe, modes::Particle::kTrack , modes::Particle::kCharmHadron > mPairHistManagerSe ;
1157+ pairhistmanager::PairHistManager<prefixMe, modes::Particle::kTrack , modes::Particle::kCharmHadron > mPairHistManagerMe ;
1158+ closepairrejection::ClosePairRejectionTrackLc<prefixCprProtonSe, prefixCprKaonSe, prefixCprPionSe> mCprSe ;
1159+ closepairrejection::ClosePairRejectionTrackLc<prefixCprProtonMe, prefixCprKaonMe, prefixCprPionMe> mCprMe ;
1160+ paircleaner::TrackLcPairCleaner mPc ;
1161+ pairhistmanager::MixingPolicy mMixingPolicy = pairhistmanager::MixingPolicy::kVtxMult ;
1162+ int mMixingDepth = 5 ;
1163+ };
1164+
10121165template <auto & prefixTrack,
10131166 auto & prefixV0,
10141167 auto & prefixPosDau,
0 commit comments