Skip to content

Commit f21cbc0

Browse files
authored
[PWGCF] Add v0-resonance pair task (#16606)
1 parent 641a8f8 commit f21cbc0

9 files changed

Lines changed: 384 additions & 39 deletions

PWGCF/Femto/Core/closePairRejection.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ constexpr const char PrefixCprTrackResonanceDaughter[] = "CprTrackResonanceDaugh
8888
constexpr const char PrefixCprTrackKinkDaughter[] = "CprTrackKinkDaughter";
8989
constexpr const char PrefixCprV0DaughterV0DaughterPos[] = "CprV0DaughterV0DaughterPos";
9090
constexpr const char PrefixCprV0DaughterV0DaughterNeg[] = "CprV0DaughterV0DaughterNeg";
91+
constexpr const char PrefixCprV0DaughterResoDaughterPos[] = "CprV0DaughterResoDaughterPos";
92+
constexpr const char PrefixCprV0DaughterResoDaughterNeg[] = "CprV0DaughterResoDaughterNeg";
9193
constexpr const char PrefixCprTrackCascadeBachelor[] = "CprTrackCascadeBachelor";
9294

9395
// pairs
@@ -97,6 +99,8 @@ using ConfCprTrackResonanceDaughter = ConfCpr<PrefixCprTrackResonanceDaughter>;
9799
using ConfCprTrackKinkDaughter = ConfCpr<PrefixCprTrackKinkDaughter>;
98100
using ConfCprV0DaugherV0DaughterPos = ConfCpr<PrefixCprV0DaughterV0DaughterPos>;
99101
using ConfCprV0DaugherV0DaughterNeg = ConfCpr<PrefixCprV0DaughterV0DaughterNeg>;
102+
using ConfCprV0DaughterResoDaughterPos = ConfCpr<PrefixCprV0DaughterResoDaughterPos>;
103+
using ConfCprV0DaughterResoDaughterNeg = ConfCpr<PrefixCprV0DaughterResoDaughterNeg>;
100104
using ConfCprTrackCascadeBachelor = ConfCpr<PrefixCprTrackCascadeBachelor>;
101105

102106
// tpc radii for computing phistar
@@ -112,6 +116,10 @@ constexpr char PrefixV0V0PosSe[] = "CPR_V0V0_PosDau/SE/";
112116
constexpr char PrefixV0V0NegSe[] = "CPR_V0V0_NegDau/SE/";
113117
constexpr char PrefixV0V0PosMe[] = "CPR_V0V0_PosDau/ME/";
114118
constexpr char PrefixV0V0NegMe[] = "CPR_V0V0_NegDau/ME/";
119+
constexpr char PrefixV0TwoTrackResonancePosSe[] = "CPR_V0V0_PosDau/SE/";
120+
constexpr char PrefixV0TwoTrackResonanceNegSe[] = "CPR_V0Resonance_NegDau/SE/";
121+
constexpr char PrefixV0TwoTrackResonancePosMe[] = "CPR_V0Resonance_PosDau/ME/";
122+
constexpr char PrefixV0TwoTrackResonanceNegMe[] = "CPR_V0Resonance_NegDau/ME/";
115123
constexpr char PrefixTrackTwoTrackResonanceSe[] = "CPR_TrackResonanceDau/SE/";
116124
constexpr char PrefixTrackTwoTrackResonanceMe[] = "CPR_TrackResonanceDau/ME/";
117125
constexpr char PrefixTrackCascadeBachelorSe[] = "CPR_TrackCascadeBachelor/SE/";

PWGCF/Femto/Core/pairBuilder.h

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,130 @@ class PairTrackTwoTrackResonanceBuilder
820820
int mMixingDepth = 5;
821821
};
822822

823+
template <const char* prefixV0,
824+
const char* prefixV0PosDau,
825+
const char* prefixV0NegDau,
826+
const char* prefixResonance,
827+
const char* prefixResonancePosDau,
828+
const char* prefixResonanceNegDau,
829+
const char* prefixSe,
830+
const char* prefixMe,
831+
const char* prefixCprPosSe,
832+
const char* prefixCprNegSe,
833+
const char* prefixCprPosMe,
834+
const char* prefixCprNegMe,
835+
modes::V0 v0Type,
836+
modes::TwoTrackResonance resonanceType>
837+
class PairV0TwoTrackResonanceBuilder
838+
{
839+
public:
840+
PairV0TwoTrackResonanceBuilder() = default;
841+
~PairV0TwoTrackResonanceBuilder() = default;
842+
843+
template <modes::Mode modeSe,
844+
modes::Mode modeMe,
845+
typename T1,
846+
typename T2,
847+
typename T3,
848+
typename T4,
849+
typename T5,
850+
typename T6,
851+
typename T7,
852+
typename T8,
853+
typename T9,
854+
typename T10,
855+
typename T11,
856+
typename T12,
857+
typename T13,
858+
typename T14,
859+
typename T15,
860+
typename T16,
861+
typename T17,
862+
typename T18>
863+
void init(o2::framework::HistogramRegistry* registry,
864+
T1 const& confCollisionBinning,
865+
T2 const& confV0Selection,
866+
T3 const& confResonanceSelection,
867+
T4 const& confCprPos,
868+
T5 const& confCprNeg,
869+
T6 const& confMixing,
870+
T7 const& confPairBinning,
871+
T8 const& confPairCuts,
872+
std::map<T9, std::vector<o2::framework::AxisSpec>> const& colHistSpec,
873+
std::map<T10, std::vector<o2::framework::AxisSpec>> const& v0HistSpec,
874+
std::map<T11, std::vector<o2::framework::AxisSpec>> const& V0posDauHistSpec,
875+
std::map<T12, std::vector<o2::framework::AxisSpec>> const& V0negDauHistSpec,
876+
std::map<T13, std::vector<o2::framework::AxisSpec>> const& resonanceHistSpec,
877+
std::map<T14, std::vector<o2::framework::AxisSpec>> const& ResonancePosDauHistSpec,
878+
std::map<T15, std::vector<o2::framework::AxisSpec>> const& ResonanceNegDauHistSpec,
879+
std::map<T16, std::vector<o2::framework::AxisSpec>> const& pairHistSpec,
880+
std::map<T17, std::vector<o2::framework::AxisSpec>> const& cprHistSpecPos,
881+
std::map<T18, std::vector<o2::framework::AxisSpec>> const& cprHistSpecNeg)
882+
{
883+
mColHistManager.template init<modeSe>(registry, colHistSpec, confCollisionBinning);
884+
885+
mV0HistManager.template init<modeSe>(registry, v0HistSpec, confV0Selection, V0posDauHistSpec, V0negDauHistSpec);
886+
mResonanceHistManager.template init<modeSe>(registry, resonanceHistSpec, confResonanceSelection, ResonancePosDauHistSpec, ResonanceNegDauHistSpec);
887+
888+
mPairHistManagerSe.template init<modeSe>(registry, pairHistSpec, confPairBinning, confPairCuts, confMixing);
889+
mPairHistManagerSe.setMass(confV0Selection.pdgCodeAbs.value, confResonanceSelection.pdgCodeAbs.value);
890+
mPairHistManagerSe.setCharge(1, 1); // set charge to 1
891+
mCprSe.init(registry, cprHistSpecPos, cprHistSpecNeg, confCprPos, confCprNeg);
892+
893+
mPairHistManagerMe.template init<modeMe>(registry, pairHistSpec, confPairBinning, confPairCuts, confMixing);
894+
mPairHistManagerMe.setMass(confV0Selection.pdgCodeAbs.value, confResonanceSelection.pdgCodeAbs.value);
895+
mPairHistManagerMe.setCharge(1, 1); // set charge to 1
896+
mCprMe.init(registry, cprHistSpecPos, cprHistSpecNeg, confCprPos, confCprNeg);
897+
898+
// setup mixing
899+
mMixingPolicy = static_cast<pairhistmanager::MixingPolicy>(confMixing.policy.value);
900+
mMixingDepth = confMixing.depth.value;
901+
}
902+
903+
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4, typename T5>
904+
void processSameEvent(T1 const& col, T2& trackTable, T3& v0Partition, T4& resonancePartition, T5& cache)
905+
{
906+
auto v0Slice = v0Partition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache);
907+
auto resonanaceSlice = resonancePartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache);
908+
if (v0Slice.size() < nLimitPartitionParticles || resonanaceSlice.size() < nLimitPartitionParticles) {
909+
return;
910+
}
911+
mColHistManager.template fill<mode>(col);
912+
mCprSe.setMagField(col.magField());
913+
pairprocesshelpers::processSameEvent<mode>(v0Slice, resonanaceSlice, trackTable, col, mV0HistManager, mResonanceHistManager, mPairHistManagerSe, mCprSe, mPc);
914+
}
915+
916+
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
917+
void processMixedEvent(T1 const& cols, T2& trackTable, T3& v0Partition, T4& resonancePartition, T5& cache, T6& binsVtxMult, T7& binsVtxCent, T8& binsVtxMultCent)
918+
{
919+
switch (mMixingPolicy) {
920+
case static_cast<int>(pairhistmanager::kVtxMult):
921+
pairprocesshelpers::processMixedEvent<mode>(cols, v0Partition, resonancePartition, trackTable, cache, binsVtxMult, mMixingDepth, mPairHistManagerMe, mCprMe, mPc);
922+
break;
923+
case static_cast<int>(pairhistmanager::kVtxCent):
924+
pairprocesshelpers::processMixedEvent<mode>(cols, v0Partition, resonancePartition, trackTable, cache, binsVtxCent, mMixingDepth, mPairHistManagerMe, mCprMe, mPc);
925+
break;
926+
case static_cast<int>(pairhistmanager::kVtxMultCent):
927+
pairprocesshelpers::processMixedEvent<mode>(cols, v0Partition, resonancePartition, trackTable, cache, binsVtxMultCent, mMixingDepth, mPairHistManagerMe, mCprMe, mPc);
928+
break;
929+
default:
930+
LOG(fatal) << "Invalid binning policiy specifed. Breaking...";
931+
}
932+
}
933+
934+
private:
935+
colhistmanager::CollisionHistManager mColHistManager;
936+
v0histmanager::V0HistManager<prefixV0, prefixV0PosDau, prefixV0NegDau, v0Type> mV0HistManager;
937+
twotrackresonancehistmanager::TwoTrackResonanceHistManager<prefixResonance, prefixResonancePosDau, prefixResonanceNegDau, resonanceType> mResonanceHistManager;
938+
pairhistmanager::PairHistManager<prefixSe, modes::Particle::kV0, modes::Particle::kTwoTrackResonance> mPairHistManagerSe;
939+
pairhistmanager::PairHistManager<prefixMe, modes::Particle::kV0, modes::Particle::kTwoTrackResonance> mPairHistManagerMe;
940+
closepairrejection::ClosePairRejectionV0V0<prefixCprPosSe, prefixCprNegSe> mCprSe; // cpr for twotrackresonances and v0 work the same way
941+
closepairrejection::ClosePairRejectionV0V0<prefixCprPosMe, prefixCprNegMe> mCprMe; // cpr for twotrackresonances and v0 work the same way
942+
paircleaner::V0V0PairCleaner mPc; // pc for twotrackresonances and v0 work the same way
943+
pairhistmanager::MixingPolicy mMixingPolicy = pairhistmanager::MixingPolicy::kVtxMult;
944+
int mMixingDepth = 5;
945+
};
946+
823947
template <const char* prefixTrack,
824948
const char* prefixKink,
825949
const char* prefixChaDau,

PWGCF/Femto/Core/pairCleaner.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class TrackTrackPairCleaner : public BasePairCleaner
111111
}
112112
};
113113

114-
class V0V0PairCleaner : public BasePairCleaner
114+
class V0V0PairCleaner : public BasePairCleaner // also works for particles decaying into a positive and negative daughter, like resonances
115115
{
116116
public:
117117
V0V0PairCleaner() = default;
@@ -122,7 +122,9 @@ class V0V0PairCleaner : public BasePairCleaner
122122
auto negDaughter1 = trackTable.rawIteratorAt(v01.negDauId() - trackTable.offset());
123123
auto posDaughter2 = trackTable.rawIteratorAt(v02.posDauId() - trackTable.offset());
124124
auto negDaughter2 = trackTable.rawIteratorAt(v02.negDauId() - trackTable.offset());
125-
return this->isCleanTrackPair(posDaughter1, posDaughter2) && this->isCleanTrackPair(negDaughter1, negDaughter2);
125+
// check all charge combinations
126+
return this->isCleanTrackPair(posDaughter1, posDaughter2) && this->isCleanTrackPair(negDaughter1, negDaughter2) &&
127+
this->isCleanTrackPair(posDaughter1, negDaughter2) && this->isCleanTrackPair(negDaughter1, posDaughter2);
126128
}
127129

128130
template <typename T1, typename T2, typename T3, typename T4>

PWGCF/Femto/Core/pairHistManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,9 @@ constexpr char PrefixV0V0Me[] = "V0V0/ME/";
351351
constexpr char PrefixTrackResonanceSe[] = "TrackResonance/SE/";
352352
constexpr char PrefixTrackResonanceMe[] = "TrackResonance/ME/";
353353

354+
constexpr char PrefixV0ResonanceSe[] = "V0Resonance/SE/";
355+
constexpr char PrefixV0ResonanceMe[] = "V0Resonance/ME/";
356+
354357
constexpr char PrefixTrackCascadeSe[] = "TrackCascade/SE/";
355358
constexpr char PrefixTrackCascadeMe[] = "TrackCascade/ME/";
356359

PWGCF/Femto/Core/particleCleaner.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,17 +209,16 @@ class ParticleCleaner
209209

210210
return hasRequiredPdgCode && !hasRejectedPdgCode &&
211211
hasMotherWithRequiredPdgCode && !hasMotherWithRejectedPdgCode &&
212-
hasPartonicMotherWithRequiredPdgCode &&
213-
!hasPartonicMotherWithRejectedPdgCode;
212+
hasPartonicMotherWithRequiredPdgCode && !hasPartonicMotherWithRejectedPdgCode;
214213
}
215214

216215
private:
217216
bool mActivate = false;
218217
bool mRejectParticleWithoutMcParticle = true;
219218
bool mRejectParticleWithoutMcMother = true;
220219
bool mRejectParticleWithoutMcPartonicMother = true;
221-
std::vector<int> mRequiredPdgCodes = {};
222-
std::vector<int> mRejectedPdgCodes = {};
220+
std::vector<int> mRequiredPdgCodes{};
221+
std::vector<int> mRejectedPdgCodes{};
223222
std::vector<int> mRequiredMotherPdgCodes{};
224223
std::vector<int> mRejectedMotherPdgCodes{};
225224
std::vector<int> mRequiredPartonicMotherPdgCodes{};

PWGCF/Femto/TableProducer/femtoProducerDerivedToDerived.cxx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,16 @@ struct FemtoProducerDerivedToDerived {
123123
}
124124
PROCESS_SWITCH(FemtoProducerDerivedToDerived, processTracksLambdas, "Process lambdas and tracks", false);
125125

126+
void processLambdas(FilteredCollision const& col, Tracks const& tracks, Lambdas const& lambdas)
127+
{
128+
if (v0Builder.collisionHasTooFewLambdas(col, lambdas, lambdaPartition, cache)) {
129+
return;
130+
}
131+
collisionBuilder.processCollision(col, collisionBuilderProducts);
132+
v0Builder.processLambdas(col, lambdas, tracks, lambdaPartition, trackBuilder, cache, v0BuilderProducts, trackBuilderProducts, collisionBuilderProducts);
133+
}
134+
PROCESS_SWITCH(FemtoProducerDerivedToDerived, processLambdas, "Process lambdas", false);
135+
126136
void processTracksK0shorts(FilteredCollision const& col, Tracks const& tracks, K0shorts const& k0shorts)
127137
{
128138
if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache) || v0Builder.collisionHasTooFewK0shorts(col, k0shorts, k0shortPartition, cache)) {

PWGCF/Femto/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ o2physics_add_dpl_workflow(femto-pair-track-two-track-resonance
4949
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
5050
COMPONENT_NAME Analysis)
5151

52+
o2physics_add_dpl_workflow(femto-pair-v0-two-track-resonance
53+
SOURCES femtoPairV0TwoTrackResonance.cxx
54+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
55+
COMPONENT_NAME Analysis)
56+
5257
o2physics_add_dpl_workflow(femto-pair-track-cascade
5358
SOURCES femtoPairTrackCascade.cxx
5459
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore

0 commit comments

Comments
 (0)