Skip to content

Commit 929f0a6

Browse files
authored
[PWGCF] adding generic pair tasks (#13130)
1 parent ee4bfed commit 929f0a6

21 files changed

+890
-106
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: 63 additions & 25 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;
@@ -196,10 +200,12 @@ template <const char* prefix>
196200
class ClosePairRejectionTrackTrack
197201
{
198202
public:
199-
void init(o2::framework::HistogramRegistry* registry, std::map<CprHist, std::vector<o2::framework::AxisSpec>>& specs, float detaMax, float dphistarMax, int signTrack1, int absChargeTrack1, int signTrack2, int AbsChargeTrack2, bool isActivated)
203+
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, signTrack1 * absChargeTrack1, signTrack2 * AbsChargeTrack2);
206+
if (mIsActivated) {
207+
mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack1, chargeTrack2);
208+
}
203209
}
204210

205211
void setMagField(float magField) { mCtr.setMagField(magField); }
@@ -221,14 +227,16 @@ template <const char* prefix>
221227
class ClosePairRejectionTrackV0 // can also be used for any particle type that has pos/neg daughters, like resonances
222228
{
223229
public:
224-
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)
230+
void init(o2::framework::HistogramRegistry* registry, std::map<CprHist, std::vector<o2::framework::AxisSpec>>& specs, float detaMax, float dphistarMax, int chargeTrack, bool isActivated)
225231
{
226232
mIsActivated = isActivated;
227-
mSignTrack = signTrack;
233+
mChargeTrack = chargeTrack;
228234

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

234242
void setMagField(float magField)
@@ -238,14 +246,14 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
238246
template <typename T1, typename T2, typename T3>
239247
void setPair(const T1& track, const T2& v0, const T3 /*trackTable*/)
240248
{
241-
if (mSignTrack == 1) {
249+
if (mChargeTrack > 0) {
242250
auto daughter = v0.template posDau_as<T3>();
243251
mCtr.compute(track, daughter);
244-
} else if (mSignTrack == -1) {
252+
} else if (mChargeTrack < 0) {
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

@@ -258,23 +266,58 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h
258266

259267
private:
260268
CloseTrackRejection<prefix> mCtr;
261-
int mSignTrack = 0;
269+
int mChargeTrack = 0;
262270
bool mIsActivated = true;
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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +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 = uint64_t;
2829
using CollisionMaskType = uint16_t;
2930

3031
// 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)