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