@@ -270,7 +270,7 @@ struct UpcRhoAnalysis {
270270
271271 void init (o2::framework::InitContext& context)
272272 {
273- if (context.mOptions .get <bool >(" processSGdata" ) || context.mOptions .get <bool >(" processDGdata" )) {
273+ if (context.mOptions .get <bool >(" processSGdata" ) || context.mOptions .get <bool >(" processDGdata" ) || context. mOptions . get < bool >( " processMcRecoWithTruth " ) ) {
274274 // QA
275275 // collisions
276276 rQC.add (" QC/collisions/all/hPosXY" , " ;vertex #it{x} (cm);vertex #it{y} (cm);counts" , kTH2D , {{2000 , -0.1 , 0.1 }, {2000 , -0.1 , 0.1 }});
@@ -394,7 +394,7 @@ struct UpcRhoAnalysis {
394394 rSystem.addClone (" system/selected/AnAn/" , " system/selected/XnXn/" );
395395 }
396396
397- if (context.mOptions .get <bool >(" processMCdata" ) || context.mOptions .get <bool >(" processMCdataWithBCs" )) {
397+ if (context.mOptions .get <bool >(" processMCdata" ) || context.mOptions .get <bool >(" processMCdataWithBCs" ) || context. mOptions . get < bool >( " processMcRecoWithTruth " ) ) {
398398 // MC
399399 // collisions
400400 rMC.add (" MC/collisions/hPosXY" , " ;vertex #it{x} (cm);vertex #it{y} (cm);counts" , kTH2D , {{2000 , -0.1 , 0.1 }, {2000 , -0.1 , 0.1 }});
@@ -1267,6 +1267,48 @@ struct UpcRhoAnalysis {
12671267 }
12681268 PROCESS_SWITCH (UpcRhoAnalysis, processResolution, " check resolution of kinematic variables" , false );
12691269
1270+ void processMcRecoWithTruth (soa::Join<aod::UDCollisions, aod::UDCollisionsSels, aod::UDCollisionSelExtras, aod::UDZdcsReduced, aod::SGCollisions, aod::UDMcCollsLabels>::iterator const & collision, soa::Join<aod::UDTracks, aod::UDTracksExtra, aod::UDTracksDCA, aod::UDTracksPID, aod::UDTracksFlags, aod::UDMcTrackLabels> const & tracks, aod::UDMcCollisions const &, aod::UDMcParticles const &)
1271+ {
1272+ // basically just runs the analysis as for normal data but also accesses the MC truth information for the tracks and collisions
1273+ auto mcCollision = collision.udMcCollision ();
1274+ const int runIndex = -1 ; // we don't care here
1275+ if (cutGapSide && collision.gapSide () != gapSide)
1276+ return ;
1277+ if (!collisionPassesCuts (collision, runIndex)) // apply collision cuts
1278+ return ;
1279+
1280+ std::vector<decltype (tracks.begin ())> recoTracks; // store selected tracks
1281+ std::vector<decltype (tracks.begin ().udMcParticle ())> trueTracks;
1282+ for (const auto & track : tracks) {
1283+ fillTrackQcHistos<0 >(track); // fill QC histograms before cuts
1284+
1285+ if (!trackPassesCuts (track, runIndex)) // apply track cuts
1286+ continue ;
1287+ recoTracks.push_back (track);
1288+ if (track.has_udMcParticle ())
1289+ trueTracks.push_back (track.udMcParticle ());
1290+ }
1291+ if (static_cast <int >(recoTracks.size ()) != nExpectedPions || static_cast <int >(trueTracks.size ()) != nExpectedPions) // further consider only two pion systems
1292+ return ;
1293+ if (applyPid && !tracksPassPID (recoTracks)) // apply PID cut before creating derived data if desired
1294+ return ;
1295+
1296+ auto leadingTruePion = momentum (trueTracks[0 ].px (), trueTracks[0 ].py (), trueTracks[0 ].pz ()) > momentum (trueTracks[1 ].px (), trueTracks[1 ].py (), trueTracks[1 ].pz ()) ? trueTracks[0 ] : trueTracks[1 ];
1297+ auto subleadingTruePion = (leadingTruePion == trueTracks[0 ]) ? trueTracks[1 ] : trueTracks[0 ];
1298+ auto leadingRecoPion = momentum (recoTracks[0 ].px (), recoTracks[0 ].py (), recoTracks[0 ].pz ()) > momentum (recoTracks[1 ].px (), recoTracks[1 ].py (), recoTracks[1 ].pz ()) ? recoTracks[0 ] : recoTracks[1 ];
1299+ auto subleadingRecoPion = (leadingRecoPion == recoTracks[0 ]) ? recoTracks[1 ] : recoTracks[0 ];
1300+
1301+ resolutionTree (mcCollision.posX (), mcCollision.posY (), mcCollision.posZ (),
1302+ collision.posX (), collision.posY (), collision.posZ (),
1303+ collision.totalFT0AmplitudeA (), collision.totalFT0AmplitudeC (), collision.totalFV0AmplitudeA (), collision.totalFDDAmplitudeA (), collision.totalFDDAmplitudeC (),
1304+ collision.timeFT0A (), collision.timeFT0C (), collision.timeFV0A (), collision.timeFDDA (), collision.timeFDDC (),
1305+ leadingTruePion.pdgCode () / std::abs (leadingTruePion.pdgCode ()), pt (leadingTruePion.px (), leadingTruePion.py ()), eta (leadingTruePion.px (), leadingTruePion.py (), leadingTruePion.pz ()), phi (leadingTruePion.px (), leadingTruePion.py ()),
1306+ pt (leadingRecoPion.px (), leadingRecoPion.py ()), eta (leadingRecoPion.px (), leadingRecoPion.py (), leadingRecoPion.pz ()), phi (leadingRecoPion.px (), leadingRecoPion.py ()),
1307+ subleadingTruePion.pdgCode () / std::abs (subleadingTruePion.pdgCode ()), pt (subleadingTruePion.px (), subleadingTruePion.py ()), eta (subleadingTruePion.px (), subleadingTruePion.py (), subleadingTruePion.pz ()), phi (subleadingTruePion.px (), subleadingTruePion.py ()),
1308+ pt (subleadingRecoPion.px (), subleadingRecoPion.py ()), eta (subleadingRecoPion.px (), subleadingRecoPion.py (), subleadingRecoPion.pz ()), phi (subleadingRecoPion.px (), subleadingRecoPion.py ()));
1309+ }
1310+ PROCESS_SWITCH (UpcRhoAnalysis, processMcRecoWithTruth, " process MC reco with access to MC truth" , false );
1311+
12701312 void processCollisionRecoCheck (aod::UDMcCollision const & /* mcCollision */ , soa::SmallGroups<soa::Join<aod::UDMcCollsLabels, aod::UDCollisions>> const & collisions)
12711313 {
12721314 checkNumberOfCollisionReconstructions (collisions);
0 commit comments