Skip to content

Commit 16501db

Browse files
mcoquet642alibuild
andauthored
[PWGDQ] MC analysis for MFT and dimuons (AliceO2Group#9425)
Co-authored-by: ALICE Action Bot <[email protected]>
1 parent ac3ee08 commit 16501db

File tree

2 files changed

+88
-17
lines changed

2 files changed

+88
-17
lines changed

PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx

Lines changed: 81 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <string>
2222
#include <memory>
2323
#include <vector>
24+
#include <utility>
25+
#include <unordered_map>
2426
#include "TList.h"
2527
#include "Framework/AnalysisTask.h"
2628
#include "Framework/AnalysisDataModel.h"
@@ -86,6 +88,7 @@ using MyEvents = soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels>
8688
using MyEventsWithMults = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::MultsExtra, aod::McCollisionLabels>;
8789
using MyEventsWithCent = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs, aod::McCollisionLabels>;
8890
using MyEventsWithCentAndMults = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs, aod::Mults, aod::MultsExtra, aod::McCollisionLabels>;
91+
using MFTTrackLabeled = soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels>;
8992

9093
// Declare bit maps containing information on the table joins content (used as argument in templated functions)
9194
// constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision;
@@ -133,6 +136,7 @@ struct TableMakerMC {
133136
Produces<ReducedMFTs> mftTrack;
134137
Produces<ReducedMFTsExtra> mftTrackExtra;
135138
Produces<ReducedMFTAssoc> mftAssoc;
139+
Produces<ReducedMFTLabels> mftLabels;
136140

137141
OutputObj<THashList> fOutputList{"output"};
138142
OutputObj<TList> fStatsList{"Statistics"}; //! skimming statistics
@@ -183,6 +187,7 @@ struct TableMakerMC {
183187
// Muon related options
184188
Configurable<bool> fPropMuon{"cfgPropMuon", true, "Propagate muon tracks through absorber (do not use if applying pairing)"};
185189
Configurable<bool> fRefitGlobalMuon{"cfgRefitGlobalMuon", true, "Correct global muon parameters"};
190+
Configurable<bool> fKeepBestMatch{"cfgKeepBestMatch", false, "Keep only the best match global muons in the skimming"};
186191
Configurable<float> fMuonMatchEtaMin{"cfgMuonMatchEtaMin", -4.0f, "Definition of the acceptance of muon tracks to be matched with MFT"};
187192
Configurable<float> fMuonMatchEtaMax{"cfgMuonMatchEtaMax", -2.5f, "Definition of the acceptance of muon tracks to be matched with MFT"};
188193
} fConfigVariousOptions;
@@ -212,6 +217,8 @@ struct TableMakerMC {
212217
std::map<uint32_t, uint8_t> fFwdTrackFilterMap; // key: fwd-track global index, value: fwd-track filter map
213218
std::map<uint32_t, uint32_t> fMftIndexMap; // key: MFT tracklet global index, value: new MFT tracklet global index
214219

220+
std::map<uint32_t, bool> fBestMatch;
221+
215222
void init(o2::framework::InitContext& context)
216223
{
217224
// Check whether barrel or muon are enabled
@@ -691,13 +698,16 @@ struct TableMakerMC {
691698
} // end loop over associations
692699
} // end skimTracks
693700

694-
template <uint32_t TMFTFillMap, typename TEvent>
695-
void skimMFT(TEvent const& collision, MFTTracks const& /*mfts*/, MFTTrackAssoc const& mftAssocs)
701+
template <uint32_t TMFTFillMap, typename TEvent, typename TMFTTracks>
702+
void skimMFT(TEvent const& collision, TMFTTracks const& /*mfts*/, MFTTrackAssoc const& mftAssocs, aod::McParticles const& mcTracks)
696703
{
697704
// Skim MFT tracks
698705
// So far no cuts are applied here
706+
uint16_t mcflags = static_cast<uint16_t>(0);
707+
int trackCounter = fLabelsMap.size();
708+
699709
for (const auto& assoc : mftAssocs) {
700-
auto track = assoc.template mfttrack_as<MFTTracks>();
710+
auto track = assoc.template mfttrack_as<TMFTTracks>();
701711

702712
if (fConfigHistOutput.fConfigQA) {
703713
VarManager::FillTrack<TMFTFillMap>(track);
@@ -712,11 +722,63 @@ struct TableMakerMC {
712722
mftTrackExtra(track.mftClusterSizesAndTrackFlags(), track.sign(), 0.0, 0.0, track.nClusters());
713723

714724
fMftIndexMap[track.globalIndex()] = mftTrack.lastIndex();
725+
if (!track.has_mcParticle()) {
726+
mftLabels(-1, 0, 0); // this is the case when there is no matched MCParticle
727+
} else {
728+
auto mctrack = track.template mcParticle_as<aod::McParticles>();
729+
VarManager::FillTrackMC(mcTracks, mctrack);
730+
731+
mcflags = 0;
732+
int i = 0; // runs over the MC signals
733+
// check all the specified signals and fill histograms for MC truth matched tracks
734+
for (auto& sig : fMCSignals) {
735+
if (sig.CheckSignal(true, mctrack)) {
736+
mcflags |= (static_cast<uint16_t>(1) << i);
737+
// If detailed QA is on, fill histograms for each MC signal and track cut combination
738+
if (fDoDetailedQA) {
739+
fHistMan->FillHistClass(Form("MFTTrack_%s", sig.GetName()), VarManager::fgValues); // fill the reconstructed truth
740+
}
741+
}
742+
i++;
743+
}
744+
745+
// if the MC truth particle corresponding to this reconstructed track is not already written,
746+
// add it to the skimmed stack
747+
if (!(fLabelsMap.find(mctrack.globalIndex()) != fLabelsMap.end())) {
748+
fLabelsMap[mctrack.globalIndex()] = trackCounter;
749+
fLabelsMapReversed[trackCounter] = mctrack.globalIndex();
750+
fMCFlags[mctrack.globalIndex()] = mcflags;
751+
trackCounter++;
752+
}
753+
mftLabels(fLabelsMap.find(mctrack.globalIndex())->second, track.mcMask(), mcflags);
754+
}
715755
}
716756
mftAssoc(fCollIndexMap[collision.globalIndex()], fMftIndexMap[track.globalIndex()]);
717757
}
718758
}
719759

760+
template <typename TMuons>
761+
void skimBestMuonMatches(TMuons const& muons)
762+
{
763+
std::unordered_map<int, std::pair<float, int>> mCandidates;
764+
for (const auto& muon : muons) {
765+
if (static_cast<int>(muon.trackType()) < 2) {
766+
auto muonID = muon.matchMCHTrackId();
767+
auto chi2 = muon.chi2MatchMCHMFT();
768+
if (mCandidates.find(muonID) == mCandidates.end()) {
769+
mCandidates[muonID] = {chi2, muon.globalIndex()};
770+
} else {
771+
if (chi2 < mCandidates[muonID].first) {
772+
mCandidates[muonID] = {chi2, muon.globalIndex()};
773+
}
774+
}
775+
}
776+
}
777+
for (auto& pairCand : mCandidates) {
778+
fBestMatch[pairCand.second.second] = true;
779+
}
780+
}
781+
720782
template <uint32_t TMuonFillMap, uint32_t TMFTFillMap, typename TEvent, typename TMuons, typename TMFTTracks>
721783
void skimMuons(TEvent const& collision, TMuons const& muons, FwdTrackAssoc const& muonAssocs, aod::McParticles const& mcTracks, TMFTTracks const& /*mftTracks*/)
722784
{
@@ -735,6 +797,11 @@ struct TableMakerMC {
735797
for (const auto& assoc : muonAssocs) {
736798
// get the muon
737799
auto muon = assoc.template fwdtrack_as<TMuons>();
800+
if (fConfigVariousOptions.fKeepBestMatch && static_cast<int>(muon.trackType()) < 2) {
801+
if (fBestMatch.find(muon.globalIndex()) == fBestMatch.end()) {
802+
continue;
803+
}
804+
}
738805

739806
trackFilteringTag = uint8_t(0);
740807
trackTempFilterMap = uint8_t(0);
@@ -750,7 +817,7 @@ struct TableMakerMC {
750817
if (muontrack.eta() < fConfigVariousOptions.fMuonMatchEtaMin || muontrack.eta() > fConfigVariousOptions.fMuonMatchEtaMax) {
751818
continue;
752819
}
753-
auto mfttrack = muon.template matchMFTTrack_as<MFTTracks>();
820+
auto mfttrack = muon.template matchMFTTrack_as<TMFTTracks>();
754821
VarManager::FillTrackCollision<TMuonFillMap>(muontrack, collision);
755822
VarManager::FillGlobalMuonRefit<TMuonFillMap>(muontrack, mfttrack, collision);
756823
} else {
@@ -862,7 +929,7 @@ struct TableMakerMC {
862929
// recalculte pDca and global muon kinematics
863930
if (static_cast<int>(muon.trackType()) < 2 && fConfigVariousOptions.fRefitGlobalMuon) {
864931
auto muontrack = muon.template matchMCHTrack_as<TMuons>();
865-
auto mfttrack = muon.template matchMFTTrack_as<MFTTracks>();
932+
auto mfttrack = muon.template matchMFTTrack_as<TMFTTracks>();
866933
VarManager::FillTrackCollision<TMuonFillMap>(muontrack, collision);
867934
VarManager::FillGlobalMuonRefit<TMuonFillMap>(muontrack, mfttrack, collision);
868935
} else {
@@ -956,6 +1023,7 @@ struct TableMakerMC {
9561023
mftTrack.reserve(mftTracks.size());
9571024
mftTrackExtra.reserve(mftTracks.size());
9581025
mftAssoc.reserve(mftTracks.size());
1026+
mftLabels.reserve(mftTracks.size());
9591027
}
9601028

9611029
// Clear index map and reserve memory for muon tables
@@ -980,11 +1048,14 @@ struct TableMakerMC {
9801048
}
9811049
if constexpr (static_cast<bool>(TMFTFillMap)) {
9821050
auto groupedMFTIndices = mftAssocs.sliceBy(mfttrackIndicesPerCollision, origIdx);
983-
skimMFT<TMFTFillMap>(collision, mftTracks, groupedMFTIndices);
1051+
skimMFT<TMFTFillMap>(collision, mftTracks, groupedMFTIndices, mcParticles);
9841052
}
9851053
if constexpr (static_cast<bool>(TMuonFillMap)) {
9861054
if constexpr (static_cast<bool>(TMFTFillMap)) {
9871055
auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx);
1056+
if (fConfigVariousOptions.fKeepBestMatch) {
1057+
skimBestMuonMatches(muons);
1058+
}
9881059
skimMuons<TMuonFillMap, TMFTFillMap>(collision, muons, groupedMuonIndices, mcParticles, mftTracks);
9891060
} else {
9901061
auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx);
@@ -1133,7 +1204,7 @@ struct TableMakerMC {
11331204
}
11341205

11351206
void processPP(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs,
1136-
MyBarrelTracksWithCov const& tracksBarrel, MyMuonsWithCov const& tracksMuon, aod::MFTTracks const& mftTracks,
1207+
MyBarrelTracksWithCov const& tracksBarrel, MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks,
11371208
aod::TrackAssoc const& trackAssocs, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs,
11381209
aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles)
11391210
{
@@ -1148,15 +1219,15 @@ struct TableMakerMC {
11481219
}
11491220

11501221
void processPPMuonOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs,
1151-
MyMuonsWithCov const& tracksMuon, aod::MFTTracks const& mftTracks,
1222+
MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks,
11521223
aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs,
11531224
aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles)
11541225
{
11551226
fullSkimming<gkEventFillMapWithMults, 0u, gkMuonFillMapWithCov, gkMFTFillMap>(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles);
11561227
}
11571228

11581229
void processPbPb(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs,
1159-
MyBarrelTracksWithCov const& tracksBarrel, MyMuonsWithCov const& tracksMuon, aod::MFTTracks const& mftTracks,
1230+
MyBarrelTracksWithCov const& tracksBarrel, MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks,
11601231
aod::TrackAssoc const& trackAssocs, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs,
11611232
aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles)
11621233
{
@@ -1171,7 +1242,7 @@ struct TableMakerMC {
11711242
}
11721243

11731244
void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs,
1174-
MyMuonsWithCov const& tracksMuon, aod::MFTTracks const& mftTracks,
1245+
MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks,
11751246
aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs,
11761247
aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles)
11771248
{

PWGDQ/Tasks/dqEfficiency_withAssoc.cxx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,10 +1648,10 @@ struct AnalysisSameEventPairing {
16481648

16491649
if constexpr (TTwoProngFitter) {
16501650
dimuonsExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauz], VarManager::fgValues[VarManager::kVertexingLz], VarManager::fgValues[VarManager::kVertexingLxy]);
1651-
if (fConfigOptions.flatTables.value) {
1651+
if (fConfigOptions.flatTables.value && t1.has_reducedMCTrack() && t2.has_reducedMCTrack()) {
16521652
dimuonAllList(event.posX(), event.posY(), event.posZ(), event.numContrib(),
16531653
event.selection_raw(), evSel,
1654-
-999., -999., -999.,
1654+
event.reducedMCevent().mcPosX(), event.reducedMCevent().mcPosY(), event.reducedMCevent().mcPosZ(),
16551655
VarManager::fgValues[VarManager::kMass],
16561656
mcDecision,
16571657
VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], t1.sign() + t2.sign(), VarManager::fgValues[VarManager::kVertexingChi2PCA],
@@ -1661,14 +1661,14 @@ struct AnalysisSameEventPairing {
16611661
VarManager::fgValues[VarManager::kPt1], VarManager::fgValues[VarManager::kEta1], VarManager::fgValues[VarManager::kPhi1], t1.sign(),
16621662
VarManager::fgValues[VarManager::kPt2], VarManager::fgValues[VarManager::kEta2], VarManager::fgValues[VarManager::kPhi2], t2.sign(),
16631663
t1.fwdDcaX(), t1.fwdDcaY(), t2.fwdDcaX(), t2.fwdDcaY(),
1664-
0., 0.,
1664+
t1.mcMask(), t2.mcMask(),
16651665
t1.chi2MatchMCHMID(), t2.chi2MatchMCHMID(),
16661666
t1.chi2MatchMCHMFT(), t2.chi2MatchMCHMFT(),
16671667
t1.chi2(), t2.chi2(),
1668-
-999., -999., -999., -999.,
1669-
-999., -999., -999., -999.,
1670-
-999., -999., -999., -999.,
1671-
-999., -999., -999., -999.,
1668+
t1.reducedMCTrack().pt(), t1.reducedMCTrack().eta(), t1.reducedMCTrack().phi(), t1.reducedMCTrack().e(),
1669+
t2.reducedMCTrack().pt(), t2.reducedMCTrack().eta(), t2.reducedMCTrack().phi(), t2.reducedMCTrack().e(),
1670+
t1.reducedMCTrack().vx(), t1.reducedMCTrack().vy(), t1.reducedMCTrack().vz(), t1.reducedMCTrack().vt(),
1671+
t2.reducedMCTrack().vx(), t2.reducedMCTrack().vy(), t2.reducedMCTrack().vz(), t2.reducedMCTrack().vt(),
16721672
(twoTrackFilter & (static_cast<uint32_t>(1) << 28)) || (twoTrackFilter & (static_cast<uint32_t>(1) << 30)), (twoTrackFilter & (static_cast<uint32_t>(1) << 29)) || (twoTrackFilter & (static_cast<uint32_t>(1) << 31)),
16731673
-999.0, -999.0, -999.0, -999.0, -999.0,
16741674
-999.0, -999.0, -999.0, -999.0, -999.0,

0 commit comments

Comments
 (0)