1414// This code produces reduced events for photon analyses.
1515// Please write to: daiki.sekihata@cern.ch
1616
17- #include < map>
18- #include < vector>
19- #include < iostream>
17+ #include " PWGEM/Dilepton/DataModel/dileptonTables.h"
18+ #include " PWGEM/PhotonMeson/DataModel/gammaTables.h"
19+
20+ #include " Common/Core/TableHelper.h"
2021
21- #include < random>
22- #include " Framework/runDataProcessing.h"
23- #include " Framework/AnalysisTask.h"
24- #include " Framework/AnalysisDataModel.h"
2522#include " Framework/ASoAHelpers.h"
23+ #include " Framework/AnalysisDataModel.h"
24+ #include " Framework/AnalysisTask.h"
25+ #include " Framework/runDataProcessing.h"
2626#include " ReconstructionDataFormats/Track.h"
27- #include " Common/Core/TableHelper.h"
28- #include " PWGEM/Dilepton/DataModel/dileptonTables.h"
29- #include " PWGEM/PhotonMeson/DataModel/gammaTables.h"
27+
28+ #include < iostream>
29+ #include < map>
30+ #include < random>
31+ #include < vector>
3032
3133using namespace o2 ;
3234using namespace o2 ::framework;
@@ -43,6 +45,7 @@ struct AssociateMCInfoDilepton {
4345 using MyCollisionsMC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::EMEvSels>;
4446 using TracksMC = soa::Join<aod::TracksIU, aod::McTrackLabels>;
4547 using FwdTracksMC = soa::Join<aod::FwdTracks, aod::McFwdTrackLabels>;
48+ using MFTTracksMC = soa::Join<aod::MFTTracks, aod::McMFTTrackLabels>;
4649
4750 Produces<o2::aod::EMMCEvents> mcevents;
4851 Produces<o2::aod::EMMCEventLabels> mceventlabels;
@@ -51,6 +54,7 @@ struct AssociateMCInfoDilepton {
5154 Produces<o2::aod::V0LegMCLabels> v0legmclabels;
5255 Produces<o2::aod::EMPrimaryElectronMCLabels> emprimaryelectronmclabels;
5356 Produces<o2::aod::EMPrimaryMuonMCLabels> emprimarymuonmclabels;
57+ Produces<o2::aod::EMMFTMCLabels> emmftmclabels;
5458 Produces<o2::aod::EMDummyDatas> emdummydata;
5559
5660 Configurable<int > n_dummy_loop{" n_dummy_loop" , 0 , " for loop runs over n times" };
@@ -135,8 +139,8 @@ struct AssociateMCInfoDilepton {
135139 Partition<aod::McParticles> mcmuons = nabs(o2::aod::mcparticle::pdgCode) == 13 && min_eta_gen_primary_fwd < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen_primary_fwd;
136140 Partition<aod::McParticles> mcvectormesons = o2::aod::mcparticle::pdgCode == 223 || o2::aod::mcparticle::pdgCode == 333 ;
137141
138- template <uint8_t system, typename TTracks, typename TFwdTracks, typename TPCMs, typename TPCMLegs, typename TEMPrimaryElectrons, typename TEMPrimaryMuons>
139- void skimmingMC (MyCollisionsMC const & collisions, aod::BCs const &, aod::McCollisions const & mcCollisions, aod::McParticles const & mcTracks, TTracks const & o2tracks, TFwdTracks const & o2fwdtracks, TPCMs const & v0photons, TPCMLegs const & /* v0legs */ , TEMPrimaryElectrons const & emprimaryelectrons, TEMPrimaryMuons const & emprimarymuons)
142+ template <uint8_t system, typename TTracks, typename TFwdTracks, typename TMFTTracks, typename TPCMs, typename TPCMLegs, typename TEMPrimaryElectrons, typename TEMPrimaryMuons>
143+ void skimmingMC (MyCollisionsMC const & collisions, aod::BCs const &, aod::McCollisions const & mcCollisions, aod::McParticles const & mcTracks, TTracks const & o2tracks, TFwdTracks const & o2fwdtracks, TMFTTracks const &, TPCMs const & v0photons, TPCMLegs const &, TEMPrimaryElectrons const & emprimaryelectrons, TEMPrimaryMuons const & emprimarymuons)
140144 {
141145 // temporary variables used for the indexing of the skimmed MC stack
142146 std::map<uint64_t , int > fNewLabels ;
@@ -358,8 +362,8 @@ struct AssociateMCInfoDilepton {
358362 continue ;
359363 }
360364
361- auto ele = v0.template negTrack_as <aod::V0Legs >();
362- auto pos = v0.template posTrack_as <aod::V0Legs >();
365+ auto ele = v0.template negTrack_as <TPCMLegs >();
366+ auto pos = v0.template posTrack_as <TPCMLegs >();
363367
364368 auto o2track_ele = o2tracks.iteratorAt (ele.trackId ());
365369 auto o2track_pos = o2tracks.iteratorAt (pos.trackId ());
@@ -521,6 +525,54 @@ struct AssociateMCInfoDilepton {
521525 }
522526 } // end of mother chain loop
523527
528+ // mc label for tracks registered in MFT in global muons
529+ if (o2track.matchMFTTrackId () > -1 ) {
530+ const auto & o2mfttrack = o2track.template matchMFTTrack_as <TMFTTracks>();
531+ if (!o2mfttrack.has_mcParticle ()) {
532+ emmftmclabels (-1 , 0 );
533+ break ;
534+ }
535+
536+ const auto & mco2mfttrack = o2mfttrack.template mcParticle_as <aod::McParticles>();
537+ if (!(fNewLabels .find (mco2mfttrack.globalIndex ()) != fNewLabels .end ())) {
538+ fNewLabels [mco2mfttrack.globalIndex ()] = fCounters [0 ];
539+ fNewLabelsReversed [fCounters [0 ]] = mco2mfttrack.globalIndex ();
540+ // fMCFlags[mco2mfttrack.globalIndex()] = mcflags;
541+ fEventIdx [mco2mfttrack.globalIndex ()] = fEventLabels .find (mco2mfttrack.mcCollisionId ())->second ;
542+ fCounters [0 ]++;
543+ }
544+ emmftmclabels (fNewLabels .find (mco2mfttrack.index ())->second , o2track.mcMask ());
545+
546+ // Next, store mother-chain of this reconstructed track.
547+ int motherid = -999 ; // first mother index
548+ if (mctrack.has_mothers ()) {
549+ motherid = mctrack.mothersIds ()[0 ]; // first mother index
550+ }
551+ while (motherid > -1 ) {
552+ if (motherid < mcTracks.size ()) { // protect against bad mother indices. why is this needed?
553+ auto mp = mcTracks.iteratorAt (motherid);
554+
555+ // if the MC truth particle corresponding to this reconstructed track which is not already written, add it to the skimmed MC stack
556+ if (!(fNewLabels .find (mp.globalIndex ()) != fNewLabels .end ())) {
557+ fNewLabels [mp.globalIndex ()] = fCounters [0 ];
558+ fNewLabelsReversed [fCounters [0 ]] = mp.globalIndex ();
559+ // fMCFlags[mp.globalIndex()] = mcflags;
560+ fEventIdx [mp.globalIndex ()] = fEventLabels .find (mp.mcCollisionId ())->second ;
561+ fCounters [0 ]++;
562+ }
563+
564+ if (mp.has_mothers ()) {
565+ motherid = mp.mothersIds ()[0 ]; // first mother index
566+ } else {
567+ motherid = -999 ;
568+ }
569+ } else {
570+ motherid = -999 ;
571+ }
572+ } // end of mother chain loop
573+ } else {
574+ emmftmclabels (-1 , 0 );
575+ }
524576 } // end of em primary muon loop
525577 }
526578
@@ -612,36 +664,36 @@ struct AssociateMCInfoDilepton {
612664 void processMC_Electron (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, aod::EMPrimaryElectrons const & emprimaryelectrons)
613665 {
614666 const uint8_t sysflag = kElectron ;
615- skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr , nullptr , nullptr , emprimaryelectrons, nullptr );
667+ skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr , nullptr , nullptr , nullptr , emprimaryelectrons, nullptr );
616668 }
617669
618- void processMC_FwdMuon (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, FwdTracksMC const & o2fwdtracks, aod::EMPrimaryMuons const & emprimarymuons)
670+ void processMC_FwdMuon (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, FwdTracksMC const & o2fwdtracks, MFTTracksMC const & o2mfttracks, aod::EMPrimaryMuons const & emprimarymuons)
619671 {
620672 const uint8_t sysflag = kFwdMuon ;
621- skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, nullptr , o2fwdtracks, nullptr , nullptr , nullptr , emprimarymuons);
673+ skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, nullptr , o2fwdtracks, o2mfttracks, nullptr , nullptr , nullptr , emprimarymuons);
622674 }
623675
624- void processMC_Electron_FwdMuon (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, FwdTracksMC const & o2fwdtracks, aod::EMPrimaryElectrons const & emprimaryelectrons, aod::EMPrimaryMuons const & emprimarymuons)
676+ void processMC_Electron_FwdMuon (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, FwdTracksMC const & o2fwdtracks, MFTTracksMC const & o2mfttracks, aod::EMPrimaryElectrons const & emprimaryelectrons, aod::EMPrimaryMuons const & emprimarymuons)
625677 {
626678 const uint8_t sysflag = kElectron | kFwdMuon ;
627- skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, o2fwdtracks, nullptr , nullptr , emprimaryelectrons, emprimarymuons);
679+ skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, o2fwdtracks, o2mfttracks, nullptr , nullptr , emprimaryelectrons, emprimarymuons);
628680 }
629681
630- void processMC_Electron_FwdMuon_PCM (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, FwdTracksMC const & o2fwdtracks, aod::V0PhotonsKF const & v0photons, aod::V0Legs const & v0legs, aod::EMPrimaryElectrons const & emprimaryelectrons, aod::EMPrimaryMuons const & emprimarymuons)
682+ void processMC_Electron_FwdMuon_PCM (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, FwdTracksMC const & o2fwdtracks, MFTTracksMC const & o2mfttracks, aod::V0PhotonsKF const & v0photons, aod::V0Legs const & v0legs, aod::EMPrimaryElectrons const & emprimaryelectrons, aod::EMPrimaryMuons const & emprimarymuons)
631683 {
632684 const uint8_t sysflag = kPCM | kElectron | kFwdMuon ;
633- skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, o2fwdtracks, v0photons, v0legs, emprimaryelectrons, emprimarymuons);
685+ skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, o2fwdtracks, o2mfttracks, v0photons, v0legs, emprimaryelectrons, emprimarymuons);
634686 }
635687
636688 void processMC_Electron_PCM (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, aod::V0PhotonsKF const & v0photons, aod::V0Legs const & v0legs, aod::EMPrimaryElectrons const & emprimaryelectrons)
637689 {
638690 const uint8_t sysflag = kPCM | kElectron ;
639- skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr , v0photons, v0legs, emprimaryelectrons, nullptr );
691+ skimmingMC<sysflag>(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr , nullptr , v0photons, v0legs, emprimaryelectrons, nullptr );
640692 }
641693
642694 void processMC_PCM (MyCollisionsMC const & collisions, aod::BCs const & bcs, aod::McCollisions const & mccollisions, aod::McParticles const & mcTracks, TracksMC const & o2tracks, aod::V0PhotonsKF const & v0photons, aod::V0Legs const & v0legs)
643695 {
644- skimmingMC<kPCM >(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr , v0photons, v0legs, nullptr , nullptr );
696+ skimmingMC<kPCM >(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr , nullptr , v0photons, v0legs, nullptr , nullptr );
645697 }
646698
647699 void processGenDummy (MyCollisionsMC const &)
0 commit comments