Skip to content

Commit 6dd8f6c

Browse files
author
Henrik Fribert
committed
Feat: Add Track-Kink pairing to femto framework
1 parent fa7d3fe commit 6dd8f6c

File tree

8 files changed

+326
-3
lines changed

8 files changed

+326
-3
lines changed

PWGCF/Femto/Core/closePairRejection.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ constexpr char PrefixTrackTrackSe[] = "CPR_TrackTrack/SE/";
6565
constexpr char PrefixTrackTrackMe[] = "CPR_TrackTrack/ME/";
6666
constexpr char PrefixTrackV0Se[] = "CPR_TrackV0/SE/";
6767
constexpr char PrefixTrackV0Me[] = "CPR_TrackV0/ME/";
68+
constexpr char PrefixTrackKinkSe[] = "CPR_TrackKink/SE/";
69+
constexpr char PrefixTrackKinkMe[] = "CPR_TrackKink/ME/";
6870

6971
// must be in sync with enum TrackVariables
7072
// the enum gives the correct index in the array
@@ -260,6 +262,50 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
260262
bool mIsActivated = true;
261263
};
262264

265+
template <const char* prefix>
266+
class ClosePairRejectionTrackKink
267+
{
268+
public:
269+
void init(o2::framework::HistogramRegistry* registry, std::map<CprHist, std::vector<o2::framework::AxisSpec>>& specs, float detaMax, float dphistarMax, int signTrack, int absChargeTrack, bool isActivated)
270+
{
271+
mIsActivated = isActivated;
272+
mSignTrack = signTrack;
273+
274+
// initialize CPR with charge of the track and the charged daughter particle
275+
// For kinks, we compare the primary track with the charged daughter
276+
// The charged daughter has absolute charge of 1, so we can pass the sign directly
277+
mCtr.init(registry, specs, detaMax, dphistarMax, signTrack * absChargeTrack, mSignTrack);
278+
}
279+
280+
void setMagField(float magField)
281+
{
282+
mCtr.setMagField(magField);
283+
}
284+
285+
template <typename T1, typename T2, typename T3>
286+
void setPair(const T1& track, const T2& kink, const T3 /*trackTable*/)
287+
{
288+
if (mSignTrack == 1 || mSignTrack == -1) {
289+
auto daughter = kink.template chaDau_as<T3>();
290+
mCtr.compute(track, daughter);
291+
} else {
292+
LOG(fatal) << "CPR Track-Kink: Wrong track sign";
293+
}
294+
}
295+
296+
bool isClosePair() const { return mCtr.isClosePair(); }
297+
void fill()
298+
{
299+
mCtr.fill();
300+
}
301+
bool isActivated() const { return mIsActivated; }
302+
303+
private:
304+
CloseTrackRejection<prefix> mCtr;
305+
int mSignTrack = 0;
306+
bool mIsActivated = true;
307+
};
308+
263309
}; // namespace closepairrejection
264310
}; // namespace o2::analysis::femto
265311
#endif // PWGCF_FEMTO_CORE_CLOSEPAIRREJECTION_H_

PWGCF/Femto/Core/femtoUtils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ inline float getMass(int pdgCode)
145145
case o2::constants::physics::Pdg::kHelium3:
146146
mass = o2::constants::physics::MassHelium3;
147147
break;
148+
case kSigmaMinus:
149+
mass = o2::constants::physics::MassSigmaMinus;
150+
break;
148151
default:
149152
LOG(fatal) << "PDG code is not suppored";
150153
}

PWGCF/Femto/Core/kinkHistManager.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,8 @@ std::map<KinkHist, std::vector<framework::AxisSpec>> makeKinkQaHistSpecMap(T1 co
150150
}
151151

152152
constexpr char PrefixSigmaQa[] = "SigmaQA/";
153-
constexpr char PrefixSigma[] = "Sigma/";
154-
constexpr char PrefixKinkChaDaughter[] = "KinkChaDau/";
155-
constexpr char PrefixKinkChaDaughterQa[] = "KinkChaDauQa/";
153+
constexpr char PrefixSigma1[] = "Sigma1/";
154+
constexpr char PrefixSigma2[] = "Sigma2/";
156155

157156
constexpr std::string_view AnalysisDir = "Kinematics/";
158157
constexpr std::string_view QaDir = "QA/";

PWGCF/Femto/Core/pairBuilder.h

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "PWGCF/Femto/Core/closePairRejection.h"
2020
#include "PWGCF/Femto/Core/collisionHistManager.h"
21+
#include "PWGCF/Femto/Core/kinkHistManager.h"
2122
#include "PWGCF/Femto/Core/modes.h"
2223
#include "PWGCF/Femto/Core/pairCleaner.h"
2324
#include "PWGCF/Femto/Core/pairHistManager.h"
@@ -296,6 +297,107 @@ class PairTrackV0Builder
296297
int mMixingDepth = 5;
297298
};
298299

300+
template <
301+
const char* prefixTrack,
302+
const char* prefixKink,
303+
const char* prefixChaDau,
304+
const char* prefixSe,
305+
const char* prefixMe,
306+
const char* prefixCprSe,
307+
const char* prefixCprMe,
308+
modes::Mode mode,
309+
modes::Kink kinkType>
310+
class PairTrackKinkBuilder
311+
{
312+
public:
313+
PairTrackKinkBuilder() = default;
314+
315+
template <typename T1,
316+
typename T2,
317+
typename T3,
318+
typename T4,
319+
typename T5,
320+
typename T6,
321+
typename T7,
322+
typename T8,
323+
typename T9,
324+
typename T10>
325+
void init(o2::framework::HistogramRegistry* registry,
326+
T1& confTrackSelection,
327+
T2& confKinkSelection,
328+
T3& confCpr,
329+
T4& confMixing,
330+
std::map<T5, std::vector<framework::AxisSpec>>& colHistSpec,
331+
std::map<T6, std::vector<framework::AxisSpec>>& trackHistSpec,
332+
std::map<T7, std::vector<framework::AxisSpec>>& kinkHistSpec,
333+
std::map<T8, std::vector<framework::AxisSpec>>& chaDauHistSpec,
334+
std::map<T9, std::vector<framework::AxisSpec>>& pairHistSpec,
335+
std::map<T10, std::vector<framework::AxisSpec>>& cprHistSpec)
336+
{
337+
mColHistManager.init(registry, colHistSpec);
338+
339+
mTrackHistManager.init(registry, trackHistSpec);
340+
mKinkHistManager.init(registry, kinkHistSpec, chaDauHistSpec);
341+
342+
mPairHistManagerSe.init(registry, pairHistSpec);
343+
mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confKinkSelection.pdgCode.value);
344+
mPairHistManagerSe.setCharge(confTrackSelection.absCharge.value, 1);
345+
mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.sign.value, confTrackSelection.absCharge.value, confCpr.on.value);
346+
347+
mPairHistManagerMe.init(registry, pairHistSpec);
348+
mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confKinkSelection.pdgCode.value);
349+
mPairHistManagerMe.setCharge(confTrackSelection.absCharge.value, 1);
350+
mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.sign.value, confTrackSelection.absCharge.value, confCpr.on.value);
351+
352+
// setup mixing
353+
mMixingPolicy = static_cast<pairhistmanager::MixingPoliciy>(confMixing.policy.value);
354+
mMixingDepth = confMixing.depth.value;
355+
}
356+
357+
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
358+
void processSameEvent(T1 const& col, T2& trackTable, T3& trackPartition, T4& /*kinktable*/, T5& kinkPartition, T6& cache)
359+
{
360+
auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache);
361+
auto kinkSlice = kinkPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache);
362+
if (trackSlice.size() == 0 || kinkSlice.size() == 0) {
363+
return;
364+
}
365+
mColHistManager.fill(col);
366+
mCprSe.setMagField(col.magField());
367+
pairprocesshelpers::processSameEvent(trackSlice, kinkSlice, trackTable, mTrackHistManager, mKinkHistManager, mPairHistManagerSe, mCprSe, mPc);
368+
}
369+
370+
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
371+
void processMixedEvent(T1 const& cols, T2& trackTable, T3& trackPartition, T4& kinkPartition, T5& cache, T6& binsVtxMult, T7& binsVtxCent, T8& binsVtxMultCent)
372+
{
373+
switch (mMixingPolicy) {
374+
case static_cast<int>(pairhistmanager::kVtxMult):
375+
pairprocesshelpers::processMixedEvent(cols, trackPartition, kinkPartition, trackTable, cache, binsVtxMult, mMixingDepth, mPairHistManagerMe, mCprMe, mPc);
376+
break;
377+
case static_cast<int>(pairhistmanager::kVtxCent):
378+
pairprocesshelpers::processMixedEvent(cols, trackPartition, kinkPartition, trackTable, cache, binsVtxCent, mMixingDepth, mPairHistManagerMe, mCprMe, mPc);
379+
break;
380+
case static_cast<int>(pairhistmanager::kVtxMultCent):
381+
pairprocesshelpers::processMixedEvent(cols, trackPartition, kinkPartition, trackTable, cache, binsVtxMultCent, mMixingDepth, mPairHistManagerMe, mCprMe, mPc);
382+
break;
383+
default:
384+
LOG(fatal) << "Invalid binning policiy specifed. Breaking...";
385+
}
386+
}
387+
388+
private:
389+
colhistmanager::CollisionHistManager<mode> mColHistManager;
390+
trackhistmanager::TrackHistManager<prefixTrack, mode> mTrackHistManager;
391+
kinkhistmanager::KinkHistManager<prefixKink, prefixChaDau, mode, kinkType> mKinkHistManager;
392+
pairhistmanager::PairHistManager<prefixSe, mode> mPairHistManagerSe;
393+
pairhistmanager::PairHistManager<prefixMe, mode> mPairHistManagerMe;
394+
closepairrejection::ClosePairRejectionTrackKink<prefixCprSe> mCprSe;
395+
closepairrejection::ClosePairRejectionTrackKink<prefixCprMe> mCprMe;
396+
paircleaner::TrackKinkPairCleaner mPc;
397+
pairhistmanager::MixingPoliciy mMixingPolicy = pairhistmanager::MixingPoliciy::kVtxMult;
398+
int mMixingDepth = 5;
399+
};
400+
299401
} // namespace pairbuilder
300402
} // namespace o2::analysis::femto
301403

PWGCF/Femto/Core/pairCleaner.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ class TrackV0PairCleaner : public BasePairCleaner
5858
return this->isCleanTrackPair(posDaughter, track) && this->isCleanTrackPair(negDaughter, track);
5959
}
6060
};
61+
62+
class TrackKinkPairCleaner : public BasePairCleaner
63+
{
64+
public:
65+
TrackKinkPairCleaner() = default;
66+
template <typename T1, typename T2, typename T3>
67+
bool isCleanPair(const T1& track, const T2& kink, const T3& /*trackTable */) const
68+
{
69+
auto chaDaughter = kink.template chaDau_as<T3>();
70+
return this->isCleanTrackPair(chaDaughter, track);
71+
}
72+
};
6173
} // namespace paircleaner
6274
} // namespace o2::analysis::femto
6375

PWGCF/Femto/Core/pairHistManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ constexpr char PrefixTrackTrackMe[] = "TrackTrack/ME/";
121121
constexpr char PrefixTrackV0Se[] = "TrackV0/SE/";
122122
constexpr char PrefixTrackV0Me[] = "TrackV0/ME/";
123123

124+
constexpr char PrefixTrackKinkSe[] = "TrackKink/SE/";
125+
constexpr char PrefixTrackKinkMe[] = "TrackKink/ME/";
126+
124127
constexpr std::string_view AnalysisDir = "Analysis/";
125128
constexpr std::string_view QaDir = "QA/";
126129

PWGCF/Femto/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,8 @@ o2physics_add_dpl_workflow(femto-pair-track-v0
4343
SOURCES femtoPairTrackV0.cxx
4444
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
4545
COMPONENT_NAME Analysis)
46+
47+
o2physics_add_dpl_workflow(femto-pair-track-kink
48+
SOURCES femtoPairTrackKink.cxx
49+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
50+
COMPONENT_NAME Analysis)
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
// Copyright 2019-2025 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file femtoPairTrackKink.cxx
13+
/// \brief Tasks that computes correlation between tracks and kinks
14+
/// \author Anton Riedel, TU München, anton.riedel@cern.ch
15+
/// \author Henrik Fribert, TU München, henrik.fribert@cern.ch
16+
17+
#include "PWGCF/Femto/Core/closePairRejection.h"
18+
#include "PWGCF/Femto/Core/collisionBuilder.h"
19+
#include "PWGCF/Femto/Core/collisionHistManager.h"
20+
#include "PWGCF/Femto/Core/kinkBuilder.h"
21+
#include "PWGCF/Femto/Core/kinkHistManager.h"
22+
#include "PWGCF/Femto/Core/modes.h"
23+
#include "PWGCF/Femto/Core/pairBuilder.h"
24+
#include "PWGCF/Femto/Core/pairHistManager.h"
25+
#include "PWGCF/Femto/Core/partitions.h"
26+
#include "PWGCF/Femto/Core/trackBuilder.h"
27+
#include "PWGCF/Femto/Core/trackHistManager.h"
28+
#include "PWGCF/Femto/DataModel/FemtoTables.h"
29+
30+
#include "Framework/ASoA.h"
31+
#include "Framework/AnalysisTask.h"
32+
#include "Framework/Configurable.h"
33+
#include "Framework/Expressions.h"
34+
#include "Framework/HistogramRegistry.h"
35+
#include "Framework/runDataProcessing.h"
36+
37+
#include <string>
38+
#include <vector>
39+
40+
using namespace o2;
41+
using namespace o2::aod;
42+
using namespace o2::soa;
43+
using namespace o2::framework;
44+
using namespace o2::framework::expressions;
45+
using namespace o2::analysis::femto;
46+
47+
struct FemtoPairTrackKink {
48+
49+
// setup tables
50+
using Collisions = Join<FCols, FColMasks>;
51+
using Collision = Collisions::iterator;
52+
53+
using FilteredCollisions = o2::soa::Filtered<Collisions>;
54+
using FilteredCollision = FilteredCollisions::iterator;
55+
56+
using Tracks = o2::soa::Join<FTracks, FTrackMasks>;
57+
using Sigmas = o2::soa::Join<FSigmas, FSigmaMasks>;
58+
59+
SliceCache cache;
60+
61+
// setup collisions
62+
collisionbuilder::ConfCollisionSelection collisionSelection;
63+
Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection);
64+
colhistmanager::ConfCollisionBinning confCollisionBinning;
65+
66+
// setup tracks
67+
trackbuilder::ConfTrackSelection1 trackSelection;
68+
trackhistmanager::ConfTrackBinning1 confTrackBinning;
69+
Partition<Tracks> trackPartition = MAKE_TRACK_PARTITION(trackSelection);
70+
Preslice<Tracks> perColTracks = aod::femtobase::stored::collisionId;
71+
72+
// setup for daughters
73+
trackhistmanager::ConfKinkChaDauBinning confChaDauBinning;
74+
75+
// setup sigmas
76+
kinkbuilder::ConfSigmaSelection1 sigmaSelection;
77+
kinkhistmanager::ConfSigmaBinning1 confSigmaBinning;
78+
Partition<Sigmas> sigmaPartition = MAKE_SIGMA_PARTITION(sigmaSelection);
79+
Preslice<Sigmas> perColSigmas = aod::femtobase::stored::collisionId;
80+
81+
// setup pairs
82+
pairhistmanager::ConfPairBinning confPairBinning;
83+
84+
pairbuilder::PairTrackKinkBuilder<
85+
trackhistmanager::PrefixTrack1,
86+
kinkhistmanager::PrefixSigma1,
87+
trackhistmanager::PrefixKinkChaDaughter,
88+
pairhistmanager::PrefixTrackKinkSe,
89+
pairhistmanager::PrefixTrackKinkMe,
90+
closepairrejection::PrefixTrackKinkSe,
91+
closepairrejection::PrefixTrackKinkMe,
92+
modes::Mode::kAnalysis,
93+
modes::Kink::kSigma>
94+
pairTrackSigmaBuilder;
95+
96+
// setup mixing
97+
std::vector<double> defaultVtxBins{10, -10, 10};
98+
std::vector<double> defaultMultBins{50, 0, 200};
99+
std::vector<double> defaultCentBins{10, 0, 100};
100+
ColumnBinningPolicy<femtocollisions::PosZ, femtocollisions::Mult> mixBinsVtxMult{{defaultVtxBins, defaultMultBins}, true};
101+
ColumnBinningPolicy<aod::femtocollisions::PosZ, aod::femtocollisions::Cent> mixBinsVtxCent{{defaultVtxBins, defaultCentBins}, true};
102+
ColumnBinningPolicy<aod::femtocollisions::PosZ, aod::femtocollisions::Mult, aod::femtocollisions::Cent> mixBinsVtxMultCent{{defaultVtxBins, defaultMultBins, defaultCentBins}, true};
103+
pairhistmanager::ConfMixing confMixing;
104+
105+
HistogramRegistry hRegistry{"FemtoTrackKink", {}, OutputObjHandlingPolicy::AnalysisObject};
106+
107+
// setup cpr
108+
closepairrejection::ConfCpr confCpr;
109+
110+
void init(InitContext&)
111+
{
112+
113+
// setup columnpolicy for binning
114+
// default values are used during instantiation, so we need to explicity update them here
115+
mixBinsVtxMult = {{confMixing.vtxBins, confMixing.multBins.value}, true};
116+
mixBinsVtxCent = {{confMixing.vtxBins.value, confMixing.centBins.value}, true};
117+
mixBinsVtxMultCent = {{confMixing.vtxBins.value, confMixing.multBins.value, confMixing.centBins.value}, true};
118+
119+
// setup histograms
120+
auto colHistSpec = colhistmanager::makeColHistSpecMap(confCollisionBinning);
121+
auto trackHistSpec = trackhistmanager::makeTrackHistSpecMap(confTrackBinning);
122+
auto chaDauSpec = trackhistmanager::makeTrackHistSpecMap(confChaDauBinning);
123+
auto pairHistSpec = pairhistmanager::makePairHistSpecMap(confPairBinning, confTrackBinning, confSigmaBinning);
124+
auto cprHistSpec = closepairrejection::makeCprHistSpecMap(confCpr);
125+
126+
// setup for sigma
127+
// if (doprocessSigmaSameEvent || doprocessSigmaMixedEvent) {
128+
if (doprocessSigmaSameEvent) {
129+
auto sigmaHistSpec = kinkhistmanager::makeKinkHistSpecMap(confSigmaBinning);
130+
pairTrackSigmaBuilder.init(&hRegistry, trackSelection, sigmaSelection, confCpr, confMixing, colHistSpec, trackHistSpec, sigmaHistSpec, chaDauSpec, pairHistSpec, cprHistSpec);
131+
}
132+
};
133+
134+
void processSigmaSameEvent(FilteredCollision const& col, Tracks const& tracks, Sigmas const& sigmas)
135+
{
136+
pairTrackSigmaBuilder.processSameEvent(col, tracks, trackPartition, sigmas, sigmaPartition, cache);
137+
}
138+
PROCESS_SWITCH(FemtoPairTrackKink, processSigmaSameEvent, "Enable processing same event processing for tracks and sigmas", true);
139+
140+
void processSigmaMixedEvent(FilteredCollisions const& cols, Tracks const& tracks, Sigmas const& /*sigmas*/)
141+
{
142+
pairTrackSigmaBuilder.processMixedEvent(cols, tracks, trackPartition, sigmaPartition, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
143+
}
144+
PROCESS_SWITCH(FemtoPairTrackKink, processSigmaMixedEvent, "Enable processing mixed event processing for tracks and sigmas", true);
145+
};
146+
147+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
148+
{
149+
WorkflowSpec workflow{
150+
adaptAnalysisTask<FemtoPairTrackKink>(cfgc),
151+
};
152+
return workflow;
153+
}

0 commit comments

Comments
 (0)