Skip to content

Commit 1bbf578

Browse files
add processElectronMuonSkimmed
1 parent 8218812 commit 1bbf578

File tree

2 files changed

+171
-33
lines changed

2 files changed

+171
-33
lines changed

PWGDQ/DataModel/ReducedInfoTables.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,17 @@ DECLARE_SOA_TABLE(Dimuons, "AOD", "RTDIMUON", //!
830830
reducedpair::Rap<reducedpair::Pt, reducedpair::Eta, reducedpair::Mass>,
831831
reducedpair::Y<reducedpair::Pt, reducedpair::Eta, reducedpair::Mass>);
832832

833+
DECLARE_SOA_TABLE(ElectronMuons, "AOD", "RTELECTRONMUON", //!
834+
o2::soa::Index<>, reducedpair::ReducedEventId,
835+
reducedpair::Mass, reducedpair::Pt, reducedpair::Eta, reducedpair::Phi, reducedpair::Sign,
836+
reducedpair::FilterMap, reducedpair::McDecision,
837+
reducedpair::Px<reducedpair::Pt, reducedpair::Phi>,
838+
reducedpair::Py<reducedpair::Pt, reducedpair::Phi>,
839+
reducedpair::Pz<reducedpair::Pt, reducedpair::Eta>,
840+
reducedpair::P<reducedpair::Pt, reducedpair::Eta>,
841+
reducedpair::Rap<reducedpair::Pt, reducedpair::Eta, reducedpair::Mass>,
842+
reducedpair::Y<reducedpair::Pt, reducedpair::Eta, reducedpair::Mass>);
843+
833844
DECLARE_SOA_TABLE(DielectronsExtra, "AOD", "RTDIELEEXTRA", //!
834845
reducedpair::Index0Id, reducedpair::Index1Id,
835846
reducedpair::Tauz,

PWGDQ/Tasks/tableReader_withAssoc.cxx

Lines changed: 160 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,7 @@ struct AnalysisSameEventPairing {
12251225

12261226
Produces<aod::Dielectrons> dielectronList;
12271227
Produces<aod::Dimuons> dimuonList;
1228+
Produces<aod::ElectronMuons> electronmuonList;
12281229
Produces<aod::DielectronsExtra> dielectronsExtraList;
12291230
Produces<aod::DielectronsInfo> dielectronInfoList;
12301231
Produces<aod::DimuonsExtra> dimuonsExtraList;
@@ -1303,6 +1304,7 @@ struct AnalysisSameEventPairing {
13031304
std::map<int, std::vector<TString>> fTrackMuonHistNames;
13041305
std::vector<AnalysisCompositeCut> fPairCuts;
13051306
std::vector<TString> fTrackCuts;
1307+
std::vector<TString> fMuonCuts;
13061308
std::map<std::pair<uint32_t, uint32_t>, uint32_t> fAmbiguousPairs;
13071309

13081310
uint32_t fTrackFilterMask; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream
@@ -1315,6 +1317,8 @@ struct AnalysisSameEventPairing {
13151317
bool fEnableBarrelHistos;
13161318
bool fEnableMuonHistos;
13171319
bool fEnableMuonMixingHistos;
1320+
bool fEnableBarrelMuonHistos;
1321+
// bool fEnableBarrelMuonMixingHistos;
13181322

13191323
NoBinningPolicy<aod::dqanalysisflags::MixingHash> hashBin;
13201324

@@ -1327,9 +1331,10 @@ struct AnalysisSameEventPairing {
13271331
fEnableBarrelMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmed") || context.mOptions.get<bool>("processMixingBarrelSkimmedFlow") || context.mOptions.get<bool>("processMixingBarrelWithQvectorCentrSkimmedNoCov");
13281332
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");
13291333
fEnableMuonMixingHistos = context.mOptions.get<bool>("processMixingAllSkimmed") || context.mOptions.get<bool>("processMixingMuonSkimmed");
1334+
fEnableBarrelMuonHistos = context.mOptions.get<bool>("processElectronMuonSkimmed");
13301335

13311336
if (context.mOptions.get<bool>("processDummy")) {
1332-
if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos) {
1337+
if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos || fEnableBarrelMuonHistos) {
13331338
LOG(fatal) << "No other processing tasks should be enabled if the processDummy is enabled!!";
13341339
}
13351340
return;
@@ -1340,6 +1345,7 @@ struct AnalysisSameEventPairing {
13401345
TString histNames = "";
13411346
std::vector<TString> names;
13421347
fTrackCuts.clear();
1348+
fMuonCuts.clear();
13431349

13441350
// NOTE: Pair cuts are only applied on the histogram output. The produced pair tables do not have these cuts applied
13451351
TString cutNamesStr = fConfigCuts.pair.value;
@@ -1487,6 +1493,7 @@ struct AnalysisSameEventPairing {
14871493
fNCutsMuon = objArray->GetEntries();
14881494
for (int icut = 0; icut < objArray->GetEntries(); ++icut) {
14891495
TString tempStr = objArray->At(icut)->GetName();
1496+
fMuonCuts.push_back(tempStr);
14901497
if (objArrayMuonCuts->FindObject(tempStr.Data()) != nullptr) {
14911498
fMuonFilterMask |= (static_cast<uint32_t>(1) << icut);
14921499

@@ -1569,38 +1576,47 @@ struct AnalysisSameEventPairing {
15691576
VarManager::SetupMatLUTFwdDCAFitter(fLUT);
15701577
}
15711578

1572-
/*if (context.mOptions.get<bool>("processElectronMuonSkimmed") || context.mOptions.get<bool>("processAllSkimmed")) {
1573-
TString cutNamesBarrel = fConfigCuts.track.value;
1574-
TString cutNamesMuon = fConfigCuts.muon.value;
1575-
if (!cutNamesBarrel.IsNull() && !cutNamesMuon.IsNull()) {
1576-
std::unique_ptr<TObjArray> objArrayBarrel(cutNamesBarrel.Tokenize(","));
1577-
std::unique_ptr<TObjArray> objArrayMuon(cutNamesMuon.Tokenize(","));
1578-
if (objArrayBarrel->GetEntries() == objArrayMuon->GetEntries()) { // one must specify equal number of barrel and muon cuts
1579-
for (int icut = 0; icut < objArrayBarrel->GetEntries(); ++icut) { // loop over track cuts
1580-
// no pair cuts
1581-
names = {
1582-
Form("PairsEleMuSEPM_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName()),
1583-
Form("PairsEleMuSEPP_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName()),
1584-
Form("PairsEleMuSEMM_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName())};
1585-
histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1586-
fTrackMuonHistNames.push_back(names);
1587-
1588-
TString cutNamesStr = fConfigCuts.pair.value;
1589-
if (!cutNamesStr.IsNull()) { // if pair cuts
1590-
std::unique_ptr<TObjArray> objArrayPair(cutNamesStr.Tokenize(","));
1591-
for (int iPairCut = 0; iPairCut < objArrayPair->GetEntries(); ++iPairCut) { // loop over pair cuts
1592-
std::vector<TString> names = {
1593-
Form("PairsEleMuSEPM_%s_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName(), objArrayPair->At(iPairCut)->GetName()),
1594-
Form("PairsEleMuSEPP_%s_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName(), objArrayPair->At(iPairCut)->GetName()),
1595-
Form("PairsEleMuSEMM_%s_%s_%s", objArrayBarrel->At(icut)->GetName(), objArrayMuon->At(icut)->GetName(), objArrayPair->At(iPairCut)->GetName())};
1596-
histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1597-
fTrackMuonHistNames.push_back(names);
1598-
} // end loop (pair cuts)
1599-
} // end if (pair cuts)
1600-
} // end loop (track cuts)
1601-
} // end if (equal number of cuts)
1602-
} // end if (track cuts)
1603-
}*/
1579+
if (fEnableBarrelMuonHistos) {
1580+
for (int iTrack = 0; iTrack < fNCutsBarrel; ++iTrack) {
1581+
TString trackCutName = fTrackCuts[iTrack];
1582+
if (objArrayTrackCuts->FindObject(trackCutName.Data()) == nullptr) continue;
1583+
1584+
for (int iMuon = 0; iMuon < fNCutsMuon; ++iMuon) {
1585+
TString muonCutName = fMuonCuts[iMuon];
1586+
if (objArrayMuonCuts->FindObject(muonCutName.Data()) == nullptr) continue;
1587+
1588+
names = {
1589+
Form("PairsEleMuSEPM_%s_%s", trackCutName.Data(), muonCutName.Data()),
1590+
Form("PairsEleMuSEPP_%s_%s", trackCutName.Data(), muonCutName.Data()),
1591+
Form("PairsEleMuSEMM_%s_%s", trackCutName.Data(), muonCutName.Data())
1592+
};
1593+
histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1594+
1595+
// if (fEnableBarrelMuonMixingHistos) {
1596+
// names.push_back(Form("PairsBarrelMuonMEPM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1597+
// names.push_back(Form("PairsBarrelMuonMEPP_%s_%s", trackCutName.Data(), muonCutName.Data()));
1598+
// names.push_back(Form("PairsBarrelMuonMEMM_%s_%s", trackCutName.Data(), muonCutName.Data()));
1599+
// histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data());
1600+
// }
1601+
1602+
TString cutNamesStr = fConfigCuts.pair.value;
1603+
if (!cutNamesStr.IsNull()) {
1604+
std::unique_ptr<TObjArray> objArrayPair(cutNamesStr.Tokenize(","));
1605+
int nPairCuts = objArrayPair->GetEntries();
1606+
for (int iPairCut = 0; iPairCut < nPairCuts; ++iPairCut) {
1607+
names = {
1608+
Form("PairsEleMuSEPM_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName()),
1609+
Form("PairsEleMuSEPP_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName()),
1610+
Form("PairsEleMuSEMM_%s_%s_%s", trackCutName.Data(), muonCutName.Data(), objArrayPair->At(iPairCut)->GetName())
1611+
};
1612+
histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data());
1613+
int index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
1614+
fTrackMuonHistNames[index] = names;
1615+
}
1616+
}
1617+
}
1618+
}
1619+
}
16041620

16051621
if (fConfigQA) {
16061622
fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars);
@@ -2254,6 +2270,109 @@ struct AnalysisSameEventPairing {
22542270
} // end event loop
22552271
}
22562272

2273+
template <bool TTwoProngFitter, int TPairType, uint32_t TEventFillMap, uint32_t TTrackFillMap, uint32_t TMuonFillMap, typename TEvents, typename TTrackAssocs, typename TTracks, typename TMuonAssocs, typename TMuons>
2274+
void runEmuSameEventPairing(TEvents const& events, Preslice<TTrackAssocs>& preslice1, TTrackAssocs const& assocs1, TTracks const& /*tracks1*/, Preslice<TMuonAssocs>& preslice2, TMuonAssocs const& assocs2, TMuons const& /*tracks2*/)
2275+
{
2276+
if (events.size() > 0) {
2277+
if (fCurrentRun != events.begin().runNumber()) {
2278+
initParamsFromCCDB(events.begin().timestamp(), events.begin().runNumber(), TTwoProngFitter);
2279+
fCurrentRun = events.begin().runNumber();
2280+
}
2281+
}
2282+
2283+
const auto& histNames = fTrackMuonHistNames;
2284+
int nPairCuts = (fPairCuts.size() > 0) ? fPairCuts.size() : 1;
2285+
2286+
electronmuonList.reserve(1);
2287+
2288+
uint32_t twoTrackFilter = 0;
2289+
int sign1 = 0;
2290+
int sign2 = 0;
2291+
2292+
constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0);
2293+
constexpr bool eventHasQvectorCentr = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0);
2294+
2295+
for (auto& event : events) {
2296+
if (!event.isEventSelected_bit(0)) continue;
2297+
if (fConfigCuts.event && event.isEventSelected_bit(2)) continue;
2298+
2299+
VarManager::ResetValues(0, VarManager::kNVars);
2300+
VarManager::FillEvent<TEventFillMap>(event, VarManager::fgValues);
2301+
2302+
auto groupedAssocs1 = assocs1.sliceBy(preslice1, event.globalIndex());
2303+
if (groupedAssocs1.size() == 0) continue;
2304+
auto groupedAssocs2 = assocs2.sliceBy(preslice2, event.globalIndex());
2305+
if (groupedAssocs2.size() == 0) continue;
2306+
2307+
// Custom combination policy
2308+
for (auto& [a1, a2] : o2::soa::combinations(soa::CombinationsFullIndexPolicy(groupedAssocs1, groupedAssocs2))) {
2309+
if (!(a1.isBarrelSelected_raw() & fTrackFilterMask)) continue;
2310+
if (!a1.isBarrelSelectedPrefilter_raw()) continue;
2311+
if (!(a2.isMuonSelected_raw() & fMuonFilterMask)) continue;
2312+
2313+
auto t1 = a1.template reducedtrack_as<TTracks>();
2314+
auto t2 = a2.template reducedmuon_as<TMuons>();
2315+
sign1 = t1.sign();
2316+
sign2 = t2.sign();
2317+
2318+
twoTrackFilter = 0;
2319+
int minCuts = std::min(fNCutsBarrel, fNCutsMuon);
2320+
for (int i = 0; i < minCuts; ++i) {
2321+
if ((a1.isBarrelSelected_raw() & (1u << i)) && (a2.isMuonSelected_raw() & (1u << i))) {
2322+
twoTrackFilter |= (1u << i);
2323+
}
2324+
}
2325+
if (t1.barrelAmbiguityInBunch() > 1) twoTrackFilter |= (1u << 28);
2326+
if (t1.barrelAmbiguityOutOfBunch() > 1) twoTrackFilter |= (1u << 30);
2327+
if (t2.muonAmbiguityInBunch() > 1) twoTrackFilter |= (1u << 29);
2328+
if (t2.muonAmbiguityOutOfBunch() > 1) twoTrackFilter |= (1u << 31);
2329+
2330+
VarManager::FillPair<VarManager::kElectronMuon, TTrackFillMap>(t1, t2);
2331+
if (fConfigOptions.propTrack) {
2332+
VarManager::FillPairCollision<VarManager::kElectronMuon, TTrackFillMap>(event, t1, t2);
2333+
}
2334+
if constexpr (eventHasQvector) {
2335+
VarManager::FillPairVn<VarManager::kElectronMuon>(t1, t2);
2336+
}
2337+
if constexpr (eventHasQvectorCentr) {
2338+
VarManager::FillPairVn<TEventFillMap, VarManager::kElectronMuon>(t1, t2);
2339+
}
2340+
2341+
electronmuonList(event.globalIndex(), VarManager::fgValues[VarManager::kMass],
2342+
VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi],
2343+
t1.sign() + t2.sign(), twoTrackFilter, 0);
2344+
2345+
for (int iTrack = 0; iTrack < fNCutsBarrel; ++iTrack) {
2346+
if (!(a1.isBarrelSelected_raw() & (1u << iTrack))) continue;
2347+
2348+
for (int iMuon = 0; iMuon < fNCutsMuon; ++iMuon) {
2349+
if (!(a2.isMuonSelected_raw() & (1u << iMuon))) continue;
2350+
2351+
for (unsigned int iPairCut = 0; iPairCut < (fPairCuts.empty() ? 1 : fPairCuts.size()); iPairCut++) {
2352+
if (!fPairCuts.empty()) {
2353+
AnalysisCompositeCut cut = fPairCuts.at(iPairCut);
2354+
if (!cut.IsSelected(VarManager::fgValues)) continue;
2355+
}
2356+
int index = iTrack * (fNCutsMuon * nPairCuts) + iMuon * nPairCuts + iPairCut;
2357+
auto itHist = histNames.find(index);
2358+
if (itHist == histNames.end()) continue;
2359+
if (sign1 * sign2 < 0) { // Opposite Sign
2360+
fHistMan->FillHistClass(histNames[index][0].Data(), VarManager::fgValues);
2361+
} else { // Like Sign
2362+
if (sign1 > 0) {
2363+
fHistMan->FillHistClass(itHist->second[1].Data(), VarManager::fgValues);
2364+
} else {
2365+
fHistMan->FillHistClass(itHist->second[2].Data(), VarManager::fgValues);
2366+
}
2367+
}
2368+
} // end pair cut loop
2369+
} // end muon cut loop
2370+
} // end barrel cut loop
2371+
2372+
} // end combinations loop
2373+
} // end event loop
2374+
}
2375+
22572376
void processAllSkimmed(MyEventsVtxCovSelected const& events,
22582377
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const& barrelTracks,
22592378
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
@@ -2323,6 +2442,13 @@ struct AnalysisSameEventPairing {
23232442
runSameEventPairing<true, VarManager::kDecayToMuMu, gkEventFillMapWithMultExtraWithQVector, gkMuonFillMapWithCov>(events, muonAssocsPerCollision, muonAssocs, muons);
23242443
}
23252444

2445+
void processElectronMuonSkimmed(MyEventsVtxCovSelected const& events,
2446+
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& barrelAssocs, MyBarrelTracksWithCovWithAmbiguities const& barrelTracks,
2447+
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
2448+
{
2449+
runEmuSameEventPairing<true, VarManager::kElectronMuon, gkEventFillMapWithCov, gkTrackFillMapWithCov, gkMuonFillMapWithCov>(events, trackAssocsPerCollision, muonAssocsPerCollision, barrelAssocs, barrelTracks, muonAssocs, muons);
2450+
}
2451+
23262452
void processMixingAllSkimmed(soa::Filtered<MyEventsHashSelected>& events,
23272453
soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const& trackAssocs, MyBarrelTracksWithCov const& tracks,
23282454
soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons)
@@ -2370,6 +2496,7 @@ struct AnalysisSameEventPairing {
23702496
PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmed, "Run muon only pairing, with skimmed tracks", false);
23712497
PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmedMultExtra, "Run muon only pairing, with skimmed tracks", false);
23722498
PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmedFlow, "Run muon only pairing, with skimmed tracks and flow", false);
2499+
PROCESS_SWITCH(AnalysisSameEventPairing, processElectronMuonSkimmed, "Run electron-muon pairing, with skimmed tracks/muons", false);
23732500
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingAllSkimmed, "Run all types of mixed pairing, with skimmed tracks/muons", false);
23742501
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelSkimmed, "Run barrel type mixing pairing, with skimmed tracks", false);
23752502
PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelSkimmedFlow, "Run barrel type mixing pairing, with flow, with skimmed tracks", false);

0 commit comments

Comments
 (0)