Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 13 additions & 19 deletions PWGCF/Femto/Core/cascadeBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,8 @@ class CascadeBuilder
LOG(info) << "Initialization done...";
}

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

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

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

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

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

fillCascade(collisionProducts, cascadeProducts, cascade, col, bachelorIndex, posDaughterIndex, negDaughterIndex);
}
}

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>
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)
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>
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)
{
if (!mFillAnyTable) {
return;
Expand All @@ -437,17 +434,14 @@ class CascadeBuilder

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

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

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

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

fillCascade(collisionProducts, cascadeProducts, cascade, col, bachelorIndex, posDaughterIndex, negDaughterIndex);
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {
Expand Down
52 changes: 18 additions & 34 deletions PWGCF/Femto/Core/kinkBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ struct ConfKinkFilters : o2::framework::ConfigurableGroup {
// selections bits for all kinks
#define KINK_DEFAULT_BITS \
o2::framework::Configurable<std::vector<float>> kinkTopoDcaMax{"kinkTopoDcaMax", {2.0f}, "Maximum kink topological DCA"}; \
o2::framework::Configurable<std::vector<float>> transRadMin{"transRadMin", {0.2f}, "Minimum transverse radius (cm)"}; \
o2::framework::Configurable<std::vector<float>> transRadMin{"transRadMin", {20.f}, "Minimum transverse radius (cm)"}; \
o2::framework::Configurable<std::vector<float>> transRadMax{"transRadMax", {100.f}, "Maximum transverse radius (cm)"}; \
o2::framework::Configurable<std::vector<float>> dauAbsEtaMax{"dauAbsEtaMax", {0.8f}, "Maximum absolute pseudorapidity for daughter track"}; \
o2::framework::Configurable<std::vector<float>> dauDcaPvMin{"dauDcaPvMin", {0.0f}, "Minimum DCA of daughter from primary vertex (cm)"}; \
o2::framework::Configurable<std::vector<float>> dauAbsEtaMax{"dauAbsEtaMax", {1.0f}, "Maximum absolute pseudorapidity for daughter track"}; \
o2::framework::Configurable<std::vector<float>> dauDcaPvMin{"dauDcaPvMin", {0.1f}, "Minimum DCA of daughter from primary vertex (cm)"}; \
o2::framework::Configurable<std::vector<float>> mothDcaPvMax{"mothDcaPvMax", {1.0f}, "Maximum DCA of mother from primary vertex (cm)"}; \
o2::framework::Configurable<std::vector<float>> alphaAPMin{"alphaAPMin", {-1.0f}, "Minimum Alpha_AP for Sigma candidates"}; \
o2::framework::Configurable<std::vector<float>> alphaAPMax{"alphaAPMax", {0.0f}, "Maximum Alpha_AP for Sigma candidates"}; \
Expand Down Expand Up @@ -224,8 +224,8 @@ class KinkSelection : public BaseSelection<float, o2::aod::femtodatatypes::KinkM
this->setupContainers<HistName>(registry);
};

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

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

// Recalculate pT using kinematic constraints
float ptRecalc = utils::calcPtnew(momMother[0], momMother[1], momMother[2],
momDaughter[0], momDaughter[1], momDaughter[2]);
if (ptRecalc > 0.f) {
mKinkMotherPt = ptRecalc;
} else {
mKinkMotherPt = -1.f;
}
float ptRecalc = utils::calcPtnew(momMother[0], momMother[1], momMother[2], momDaughter[0], momDaughter[1], momDaughter[2]);
mKinkMotherPt = (ptRecalc > 0.f) ? ptRecalc : std::hypot(momMother[0], momMother[1]);
}

template <typename T>
Expand Down Expand Up @@ -435,8 +430,8 @@ class KinkBuilder
LOG(info) << "Initialization done...";
}

template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
void fillKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& kinkProducts, T6 const& kinks, T7 const& tracks, T8 const& tracksWithItsPid, T9& trackBuilder)
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
void fillKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& kinkProducts, T6 const& kinks, T7 const& tracks, T8& trackBuilder)
{
if (!mFillAnyTable) {
return;
Expand All @@ -450,20 +445,15 @@ class KinkBuilder
continue;
}
// compute qa variables before applying selections
mKinkSelection.computeQaVariables(kink, tracks);
mKinkSelection.computeKinkKinematics(kink, tracks, col);
mKinkSelection.applySelections(kink, tracks);
if (!mKinkSelection.passesAllRequiredSelections()) {
continue;
}

collisionBuilder.template fillCollision<system>(collisionProducts, col);
// cleaner, but without ITS pid: auto daughter = kink.template trackDaug_as<T7>();
int64_t idx = kink.trackDaugId() - tracksWithItsPid.offset();
// check for valid index
if (idx < 0 || idx >= static_cast<int64_t>(tracksWithItsPid.size())) {
return;
}
auto daughter = tracksWithItsPid.iteratorAt(idx);

auto daughter = kink.template trackDaug_as<T7>();
daughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kKinkDaughter>(daughter, trackProducts, collisionProducts);
if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) {
fillSigma(collisionProducts, kinkProducts, kink, daughterIndex);
Expand All @@ -474,8 +464,8 @@ class KinkBuilder
}
}

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>
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)
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>
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)
{

if (!mFillAnyTable) {
Expand All @@ -489,22 +479,16 @@ class KinkBuilder
continue;
}
// compute qa variables before applying selections
mKinkSelection.computeQaVariables(kink, tracks);
mKinkSelection.computeKinkKinematics(kink, tracks, col);
mKinkSelection.applySelections(kink, tracks);
if (!mKinkSelection.passesAllRequiredSelections()) {
continue;
}

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

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

if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) {
fillSigma(collisionProducts, kinkProducts, kink, daughterIndex);
Expand Down
4 changes: 2 additions & 2 deletions PWGCF/Femto/Core/pairHistManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ struct ConfPairBinning : o2::framework::ConfigurableGroup {
o2::framework::ConfigurableAxis dalitzM13{"dalitzM13", {{100, 0, 10}}, "Mass13 binning of darlitz plot"};
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)"};
o2::framework::ConfigurableAxis binningDeltaEta{"binningDeltaEta", {{35, -1.6, 1.6}}, "Delta eta"};
o2::framework::ConfigurableAxis binningDeltaPhi{"binningDeltaPhi", {{35, -o2::constants::math::PI / 2, 3 * o2::constants::math::PI / 2}}, "Delta phi"};
o2::framework::ConfigurableAxis binningDeltaPhi{"binningDeltaPhi", {{35, -o2::constants::math::PIHalf, 3 * o2::constants::math::PIHalf}}, "Delta phi"};
};

struct ConfPairCuts : o2::framework::ConfigurableGroup {
Expand Down Expand Up @@ -489,7 +489,7 @@ class PairHistManager

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

if (mPlotDalitz) {
Expand Down
50 changes: 39 additions & 11 deletions PWGCF/Femto/Core/trackBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ class TrackBuilder
}
}
if (mProduceTrackMass) {
trackProducts.producedTrackMass(track.mass());
trackProducts.producedTrackMass(track.mass()); // default value if track has no TOF signal is -999
}
if (mProduceTrackDcas) {
trackProducts.producedTrackDcas(track.dcaXY(), track.dcaZ());
Expand All @@ -624,25 +624,53 @@ class TrackBuilder
track.beta());
}
if (mProduceElectronPids) {
trackProducts.producedElectronPids(track.itsNSigmaEl(), track.tpcNSigmaEl(), track.tofNSigmaEl());
float itsEl = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaEl(); }) {
itsEl = track.itsNSigmaEl();
}
trackProducts.producedElectronPids(itsEl, track.tpcNSigmaEl(), track.tofNSigmaEl());
}
if (mProducePionPids) {
trackProducts.producedPionPids(track.itsNSigmaPi(), track.tpcNSigmaPi(), track.tofNSigmaPi());
float itsPi = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaPi(); }) {
itsPi = track.itsNSigmaPi();
}
trackProducts.producedPionPids(itsPi, track.tpcNSigmaPi(), track.tofNSigmaPi());
}
if (mProduceKaonPids) {
trackProducts.producedKaonPids(track.itsNSigmaKa(), track.tpcNSigmaKa(), track.tofNSigmaKa());
float itsKa = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaKa(); }) {
itsKa = track.itsNSigmaKa();
}
trackProducts.producedKaonPids(itsKa, track.tpcNSigmaKa(), track.tofNSigmaKa());
}
if (mProduceProtonPids) {
trackProducts.producedProtonPids(track.itsNSigmaPr(), track.tpcNSigmaPr(), track.tofNSigmaPr());
float itsPr = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaPr(); }) {
itsPr = track.itsNSigmaPr();
}
trackProducts.producedProtonPids(itsPr, track.tpcNSigmaPr(), track.tofNSigmaPr());
}
if (mProduceDeuteronPids) {
trackProducts.producedDeuteronPids(track.itsNSigmaDe(), track.tpcNSigmaDe(), track.tofNSigmaDe());
float itsDe = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaDe(); }) {
itsDe = track.itsNSigmaDe();
}
trackProducts.producedDeuteronPids(itsDe, track.tpcNSigmaDe(), track.tofNSigmaDe());
}
if (mProduceTritonPids) {
trackProducts.producedTritonPids(track.itsNSigmaTr(), track.tpcNSigmaTr(), track.tofNSigmaTr());
float itsTr = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaTr(); }) {
itsTr = track.itsNSigmaTr();
}
trackProducts.producedTritonPids(itsTr, track.tpcNSigmaTr(), track.tofNSigmaTr());
}
if (mProduceHeliumPids) {
trackProducts.producedHeliumPids(track.itsNSigmaHe(), track.tpcNSigmaHe(), track.tofNSigmaHe());
float itsHe = 0.f;
if constexpr (requires(T1 t) { t.itsNSigmaHe(); }) {
itsHe = track.itsNSigmaHe();
}
trackProducts.producedHeliumPids(itsHe, track.tpcNSigmaHe(), track.tofNSigmaHe());
}
}

Expand Down Expand Up @@ -690,15 +718,15 @@ class TrackBuilder
}
}

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>
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)
template <modes::System system, modes::Track type, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
int64_t getDaughterIndex(const T1& col, T2& collisionProducts, T3 const& mcCols, const T4& daughter, T5& trackProducts, T6 const& mcParticles, T7& mcBuilder, T8& mcProducts)
{
auto result = utils::getIndex(daughter.globalIndex(), indexMap);
if (result) {
// daugher already in track table
return result.value();
} else {
this->fillMcTrack<system, type>(col, collisionProducts, mcCols, daughter, daughterWithItsPid, trackProducts, mcParticles, mcBuilder, mcProducts);
this->fillMcTrack<system, type>(col, collisionProducts, mcCols, daughter, daughter, trackProducts, mcParticles, mcBuilder, mcProducts);
// daughter is last track which was added added
return trackProducts.producedTracks.lastIndex();
}
Expand Down
Loading
Loading