Skip to content

Commit 48719f9

Browse files
committed
PWGEM/Dilepton: support new data of global muons
1 parent b2d44f3 commit 48719f9

File tree

1 file changed

+81
-1
lines changed

1 file changed

+81
-1
lines changed

PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,14 +399,46 @@ struct skimmerPrimaryMuon {
399399
}
400400
}
401401

402-
SliceCache cache;
402+
// std::map<std::tuple<int, int, int>, float> mCandidates; // std::pair<globalIndex of global muon, globalIndex of matched MCH-MID, globalIndex of MFT> -> chi2MatchMCHMFT;
403+
std::vector<std::tuple<int, int, int>> vec_min_chi2MatchMCHMFT; // std::pair<globalIndex of global muon, globalIndex of matched MCH-MID, globalIndex of MFT> -> chi2MatchMCHMFT;
404+
template <typename TMuons>
405+
void findBestMatchPerMCHMID(TMuons const& muons)
406+
{
407+
vec_min_chi2MatchMCHMFT.reserve(muons.size());
408+
for (const auto& muon : muons) {
409+
if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
410+
const auto& muons_per_MCHMID = muons.sliceBy(fwdtracksPerMCHTrack, muon.globalIndex());
411+
// LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
412+
// LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
413+
414+
float min_chi2MatchMCHMFT = 1e+10;
415+
std::tuple<int, int, int> tupleIds_at_min;
416+
for (const auto& muon_tmp : muons_per_MCHMID) {
417+
if (muon_tmp.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
418+
// LOGF(info, "muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", muon_tmp.globalIndex(), muon_tmp.matchMCHTrackId(), muon_tmp.matchMFTTrackId(), muon_tmp.chi2MatchMCHMFT());
419+
if (0.f < muon_tmp.chi2MatchMCHMFT() && muon_tmp.chi2MatchMCHMFT() < min_chi2MatchMCHMFT) {
420+
min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT();
421+
tupleIds_at_min = std::make_tuple(muon_tmp.globalIndex(), muon_tmp.matchMCHTrackId(), muon_tmp.matchMFTTrackId());
422+
}
423+
}
424+
}
425+
vec_min_chi2MatchMCHMFT.emplace_back(tupleIds_at_min);
426+
// mCandidates[tupleIds_at_min] = min_chi2MatchMCHMFT;
427+
// LOGF(info, "min: muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", std::get<0>(tupleIds_at_min), std::get<1>(tupleIds_at_min), std::get<2>(tupleIds_at_min), min_chi2MatchMCHMFT);
428+
}
429+
} // end of muon loop
430+
}
403431

432+
SliceCache cache;
404433
Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
405434
Preslice<aod::FwdTrackAssoc> fwdtrackIndicesPerCollision = aod::track_association::collisionId;
406435
PresliceUnsorted<aod::FwdTrackAssoc> fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId;
436+
PresliceUnsorted<aod::FwdTracks> fwdtracksPerMCHTrack = aod::fwdtrack::matchMCHTrackId;
407437

408438
void processRec_SA(MyCollisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&)
409439
{
440+
findBestMatchPerMCHMID(fwdtracks);
441+
410442
for (const auto& collision : collisions) {
411443
const auto& bc = collision.template bc_as<aod::BCsWithTimestamps>();
412444
initCCDB(bc);
@@ -420,14 +452,24 @@ struct skimmerPrimaryMuon {
420452
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
421453
continue;
422454
}
455+
456+
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find(vec_min_chi2MatchMCHMFT.begin(), vec_min_chi2MatchMCHMFT.end(), std::make_tuple(fwdtrack.globalIndex(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId())) == vec_min_chi2MatchMCHMFT.end()) {
457+
continue;
458+
}
459+
423460
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false);
424461
} // end of fwdtrack loop
425462
} // end of collision loop
463+
464+
vec_min_chi2MatchMCHMFT.clear();
465+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
426466
}
427467
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA, "process reconstructed info", false);
428468

429469
void processRec_TTCA(MyCollisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices)
430470
{
471+
findBestMatchPerMCHMID(fwdtracks);
472+
431473
std::unordered_map<int64_t, bool> mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
432474
for (const auto& fwdtrack : fwdtracks) {
433475
const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex());
@@ -449,15 +491,23 @@ struct skimmerPrimaryMuon {
449491
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
450492
continue;
451493
}
494+
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find(vec_min_chi2MatchMCHMFT.begin(), vec_min_chi2MatchMCHMFT.end(), std::make_tuple(fwdtrack.globalIndex(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId())) == vec_min_chi2MatchMCHMFT.end()) {
495+
continue;
496+
}
497+
452498
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex()]);
453499
} // end of fwdtrack loop
454500
} // end of collision loop
455501
mapAmb.clear();
502+
vec_min_chi2MatchMCHMFT.clear();
503+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
456504
}
457505
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA, "process reconstructed info", false);
458506

459507
void processRec_SA_SWT(MyCollisionsWithSWT const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&)
460508
{
509+
findBestMatchPerMCHMID(fwdtracks);
510+
461511
for (const auto& collision : collisions) {
462512
const auto& bc = collision.template bc_as<aod::BCsWithTimestamps>();
463513
initCCDB(bc);
@@ -475,14 +525,22 @@ struct skimmerPrimaryMuon {
475525
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
476526
continue;
477527
}
528+
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find(vec_min_chi2MatchMCHMFT.begin(), vec_min_chi2MatchMCHMFT.end(), std::make_tuple(fwdtrack.globalIndex(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId())) == vec_min_chi2MatchMCHMFT.end()) {
529+
continue;
530+
}
531+
478532
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false);
479533
} // end of fwdtrack loop
480534
} // end of collision loop
535+
vec_min_chi2MatchMCHMFT.clear();
536+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
481537
}
482538
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA_SWT, "process reconstructed info only with standalone", false);
483539

484540
void processRec_TTCA_SWT(MyCollisionsWithSWT const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices)
485541
{
542+
findBestMatchPerMCHMID(fwdtracks);
543+
486544
std::unordered_map<int64_t, bool> mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
487545
for (const auto& fwdtrack : fwdtracks) {
488546
const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex());
@@ -506,15 +564,23 @@ struct skimmerPrimaryMuon {
506564
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
507565
continue;
508566
}
567+
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find(vec_min_chi2MatchMCHMFT.begin(), vec_min_chi2MatchMCHMFT.end(), std::make_tuple(fwdtrack.globalIndex(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId())) == vec_min_chi2MatchMCHMFT.end()) {
568+
continue;
569+
}
570+
509571
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex()]);
510572
} // end of fwdtrack loop
511573
} // end of collision loop
512574
mapAmb.clear();
575+
vec_min_chi2MatchMCHMFT.clear();
576+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
513577
}
514578
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA_SWT, "process reconstructed info", false);
515579

516580
void processMC_SA(soa::Join<MyCollisions, aod::McCollisionLabels> const& collisions, MyFwdTracksMC const& fwdtracks, MFTTracksMC const&, aod::BCsWithTimestamps const&)
517581
{
582+
findBestMatchPerMCHMID(fwdtracks);
583+
518584
for (const auto& collision : collisions) {
519585
const auto& bc = collision.template bc_as<aod::BCsWithTimestamps>();
520586
initCCDB(bc);
@@ -533,14 +599,22 @@ struct skimmerPrimaryMuon {
533599
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
534600
continue;
535601
}
602+
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find(vec_min_chi2MatchMCHMFT.begin(), vec_min_chi2MatchMCHMFT.end(), std::make_tuple(fwdtrack.globalIndex(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId())) == vec_min_chi2MatchMCHMFT.end()) {
603+
continue;
604+
}
605+
536606
fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, false);
537607
} // end of fwdtrack loop
538608
} // end of collision loop
609+
vec_min_chi2MatchMCHMFT.clear();
610+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
539611
}
540612
PROCESS_SWITCH(skimmerPrimaryMuon, processMC_SA, "process reconstructed and MC info", false);
541613

542614
void processMC_TTCA(soa::Join<MyCollisions, aod::McCollisionLabels> const& collisions, MyFwdTracksMC const& fwdtracks, MFTTracksMC const&, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices)
543615
{
616+
findBestMatchPerMCHMID(fwdtracks);
617+
544618
std::unordered_map<int64_t, bool> mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
545619
for (const auto& fwdtrack : fwdtracks) {
546620
const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex());
@@ -567,10 +641,16 @@ struct skimmerPrimaryMuon {
567641
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
568642
continue;
569643
}
644+
if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && std::find(vec_min_chi2MatchMCHMFT.begin(), vec_min_chi2MatchMCHMFT.end(), std::make_tuple(fwdtrack.globalIndex(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId())) == vec_min_chi2MatchMCHMFT.end()) {
645+
continue;
646+
}
647+
570648
fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex()]);
571649
} // end of fwdtrack loop
572650
} // end of collision loop
573651
mapAmb.clear();
652+
vec_min_chi2MatchMCHMFT.clear();
653+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
574654
}
575655
PROCESS_SWITCH(skimmerPrimaryMuon, processMC_TTCA, "process reconstructed and MC info", false);
576656

0 commit comments

Comments
 (0)