Skip to content

Commit c2807d8

Browse files
EloviyoShirajum Monira
andauthored
[PWGCF] FemtoUniverse cascade task -- added process function for cascade efficiency correction (#9960)
Co-authored-by: Shirajum Monira <shirajum.monira@cernch>
1 parent f75a23b commit c2807d8

File tree

1 file changed

+89
-26
lines changed

1 file changed

+89
-26
lines changed

PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx

Lines changed: 89 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
/// \author Zuzanna Chochulska, WUT Warsaw & CTU Prague, zchochul@cern.ch
1616
/// \author Malgorzata Janik, WUT Warsaw, majanik@cern.ch
1717
/// \author Pritam Chakraborty, WUT Warsaw, pritam.chakraborty@cern.ch
18+
/// \author Shirajum Monira, WUT Warsaw, shirajum.monira@cern.ch
1819

20+
#include <experimental/type_traits>
1921
#include <CCDB/BasicCCDBManager.h>
2022
#include <TPDGCode.h>
2123
#include <vector>
@@ -465,10 +467,10 @@ struct FemtoUniverseProducerTask {
465467

466468
void init(InitContext&)
467469
{
468-
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMC || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == false) {
470+
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == false) {
469471
LOGF(fatal, "Neither processFullData nor processFullMC enabled. Please choose one.");
470472
}
471-
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMC || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == true) {
473+
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == true) {
472474
LOGF(fatal,
473475
"Cannot enable process Data and process MC at the same time. "
474476
"Please choose one.");
@@ -1121,9 +1123,9 @@ struct FemtoUniverseProducerTask {
11211123
0,
11221124
0);
11231125
const int rowOfPosTrack = outputCascParts.lastIndex();
1124-
// if constexpr (isMC) {
1125-
// fillMCParticle(postrack, o2::aod::femtouniverseparticle::ParticleType::kV0Child);
1126-
// }
1126+
if constexpr (isMC) {
1127+
fillMCParticle(posTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kV0Child);
1128+
}
11271129
int negtrackID = casc.negTrackId();
11281130
int rowInPrimaryTrackTableNeg = -1;
11291131
rowInPrimaryTrackTableNeg = getRowDaughters(negtrackID, tmpIDtrack);
@@ -1152,9 +1154,9 @@ struct FemtoUniverseProducerTask {
11521154
0,
11531155
0);
11541156
const int rowOfNegTrack = outputCascParts.lastIndex();
1155-
// if constexpr (isMC) {
1156-
// fillMCParticle(negtrack, o2::aod::femtouniverseparticle::ParticleType::kV0Child);
1157-
// }
1157+
if constexpr (isMC) {
1158+
fillMCParticle(negTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kV0Child);
1159+
}
11581160
// bachelor
11591161
int bachtrackID = casc.bachelorId();
11601162
int rowInPrimaryTrackTableBach = -1;
@@ -1184,6 +1186,9 @@ struct FemtoUniverseProducerTask {
11841186
0,
11851187
0);
11861188
const int rowOfBachTrack = outputCascParts.lastIndex();
1189+
if constexpr (isMC) {
1190+
fillMCParticle(bachTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor);
1191+
}
11871192
// cascade
11881193
std::vector<int> indexCascChildID = {rowOfPosTrack, rowOfNegTrack, rowOfBachTrack};
11891194
outputCascParts(outputCollision.lastIndex(),
@@ -1213,6 +1218,9 @@ struct FemtoUniverseProducerTask {
12131218
fillDebugParticle<true, false, false>(bachTrackCasc); // QA for negative daughter
12141219
fillDebugParticle<false, false, true>(casc); // QA for cascade
12151220
}
1221+
if constexpr (isMC) {
1222+
fillMCParticle(casc, o2::aod::femtouniverseparticle::ParticleType::kCascade);
1223+
}
12161224
}
12171225
}
12181226

@@ -1676,6 +1684,7 @@ struct FemtoUniverseProducerTask {
16761684
0,
16771685
0);
16781686
} else {
1687+
childIDs.push_back(0);
16791688
outputCascParts(outputCollision.lastIndex(),
16801689
particle.pt(),
16811690
particle.eta(),
@@ -1699,9 +1708,14 @@ struct FemtoUniverseProducerTask {
16991708
if constexpr (resolveDaughs) {
17001709
childIDs[0] = 0;
17011710
childIDs[1] = 0;
1711+
auto minDaughs = 2ul;
1712+
if (confIsActivateCascade) {
1713+
childIDs.push_back(0);
1714+
minDaughs = 3ul;
1715+
}
17021716
for (std::size_t i = 0; i < tmpIDtrack.size(); i++) {
17031717
const auto& particle = tracks.iteratorAt(tmpIDtrack[i] - tracks.begin().globalIndex());
1704-
for (int daughIndex = 0, n = std::min(2ul, particle.daughtersIds().size()); daughIndex < n; daughIndex++) {
1718+
for (int daughIndex = 0, n = std::min(minDaughs, particle.daughtersIds().size()); daughIndex < n; daughIndex++) {
17051719
// loop to find the corresponding index of the daughters
17061720
for (std::size_t j = 0; j < tmpIDtrack.size(); j++) {
17071721
if (tmpIDtrack[j] == particle.daughtersIds()[daughIndex]) {
@@ -1710,17 +1724,29 @@ struct FemtoUniverseProducerTask {
17101724
}
17111725
}
17121726
}
1713-
outputParts(outputCollision.lastIndex(),
1714-
particle.pt(),
1715-
particle.eta(),
1716-
particle.phi(),
1717-
aod::femtouniverseparticle::ParticleType::kMCTruthTrack,
1718-
0,
1719-
static_cast<uint32_t>(particle.pdgCode()),
1720-
particle.pdgCode(),
1721-
childIDs,
1722-
0,
1723-
0);
1727+
if (!confIsActivateCascade) {
1728+
outputParts(outputCollision.lastIndex(),
1729+
particle.pt(),
1730+
particle.eta(),
1731+
particle.phi(),
1732+
aod::femtouniverseparticle::ParticleType::kMCTruthTrack,
1733+
0,
1734+
static_cast<uint32_t>(particle.pdgCode()),
1735+
particle.pdgCode(),
1736+
childIDs,
1737+
0,
1738+
0);
1739+
} else {
1740+
outputCascParts(outputCollision.lastIndex(),
1741+
particle.pt(),
1742+
particle.eta(),
1743+
particle.phi(),
1744+
aod::femtouniverseparticle::ParticleType::kMCTruthTrack,
1745+
0,
1746+
static_cast<uint32_t>(particle.pdgCode()),
1747+
particle.pdgCode(),
1748+
childIDs, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1749+
}
17241750
if (confIsDebug) {
17251751
fillDebugParticle<false, true, false>(particle);
17261752
}
@@ -1980,25 +2006,37 @@ struct FemtoUniverseProducerTask {
19802006
}
19812007
PROCESS_SWITCH(FemtoUniverseProducerTask, processTrackMCGen, "Provide MC Generated for model comparisons", false);
19822008

2009+
template <class T>
2010+
using HasBachelor = decltype(std::declval<T&>().bachelorphi());
2011+
19832012
Preslice<aod::McParticles> perMCCollision = aod::mcparticle::mcCollisionId;
19842013
PresliceUnsorted<soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels>> recoCollsPerMCColl = aod::mcparticle::mcCollisionId;
19852014
Preslice<soa::Join<aod::FemtoFullTracks, aod::McTrackLabels>> perCollisionTracks = aod::track::collisionId;
1986-
Preslice<soa::Join<o2::aod::V0Datas, aod::McV0Labels>> perCollisionV0s = aod::track::collisionId;
2015+
template <class StrangePartType>
19872016
void processTruthAndFullMC(
19882017
aod::McCollisions const& mccols,
19892018
aod::McParticles const& mcParticles,
19902019
soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels> const& collisions,
19912020
soa::Filtered<soa::Join<aod::FemtoFullTracks, aod::McTrackLabels>> const& tracks,
1992-
soa::Join<o2::aod::V0Datas, aod::McV0Labels> const& fullV0s,
1993-
aod::BCsWithTimestamps const&)
2021+
StrangePartType const& strangeParts,
2022+
aod::BCsWithTimestamps const&,
2023+
Preslice<StrangePartType>& ps)
19942024
{
19952025
// recos
19962026
std::set<int> recoMcIds;
19972027
for (const auto& col : collisions) {
19982028
auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex());
1999-
auto groupedV0s = fullV0s.sliceBy(perCollisionV0s, col.globalIndex());
2029+
auto groupedStrageParts = strangeParts.sliceBy(ps, col.globalIndex());
20002030
getMagneticFieldTesla(col.bc_as<aod::BCsWithTimestamps>());
2001-
fillCollisionsAndTracksAndV0AndPhi<true>(col, groupedTracks, groupedV0s);
2031+
if constexpr (std::experimental::is_detected<HasBachelor, typename StrangePartType::iterator>::value) {
2032+
const auto colcheck = fillCollisions<true>(col, groupedTracks);
2033+
if (colcheck) {
2034+
fillTracks<true>(groupedTracks);
2035+
fillCascade<true>(col, groupedStrageParts, groupedTracks);
2036+
}
2037+
} else {
2038+
fillCollisionsAndTracksAndV0AndPhi<true>(col, groupedTracks, groupedStrageParts);
2039+
}
20022040
for (const auto& track : groupedTracks) {
20032041
if (trackCuts.isSelectedMinimal(track))
20042042
recoMcIds.insert(track.mcParticleId());
@@ -2013,7 +2051,32 @@ struct FemtoUniverseProducerTask {
20132051
fillParticles<decltype(groupedMCParticles), true, true>(groupedMCParticles, recoMcIds); // fills mc particles
20142052
}
20152053
}
2016-
PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMC, "Provide both MC truth and reco for tracks and V0s", false);
2054+
2055+
Preslice<soa::Join<o2::aod::V0Datas, aod::McV0Labels>> perCollisionV0s = aod::track::collisionId;
2056+
void processTruthAndFullMCV0(
2057+
aod::McCollisions const& mccols,
2058+
aod::McParticles const& mcParticles,
2059+
soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels> const& collisions,
2060+
soa::Filtered<soa::Join<aod::FemtoFullTracks, aod::McTrackLabels>> const& tracks,
2061+
soa::Join<o2::aod::V0Datas, aod::McV0Labels> const& fullV0s,
2062+
aod::BCsWithTimestamps const& bcs)
2063+
{
2064+
processTruthAndFullMC(mccols, mcParticles, collisions, tracks, fullV0s, bcs, perCollisionV0s);
2065+
}
2066+
PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCV0, "Provide both MC truth and reco for tracks and V0s", false);
2067+
2068+
Preslice<soa::Join<o2::aod::CascDatas, aod::McCascLabels>> perCollisionCascs = aod::track::collisionId;
2069+
void processTruthAndFullMCCasc(
2070+
aod::McCollisions const& mccols,
2071+
aod::McParticles const& mcParticles,
2072+
soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels> const& collisions,
2073+
soa::Filtered<soa::Join<aod::FemtoFullTracks, aod::McTrackLabels>> const& tracks,
2074+
soa::Join<o2::aod::CascDatas, aod::McCascLabels> const& fullCascades,
2075+
aod::BCsWithTimestamps const& bcs)
2076+
{
2077+
processTruthAndFullMC(mccols, mcParticles, collisions, tracks, fullCascades, bcs, perCollisionCascs);
2078+
}
2079+
PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCasc, "Provide both MC truth and reco for tracks and Cascades", false);
20172080

20182081
void processFullMCCent(aod::FemtoFullCollisionCentRun3 const& col,
20192082
aod::BCsWithTimestamps const&,

0 commit comments

Comments
 (0)