Skip to content

Commit fb3c7fd

Browse files
authored
[PWGEM/Dilepton] support new data of global muons (#12297)
1 parent f061710 commit fb3c7fd

File tree

1 file changed

+82
-1
lines changed

1 file changed

+82
-1
lines changed

PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
#include <map>
4040
#include <string>
41+
#include <tuple>
4142
#include <unordered_map>
4243
#include <utility>
4344
#include <vector>
@@ -399,14 +400,46 @@ struct skimmerPrimaryMuon {
399400
}
400401
}
401402

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

433+
SliceCache cache;
404434
Preslice<aod::FwdTracks> perCollision = o2::aod::fwdtrack::collisionId;
405435
Preslice<aod::FwdTrackAssoc> fwdtrackIndicesPerCollision = aod::track_association::collisionId;
406436
PresliceUnsorted<aod::FwdTrackAssoc> fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId;
437+
PresliceUnsorted<aod::FwdTracks> fwdtracksPerMCHTrack = aod::fwdtrack::matchMCHTrackId;
407438

408439
void processRec_SA(MyCollisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&)
409440
{
441+
findBestMatchPerMCHMID(fwdtracks);
442+
410443
for (const auto& collision : collisions) {
411444
const auto& bc = collision.template bc_as<aod::BCsWithTimestamps>();
412445
initCCDB(bc);
@@ -420,14 +453,24 @@ struct skimmerPrimaryMuon {
420453
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
421454
continue;
422455
}
456+
457+
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()) {
458+
continue;
459+
}
460+
423461
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false);
424462
} // end of fwdtrack loop
425463
} // end of collision loop
464+
465+
vec_min_chi2MatchMCHMFT.clear();
466+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
426467
}
427468
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA, "process reconstructed info", false);
428469

429470
void processRec_TTCA(MyCollisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices)
430471
{
472+
findBestMatchPerMCHMID(fwdtracks);
473+
431474
std::unordered_map<int64_t, bool> mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
432475
for (const auto& fwdtrack : fwdtracks) {
433476
const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex());
@@ -449,15 +492,23 @@ struct skimmerPrimaryMuon {
449492
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
450493
continue;
451494
}
495+
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()) {
496+
continue;
497+
}
498+
452499
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex()]);
453500
} // end of fwdtrack loop
454501
} // end of collision loop
455502
mapAmb.clear();
503+
vec_min_chi2MatchMCHMFT.clear();
504+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
456505
}
457506
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA, "process reconstructed info", false);
458507

459508
void processRec_SA_SWT(MyCollisionsWithSWT const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&)
460509
{
510+
findBestMatchPerMCHMID(fwdtracks);
511+
461512
for (const auto& collision : collisions) {
462513
const auto& bc = collision.template bc_as<aod::BCsWithTimestamps>();
463514
initCCDB(bc);
@@ -475,14 +526,22 @@ struct skimmerPrimaryMuon {
475526
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
476527
continue;
477528
}
529+
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()) {
530+
continue;
531+
}
532+
478533
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, false);
479534
} // end of fwdtrack loop
480535
} // end of collision loop
536+
vec_min_chi2MatchMCHMFT.clear();
537+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
481538
}
482539
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA_SWT, "process reconstructed info only with standalone", false);
483540

484541
void processRec_TTCA_SWT(MyCollisionsWithSWT const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const&, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices)
485542
{
543+
findBestMatchPerMCHMID(fwdtracks);
544+
486545
std::unordered_map<int64_t, bool> mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
487546
for (const auto& fwdtrack : fwdtracks) {
488547
const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex());
@@ -506,15 +565,23 @@ struct skimmerPrimaryMuon {
506565
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
507566
continue;
508567
}
568+
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()) {
569+
continue;
570+
}
571+
509572
fillFwdTrackTable<MyFwdTracks, aod::MFTTracks>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex()]);
510573
} // end of fwdtrack loop
511574
} // end of collision loop
512575
mapAmb.clear();
576+
vec_min_chi2MatchMCHMFT.clear();
577+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
513578
}
514579
PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA_SWT, "process reconstructed info", false);
515580

516581
void processMC_SA(soa::Join<MyCollisions, aod::McCollisionLabels> const& collisions, MyFwdTracksMC const& fwdtracks, MFTTracksMC const&, aod::BCsWithTimestamps const&)
517582
{
583+
findBestMatchPerMCHMID(fwdtracks);
584+
518585
for (const auto& collision : collisions) {
519586
const auto& bc = collision.template bc_as<aod::BCsWithTimestamps>();
520587
initCCDB(bc);
@@ -533,14 +600,22 @@ struct skimmerPrimaryMuon {
533600
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
534601
continue;
535602
}
603+
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()) {
604+
continue;
605+
}
606+
536607
fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, false);
537608
} // end of fwdtrack loop
538609
} // end of collision loop
610+
vec_min_chi2MatchMCHMFT.clear();
611+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
539612
}
540613
PROCESS_SWITCH(skimmerPrimaryMuon, processMC_SA, "process reconstructed and MC info", false);
541614

542615
void processMC_TTCA(soa::Join<MyCollisions, aod::McCollisionLabels> const& collisions, MyFwdTracksMC const& fwdtracks, MFTTracksMC const&, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices)
543616
{
617+
findBestMatchPerMCHMID(fwdtracks);
618+
544619
std::unordered_map<int64_t, bool> mapAmb; // fwdtrack.globalIndex() -> bool isAmb;
545620
for (const auto& fwdtrack : fwdtracks) {
546621
const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex());
@@ -567,10 +642,16 @@ struct skimmerPrimaryMuon {
567642
if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
568643
continue;
569644
}
645+
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()) {
646+
continue;
647+
}
648+
570649
fillFwdTrackTable<MyFwdTracksMC, MFTTracksMC>(collision, fwdtrack, mapAmb[fwdtrack.globalIndex()]);
571650
} // end of fwdtrack loop
572651
} // end of collision loop
573652
mapAmb.clear();
653+
vec_min_chi2MatchMCHMFT.clear();
654+
vec_min_chi2MatchMCHMFT.shrink_to_fit();
574655
}
575656
PROCESS_SWITCH(skimmerPrimaryMuon, processMC_TTCA, "process reconstructed and MC info", false);
576657

0 commit comments

Comments
 (0)