Skip to content

Commit 86b3abe

Browse files
authored
[PWGCF] Update femto framework (#13848)
Megalinter error due to import error ```import ROOT``` in cutculator.py. Still merging.
1 parent f692e9a commit 86b3abe

File tree

11 files changed

+1019
-565
lines changed

11 files changed

+1019
-565
lines changed

PWGCF/Femto/Core/baseSelection.h

Lines changed: 184 additions & 90 deletions
Large diffs are not rendered by default.

PWGCF/Femto/Core/cascadeBuilder.h

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,10 @@ enum CascadeSels {
142142
kCascadeSelsMax
143143
};
144144

145-
const char cascadeSelsName[] = "Cascade Selection Object";
146-
const std::unordered_map<CascadeSels, std::string> cascadeSelsToString = {
145+
constexpr char XiSelHistName[] = "hXiSelection";
146+
constexpr char OmegaSelHistName[] = "hOmegaSelection";
147+
constexpr char CascadeSelsName[] = "Cascade Selection Object";
148+
const std::unordered_map<CascadeSels, std::string> cascadeSelectionNames = {
147149
{kCascadeCpaMin, "Cascade CPA Min"},
148150
{kCascadeDcaDaughMax, "Cascade DCA Daughters Max"},
149151
{kCascadeTransRadMin, "Cascade Transverse Radius Min"},
@@ -167,29 +169,29 @@ const std::unordered_map<CascadeSels, std::string> cascadeSelsToString = {
167169

168170
/// \class FemtoDreamTrackCuts
169171
/// \brief Cut class to contain and execute all cuts applied to tracks
170-
template <modes::Cascade cascadeType>
172+
template <modes::Cascade cascadeType, const char* HistName>
171173
class CascadeSelection : public BaseSelection<float, o2::aod::femtodatatypes::CascadeMaskType, kCascadeSelsMax>
172174
{
173175
public:
174176
CascadeSelection() = default;
175177
~CascadeSelection() = default;
176178

177179
template <typename T1, typename T2>
178-
void configure(T1 const& config, T2 const& filter)
180+
void configure(o2::framework::HistogramRegistry* registry, T1 const& config, T2 const& filter)
179181
{
180182
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {
181183
mXiMassLowerLimit = filter.massXiMin.value;
182184
mXiMassUpperLimit = filter.massXiMax.value;
183185
mOmegaMassLowerLimit = filter.rejectMassOmegaMin.value;
184186
mOmegaMassUpperLimit = filter.rejectMassOmegaMax.value;
185-
this->addSelection(config.bachelorTpcPion.value, kBachelorTpcPion, limits::kAbsUpperLimit, true, true);
187+
this->addSelection(kBachelorTpcPion, cascadeSelectionNames.at(kBachelorTpcPion), config.bachelorTpcPion.value, limits::kAbsUpperLimit, true, true, false);
186188
}
187189
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kOmega)) {
188190
mOmegaMassLowerLimit = filter.massOmegaMin.value;
189191
mOmegaMassUpperLimit = filter.massOmegaMax.value;
190192
mXiMassLowerLimit = filter.rejectMassXiMin.value;
191193
mXiMassUpperLimit = filter.rejectMassXiMax.value;
192-
this->addSelection(config.bachelorTpcKaon.value, kBachelorTpcKaon, limits::kAbsUpperLimit, true, true);
194+
this->addSelection(kBachelorTpcKaon, cascadeSelectionNames.at(kBachelorTpcKaon), config.bachelorTpcKaon.value, limits::kAbsUpperLimit, true, true, false);
193195
}
194196

195197
mPtMin = filter.ptMin.value;
@@ -201,19 +203,21 @@ class CascadeSelection : public BaseSelection<float, o2::aod::femtodatatypes::Ca
201203
mLambdaMassMin = filter.massLambdaMin.value;
202204
mLambdaMassMax = filter.massLambdaMax.value;
203205

204-
this->addSelection(config.posDauTpc.value, kPosDauTpc, limits::kAbsUpperLimit, true, true);
205-
this->addSelection(config.negDauTpc.value, kNegDauTpc, limits::kAbsUpperLimit, true, true);
206-
207-
this->addSelection(config.cascadeCpaMin.value, kCascadeCpaMin, limits::kLowerLimit, true, true);
208-
this->addSelection(config.cascadeTransRadMin.value, kCascadeTransRadMin, limits::kLowerLimit, true, true);
209-
this->addSelection(config.cascadeDcaDauMax.value, kCascadeDcaDaughMax, limits::kAbsUpperLimit, true, true);
210-
this->addSelection(config.lambdaCpaMin.value, kLambdaCpaMin, limits::kLowerLimit, true, true);
211-
this->addSelection(config.lambdaTransRadMin.value, kLambdaTransRadMin, limits::kLowerLimit, true, true);
212-
this->addSelection(config.lambdaDcaDauMax.value, kLambdaDcaDauMax, limits::kAbsUpperLimit, true, true);
213-
this->addSelection(config.lambdaDcaToPvMin.value, kLambdaDcaToPvMin, limits::kLowerLimit, true, true);
214-
this->addSelection(config.dauAbsEtaMax.value, kDauAbsEtaMax, limits::kAbsUpperLimit, true, true);
215-
this->addSelection(config.dauDcaMin.value, kDauDcaMin, limits::kAbsLowerLimit, true, true);
216-
this->addSelection(config.dauTpcClustersMin.value, kDauTpcClsMin, limits::kLowerLimit, true, true);
206+
this->addSelection(kPosDauTpc, cascadeSelectionNames.at(kPosDauTpc), config.posDauTpc.value, limits::kAbsUpperLimit, true, true, false);
207+
this->addSelection(kNegDauTpc, cascadeSelectionNames.at(kNegDauTpc), config.negDauTpc.value, limits::kAbsUpperLimit, true, true, false);
208+
209+
this->addSelection(kCascadeCpaMin, cascadeSelectionNames.at(kCascadeCpaMin), config.cascadeCpaMin.value, limits::kLowerLimit, true, true, false);
210+
this->addSelection(kCascadeTransRadMin, cascadeSelectionNames.at(kCascadeTransRadMin), config.cascadeTransRadMin.value, limits::kLowerLimit, true, true, false);
211+
this->addSelection(kCascadeDcaDaughMax, cascadeSelectionNames.at(kCascadeDcaDaughMax), config.cascadeDcaDauMax.value, limits::kAbsUpperLimit, true, true, false);
212+
this->addSelection(kLambdaCpaMin, cascadeSelectionNames.at(kLambdaCpaMin), config.lambdaCpaMin.value, limits::kLowerLimit, true, true, false);
213+
this->addSelection(kLambdaTransRadMin, cascadeSelectionNames.at(kLambdaTransRadMin), config.lambdaTransRadMin.value, limits::kLowerLimit, true, true, false);
214+
this->addSelection(kLambdaDcaDauMax, cascadeSelectionNames.at(kLambdaDcaDauMax), config.lambdaDcaDauMax.value, limits::kAbsUpperLimit, true, true, false);
215+
this->addSelection(kLambdaDcaToPvMin, cascadeSelectionNames.at(kLambdaDcaToPvMin), config.lambdaDcaToPvMin.value, limits::kLowerLimit, true, true, false);
216+
this->addSelection(kDauAbsEtaMax, cascadeSelectionNames.at(kDauAbsEtaMax), config.dauAbsEtaMax.value, limits::kAbsUpperLimit, true, true, false);
217+
this->addSelection(kDauDcaMin, cascadeSelectionNames.at(kDauDcaMin), config.dauDcaMin.value, limits::kAbsLowerLimit, true, true, false);
218+
this->addSelection(kDauTpcClsMin, cascadeSelectionNames.at(kDauTpcClsMin), config.dauTpcClustersMin.value, limits::kLowerLimit, true, true, false);
219+
220+
this->setupContainers<HistName>(registry);
217221
};
218222

219223
template <typename T1, typename T2, typename T3>
@@ -263,31 +267,44 @@ class CascadeSelection : public BaseSelection<float, o2::aod::femtodatatypes::Ca
263267
LOG(warn) << "Encountered Cascade candidate with 0 charge";
264268
}
265269

266-
this->assembleBitmask();
270+
this->assembleBitmask<HistName>();
267271
};
268272

269273
template <typename T>
270-
bool checkFilters(const T& cascade) const
274+
bool checkCandidate(const T& cascade) const
271275
{
272-
return ((cascade.pt() > mPtMin && cascade.pt() < mPtMax) &&
273-
(cascade.eta() > mEtaMin && cascade.eta() < mEtaMax) &&
274-
(cascade.phi() > mPhiMin && cascade.phi() < mPhiMax) &&
275-
(cascade.mLambda() > mLambdaMassMin && cascade.mLambda() < mLambdaMassMax));
276-
}
276+
// check kinematics
277+
const bool kinematicsOK =
278+
(cascade.pt() > mPtMin && cascade.pt() < mPtMax) &&
279+
(cascade.eta() > mEtaMin && cascade.eta() < mEtaMax) &&
280+
(cascade.phi() > mPhiMin && cascade.phi() < mPhiMax);
281+
282+
if (!kinematicsOK) {
283+
return false;
284+
}
277285

278-
template <typename T>
279-
bool checkHypothesis(T const& cascadeCandidate)
280-
{
281-
// no need to check PID of the bachelor/daughters here, they are set as minimal cuts
282-
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {
283-
return (mXiMassLowerLimit < cascadeCandidate.mXi() && mXiMassUpperLimit > cascadeCandidate.mXi()) && // inside xi mass window
284-
(cascadeCandidate.mOmega() < mOmegaMassLowerLimit || cascadeCandidate.mOmega() > mOmegaMassUpperLimit); // outside omega mass window
286+
// check mass of daughter lambda
287+
const bool lambdaOK =
288+
(cascade.mLambda() > mLambdaMassMin && cascade.mLambda() < mLambdaMassMax);
289+
290+
if (!lambdaOK) {
291+
return false;
285292
}
293+
294+
// check mass hypothesis
286295
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {
287-
return (mOmegaMassLowerLimit < cascadeCandidate.mOmega() && mOmegaMassUpperLimit > cascadeCandidate.mOmega()) && // inside omega mass window
288-
(cascadeCandidate.mXi() < mXiMassLowerLimit || cascadeCandidate.mXi() > mXiMassUpperLimit); // outside xi mass window
296+
// Xi candidate must be inside Xi window and outside Omega
297+
return (cascade.mXi() > mXiMassLowerLimit && cascade.mXi() < mXiMassUpperLimit) &&
298+
(cascade.mOmega() < mOmegaMassLowerLimit || cascade.mOmega() > mOmegaMassUpperLimit);
299+
}
300+
301+
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kOmega)) {
302+
// Omega candidate must be inside Omega window and outside Xi
303+
return (cascade.mOmega() > mOmegaMassLowerLimit && cascade.mOmega() < mOmegaMassUpperLimit) &&
304+
(cascade.mXi() < mXiMassLowerLimit || cascade.mXi() > mXiMassUpperLimit);
289305
}
290-
return false;
306+
307+
return false; // should never happen
291308
}
292309

293310
protected:
@@ -327,17 +344,16 @@ struct ConfCascadeTables : o2::framework::ConfigurableGroup {
327344
o2::framework::Configurable<int> produceOmegaExtras{"produceOmegaExtras", -1, "Produce OmegaExtras (-1: auto; 0 off; 1 on)"};
328345
};
329346

330-
template <modes::Cascade cascadeType>
347+
template <modes::Cascade cascadeType, const char* HistName>
331348
class CascadeBuilder
332349
{
333350
public:
334351
CascadeBuilder() = default;
335352
~CascadeBuilder() = default;
336353

337354
template <typename T1, typename T2, typename T3, typename T4>
338-
void init(T1& config, T2& filter, T3& table, T4& initContext)
355+
void init(o2::framework::HistogramRegistry* registry, T1& config, T2& filter, T3& table, T4& initContext)
339356
{
340-
mCascadeSelection.configure(config, filter);
341357
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {
342358
LOG(info) << "Initialize femto Xi builder...";
343359
mProduceXis = utils::enableTable("FXis_001", table.produceXis.value, initContext);
@@ -353,10 +369,13 @@ class CascadeBuilder
353369

354370
if (mProduceXis || mProduceXiExtras || mProduceXiMasks || mProduceOmegas || mProduceOmegaMasks || mProduceOmegaExtras) {
355371
mFillAnyTable = true;
356-
mCascadeSelection.printSelections(cascadeSelsName, cascadeSelsToString);
357372
} else {
358-
LOG(info) << "No tables configured";
373+
LOG(info) << "No tables configured, Selection object will not be configured...";
374+
LOG(info) << "Initialization done...";
375+
return;
359376
}
377+
mCascadeSelection.configure(registry, config, filter);
378+
mCascadeSelection.printSelections(CascadeSelsName);
360379
LOG(info) << "Initialization done...";
361380
}
362381

@@ -371,11 +390,11 @@ class CascadeBuilder
371390
int32_t posDaughterIndex = 0;
372391
int32_t negDaughterIndex = 0;
373392
for (const auto& cascade : fullCascades) {
374-
if (!mCascadeSelection.checkFilters(cascade)) {
393+
if (!mCascadeSelection.checkCandidate(cascade)) {
375394
continue;
376395
}
377396
mCascadeSelection.applySelections(cascade, fullTracks, col);
378-
if (mCascadeSelection.passesAllRequiredSelections() && mCascadeSelection.checkHypothesis(cascade)) {
397+
if (mCascadeSelection.passesAllRequiredSelections()) {
379398

380399
auto bachelor = cascade.template bachelor_as<T5>();
381400
auto posDaughter = cascade.template posTrack_as<T5>();
@@ -450,7 +469,7 @@ class CascadeBuilder
450469
bool fillAnyTable() { return mFillAnyTable; }
451470

452471
private:
453-
CascadeSelection<cascadeType> mCascadeSelection;
472+
CascadeSelection<cascadeType, HistName> mCascadeSelection;
454473
bool mFillAnyTable = false;
455474
bool mProduceXis = false;
456475
bool mProduceXiMasks = false;

0 commit comments

Comments
 (0)