Skip to content

Commit d30a97f

Browse files
[PWGDQ] Adding new mixing process function for electron-muon analysis (#15754)
1 parent 0752b3d commit d30a97f

File tree

1 file changed

+121
-11
lines changed

1 file changed

+121
-11
lines changed

PWGDQ/Tasks/tableReader_withAssoc.cxx

Lines changed: 121 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,7 +1340,7 @@ struct AnalysisSameEventPairing {
13401340
bool fEnableMuonHistos;
13411341
bool fEnableMuonMixingHistos;
13421342
bool fEnableBarrelMuonHistos;
1343-
// bool fEnableBarrelMuonMixingHistos;
1343+
bool fEnableBarrelMuonMixingHistos;
13441344

13451345
NoBinningPolicy<aod::dqanalysisflags::MixingHash> hashBin;
13461346

@@ -1355,9 +1355,10 @@ struct AnalysisSameEventPairing {
13551355
fEnableMuonHistos = context.mOptions.get<bool>("processAllSkimmed") || context.mOptions.get<bool>("processMuonOnlySkimmed") || context.mOptions.get<bool>("processMuonOnlySkimmedMultExtra") || context.mOptions.get<bool>("processMuonOnlySkimmedFlow") || context.mOptions.get<bool>("processMixingMuonSkimmed");
13561356
fEnableMuonMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingMuonSkimmed");
13571357
fEnableBarrelMuonHistos = context.mOptions.get<bool>("processElectronMuonSkimmed");
1358+
fEnableBarrelMuonMixingHistos = context.mOptions.get<bool>("processMixingElectronMuonSkimmed");
13581359

13591360
if (context.mOptions.get<bool>("processDummy")) {
1360-
if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos || fEnableBarrelMuonHistos) {
1361+
if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos || fEnableBarrelMuonHistos || fEnableBarrelMuonMixingHistos) {
13611362
LOG(fatal) << "No other processing tasks should be enabled if the processDummy is enabled!!";
13621363
}
13631364
return;
@@ -1599,7 +1600,7 @@ struct AnalysisSameEventPairing {
15991600
VarManager::SetupMatLUTFwdDCAFitter(fLUT);
16001601
}
16011602

1602-
if (fEnableBarrelMuonHistos) {
1603+
if (fEnableBarrelMuonHistos || fEnableBarrelMuonMixingHistos) {
16031604
for (int iTrack = 0; iTrack < fNCutsBarrel; ++iTrack) {
16041605
TString trackCutName = fTrackCuts[iTrack];
16051606
if (objArrayTrackCuts->FindObject(trackCutName.Data()) == nullptr)
@@ -1618,12 +1619,12 @@ struct AnalysisSameEventPairing {
16181619
int index = iTrack * fNCutsMuon + iMuon;
16191620
fTrackMuonHistNames[index] = names;
16201621

1621-
// if (fEnableBarrelMuonMixingHistos) {
1622-
// names.push_back(Form("PairsBarrelMuonMEPM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1623-
// names.push_back(Form("PairsBarrelMuonMEPP_%s_%s", trackCutName.Data(), muonCutName.Data()));
1624-
// names.push_back(Form("PairsBarrelMuonMEMM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1625-
// histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data());
1626-
// }
1622+
if (fEnableBarrelMuonMixingHistos) {
1623+
names.push_back(Form("PairsEleMuMEPM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1624+
names.push_back(Form("PairsEleMuMEPP_%s_%s", trackCutName.Data(), muonCutName.Data()));
1625+
names.push_back(Form("PairsEleMuMEMM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1626+
histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data());
1627+
}
16271628

16281629
TString cutNamesStr = fConfigCuts.pair.value;
16291630
if (!cutNamesStr.IsNull()) {
@@ -1635,6 +1636,12 @@ struct AnalysisSameEventPairing {
16351636
Form("PairsEleMuSEPP_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName()),
16361637
Form("PairsEleMuSEMM_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName())};
16371638
histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1639+
if (fEnableBarrelMuonMixingHistos) {
1640+
names.push_back(Form("PairsEleMuMEPM_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName()));
1641+
names.push_back(Form("PairsEleMuMEPP_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName()));
1642+
names.push_back(Form("PairsEleMuMEMM_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName()));
1643+
histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data());
1644+
}
16381645
index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
16391646
fTrackMuonHistNames[index] = names;
16401647
}
@@ -1651,10 +1658,10 @@ struct AnalysisSameEventPairing {
16511658
DefineHistograms(fHistMan, histNames.Data(), fConfigAddSEPHistogram.value.data()); // define all histograms
16521659
if (fEnableBarrelHistos) {
16531660
DefineHistograms(fHistMan, "PairingSEQA", "sameevent-pairing"); // histograms for QA of the pairing
1654-
};
1661+
}
16551662
if (fEnableBarrelMixingHistos) {
16561663
DefineHistograms(fHistMan, "PairingMEQA", "mixedevent-pairing"); // histograms for QA of the pairing
1657-
};
1664+
}
16581665
dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON
16591666
VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill
16601667
fOutputList.setObject(fHistMan->GetMainHistogramList());
@@ -2432,6 +2439,101 @@ struct AnalysisSameEventPairing {
24322439
} // end event loop
24332440
}
24342441

2442+
template <uint32_t TEventFillMap, typename TAssoc1, typename TAssoc2, typename TTracks1, typename TTracks2>
2443+
void runEmuMixedPairing(TAssoc1 const& assocs1, TAssoc2 const& assocs2, TTracks1 const& /*tracks1*/, TTracks2 const& /*tracks2*/)
2444+
{
2445+
const auto& histNames = fTrackMuonHistNames;
2446+
int sign1 = 0;
2447+
int sign2 = 0;
2448+
int nPairCuts = (fPairCuts.size() > 0) ? fPairCuts.size() : 1;
2449+
constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0);
2450+
constexpr bool eventHasQvectorCentr = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0);
2451+
2452+
for (auto& a1 : assocs1) {
2453+
if (!(a1.isBarrelSelected_raw() & fTrackFilterMask)) {
2454+
continue;
2455+
}
2456+
for (auto& a2 : assocs2) {
2457+
if (!(a2.isMuonSelected_raw() & fMuonFilterMask)) {
2458+
continue;
2459+
}
2460+
2461+
auto t1 = a1.template reducedtrack_as<TTracks1>();
2462+
auto t2 = a2.template reducedmuon_as<TTracks2>();
2463+
sign1 = t1.sign();
2464+
sign2 = t2.sign();
2465+
2466+
VarManager::FillPairME<TEventFillMap, VarManager::kElectronMuon>(t1, t2);
2467+
if constexpr (eventHasQvector) {
2468+
VarManager::FillPairVn<VarManager::kElectronMuon>(t1, t2);
2469+
}
2470+
if constexpr (eventHasQvectorCentr) {
2471+
VarManager::FillPairVn<TEventFillMap, VarManager::kElectronMuon>(t1, t2);
2472+
}
2473+
2474+
for (int iTrack = 0; iTrack < fNCutsBarrel; ++iTrack) {
2475+
if (!(a1.isBarrelSelected_raw() & (1u << iTrack))) {
2476+
continue;
2477+
}
2478+
for (int iMuon = 0; iMuon < fNCutsMuon; ++iMuon) {
2479+
if (!(a2.isMuonSelected_raw() & (1u << iMuon))) {
2480+
continue;
2481+
}
2482+
for (int iPairCut = 0; iPairCut < nPairCuts; ++iPairCut) {
2483+
if (!fPairCuts.empty()) {
2484+
AnalysisCompositeCut cut = fPairCuts.at(iPairCut);
2485+
if (!cut.IsSelected(VarManager::fgValues)) {
2486+
continue;
2487+
}
2488+
}
2489+
int index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
2490+
auto itHist = histNames.find(index);
2491+
if (itHist == histNames.end() || itHist->second.size() < 6) {
2492+
continue;
2493+
}
2494+
if (sign1 * sign2 < 0) {
2495+
fHistMan->FillHistClass(itHist->second[3].Data(), VarManager::fgValues);
2496+
} else {
2497+
if (sign1 > 0) {
2498+
fHistMan->FillHistClass(itHist->second[4].Data(), VarManager::fgValues);
2499+
} else {
2500+
fHistMan->FillHistClass(itHist->second[5].Data(), VarManager::fgValues);
2501+
}
2502+
}
2503+
} // end pair cut loop
2504+
} // end muon cut loop
2505+
} // end barrel cut loop
2506+
}
2507+
}
2508+
}
2509+
2510+
template <uint32_t TEventFillMap, typename TEvents, typename TTrackAssocs, typename TTracks, typename TMuonAssocs, typename TMuons>
2511+
void runEmuSameSideMixing(TEvents& events, Preslice<TTrackAssocs>& preslice1, TTrackAssocs const& assocs1, TTracks const& tracks1,
2512+
Preslice<TMuonAssocs>& preslice2, TMuonAssocs const& assocs2, TMuons const& tracks2)
2513+
{
2514+
events.bindExternalIndices(&assocs1);
2515+
events.bindExternalIndices(&assocs2);
2516+
int mixingDepth = fConfigMixingDepth.value;
2517+
for (auto& [event1, event2] : selfCombinations(hashBin, mixingDepth, -1, events, events)) {
2518+
VarManager::ResetValues(0, VarManager::kNVars);
2519+
VarManager::FillEvent<TEventFillMap>(event1, VarManager::fgValues);
2520+
2521+
auto groupedAssocs1 = assocs1.sliceBy(preslice1, event1.globalIndex());
2522+
groupedAssocs1.bindExternalIndices(&events);
2523+
if (groupedAssocs1.size() == 0) {
2524+
continue;
2525+
}
2526+
2527+
auto groupedAssocs2 = assocs2.sliceBy(preslice2, event2.globalIndex());
2528+
groupedAssocs2.bindExternalIndices(&events);
2529+
if (groupedAssocs2.size() == 0) {
2530+
continue;
2531+
}
2532+
2533+
runEmuMixedPairing<TEventFillMap>(groupedAssocs1, groupedAssocs2, tracks1, tracks2);
2534+
} // end event loop
2535+
}
2536+
24352537
void processAllSkimmed(MyEventsVtxCovSelected const& events,
24362538
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const& barrelTracks,
24372539
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
@@ -2546,6 +2648,13 @@ struct AnalysisSameEventPairing {
25462648
runSameSideMixing<pairTypeMuMu, gkEventFillMapWithMultExtraWithQVector>(events, muonAssocs, muons, muonAssocsPerCollision);
25472649
}
25482650

2651+
void processMixingElectronMuonSkimmed(soa::Filtered<MyEventsHashSelected>& events,
2652+
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts> const& barrelAssocs, aod::ReducedTracks const& barrelTracks,
2653+
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
2654+
{
2655+
runEmuSameSideMixing<gkEventFillMap>(events, trackEmuAssocsPerCollision, barrelAssocs, barrelTracks, muonAssocsPerCollision, muonAssocs, muons);
2656+
}
2657+
25492658
void processDummy(MyEventsBasic&)
25502659
{
25512660
// do nothing
@@ -2568,6 +2677,7 @@ struct AnalysisSameEventPairing {
25682677
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelWithQvectorCentrSkimmedNoCov, "Run barrel type mixing pairing, with skimmed tracks and with Qvector from central framework", false);
25692678
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingMuonSkimmed, "Run muon type mixing pairing, with skimmed muons", false);
25702679
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingMuonSkimmedFlow, "Run muon type mixing pairing, with skimmed muons and flow", false);
2680+
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingElectronMuonSkimmed, "Run electron-muon mixing pairing, with skimmed tracks/muons", false);
25712681
PROCESS_SWITCH(AnalysisSameEventPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", true);
25722682
};
25732683

0 commit comments

Comments
 (0)