Skip to content

Commit 280fe97

Browse files
committed
Feat: implement track-resonance and track-cascade pair task
1 parent 351da6f commit 280fe97

19 files changed

+857
-74
lines changed

PWGCF/Femto/Core/cascadeBuilder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct ConfOmegaBits : o2::framework::ConfigurableGroup {
9292

9393
#define CASCADE_DEFAULT_SELECTION(defaultMassMin, defaultMassMax, defaultPdgCode) \
9494
o2::framework::Configurable<int> pdgCode{"pdgCode", defaultPdgCode, "Track PDG code"}; \
95-
o2::framework::Configurable<int> sign{"sign", 1, "Sign of the Lambda (+1 for Lambda and -1 for Antilambda"}; \
95+
o2::framework::Configurable<int> sign{"sign", 1, "Sign of the charge of the Cascade "}; \
9696
o2::framework::Configurable<float> ptMin{"ptMin", 0.f, "Minimum pT"}; \
9797
o2::framework::Configurable<float> ptMax{"ptMax", 999.f, "Maximum pT"}; \
9898
o2::framework::Configurable<float> etaMin{"etaMin", -10.f, "Minimum eta"}; \
@@ -105,7 +105,7 @@ struct ConfOmegaBits : o2::framework::ConfigurableGroup {
105105

106106
struct ConfXiSelection : o2::framework::ConfigurableGroup {
107107
std::string prefix = std::string("XiSelection");
108-
CASCADE_DEFAULT_SELECTION(1.22, 1.42, 3212)
108+
CASCADE_DEFAULT_SELECTION(1.22, 1.42, 3312)
109109
};
110110

111111
struct ConfOmegaSelection : o2::framework::ConfigurableGroup {

PWGCF/Femto/Core/cascadeHistManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ constexpr std::array<histmanager::HistInfo<CascadeHist>, kCascadeHistLast> HistT
113113
{kMassXiVsMassOmega, o2::framework::kTH2F, "hMassXiVsMassOmega", "mass #Xi vs mass #Omega; m_{#Lambda#pi} (GeV/#it{c}^{2}); m_{#LambdaK} (GeV/#it{c}^{2})"}}};
114114

115115
template <typename T>
116-
auto makeCascadeAnalysisHistSpecMap(const T& confBinningAnalysis)
116+
auto makeCascadeHistSpecMap(const T& confBinningAnalysis)
117117
{
118118
return std::map<CascadeHist, std::vector<framework::AxisSpec>>{
119119
{kPt, {confBinningAnalysis.pt}},

PWGCF/Femto/Core/closePairRejection.h

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,17 @@ struct ConfCpr : o2::framework::ConfigurableGroup {
5858

5959
// tpc radii for computing phistar
6060
constexpr int kNradii = 9;
61-
constexpr std::array<float, kNradii> kTpcRadius = {85., 105., 125., 145., 165., 185., 205., 225., 245.};
61+
constexpr std::array<float, kNradii> kTpcRadius = {85., 105., 125., 145., 165., 185., 205., 225., 245.}; // in cm
6262

6363
// directory names
6464
constexpr char PrefixTrackTrackSe[] = "CPR_TrackTrack/SE/";
6565
constexpr char PrefixTrackTrackMe[] = "CPR_TrackTrack/ME/";
66-
constexpr char PrefixTrackV0Se[] = "CPR_TrackV0/SE/";
67-
constexpr char PrefixTrackV0Me[] = "CPR_TrackV0/ME/";
66+
constexpr char PrefixTrackV0Se[] = "CPR_TrackV0Daughter/SE/";
67+
constexpr char PrefixTrackV0Me[] = "CPR_TrackV0Daughter/ME/";
68+
constexpr char PrefixTrackTwoTrackResonanceSe[] = "CPR_TrackResonanceDaughter/SE/";
69+
constexpr char PrefixTrackTwoTrackResonnaceMe[] = "CPR_TrackResonanceDaughter/ME/";
70+
constexpr char PrefixTrackCascadeSe[] = "CPR_TrackCascadeBachelor/SE/";
71+
constexpr char PrefixTrackCascadeMe[] = "CPR_TrackCascadeBachelor/ME/";
6872
constexpr char PrefixTrackKinkSe[] = "CPR_TrackKink/SE/";
6973
constexpr char PrefixTrackKinkMe[] = "CPR_TrackKink/ME/";
7074

@@ -117,7 +121,7 @@ class CloseTrackRejection
117121
mChargeTrack2 = chargeTrack2;
118122

119123
if (utils::sign(mChargeTrack1) != utils::sign(mChargeTrack2)) {
120-
LOG(warn) << "CPR is truned on for tracks with opposite charge. Is this intended?";
124+
LOG(warn) << "CPR is turned on for tracks with opposite charge. Is this intended?";
121125
}
122126

123127
mHistogramRegistry = registry;
@@ -199,7 +203,9 @@ class ClosePairRejectionTrackTrack
199203
void init(o2::framework::HistogramRegistry* registry, std::map<CprHist, std::vector<o2::framework::AxisSpec>>& specs, float detaMax, float dphistarMax, int chargeTrack1, int chargeTrack2, bool isActivated)
200204
{
201205
mIsActivated = isActivated;
202-
mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack1, chargeTrack2);
206+
if (mIsActivated) {
207+
mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack1, chargeTrack2);
208+
}
203209
}
204210

205211
void setMagField(float magField) { mCtr.setMagField(magField); }
@@ -228,7 +234,9 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
228234

229235
// initialize CPR with charge of the track and the same charge for the daughter particle
230236
// absolute charge of the daughter track will be 1, so we just pass the sign
231-
mCtr.init(registry, specs, detaMax, dphistarMax, mChargeTrack, utils::sign(mChargeTrack));
237+
if (mIsActivated) {
238+
mCtr.init(registry, specs, detaMax, dphistarMax, mChargeTrack, utils::sign(mChargeTrack));
239+
}
232240
}
233241

234242
void setMagField(float magField)
@@ -245,7 +253,7 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
245253
auto daughter = v0.template negDau_as<T3>();
246254
mCtr.compute(track, daughter);
247255
} else {
248-
LOG(fatal) << "CPR Track-V0: Wrong track sign";
256+
LOG(fatal) << "CPR Track-V0: Sign of the track is 0!";
249257
}
250258
}
251259

@@ -263,18 +271,53 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
263271
};
264272

265273
template <const char* prefix>
266-
class ClosePairRejectionTrackKink
274+
class ClosePairRejectionTrackCascade // can also be used for any particle type that has pos/neg daughters, like resonances
267275
{
268276
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)
277+
void init(o2::framework::HistogramRegistry* registry, std::map<CprHist, std::vector<o2::framework::AxisSpec>>& specs, float detaMax, float dphistarMax, int chargeTrack, int chargeCascade, bool isActivated)
270278
{
271279
mIsActivated = isActivated;
272-
mSignTrack = signTrack;
280+
if (mIsActivated) {
281+
mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack, chargeCascade);
282+
}
283+
}
284+
285+
void setMagField(float magField)
286+
{
287+
mCtr.setMagField(magField);
288+
}
289+
template <typename T1, typename T2, typename T3>
290+
void setPair(const T1& track, const T2& cascade, const T3 /*trackTable*/)
291+
{
292+
auto bachelor = cascade.template posDau_as<T3>();
293+
mCtr.compute(track, bachelor);
294+
}
273295

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+
bool mIsActivated = true;
306+
};
307+
308+
template <const char* prefix>
309+
class ClosePairRejectionTrackKink
310+
{
311+
public:
312+
void init(o2::framework::HistogramRegistry* registry, std::map<CprHist, std::vector<o2::framework::AxisSpec>>& specs, float detaMax, float dphistarMax, int chargeTrack, int signKinkCandidate, bool isActivated)
313+
{
314+
mIsActivated = isActivated;
274315
// initialize CPR with charge of the track and the charged daughter particle
275316
// For kinks, we compare the primary track with the charged daughter
276317
// 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);
318+
if (mIsActivated) {
319+
mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack, signKinkCandidate);
320+
}
278321
}
279322

280323
void setMagField(float magField)
@@ -285,12 +328,8 @@ class ClosePairRejectionTrackKink
285328
template <typename T1, typename T2, typename T3>
286329
void setPair(const T1& track, const T2& kink, const T3 /*trackTable*/)
287330
{
288-
if (mSignTrack == 1 || mSignTrack == -1) {
289-
auto daughter = kink.template chaDau_as<T3>();
290-
mCtr.compute(track, daughter);
291-
} else {
292-
LOG(warn) << "CPR Track-Kink: Wrong track sign";
293-
}
331+
auto daughter = kink.template chaDau_as<T3>();
332+
mCtr.compute(track, daughter);
294333
}
295334

296335
bool isClosePair() const { return mCtr.isClosePair(); }
@@ -302,7 +341,6 @@ class ClosePairRejectionTrackKink
302341

303342
private:
304343
CloseTrackRejection<prefix> mCtr;
305-
int mSignTrack = 0;
306344
bool mIsActivated = true;
307345
};
308346

PWGCF/Femto/Core/collisionBuilder.h

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ struct ConfCollisionTriggers : o2::framework::ConfigurableGroup {
8080
o2::framework::Configurable<std::string> triggers{"triggers", std::string("fPPP,fPPL"), "Comma seperated list of all triggers to be used"};
8181
};
8282

83+
struct ConfCollisionRctFlags : o2::framework::ConfigurableGroup {
84+
std::string prefix = std::string("CollisionRctFlags");
85+
o2::framework::Configurable<bool> useRctFlags{"useRctFlags", true, "Set to true to use RCT flags"};
86+
o2::framework::Configurable<std::string> label{"label", std::string("CBT_hadronPID"), "Which RCT flag to check"};
87+
o2::framework::Configurable<bool> useZdc{"useZdc", false, "Whether to use ZDC (only use for PbPb)"};
88+
o2::framework::Configurable<bool> treatLimitedAcceptanceAsBad{"treatLimitedAcceptanceAsBad", false, "Whether to treat limited acceptance as bad or not"};
89+
};
90+
8391
// configurables for collision selection
8492
struct ConfCollisionSelection : o2::framework::ConfigurableGroup {
8593
std::string prefix = std::string("CollisionSelection");
@@ -309,22 +317,27 @@ class CollisionBuilder
309317
CollisionBuilder() {}
310318
virtual ~CollisionBuilder() = default;
311319

312-
template <typename T1, typename T2, typename T3, typename T4, typename T5>
313-
void init(T1& filter, T2& config, T3& table, T4& trigger, T5& initContext)
320+
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
321+
void init(T1& confFilter, T2& confBits, T3& confRct, T4& confTrigger, T5& confTable, T6& initContext)
314322
{
315-
mCollisionSelection.configure(filter, config);
316-
if (trigger.useTrigger.value) {
323+
mCollisionSelection.configure(confFilter, confBits);
324+
if (confTrigger.useTrigger.value) {
317325
mUseTrigger = true;
318-
mTriggerNames = trigger.triggers.value;
319-
mZorro.setBaseCCDBPath(trigger.ccdbPath.value);
326+
mTriggerNames = confTrigger.triggers.value;
327+
mZorro.setBaseCCDBPath(confTrigger.ccdbPath.value);
328+
}
329+
if (confRct.useRctFlags.value) {
330+
mUseRctFlags = true;
331+
mRctFlagsChecker.init(confRct.label.value, confRct.useZdc.value, confRct.treatLimitedAcceptanceAsBad.value);
320332
}
333+
321334
LOG(info) << "Initialize femto collision builder...";
322-
mProducedCollisions = utils::enableTable("FCols_001", table.produceCollisions.value, initContext);
323-
mProducedCollisionMasks = utils::enableTable("FColMasks_001", table.produceCollisionMasks.value, initContext);
324-
mProduceQns = utils::enableTable("FColQnBins_001", table.produceQns.value, initContext);
325-
mProducedPositions = utils::enableTable("FColPos_001", table.producePositions.value, initContext);
326-
mProducedMultiplicities = utils::enableTable("FColMults_001", table.produceMults.value, initContext);
327-
mProducedCentralities = utils::enableTable("FColCents_001", table.produceCents.value, initContext);
335+
mProducedCollisions = utils::enableTable("FCols_001", confTable.produceCollisions.value, initContext);
336+
mProducedCollisionMasks = utils::enableTable("FColMasks_001", confTable.produceCollisionMasks.value, initContext);
337+
mProduceQns = utils::enableTable("FColQnBins_001", confTable.produceQns.value, initContext);
338+
mProducedPositions = utils::enableTable("FColPos_001", confTable.producePositions.value, initContext);
339+
mProducedMultiplicities = utils::enableTable("FColMults_001", confTable.produceMults.value, initContext);
340+
mProducedCentralities = utils::enableTable("FColCents_001", confTable.produceCents.value, initContext);
328341
if (mProducedCollisions || mProducedCollisionMasks || mProducedPositions || mProducedMultiplicities || mProducedCentralities) {
329342
mFillAnyTable = true;
330343
mCollisionSelection.printSelections(colSelsName, colSelsToString);
@@ -351,12 +364,17 @@ class CollisionBuilder
351364
template <typename T1, typename T2>
352365
bool checkCollision(T1 const& bc, T2 const& col)
353366
{
354-
if (mUseTrigger) {
355-
return mZorro.isSelected(bc.globalBC()) && mCollisionSelection.checkFilters(col) && mCollisionSelection.passesAllRequiredSelections();
356-
} else {
357-
358-
return mCollisionSelection.checkFilters(col) && mCollisionSelection.passesAllRequiredSelections();
367+
// First: if triggers are enabled, the object must be selected
368+
if (mUseTrigger && !mZorro.isSelected(bc.globalBC())) {
369+
return false;
370+
}
371+
// Then: if RCT flags are enabled, check them
372+
if (mUseRctFlags && !mRctFlagsChecker(col)) {
373+
return false;
359374
}
375+
// Finally: do the expensive checks
376+
return mCollisionSelection.checkFilters(col) &&
377+
mCollisionSelection.passesAllRequiredSelections();
360378
}
361379

362380
template <modes::System system, typename T1, typename T2>
@@ -406,6 +424,8 @@ class CollisionBuilder
406424
CollisionSelection mCollisionSelection;
407425
Zorro mZorro;
408426
bool mUseTrigger = false;
427+
aod::rctsel::RCTFlagsChecker mRctFlagsChecker;
428+
bool mUseRctFlags = false;
409429
std::string mTriggerNames = std::string("");
410430
bool mFillAnyTable = false;
411431
bool mProducedCollisions = false;

PWGCF/Femto/Core/dataTypes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace femtodatatypes
2525
// Note: Length of the bitmask is the limit of how many selections can be configured
2626

2727
// datatypes for collsions
28-
using CollisionTagType = __uint128_t;
28+
using CollisionTagType = uint64_t;
2929
using CollisionMaskType = uint16_t;
3030

3131
// datatypes for tracks

PWGCF/Femto/Core/femtoUtils.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ inline float getMass(int pdgCode)
148148
case kSigmaMinus:
149149
mass = o2::constants::physics::MassSigmaMinus;
150150
break;
151+
case kXiMinus:
152+
mass = o2::constants::physics::MassXiMinus;
153+
break;
154+
case kOmegaMinus:
155+
mass = o2::constants::physics::MassOmegaMinus;
156+
break;
151157
default:
152158
LOG(fatal) << "PDG code is not suppored";
153159
}

0 commit comments

Comments
 (0)