Skip to content

Commit af03df9

Browse files
committed
Add double counting check and new histogram group for reflected pairs
1 parent 03c598c commit af03df9

File tree

2 files changed

+91
-8
lines changed

2 files changed

+91
-8
lines changed

PWGDQ/Tasks/dqEfficiency_withAssoc.cxx

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2063,6 +2063,7 @@ struct AnalysisAsymmetricPairing {
20632063
Configurable<std::string> fConfigHistogramSubgroups{"cfgAsymmetricPairingHistogramsSubgroups", "barrel,vertexing", "Comma separated list of asymmetric-pairing histogram subgroups"};
20642064
Configurable<bool> fConfigSameSignHistograms{"cfgSameSignHistograms", false, "Include same sign pair histograms for 2-prong decays"};
20652065
// Configurable<bool> fConfigAmbiguousHistograms{"cfgAmbiguousHistograms", false, "Include separate histograms for pairs/triplets with ambiguous tracks"};
2066+
Configurable<bool> fConfigReflectedHistograms{"cfgReflectedHistograms", false, "Include separate histograms for pairs which are reflections of previously counted pairs"};
20662067
Configurable<bool> fConfigQA{"cfgQA", false, "If true, fill QA histograms"};
20672068
Configurable<std::string> fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"};
20682069

@@ -2087,6 +2088,7 @@ struct AnalysisAsymmetricPairing {
20872088
std::map<int, std::vector<TString>> fTrackHistNames;
20882089
std::map<int, std::vector<TString>> fBarrelHistNamesMCmatched;
20892090
std::vector<AnalysisCompositeCut*> fPairCuts;
2091+
int fNPairHistPrefixes;
20902092

20912093
std::vector<MCSignal> fRecMCSignals;
20922094
std::vector<MCSignal> fGenMCSignals;
@@ -2115,6 +2117,9 @@ struct AnalysisAsymmetricPairing {
21152117
Partition<soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts>> legBCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegBFilterMask) > static_cast<uint32_t>(0);
21162118
Partition<soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts>> legCCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegCFilterMask) > static_cast<uint32_t>(0);
21172119

2120+
// Map to track how many times a pair of tracks has been encountered
2121+
std::map<std::pair<int32_t, int32_t>, int8_t> fPairCount;
2122+
21182123
void init(o2::framework::InitContext& context)
21192124
{
21202125
if (context.mOptions.get<bool>("processDummy")) {
@@ -2330,7 +2335,7 @@ struct AnalysisAsymmetricPairing {
23302335
pairHistPrefixes.push_back("PairsBarrelSEPP");
23312336
pairHistPrefixes.push_back("PairsBarrelSEMM");
23322337
}
2333-
int fNPairHistPrefixes = pairHistPrefixes.size();
2338+
fNPairHistPrefixes = pairHistPrefixes.size();
23342339

23352340
for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) {
23362341
names.push_back(Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()));
@@ -2342,6 +2347,12 @@ struct AnalysisAsymmetricPairing {
23422347
histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data());
23432348
}
23442349
}
2350+
if (fConfigReflectedHistograms.value) {
2351+
for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) {
2352+
names.push_back(Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()));
2353+
histNames += Form("%s;", names[(1 + fConfigQA.value) * fNPairHistPrefixes + iPrefix].Data());
2354+
}
2355+
}
23452356
fTrackHistNames[icut] = names;
23462357

23472358
std::unique_ptr<TObjArray> objArrayCommon(commonNamesStr.Tokenize(","));
@@ -2385,6 +2396,12 @@ struct AnalysisAsymmetricPairing {
23852396
names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig.GetName()));
23862397
histNames += Form("%s;", names[iPrefix].Data());
23872398
}
2399+
if (fConfigReflectedHistograms.value) {
2400+
for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) {
2401+
names.push_back(Form("%s_reflected_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig.GetName()));
2402+
histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data());
2403+
}
2404+
}
23882405
fBarrelHistNamesMCmatched[offset + icut] = names;
23892406

23902407
for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) {
@@ -2513,6 +2530,8 @@ struct AnalysisAsymmetricPairing {
25132530
template <bool TTwoProngFitter, int TPairType, uint32_t TEventFillMap, uint32_t TTrackFillMap, typename TEvents, typename TTrackAssocs, typename TTracks>
25142531
void runAsymmetricPairing(TEvents const& events, Preslice<TTrackAssocs>& preslice, TTrackAssocs const& /*assocs*/, TTracks const& /*tracks*/, ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& /*mcTracks*/)
25152532
{
2533+
fPairCount.clear();
2534+
25162535
if (events.size() > 0) { // Additional protection to avoid crashing of events.begin().runNumber()
25172536
if (fCurrentRun != events.begin().runNumber()) {
25182537
initParamsFromCCDB(events.begin().timestamp(), false);
@@ -2582,6 +2601,18 @@ struct AnalysisAsymmetricPairing {
25822601
continue;
25832602
}
25842603

2604+
bool isReflected = false;
2605+
std::pair<int32_t, int32_t> trackIds(t1.globalIndex(), t2.globalIndex());
2606+
if (fPairCount.find(trackIds) != fPairCount.end()) {
2607+
// Double counting is possible due to track-collision ambiguity. Skip pairs which were counted before
2608+
fPairCount[trackIds] += 1;
2609+
continue;
2610+
}
2611+
if (fPairCount.find(std::pair(trackIds.second, trackIds.first)) != fPairCount.end()) {
2612+
isReflected = true;
2613+
}
2614+
fPairCount[trackIds] += 1;
2615+
25852616
sign1 = t1.sign();
25862617
sign2 = t2.sign();
25872618
// store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter
@@ -2617,18 +2648,27 @@ struct AnalysisAsymmetricPairing {
26172648
if (sign1 * sign2 < 0) { // +- pairs
26182649
fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); // reconstructed, unmatched
26192650
if (isAmbi && fConfigQA) {
2620-
fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues);
2651+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes].Data(), VarManager::fgValues);
2652+
}
2653+
if (isReflected && fConfigReflectedHistograms.value) {
2654+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value)].Data(), VarManager::fgValues);
26212655
}
26222656
} else if (fConfigSameSignHistograms.value) {
26232657
if (sign1 > 0) { // ++ pairs
26242658
fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues);
26252659
if (isAmbi && fConfigQA) {
2626-
fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues);
2660+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues);
2661+
}
2662+
if (isReflected && fConfigReflectedHistograms.value) {
2663+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value) + 1].Data(), VarManager::fgValues);
26272664
}
26282665
} else { // -- pairs
26292666
fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues);
26302667
if (isAmbi && fConfigQA) {
2631-
fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues);
2668+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues);
2669+
}
2670+
if (isReflected && fConfigReflectedHistograms) {
2671+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value) + 2].Data(), VarManager::fgValues);
26322672
}
26332673
}
26342674
}
@@ -2637,11 +2677,20 @@ struct AnalysisAsymmetricPairing {
26372677
if (mcDecision & (static_cast<uint32_t>(1) << isig)) {
26382678
if (sign1 * sign2 < 0) {
26392679
fHistMan->FillHistClass(histNamesMC[offset + icut][0].Data(), VarManager::fgValues);
2680+
if (isReflected && fConfigReflectedHistograms.value) {
2681+
fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes].Data(), VarManager::fgValues);
2682+
}
26402683
} else if (fConfigSameSignHistograms.value) {
26412684
if (sign1 > 0) {
26422685
fHistMan->FillHistClass(histNamesMC[offset + icut][1].Data(), VarManager::fgValues);
2686+
if (isReflected && fConfigReflectedHistograms.value) {
2687+
fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues);
2688+
}
26432689
} else {
26442690
fHistMan->FillHistClass(histNamesMC[offset + icut][2].Data(), VarManager::fgValues);
2691+
if (isReflected && fConfigReflectedHistograms.value) {
2692+
fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues);
2693+
}
26452694
}
26462695
}
26472696
}

PWGDQ/Tasks/tableReader_withAssoc.cxx

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,6 +1998,7 @@ struct AnalysisAsymmetricPairing {
19981998
Configurable<std::string> fConfigHistogramSubgroups{"cfgAsymmetricPairingHistogramsSubgroups", "barrel,vertexing", "Comma separated list of asymmetric-pairing histogram subgroups"};
19991999
Configurable<bool> fConfigSameSignHistograms{"cfgSameSignHistograms", false, "Include same sign pair histograms for 2-prong decays"};
20002000
Configurable<bool> fConfigAmbiguousHistograms{"cfgAmbiguousHistograms", false, "Include separate histograms for pairs/triplets with ambiguous tracks"};
2001+
Configurable<bool> fConfigReflectedHistograms{"cfgReflectedHistograms", false, "Include separate histograms for pairs which are reflections of previously counted pairs"};
20012002
Configurable<std::string> fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"};
20022003

20032004
Configurable<string> fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
@@ -2016,6 +2017,7 @@ struct AnalysisAsymmetricPairing {
20162017

20172018
std::map<int, std::vector<TString>> fTrackHistNames;
20182019
std::vector<AnalysisCompositeCut*> fPairCuts;
2020+
int fNPairHistPrefixes;
20192021

20202022
// Filter masks to find legs in BarrelTrackCuts table
20212023
uint32_t fLegAFilterMask;
@@ -2041,6 +2043,9 @@ struct AnalysisAsymmetricPairing {
20412043
Partition<soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts>> legBCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegBFilterMask) > static_cast<uint32_t>(0);
20422044
Partition<soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts>> legCCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegCFilterMask) > static_cast<uint32_t>(0);
20432045

2046+
// Map to track how many times a pair of tracks has been encountered
2047+
std::map<std::pair<int32_t, int32_t>, int8_t> fPairCount;
2048+
20442049
void init(o2::framework::InitContext& context)
20452050
{
20462051
if (context.mOptions.get<bool>("processDummy")) {
@@ -2207,7 +2212,7 @@ struct AnalysisAsymmetricPairing {
22072212
pairHistPrefixes.push_back("PairsBarrelSEPP");
22082213
pairHistPrefixes.push_back("PairsBarrelSEMM");
22092214
}
2210-
int fNPairHistPrefixes = pairHistPrefixes.size();
2215+
fNPairHistPrefixes = pairHistPrefixes.size();
22112216

22122217
for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) {
22132218
names.push_back(Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()));
@@ -2219,6 +2224,12 @@ struct AnalysisAsymmetricPairing {
22192224
histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data());
22202225
}
22212226
}
2227+
if (fConfigReflectedHistograms.value) {
2228+
for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) {
2229+
names.push_back(Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()));
2230+
histNames += Form("%s;", names[(1 + fConfigAmbiguousHistograms.value) * fNPairHistPrefixes + iPrefix].Data());
2231+
}
2232+
}
22222233
fTrackHistNames[icut] = names;
22232234

22242235
std::unique_ptr<TObjArray> objArrayCommon(commonNamesStr.Tokenize(","));
@@ -2333,6 +2344,8 @@ struct AnalysisAsymmetricPairing {
23332344
template <bool TTwoProngFitter, int TPairType, uint32_t TEventFillMap, uint32_t TTrackFillMap, typename TEvents, typename TTrackAssocs, typename TTracks>
23342345
void runAsymmetricPairing(TEvents const& events, Preslice<TTrackAssocs>& preslice, TTrackAssocs const& /*assocs*/, TTracks const& /*tracks*/)
23352346
{
2347+
fPairCount.clear();
2348+
23362349
if (events.size() > 0) { // Additional protection to avoid crashing of events.begin().runNumber()
23372350
if (fCurrentRun != events.begin().runNumber()) {
23382351
initParamsFromCCDB(events.begin().timestamp(), false);
@@ -2398,6 +2411,18 @@ struct AnalysisAsymmetricPairing {
23982411
continue;
23992412
}
24002413

2414+
bool isReflected = false;
2415+
std::pair<int32_t, int32_t> trackIds(t1.globalIndex(), t2.globalIndex());
2416+
if (fPairCount.find(trackIds) != fPairCount.end()) {
2417+
// Double counting is possible due to track-collision ambiguity. Skip pairs which were counted before
2418+
fPairCount[trackIds] += 1;
2419+
continue;
2420+
}
2421+
if (fPairCount.find(std::pair(trackIds.second, trackIds.first)) != fPairCount.end()) {
2422+
isReflected = true;
2423+
}
2424+
fPairCount[trackIds] += 1;
2425+
24012426
sign1 = t1.sign();
24022427
sign2 = t2.sign();
24032428
// store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter
@@ -2421,18 +2446,27 @@ struct AnalysisAsymmetricPairing {
24212446
if (sign1 * sign2 < 0) {
24222447
fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues);
24232448
if (isAmbi && fConfigAmbiguousHistograms.value) {
2424-
fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues);
2449+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes].Data(), VarManager::fgValues);
2450+
}
2451+
if (isReflected && fConfigReflectedHistograms.value) {
2452+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value)].Data(), VarManager::fgValues);
24252453
}
24262454
} else if (fConfigSameSignHistograms.value) {
24272455
if (sign1 > 0) {
24282456
fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues);
24292457
if (isAmbi && fConfigAmbiguousHistograms.value) {
2430-
fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues);
2458+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues);
2459+
}
2460+
if (isReflected && fConfigReflectedHistograms.value) {
2461+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value) + 1].Data(), VarManager::fgValues);
24312462
}
24322463
} else {
24332464
fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues);
24342465
if (isAmbi && fConfigAmbiguousHistograms.value) {
2435-
fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues);
2466+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues);
2467+
}
2468+
if (isReflected && fConfigReflectedHistograms) {
2469+
fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value) + 2].Data(), VarManager::fgValues);
24362470
}
24372471
}
24382472
}

0 commit comments

Comments
 (0)