Skip to content

Commit 185ff35

Browse files
authored
[PWGCF] Update femto framework (#16040)
1 parent f29db2c commit 185ff35

7 files changed

Lines changed: 131 additions & 127 deletions

File tree

PWGCF/Femto/Core/cascadeBuilder.h

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,8 @@ class CascadeBuilder
379379
LOG(info) << "Initialization done...";
380380
}
381381

382-
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
383-
void fillCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& cascadeProducts, T6 const& cascades, T7 const& tracks, T8 const& tracksWithItsPid, T9& trackBuilder)
382+
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
383+
void fillCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& cascadeProducts, T6 const& cascades, T7 const& tracks, T8& trackBuilder)
384384
{
385385
if (!mFillAnyTable) {
386386
return;
@@ -400,24 +400,21 @@ class CascadeBuilder
400400

401401
collisionBuilder.template fillCollision<system>(collisionProducts, col);
402402

403-
// cleaner, but without ITS pid: auto bachelor = cascade.template bachelor_as<T7>();
404-
auto bachelor = tracksWithItsPid.iteratorAt(cascade.bachelorId() - tracksWithItsPid.offset());
403+
auto bachelor = cascade.template bachelor_as<T7>();
405404
bachelorIndex = trackBuilder.template getDaughterIndex<modes::Track::kCascadeBachelor>(bachelor, trackProducts, collisionProducts);
406405

407-
// cleaner, but without ITS pid: auto posDaughter = cascade.template posTrack_as<T7>();
408-
auto posDaughter = tracksWithItsPid.iteratorAt(cascade.posTrackId() - tracksWithItsPid.offset());
406+
auto posDaughter = cascade.template posTrack_as<T7>();
409407
posDaughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kV0Daughter>(posDaughter, trackProducts, collisionProducts);
410408

411-
// cleaner, but without ITS pid: auto negDaughter = cascade.template negTrack_as<T7>();
412-
auto negDaughter = tracksWithItsPid.iteratorAt(cascade.negTrackId() - tracksWithItsPid.offset());
409+
auto negDaughter = cascade.template negTrack_as<T7>();
413410
negDaughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kV0Daughter>(negDaughter, trackProducts, collisionProducts);
414411

415412
fillCascade(collisionProducts, cascadeProducts, cascade, col, bachelorIndex, posDaughterIndex, negDaughterIndex);
416413
}
417414
}
418415

419-
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
420-
void fillMcCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4 const& mcCols, T5& trackProducts, T6& cascadeProducts, T7 const& cascades, T8 const& tracks, T9 const& tracksWithItsPid, T10& trackBuilder, T11 const& mcParticles, T12& mcBuilder, T13& mcProducts)
416+
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
417+
void fillMcCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4 const& mcCols, T5& trackProducts, T6& cascadeProducts, T7 const& cascades, T8 const& tracks, T9& trackBuilder, T10 const& mcParticles, T11& mcBuilder, T12& mcProducts)
421418
{
422419
if (!mFillAnyTable) {
423420
return;
@@ -437,17 +434,14 @@ class CascadeBuilder
437434

438435
collisionBuilder.template fillMcCollision<system>(collisionProducts, col, mcCols, mcProducts, mcBuilder);
439436

440-
auto bachelor = tracks.iteratorAt(cascade.bachelorId() - tracks.offset());
441-
auto bachelorWithItsPid = tracksWithItsPid.iteratorAt(cascade.bachelorId() - tracksWithItsPid.offset());
442-
bachelorIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, bachelor, bachelorWithItsPid, trackProducts, mcParticles, mcBuilder, mcProducts);
437+
auto bachelor = cascade.template bachelor_as<T8>();
438+
bachelorIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, bachelor, trackProducts, mcParticles, mcBuilder, mcProducts);
443439

444-
auto posDaughter = tracks.iteratorAt(cascade.posTrackId() - tracks.offset());
445-
auto posDaughterWithItsPid = tracksWithItsPid.iteratorAt(cascade.posTrackId() - tracksWithItsPid.offset());
446-
posDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, posDaughter, posDaughterWithItsPid, trackProducts, mcParticles, mcBuilder, mcProducts);
440+
auto posDaughter = cascade.template posTrack_as<T8>();
441+
posDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, posDaughter, trackProducts, mcParticles, mcBuilder, mcProducts);
447442

448-
auto negDaughter = tracks.iteratorAt(cascade.negTrackId() - tracks.offset());
449-
auto negDaughterWithItsPid = tracksWithItsPid.iteratorAt(cascade.negTrackId() - tracksWithItsPid.offset());
450-
negDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, negDaughter, negDaughterWithItsPid, trackProducts, mcParticles, mcBuilder, mcProducts);
443+
auto negDaughter = cascade.template negTrack_as<T8>();
444+
negDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, negDaughter, trackProducts, mcParticles, mcBuilder, mcProducts);
451445

452446
fillCascade(collisionProducts, cascadeProducts, cascade, col, bachelorIndex, posDaughterIndex, negDaughterIndex);
453447
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {

PWGCF/Femto/Core/kinkBuilder.h

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ struct ConfKinkFilters : o2::framework::ConfigurableGroup {
6464
// selections bits for all kinks
6565
#define KINK_DEFAULT_BITS \
6666
o2::framework::Configurable<std::vector<float>> kinkTopoDcaMax{"kinkTopoDcaMax", {2.0f}, "Maximum kink topological DCA"}; \
67-
o2::framework::Configurable<std::vector<float>> transRadMin{"transRadMin", {0.2f}, "Minimum transverse radius (cm)"}; \
67+
o2::framework::Configurable<std::vector<float>> transRadMin{"transRadMin", {20.f}, "Minimum transverse radius (cm)"}; \
6868
o2::framework::Configurable<std::vector<float>> transRadMax{"transRadMax", {100.f}, "Maximum transverse radius (cm)"}; \
69-
o2::framework::Configurable<std::vector<float>> dauAbsEtaMax{"dauAbsEtaMax", {0.8f}, "Maximum absolute pseudorapidity for daughter track"}; \
70-
o2::framework::Configurable<std::vector<float>> dauDcaPvMin{"dauDcaPvMin", {0.0f}, "Minimum DCA of daughter from primary vertex (cm)"}; \
69+
o2::framework::Configurable<std::vector<float>> dauAbsEtaMax{"dauAbsEtaMax", {1.0f}, "Maximum absolute pseudorapidity for daughter track"}; \
70+
o2::framework::Configurable<std::vector<float>> dauDcaPvMin{"dauDcaPvMin", {0.1f}, "Minimum DCA of daughter from primary vertex (cm)"}; \
7171
o2::framework::Configurable<std::vector<float>> mothDcaPvMax{"mothDcaPvMax", {1.0f}, "Maximum DCA of mother from primary vertex (cm)"}; \
7272
o2::framework::Configurable<std::vector<float>> alphaAPMin{"alphaAPMin", {-1.0f}, "Minimum Alpha_AP for Sigma candidates"}; \
7373
o2::framework::Configurable<std::vector<float>> alphaAPMax{"alphaAPMax", {0.0f}, "Maximum Alpha_AP for Sigma candidates"}; \
@@ -224,8 +224,8 @@ class KinkSelection : public BaseSelection<float, o2::aod::femtodatatypes::KinkM
224224
this->setupContainers<HistName>(registry);
225225
};
226226

227-
template <typename T1, typename T2>
228-
void computeQaVariables(T1 const& kinkCand, T2 const& /*tracks*/)
227+
template <typename T1, typename T2, typename T3>
228+
void computeKinkKinematics(T1 const& kinkCand, T2 const& /*tracks*/, T3 const& col)
229229
{
230230
std::array<float, 3> momMother = {kinkCand.pxMoth(), kinkCand.pyMoth(), kinkCand.pzMoth()};
231231
float kinkMomP = RecoDecay::p(momMother);
@@ -244,7 +244,7 @@ class KinkSelection : public BaseSelection<float, o2::aod::femtodatatypes::KinkM
244244
float p2A = kinkDauP * kinkDauP;
245245
mQtAp = std::sqrt(std::max(0.f, p2A - dp * dp / p2V0));
246246

247-
std::array<float, 3> vMother = {kinkCand.xDecVtx(), kinkCand.yDecVtx(), kinkCand.zDecVtx()};
247+
std::array<float, 3> vMother = {kinkCand.xDecVtx() - col.posX(), kinkCand.yDecVtx() - col.posY(), kinkCand.zDecVtx() - col.posZ()};
248248
float vMotherNorm = std::sqrt(std::inner_product(vMother.begin(), vMother.end(), vMother.begin(), 0.f));
249249
mCosPointingAngle = (vMotherNorm > 0.f && kinkMomP > 0.f) ? (std::inner_product(momMother.begin(), momMother.end(), vMother.begin(), 0.f)) / (kinkMomP * vMotherNorm) : 0.f;
250250
mTransRadius = std::hypot(kinkCand.xDecVtx(), kinkCand.yDecVtx());
@@ -313,13 +313,8 @@ class KinkSelection : public BaseSelection<float, o2::aod::femtodatatypes::KinkM
313313
mKinkMotherPhi = RecoDecay::phi(momMother);
314314

315315
// Recalculate pT using kinematic constraints
316-
float ptRecalc = utils::calcPtnew(momMother[0], momMother[1], momMother[2],
317-
momDaughter[0], momDaughter[1], momDaughter[2]);
318-
if (ptRecalc > 0.f) {
319-
mKinkMotherPt = ptRecalc;
320-
} else {
321-
mKinkMotherPt = -1.f;
322-
}
316+
float ptRecalc = utils::calcPtnew(momMother[0], momMother[1], momMother[2], momDaughter[0], momDaughter[1], momDaughter[2]);
317+
mKinkMotherPt = (ptRecalc > 0.f) ? ptRecalc : std::hypot(momMother[0], momMother[1]);
323318
}
324319

325320
template <typename T>
@@ -435,8 +430,8 @@ class KinkBuilder
435430
LOG(info) << "Initialization done...";
436431
}
437432

438-
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
439-
void fillKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& kinkProducts, T6 const& kinks, T7 const& tracks, T8 const& tracksWithItsPid, T9& trackBuilder)
433+
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
434+
void fillKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& kinkProducts, T6 const& kinks, T7 const& tracks, T8& trackBuilder)
440435
{
441436
if (!mFillAnyTable) {
442437
return;
@@ -450,20 +445,15 @@ class KinkBuilder
450445
continue;
451446
}
452447
// compute qa variables before applying selections
453-
mKinkSelection.computeQaVariables(kink, tracks);
448+
mKinkSelection.computeKinkKinematics(kink, tracks, col);
454449
mKinkSelection.applySelections(kink, tracks);
455450
if (!mKinkSelection.passesAllRequiredSelections()) {
456451
continue;
457452
}
458453

459454
collisionBuilder.template fillCollision<system>(collisionProducts, col);
460-
// cleaner, but without ITS pid: auto daughter = kink.template trackDaug_as<T7>();
461-
int64_t idx = kink.trackDaugId() - tracksWithItsPid.offset();
462-
// check for valid index
463-
if (idx < 0 || idx >= static_cast<int64_t>(tracksWithItsPid.size())) {
464-
return;
465-
}
466-
auto daughter = tracksWithItsPid.iteratorAt(idx);
455+
456+
auto daughter = kink.template trackDaug_as<T7>();
467457
daughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kKinkDaughter>(daughter, trackProducts, collisionProducts);
468458
if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) {
469459
fillSigma(collisionProducts, kinkProducts, kink, daughterIndex);
@@ -474,8 +464,8 @@ class KinkBuilder
474464
}
475465
}
476466

477-
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
478-
void fillMcKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4 const& mcCols, T5& trackProducts, T6& kinkProducts, T7 const& kinks, T8 const& tracks, T9 const& tracksWithItsPid, T10& trackBuilder, T11 const& mcParticles, T12& mcBuilder, T13& mcProducts)
467+
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
468+
void fillMcKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4 const& mcCols, T5& trackProducts, T6& kinkProducts, T7 const& kinks, T8 const& tracks, T9& trackBuilder, T10 const& mcParticles, T11& mcBuilder, T12& mcProducts)
479469
{
480470

481471
if (!mFillAnyTable) {
@@ -489,22 +479,16 @@ class KinkBuilder
489479
continue;
490480
}
491481
// compute qa variables before applying selections
492-
mKinkSelection.computeQaVariables(kink, tracks);
482+
mKinkSelection.computeKinkKinematics(kink, tracks, col);
493483
mKinkSelection.applySelections(kink, tracks);
494484
if (!mKinkSelection.passesAllRequiredSelections()) {
495485
continue;
496486
}
497487

498488
collisionBuilder.template fillMcCollision<system>(collisionProducts, col, mcCols, mcProducts, mcBuilder);
499489

500-
int64_t idx = kink.trackDaugId() - tracks.offset();
501-
// check for valid index
502-
if (idx < 0 || idx >= static_cast<int64_t>(tracks.size())) {
503-
return;
504-
}
505-
auto daughter = tracks.iteratorAt(idx);
506-
auto daughterWithItsPid = tracksWithItsPid.iteratorAt(idx);
507-
daughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kKinkDaughter>(col, collisionProducts, mcCols, daughter, daughterWithItsPid, trackProducts, mcParticles, mcBuilder, mcProducts);
490+
auto daughter = kink.template trackDaug_as<T8>();
491+
daughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kKinkDaughter>(col, collisionProducts, mcCols, daughter, trackProducts, mcParticles, mcBuilder, mcProducts);
508492

509493
if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) {
510494
fillSigma(collisionProducts, kinkProducts, kink, daughterIndex);

PWGCF/Femto/Core/pairHistManager.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ struct ConfPairBinning : o2::framework::ConfigurableGroup {
172172
o2::framework::ConfigurableAxis dalitzM13{"dalitzM13", {{100, 0, 10}}, "Mass13 binning of darlitz plot"};
173173
o2::framework::Configurable<int> transverseMassType{"transverseMassType", static_cast<int>(modes::TransverseMassType::kAveragePdgMass), "Type of transverse mass (0-> Average Pdg Mass, 1-> Reduced Pdg Mass, 2-> Mt from combined 4 vector)"};
174174
o2::framework::ConfigurableAxis binningDeltaEta{"binningDeltaEta", {{35, -1.6, 1.6}}, "Delta eta"};
175-
o2::framework::ConfigurableAxis binningDeltaPhi{"binningDeltaPhi", {{35, -o2::constants::math::PI / 2, 3 * o2::constants::math::PI / 2}}, "Delta phi"};
175+
o2::framework::ConfigurableAxis binningDeltaPhi{"binningDeltaPhi", {{35, -o2::constants::math::PIHalf, 3 * o2::constants::math::PIHalf}}, "Delta phi"};
176176
};
177177

178178
struct ConfPairCuts : o2::framework::ConfigurableGroup {
@@ -489,7 +489,7 @@ class PairHistManager
489489

490490
if (mPlotDeltaEtaDeltaPhi) {
491491
mDeltaEta = particle1.eta() - particle2.eta();
492-
mDeltaPhi = RecoDecay::constrainAngle(particle1.phi() - particle2.phi(), -o2::constants::math::PI / 2);
492+
mDeltaPhi = RecoDecay::constrainAngle(particle1.phi() - particle2.phi(), -o2::constants::math::PIHalf);
493493
}
494494

495495
if (mPlotDalitz) {

PWGCF/Femto/Core/trackBuilder.h

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ class TrackBuilder
605605
}
606606
}
607607
if (mProduceTrackMass) {
608-
trackProducts.producedTrackMass(track.mass());
608+
trackProducts.producedTrackMass(track.mass()); // default value if track has no TOF signal is -999
609609
}
610610
if (mProduceTrackDcas) {
611611
trackProducts.producedTrackDcas(track.dcaXY(), track.dcaZ());
@@ -624,25 +624,53 @@ class TrackBuilder
624624
track.beta());
625625
}
626626
if (mProduceElectronPids) {
627-
trackProducts.producedElectronPids(track.itsNSigmaEl(), track.tpcNSigmaEl(), track.tofNSigmaEl());
627+
float itsEl = 0.f;
628+
if constexpr (requires(T1 t) { t.itsNSigmaEl(); }) {
629+
itsEl = track.itsNSigmaEl();
630+
}
631+
trackProducts.producedElectronPids(itsEl, track.tpcNSigmaEl(), track.tofNSigmaEl());
628632
}
629633
if (mProducePionPids) {
630-
trackProducts.producedPionPids(track.itsNSigmaPi(), track.tpcNSigmaPi(), track.tofNSigmaPi());
634+
float itsPi = 0.f;
635+
if constexpr (requires(T1 t) { t.itsNSigmaPi(); }) {
636+
itsPi = track.itsNSigmaPi();
637+
}
638+
trackProducts.producedPionPids(itsPi, track.tpcNSigmaPi(), track.tofNSigmaPi());
631639
}
632640
if (mProduceKaonPids) {
633-
trackProducts.producedKaonPids(track.itsNSigmaKa(), track.tpcNSigmaKa(), track.tofNSigmaKa());
641+
float itsKa = 0.f;
642+
if constexpr (requires(T1 t) { t.itsNSigmaKa(); }) {
643+
itsKa = track.itsNSigmaKa();
644+
}
645+
trackProducts.producedKaonPids(itsKa, track.tpcNSigmaKa(), track.tofNSigmaKa());
634646
}
635647
if (mProduceProtonPids) {
636-
trackProducts.producedProtonPids(track.itsNSigmaPr(), track.tpcNSigmaPr(), track.tofNSigmaPr());
648+
float itsPr = 0.f;
649+
if constexpr (requires(T1 t) { t.itsNSigmaPr(); }) {
650+
itsPr = track.itsNSigmaPr();
651+
}
652+
trackProducts.producedProtonPids(itsPr, track.tpcNSigmaPr(), track.tofNSigmaPr());
637653
}
638654
if (mProduceDeuteronPids) {
639-
trackProducts.producedDeuteronPids(track.itsNSigmaDe(), track.tpcNSigmaDe(), track.tofNSigmaDe());
655+
float itsDe = 0.f;
656+
if constexpr (requires(T1 t) { t.itsNSigmaDe(); }) {
657+
itsDe = track.itsNSigmaDe();
658+
}
659+
trackProducts.producedDeuteronPids(itsDe, track.tpcNSigmaDe(), track.tofNSigmaDe());
640660
}
641661
if (mProduceTritonPids) {
642-
trackProducts.producedTritonPids(track.itsNSigmaTr(), track.tpcNSigmaTr(), track.tofNSigmaTr());
662+
float itsTr = 0.f;
663+
if constexpr (requires(T1 t) { t.itsNSigmaTr(); }) {
664+
itsTr = track.itsNSigmaTr();
665+
}
666+
trackProducts.producedTritonPids(itsTr, track.tpcNSigmaTr(), track.tofNSigmaTr());
643667
}
644668
if (mProduceHeliumPids) {
645-
trackProducts.producedHeliumPids(track.itsNSigmaHe(), track.tpcNSigmaHe(), track.tofNSigmaHe());
669+
float itsHe = 0.f;
670+
if constexpr (requires(T1 t) { t.itsNSigmaHe(); }) {
671+
itsHe = track.itsNSigmaHe();
672+
}
673+
trackProducts.producedHeliumPids(itsHe, track.tpcNSigmaHe(), track.tofNSigmaHe());
646674
}
647675
}
648676

@@ -690,15 +718,15 @@ class TrackBuilder
690718
}
691719
}
692720

693-
template <modes::System system, modes::Track type, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
694-
int64_t getDaughterIndex(const T1& col, T2& collisionProducts, T3 const& mcCols, const T4& daughter, T5& daughterWithItsPid, T6& trackProducts, T7 const& mcParticles, T8& mcBuilder, T9& mcProducts)
721+
template <modes::System system, modes::Track type, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
722+
int64_t getDaughterIndex(const T1& col, T2& collisionProducts, T3 const& mcCols, const T4& daughter, T5& trackProducts, T6 const& mcParticles, T7& mcBuilder, T8& mcProducts)
695723
{
696724
auto result = utils::getIndex(daughter.globalIndex(), indexMap);
697725
if (result) {
698726
// daugher already in track table
699727
return result.value();
700728
} else {
701-
this->fillMcTrack<system, type>(col, collisionProducts, mcCols, daughter, daughterWithItsPid, trackProducts, mcParticles, mcBuilder, mcProducts);
729+
this->fillMcTrack<system, type>(col, collisionProducts, mcCols, daughter, daughter, trackProducts, mcParticles, mcBuilder, mcProducts);
702730
// daughter is last track which was added added
703731
return trackProducts.producedTracks.lastIndex();
704732
}

0 commit comments

Comments
 (0)