@@ -312,10 +312,10 @@ struct femtoUniverseProducerTask {
312312
313313 void init (InitContext&)
314314 {
315- if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackD0mesonData || doprocessTrackCentRun2Data || doprocessTrackCentRun3Data || doprocessTrackV0CentRun3) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth) == false ) {
315+ if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackD0mesonData || doprocessTrackCentRun2Data || doprocessTrackCentRun3Data || doprocessTrackV0CentRun3) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTruthAndFullMC ) == false ) {
316316 LOGF (fatal, " Neither processFullData nor processFullMC enabled. Please choose one." );
317317 }
318- if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackD0mesonData || doprocessTrackCentRun2Data || doprocessTrackCentRun3Data || doprocessTrackV0CentRun3) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth) == true ) {
318+ if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackD0mesonData || doprocessTrackCentRun2Data || doprocessTrackCentRun3Data || doprocessTrackV0CentRun3) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTruthAndFullMC ) == true ) {
319319 LOGF (fatal,
320320 " Cannot enable process Data and process MC at the same time. "
321321 " Please choose one." );
@@ -999,7 +999,7 @@ struct femtoUniverseProducerTask {
999999 }
10001000 }
10011001
1002- template <typename TrackType>
1002+ template <typename TrackType, bool transientLabels = false >
10031003 void fillParticles (TrackType const & tracks)
10041004 {
10051005 std::vector<int > childIDs = {0 , 0 }; // these IDs are necessary to keep track of the children
@@ -1058,6 +1058,12 @@ struct femtoUniverseProducerTask {
10581058 if (ConfIsDebug) {
10591059 fillDebugParticle<false , true >(particle);
10601060 }
1061+
1062+ // Workaround to keep the FDParticles and MC label tables
1063+ // aligned, so that they can be joined in the task.
1064+ if constexpr (transientLabels) {
1065+ outputPartsMCLabels (-1 );
1066+ }
10611067 }
10621068 }
10631069
@@ -1211,6 +1217,36 @@ struct femtoUniverseProducerTask {
12111217 }
12121218 PROCESS_SWITCH (femtoUniverseProducerTask, processTrackMCTruth, " Provide MC data for MC truth track analysis" , false );
12131219
1220+ Preslice<aod::McParticles> perMCCollision = aod::mcparticle::mcCollisionId;
1221+ PresliceUnsorted<soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels>> recoCollsPerMCColl = aod::mcparticle::mcCollisionId;
1222+ Preslice<soa::Join<aod::FemtoFullTracks, aod::McTrackLabels>> perCollisionTracks = aod::track::collisionId;
1223+ Preslice<soa::Join<o2::aod::V0Datas, aod::McV0Labels>> perCollisionV0s = aod::track::collisionId;
1224+ void processTruthAndFullMC (
1225+ aod::McCollisions const & mccols,
1226+ aod::McParticles const & mcParticles,
1227+ soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels> const & collisions,
1228+ soa::Join<aod::FemtoFullTracks, aod::McTrackLabels> const & tracks,
1229+ soa::Join<o2::aod::V0Datas, aod::McV0Labels> const & fullV0s,
1230+ aod::BCsWithTimestamps const &)
1231+ {
1232+ // truth
1233+ for (auto & mccol : mccols) {
1234+ auto groupedMCParticles = mcParticles.sliceBy (perMCCollision, mccol.globalIndex ());
1235+ auto groupedCollisions = collisions.sliceBy (recoCollsPerMCColl, mccol.globalIndex ());
1236+ fillMCTruthCollisions (groupedCollisions, groupedMCParticles); // fills the reco collisions for mc collision
1237+ fillParticles<decltype (groupedMCParticles), true >(groupedMCParticles); // fills mc particles
1238+ }
1239+
1240+ // recos
1241+ for (auto & col : collisions) {
1242+ auto groupedTracks = tracks.sliceBy (perCollisionTracks, col.globalIndex ());
1243+ auto groupedV0s = fullV0s.sliceBy (perCollisionV0s, col.globalIndex ());
1244+ getMagneticFieldTesla (col.bc_as <aod::BCsWithTimestamps>());
1245+ fillCollisionsAndTracksAndV0AndPhi<true >(col, groupedTracks, groupedV0s);
1246+ }
1247+ }
1248+ PROCESS_SWITCH (femtoUniverseProducerTask, processTruthAndFullMC, " Provide both MC truth and reco for tracks and V0s" , false );
1249+
12141250 void processTrackCentRun2Data (aod::FemtoFullCollisionCentRun2 const & col,
12151251 aod::BCsWithTimestamps const &,
12161252 aod::FemtoFullTracks const & tracks)
0 commit comments