Skip to content

Commit a37914c

Browse files
committed
[PWGCF] Femto: add track-Lc pair
1 parent bcab8a6 commit a37914c

5 files changed

Lines changed: 264 additions & 16 deletions

File tree

PWGCF/Femto/Core/closePairRejection.h

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ struct ConfCpr : o2::framework::ConfigurableGroup {
8484
constexpr const char PrefixCprTrackTrack[] = "CprTrackTrack";
8585
constexpr const char PrefixCprTrackV0Daughter[] = "CprTrackV0Daughter";
8686
constexpr const char PrefixCprTrackD0Daughter[] = "CprTrackD0Daughter";
87+
constexpr const char PrefixCprTrackLcProton[] = "CprTrackLcProton";
88+
constexpr const char PrefixCprTrackLcKaon[] = "CprTrackLcKaon";
89+
constexpr const char PrefixCprTrackLcPion[] = "CprTrackLcPion";
8790
constexpr const char PrefixCprD0DaughterD0DaughterPos[] = "CprD0DaughterD0DaughterPos";
8891
constexpr const char PrefixCprD0DaughterD0DaughterNeg[] = "CprD0DaughterD0DaughterNeg";
8992
constexpr const char PrefixCprTrackResonanceDaughter[] = "CprTrackResonanceDaughter";
@@ -98,6 +101,9 @@ constexpr const char PrefixCprTrackCascadeBachelor[] = "CprTrackCascadeBachelor"
98101
using ConfCprTrackTrack = ConfCpr<PrefixCprTrackTrack>;
99102
using ConfCprTrackV0Daughter = ConfCpr<PrefixCprTrackV0Daughter>;
100103
using ConfCprTrackD0Daughter = ConfCpr<PrefixCprTrackD0Daughter>;
104+
using ConfCprTrackLcProton = ConfCpr<PrefixCprTrackLcProton>;
105+
using ConfCprTrackLcKaon = ConfCpr<PrefixCprTrackLcKaon>;
106+
using ConfCprTrackLcPion = ConfCpr<PrefixCprTrackLcPion>;
101107
using ConfCprD0DaugherD0DaughterPos = ConfCpr<PrefixCprD0DaughterD0DaughterPos>;
102108
using ConfCprD0DaugherD0DaughterNeg = ConfCpr<PrefixCprD0DaughterD0DaughterNeg>;
103109
using ConfCprTrackResonanceDaughter = ConfCpr<PrefixCprTrackResonanceDaughter>;
@@ -123,6 +129,12 @@ constexpr char PrefixD0D0PosSe[] = "CPR_D0D0_PosDau/SE/";
123129
constexpr char PrefixD0D0NegSe[] = "CPR_D0D0_NegDau/SE/";
124130
constexpr char PrefixD0D0PosMe[] = "CPR_D0D0_PosDau/ME/";
125131
constexpr char PrefixD0D0NegMe[] = "CPR_D0D0_NegDau/ME/";
132+
constexpr char PrefixTrackLcProtonSe[] = "CPR_TrackLc_Proton/SE/";
133+
constexpr char PrefixTrackLcKaonSe[] = "CPR_TrackLc_Kaon/SE/";
134+
constexpr char PrefixTrackLcPionSe[] = "CPR_TrackLc_Pion/SE/";
135+
constexpr char PrefixTrackLcProtonMe[] = "CPR_TrackLc_Proton/ME/";
136+
constexpr char PrefixTrackLcKaonMe[] = "CPR_TrackLc_Kaon/ME/";
137+
constexpr char PrefixTrackLcPionMe[] = "CPR_TrackLc_Pion/ME/";
126138
constexpr char PrefixV0V0PosSe[] = "CPR_V0V0_PosDau/SE/";
127139
constexpr char PrefixV0V0NegSe[] = "CPR_V0V0_NegDau/SE/";
128140
constexpr char PrefixV0V0PosMe[] = "CPR_V0V0_PosDau/ME/";
@@ -539,6 +551,58 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
539551
CloseTrackRejection<prefixTrackV0> mCtr;
540552
};
541553

554+
template <auto& prefixProton, auto& prefixKaon, auto& prefixPion>
555+
class ClosePairRejectionTrackLc
556+
{
557+
public:
558+
template <typename T1, typename T2, typename T3>
559+
void init(o2::framework::HistogramRegistry* registry,
560+
std::map<CprHist, std::vector<o2::framework::AxisSpec>> const& specsProton,
561+
std::map<CprHist, std::vector<o2::framework::AxisSpec>> const& specsKaon,
562+
std::map<CprHist, std::vector<o2::framework::AxisSpec>> const& specsPion,
563+
T1 const& confCprProton,
564+
T2 const& confCprKaon,
565+
T3 const& confCprPion,
566+
int absChargeTrack)
567+
{
568+
mCtrProton.init(registry, specsProton, confCprProton, absChargeTrack, 1);
569+
mCtrKaon.init(registry, specsKaon, confCprKaon, absChargeTrack, 1);
570+
mCtrPion.init(registry, specsPion, confCprPion, absChargeTrack, 1);
571+
}
572+
573+
void setMagField(float magField)
574+
{
575+
mCtrProton.setMagField(magField);
576+
mCtrKaon.setMagField(magField);
577+
mCtrPion.setMagField(magField);
578+
}
579+
580+
template <typename T1, typename T2, typename T3>
581+
void setPair(T1 const& track, T2 const& lc, T3 const& trackTable)
582+
{
583+
auto prong0 = trackTable.rawIteratorAt(lc.prong0DauId() - trackTable.offset());
584+
mCtrProton.compute(track, prong0);
585+
auto prong1 = trackTable.rawIteratorAt(lc.prong1DauId() - trackTable.offset());
586+
mCtrKaon.compute(track, prong1);
587+
auto prong2 = trackTable.rawIteratorAt(lc.prong2DauId() - trackTable.offset());
588+
mCtrPion.compute(track, prong2);
589+
}
590+
591+
[[nodiscard]] bool isClosePair() const { return mCtrProton.isClosePair() || mCtrKaon.isClosePair() || mCtrPion.isClosePair(); }
592+
593+
void fill(float kstar)
594+
{
595+
mCtrProton.fill(kstar);
596+
mCtrKaon.fill(kstar);
597+
mCtrPion.fill(kstar);
598+
}
599+
600+
private:
601+
CloseTrackRejection<prefixProton> mCtrProton;
602+
CloseTrackRejection<prefixKaon> mCtrKaon;
603+
CloseTrackRejection<prefixPion> mCtrPion;
604+
};
605+
542606
template <auto& prefixBachelor, auto& prefixV0Daughter>
543607
class ClosePairRejectionTrackCascade
544608
{

PWGCF/Femto/Core/pairBuilder.h

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
10121165
template <auto& prefixTrack,
10131166
auto& prefixV0,
10141167
auto& prefixPosDau,

PWGCF/Femto/Core/pairCleaner.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,37 @@ class TrackCascadePairCleaner : public BasePairCleaner
266266
}
267267
};
268268

269+
class TrackLcPairCleaner : public BasePairCleaner
270+
{
271+
public:
272+
TrackLcPairCleaner() = default;
273+
template <typename T1, typename T2, typename T3>
274+
bool isCleanPair(T1 const& track, T2 const& lc, T3 const& trackTable) const
275+
{
276+
auto prong0 = trackTable.rawIteratorAt(lc.prong0DauId() - trackTable.offset());
277+
auto prong1 = trackTable.rawIteratorAt(lc.prong1DauId() - trackTable.offset());
278+
auto prong2 = trackTable.rawIteratorAt(lc.prong2DauId() - trackTable.offset());
279+
return (this->isCleanParticlePair(prong0, track) && this->isCleanParticlePair(prong1, track) && this->isCleanParticlePair(prong2, track));
280+
}
281+
282+
template <typename T1, typename T2, typename T3, typename T4, typename T5>
283+
bool isCleanPair(T1 const& track1, T2 const& lc, T3 const& trackTable, T4 const& mcParticles, T5 const& partonicMothers) const
284+
{
285+
if (!this->isCleanPair(track1, lc, trackTable)) {
286+
return false;
287+
}
288+
// pair is clean
289+
// now check if we require common or non-common ancestry
290+
if (mMixPairsWithCommonAncestor) {
291+
return this->pairHasCommonAncestor(track1, lc, mcParticles, partonicMothers);
292+
}
293+
if (mMixPairsWithNonCommonAncestor) {
294+
return this->pairHasNonCommonAncestor(track1, lc, mcParticles, partonicMothers);
295+
}
296+
return true;
297+
}
298+
};
299+
269300
class McParticleMcParticlePairCleaner : public BasePairCleaner
270301
{
271302
public:

PWGCF/Femto/Tasks/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ o2physics_add_dpl_workflow(femto-pair-track-v0
4949
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
5050
COMPONENT_NAME Analysis)
5151

52-
o2physics_add_dpl_workflow(femto-pair-track-d0
53-
SOURCES femtoPairTrackD0.cxx
52+
o2physics_add_dpl_workflow(femto-pair-track-charm-hadron
53+
SOURCES femtoPairTrackCharmHadron.cxx
5454
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
5555
COMPONENT_NAME Analysis)
5656

0 commit comments

Comments
 (0)