Skip to content

Commit 0e032cd

Browse files
[PWGCF] Add multiplicity estimator task with triplet trigger to femto framework (#17968)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 36ed77a commit 0e032cd

14 files changed

Lines changed: 1414 additions & 35 deletions

PWGCF/Femto/Core/closeTripletRejection.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ namespace o2::analysis::femto::closetripletrejection
2929
constexpr const char PrefixCtrTrackTrackTrack[] = "CtrTrackTrackTrack";
3030
constexpr const char PrefixCtrTrackTrackV0[] = "CtrTrackTrackV0";
3131
constexpr const char PrefixCtrTrackTrackCascade[] = "CtrTrackTrackCascade";
32+
constexpr const char PrefixCtrMcParticleMcParticleMcParticle[] = "CtrMcParticleMcParticleMcParticle";
3233

3334
using ConfCtrTrackTrackTrack = closepairrejection::ConfCpr<PrefixCtrTrackTrackTrack>;
3435
using ConfCtrTrackTrackV0 = closepairrejection::ConfCpr<PrefixCtrTrackTrackV0>;
3536
using ConfCtrTrackTrackCascade = closepairrejection::ConfCpr<PrefixCtrTrackTrackCascade>;
37+
// generated particles, no cut by default (close triplet rejection corrects a detector effect)
38+
using ConfCtrMcParticleMcParticleMcParticle = closepairrejection::ConfCpr<PrefixCtrMcParticleMcParticleMcParticle, false>;
3639

3740
// directory names
3841
constexpr char PrefixTrack1Track2Se[] = "CPR_Track1Track2/SE/";
@@ -42,6 +45,13 @@ constexpr char PrefixTrack1Track2Me[] = "CPR_Track1Track2/ME/";
4245
constexpr char PrefixTrack2Track3Me[] = "CPR_Track2Track3/ME/";
4346
constexpr char PrefixTrack1Track3Me[] = "CPR_Track1Track3/ME/";
4447

48+
constexpr char PrefixMcParticle1McParticle2Se[] = "CPR_McParticle1McParticle2/SE/";
49+
constexpr char PrefixMcParticle2McParticle3Se[] = "CPR_McParticle2McParticle3/SE/";
50+
constexpr char PrefixMcParticle1McParticle3Se[] = "CPR_McParticle1McParticle3/SE/";
51+
constexpr char PrefixMcParticle1McParticle2Me[] = "CPR_McParticle1McParticle2/ME/";
52+
constexpr char PrefixMcParticle2McParticle3Me[] = "CPR_McParticle2McParticle3/ME/";
53+
constexpr char PrefixMcParticle1McParticle3Me[] = "CPR_McParticle1McParticle3/ME/";
54+
4555
constexpr char PrefixTrack1V0Se[] = "CPR_Track1V0/SE/";
4656
constexpr char PrefixTrack2V0Se[] = "CPR_Track2V0/SE/";
4757
constexpr char PrefixTrack1V0Me[] = "CPR_Track1V0/ME/";
@@ -205,5 +215,40 @@ class CloseTripletRejectionTrackTrackCascade
205215
closepairrejection::ClosePairRejectionTrackCascade<prefixTrack2Bachelor, prefixTrack2V0Daughter> mCtrTrack2Cascade;
206216
};
207217

218+
// close triplet rejection for triplets of generated particles; checks all three constituent pairs
219+
template <auto& prefixMcParticle1McParticle2,
220+
auto& prefixMcParticle2McParticle3,
221+
auto& prefixMcParticle1McParticle3>
222+
class CloseTripletRejectionMcParticleMcParticleMcParticle
223+
{
224+
public:
225+
CloseTripletRejectionMcParticleMcParticleMcParticle() = default;
226+
~CloseTripletRejectionMcParticleMcParticleMcParticle() = default;
227+
228+
template <typename T>
229+
void init(o2::framework::HistogramRegistry* registry,
230+
std::map<closepairrejection::CprHist, std::vector<o2::framework::AxisSpec>> const& specs,
231+
T const& confCpr)
232+
{
233+
mCtr12.init(registry, specs, confCpr);
234+
mCtr23.init(registry, specs, confCpr);
235+
mCtr13.init(registry, specs, confCpr);
236+
}
237+
238+
template <typename T1, typename T2, typename T3, typename T4>
239+
[[nodiscard]] bool isCloseTriplet(T1 const& particle1, T2 const& particle2, T3 const& particle3, T4 const& tripletHistManager)
240+
{
241+
bool isClose12 = mCtr12.isClosePair(particle1, particle2, tripletHistManager);
242+
bool isClose23 = mCtr23.isClosePair(particle2, particle3, tripletHistManager);
243+
bool isClose13 = mCtr13.isClosePair(particle1, particle3, tripletHistManager);
244+
return isClose12 || isClose23 || isClose13;
245+
}
246+
247+
private:
248+
closepairrejection::ClosePairRejectionMcParticleMcParticle<prefixMcParticle1McParticle2> mCtr12;
249+
closepairrejection::ClosePairRejectionMcParticleMcParticle<prefixMcParticle2McParticle3> mCtr23;
250+
closepairrejection::ClosePairRejectionMcParticleMcParticle<prefixMcParticle1McParticle3> mCtr13;
251+
};
252+
208253
} // namespace o2::analysis::femto::closetripletrejection
209254
#endif // PWGCF_FEMTO_CORE_CLOSETRIPLETREJECTION_H_

PWGCF/Femto/Core/mcBuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,11 @@ struct ConfMcParticleSelection : o2::framework::ConfigurableGroup {
122122

123123
constexpr const char PrefixMcParticleSelection1[] = "McParticleSelection1";
124124
constexpr const char PrefixMcParticleSelection2[] = "McParticleSelection2";
125+
constexpr const char PrefixMcParticleSelection3[] = "McParticleSelection3";
125126

126127
using ConfMcParticleSelection1 = ConfMcParticleSelection<PrefixMcParticleSelection1>;
127128
using ConfMcParticleSelection2 = ConfMcParticleSelection<PrefixMcParticleSelection2>;
129+
using ConfMcParticleSelection3 = ConfMcParticleSelection<PrefixMcParticleSelection3>;
128130

129131
class McBuilder
130132
{

PWGCF/Femto/Core/mcParticleHistManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ struct ConfMcParticleBinning : o2::framework::ConfigurableGroup {
8484

8585
constexpr const char PrefixMcParticleBinning1[] = "McParticleBinning1";
8686
constexpr const char PrefixMcParticleBinning2[] = "McParticleBinning2";
87+
constexpr const char PrefixMcParticleBinning3[] = "McParticleBinning3";
8788

8889
using ConfMcParticleBinning1 = ConfMcParticleBinning<PrefixMcParticleBinning1>;
8990
using ConfMcParticleBinning2 = ConfMcParticleBinning<PrefixMcParticleBinning2>;
91+
using ConfMcParticleBinning3 = ConfMcParticleBinning<PrefixMcParticleBinning3>;
9092

9193
// the enum gives the correct index in the array
9294
constexpr std::array<histmanager::HistInfo<McParticleHist>, kMcParticleHistLast>
@@ -144,6 +146,7 @@ auto makeMcParticleHistSpecMap(const T& confBinning)
144146

145147
inline constexpr char PrefixMcParticle1[] = "McParticle1/";
146148
inline constexpr char PrefixMcParticle2[] = "McParticle2/";
149+
inline constexpr char PrefixMcParticle3[] = "McParticle3/";
147150

148151
constexpr std::string_view McDir = "MC/";
149152

PWGCF/Femto/Core/pairHistManager.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,14 @@ class PairHistManager
760760
mTrueMinv = getMinv(mTrueParticle1, mTrueParticle2);
761761
mTrueKstar = getKstar(mTrueParticle1, mTrueParticle2);
762762

763+
// in the pure mc-truth path there is no reco counterpart, so the generated values are also
764+
// stored in the reco members; they are used by getKinematic(), i.e. by the kinematic histograms
765+
// of the pair cleaner and of the close pair rejection
766+
mKt = mTrueKt;
767+
mMt = mTrueMt;
768+
mMassInv = mTrueMinv;
769+
mKstar = mTrueKstar;
770+
763771
if (mPlotBertschPratt) {
764772
std::tie(mTrueQout, mTrueQside, mTrueQlong) = computeBertschPrattLCMS(mTrueParticle1, mTrueParticle2);
765773
}
@@ -787,6 +795,20 @@ class PairHistManager
787795
mTrueCent = 0.5f * (col1.cent() + col2.cent());
788796
}
789797

798+
/// pair cuts on the mc-truth values, for the pure mc-truth path (kMc without kReco),
799+
/// where the reco values are never set
800+
bool checkPairCutsMcTruth() const
801+
{
802+
return (!(mKstarMin > 0.f) || mTrueKstar > mKstarMin) &&
803+
(!(mKstarMax > 0.f) || mTrueKstar < mKstarMax) &&
804+
(!(mKtMin > 0.f) || mTrueKt > mKtMin) &&
805+
(!(mKtMax > 0.f) || mTrueKt < mKtMax) &&
806+
(!(mMtMin > 0.f) || mTrueMt > mMtMin) &&
807+
(!(mMtMax > 0.f) || mTrueMt < mMtMax) &&
808+
(!(mMassInvMin > 0.f) || mTrueMinv > mMassInvMin) &&
809+
(!(mMassInvMax > 0.f) || mTrueMinv < mMassInvMax);
810+
}
811+
790812
bool checkPairCuts() const
791813
{
792814
return (!(mKstarMin > 0.f) || mKstar > mKstarMin) &&

PWGCF/Femto/Core/pairProcessHelpers.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ bool processSameEvent(T1 const& SliceParticle,
341341
if (CprManager.isClosePair(p1, p2, PairHistManager)) {
342342
continue;
343343
}
344-
if (PairHistManager.checkPairCuts()) {
344+
if (PairHistManager.checkPairCutsMcTruth()) {
345345
PairHistManager.template fill<mode>();
346346
PairHistManager.trackParticlesPerEvent(p1, p2);
347347
foundPair = true;
@@ -408,7 +408,7 @@ bool processSameEvent(T1 const& SliceParticle1,
408408
if (CprManager.isClosePair(p1, p2, PairHistManager)) {
409409
continue;
410410
}
411-
if (PairHistManager.checkPairCuts()) {
411+
if (PairHistManager.checkPairCutsMcTruth()) {
412412
PairHistManager.template fill<mode>();
413413
PairHistManager.trackParticlesPerEvent(p1, p2);
414414
foundPair = true;
@@ -714,7 +714,7 @@ void processMixedEvent(T1 const& Collisions,
714714
continue;
715715
}
716716

717-
if (PairHistManager.checkPairCuts()) {
717+
if (PairHistManager.checkPairCutsMcTruth()) {
718718
hasValidPair = true;
719719
PairHistManager.trackParticlesPerEvent(p1, p2);
720720
PairHistManager.template fill<mode>();

PWGCF/Femto/Core/particleCleaner.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,10 @@ using ConfOmegaCleaner2 = ConfParticleCleaner<PrefixOmegaCleaner2>;
8585

8686
constexpr const char PrefixMcParticleCleaner1[] = "McParticleCleaner1";
8787
constexpr const char PrefixMcParticleCleaner2[] = "McParticleCleaner2";
88+
constexpr const char PrefixMcParticleCleaner3[] = "McParticleCleaner3";
8889
using ConfMcParticleCleaner1 = ConfParticleCleaner<PrefixMcParticleCleaner1>;
8990
using ConfMcParticleCleaner2 = ConfParticleCleaner<PrefixMcParticleCleaner2>;
91+
using ConfMcParticleCleaner3 = ConfParticleCleaner<PrefixMcParticleCleaner3>;
9092

9193
class ParticleCleaner
9294
{

0 commit comments

Comments
 (0)