Skip to content

Commit c1e6e68

Browse files
committed
Implement charge checks and improve candidate selection
1 parent b1d9dc9 commit c1e6e68

File tree

2 files changed

+85
-20
lines changed

2 files changed

+85
-20
lines changed

PWGDQ/Tasks/dqEfficiency_withAssoc.cxx

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,8 +1940,10 @@ struct AnalysisAsymmetricPairing {
19401940
uint32_t fLegAFilterMask;
19411941
uint32_t fLegBFilterMask;
19421942
uint32_t fLegCFilterMask;
1943-
// Map tracking which pair of leg cuts the track cuts participate in
1944-
std::map<int, uint32_t> fTrackCutFilterMasks;
1943+
// Maps tracking which combination of leg cuts the track cuts participate in
1944+
std::map<int, uint32_t> fConstructedLegAFilterMasksMap;
1945+
std::map<int, uint32_t> fConstructedLegBFilterMasksMap;
1946+
std::map<int, uint32_t> fConstructedLegCFilterMasksMap;
19451947
// Filter map for common track cuts
19461948
uint32_t fCommonTrackCutMask;
19471949
// Map tracking which common track cut the track cuts correspond to
@@ -2053,15 +2055,15 @@ struct AnalysisAsymmetricPairing {
20532055
legAIdx = objArray->IndexOf(legs->At(0));
20542056
if (legAIdx >= 0) {
20552057
fConstructedLegAFilterMask |= static_cast<uint32_t>(1) << legAIdx;
2056-
fTrackCutFilterMasks[icut] |= static_cast<uint32_t>(1) << legAIdx;
2058+
fConstructedLegAFilterMasksMap[icut] |= static_cast<uint32_t>(1) << legAIdx;
20572059
} else {
20582060
LOGF(fatal, "Leg A cut %s was not calculated upstream. Check the config!", legs->At(0)->GetName());
20592061
continue;
20602062
}
20612063
legBIdx = objArray->IndexOf(legs->At(1));
20622064
if (legBIdx >= 0) {
20632065
fConstructedLegBFilterMask |= static_cast<uint32_t>(1) << legBIdx;
2064-
fTrackCutFilterMasks[icut] |= static_cast<uint32_t>(1) << legBIdx;
2066+
fConstructedLegBFilterMasksMap[icut] |= static_cast<uint32_t>(1) << legBIdx;
20652067
} else {
20662068
LOGF(fatal, "Leg B cut %s was not calculated upstream. Check the config!", legs->At(1)->GetName());
20672069
continue;
@@ -2070,7 +2072,7 @@ struct AnalysisAsymmetricPairing {
20702072
legCIdx = objArray->IndexOf(legs->At(2));
20712073
if (legCIdx >= 0) {
20722074
fConstructedLegCFilterMask |= static_cast<uint32_t>(1) << legCIdx;
2073-
fTrackCutFilterMasks[icut] |= static_cast<uint32_t>(1) << legCIdx;
2075+
fConstructedLegCFilterMasksMap[icut] |= static_cast<uint32_t>(1) << legCIdx;
20742076
} else {
20752077
LOGF(fatal, "Leg C cut %s was not calculated upstream. Check the config!", legs->At(2)->GetName());
20762078
continue;
@@ -2379,7 +2381,7 @@ struct AnalysisAsymmetricPairing {
23792381
bool isPairIdWrong = false;
23802382
for (int icut = 0; icut < fNLegCuts; ++icut) {
23812383
// Find leg pair definitions both candidates participate in
2382-
if ((((a1.isBarrelSelected_raw() & fLegAFilterMask) | (a2.isBarrelSelected_raw() & fLegBFilterMask)) & fTrackCutFilterMasks[icut]) == fTrackCutFilterMasks[icut]) {
2384+
if ((a1.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) && (a2.isBarrelSelected_raw() & fConstructedLegBFilterMasksMap[icut])) {
23832385
twoTrackFilter |= static_cast<uint32_t>(1) << icut;
23842386
// If the supposed pion passes a kaon cut, this is a K+K-. Skip it.
23852387
if (TPairType == VarManager::kDecayToKPi && fConfigSkipAmbiguousIdCombinations.value) {
@@ -2626,8 +2628,8 @@ struct AnalysisAsymmetricPairing {
26262628
uint32_t threeTrackFilter = 0;
26272629
uint32_t threeTrackCommonFilter = 0;
26282630
for (int icut = 0; icut < fNLegCuts; ++icut) {
2629-
// Find out which leg cut combination the triplet passes
2630-
if ((((a1.isBarrelSelected_raw() & fLegAFilterMask) | (a2.isBarrelSelected_raw() & fLegBFilterMask) | (a3.isBarrelSelected_raw() & fLegCFilterMask)) & fTrackCutFilterMasks[icut]) == fTrackCutFilterMasks[icut]) {
2631+
// Find out which leg cut combinations the triplet passes
2632+
if ((a1.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) && (a2.isBarrelSelected_raw() & fConstructedLegBFilterMasksMap[icut]) && (a3.isBarrelSelected_raw() & fConstructedLegCFilterMasksMap[icut])) {
26312633
threeTrackFilter |= (static_cast<uint32_t>(1) << icut);
26322634
if (tripletType == VarManager::kTripleCandidateToPKPi && fConfigSkipAmbiguousIdCombinations.value) {
26332635
// Check if the supposed pion passes as a proton or kaon, if so, skip this triplet. It is pKp or pKK.
@@ -2662,6 +2664,17 @@ struct AnalysisAsymmetricPairing {
26622664
if (t1 == t2 || t1 == t3 || t2 == t3) {
26632665
return;
26642666
}
2667+
// Check charge
2668+
if (tripletType == VarManager::kTripleCandidateToKPiPi) {
2669+
if (!((t1.sign() == -1 && t2.sign() == 1 && t3.sign() == 1) || (t1.sign() == 1 && t2.sign() == -1 && t3.sign() == -1))) {
2670+
return;
2671+
}
2672+
}
2673+
if (tripletType == VarManager::kTripleCandidateToPKPi) {
2674+
if (!((t1.sign() == 1 && t2.sign() == -1 && t3.sign() == 1) || (t1.sign() == -1 && t2.sign() == 1 && t3.sign() == -1))) {
2675+
return;
2676+
}
2677+
}
26652678

26662679
// store the ambiguity of the three legs in the last 3 digits of the two-track filter
26672680
if (t1.barrelAmbiguityInBunch() > 1 || t1.barrelAmbiguityOutOfBunch() > 1) {
@@ -2840,7 +2853,7 @@ struct AnalysisDileptonTrack {
28402853

28412854
// TODO: The filter expressions seem to always use the default value of configurables, not the values from the actual configuration file
28422855
Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast<uint32_t>(0);
2843-
Filter dileptonFilter = aod::reducedpair::pt > fConfigDileptonpTCut&& aod::reducedpair::mass > fConfigDileptonLowMass&& aod::reducedpair::mass<fConfigDileptonHighMass && aod::reducedpair::sign == 0 && aod::reducedpair::lxy> fConfigDileptonLxyCut;
2856+
Filter dileptonFilter = aod::reducedpair::pt > fConfigDileptonpTCut && aod::reducedpair::mass > fConfigDileptonLowMass && aod::reducedpair::mass < fConfigDileptonHighMass && aod::reducedpair::sign == 0 && aod::reducedpair::lxy > fConfigDileptonLxyCut;
28442857
Filter filterBarrel = aod::dqanalysisflags::isBarrelSelected > static_cast<uint32_t>(0);
28452858
Filter filterMuon = aod::dqanalysisflags::isMuonSelected > static_cast<uint32_t>(0);
28462859

@@ -3118,7 +3131,7 @@ struct AnalysisDileptonTrack {
31183131

31193132
// loop over hadrons
31203133
for (auto& assoc : assocs) {
3121-
if constexpr (TCandidateType == VarManager::kBtoJpsiEEK || TCandidateType == VarManager::kDstarToD0KPiPi) {
3134+
if constexpr (TCandidateType == VarManager::kBtoJpsiEEK) {
31223135
if (!assoc.isBarrelSelected_bit(fTrackCutBit)) {
31233136
continue;
31243137
}
@@ -3138,6 +3151,30 @@ struct AnalysisDileptonTrack {
31383151
}
31393152
}
31403153
}
3154+
if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) {
3155+
if (!assoc.isBarrelSelected_bit(fTrackCutBit)) {
3156+
continue;
3157+
}
3158+
auto track = assoc.template reducedtrack_as<TTracks>();
3159+
if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) {
3160+
continue;
3161+
}
3162+
// Check that the charge combination makes sense for D*+ -> D0 pi+ or D*- -> D0bar pi-
3163+
if (!((track.sign() == 1 && lepton1.sign() == -1 && lepton2.sign() == 1) || (track.sign() == -1 && lepton1.sign() == 1 && lepton2.sign() == -1))) {
3164+
continue;
3165+
}
3166+
VarManager::FillDileptonHadron(dilepton, track, fValuesHadron);
3167+
VarManager::FillDileptonTrackVertexing<TCandidateType, TEventFillMap, TTrackFillMap>(event, lepton1, lepton2, track, fValuesHadron);
3168+
3169+
auto trackMC = track.reducedMCTrack();
3170+
mcDecision = 0;
3171+
isig = 0;
3172+
for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) {
3173+
if ((*sig).CheckSignal(true, lepton1MC, lepton2MC, trackMC)) {
3174+
mcDecision |= (static_cast<uint32_t>(1) << isig);
3175+
}
3176+
}
3177+
}
31413178
if constexpr (TCandidateType == VarManager::kBcToThreeMuons) {
31423179
if (!assoc.isMuonSelected_bit(fTrackCutBit)) {
31433180
continue;

PWGDQ/Tasks/tableReader_withAssoc.cxx

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,8 +1926,10 @@ struct AnalysisAsymmetricPairing {
19261926
uint32_t fLegAFilterMask;
19271927
uint32_t fLegBFilterMask;
19281928
uint32_t fLegCFilterMask;
1929-
// Map tracking which pair of leg cuts the track cuts participate in
1930-
std::map<int, uint32_t> fTrackCutFilterMasks;
1929+
// Maps tracking which combination of leg cuts the track cuts participate in
1930+
std::map<int, uint32_t> fConstructedLegAFilterMasksMap;
1931+
std::map<int, uint32_t> fConstructedLegBFilterMasksMap;
1932+
std::map<int, uint32_t> fConstructedLegCFilterMasksMap;
19311933
// Filter map for common track cuts
19321934
uint32_t fCommonTrackCutMask;
19331935
// Map tracking which common track cut the track cuts correspond to
@@ -2027,15 +2029,15 @@ struct AnalysisAsymmetricPairing {
20272029
legAIdx = objArray->IndexOf(legs->At(0));
20282030
if (legAIdx >= 0) {
20292031
fConstructedLegAFilterMask |= (static_cast<uint32_t>(1) << legAIdx);
2030-
fTrackCutFilterMasks[icut] |= static_cast<uint32_t>(1) << legAIdx;
2032+
fConstructedLegAFilterMasksMap[icut] |= static_cast<uint32_t>(1) << legAIdx;
20312033
} else {
20322034
LOGF(fatal, "Leg A cut %s was not calculated upstream. Check the config!", legs->At(0)->GetName());
20332035
continue;
20342036
}
20352037
legBIdx = objArray->IndexOf(legs->At(1));
20362038
if (legBIdx >= 0) {
20372039
fConstructedLegBFilterMask |= (static_cast<uint32_t>(1) << legBIdx);
2038-
fTrackCutFilterMasks[icut] |= static_cast<uint32_t>(1) << legBIdx;
2040+
fConstructedLegBFilterMasksMap[icut] |= static_cast<uint32_t>(1) << legBIdx;
20392041
} else {
20402042
LOGF(fatal, "Leg B cut %s was not calculated upstream. Check the config!", legs->At(1)->GetName());
20412043
continue;
@@ -2044,7 +2046,7 @@ struct AnalysisAsymmetricPairing {
20442046
legCIdx = objArray->IndexOf(legs->At(2));
20452047
if (legCIdx >= 0) {
20462048
fConstructedLegCFilterMask |= (static_cast<uint32_t>(1) << legCIdx);
2047-
fTrackCutFilterMasks[icut] |= static_cast<uint32_t>(1) << legCIdx;
2049+
fConstructedLegCFilterMasksMap[icut] |= static_cast<uint32_t>(1) << legCIdx;
20482050
} else {
20492051
LOGF(fatal, "Leg C cut %s was not calculated upstream. Check the config!", legs->At(2)->GetName());
20502052
continue;
@@ -2258,7 +2260,7 @@ struct AnalysisAsymmetricPairing {
22582260
bool isPairIdWrong = false;
22592261
for (int icut = 0; icut < fNLegCuts; ++icut) {
22602262
// Find leg pair definitions both candidates participate in
2261-
if ((((a1.isBarrelSelected_raw() & fLegAFilterMask) | (a2.isBarrelSelected_raw() & fLegBFilterMask)) & fTrackCutFilterMasks[icut]) == fTrackCutFilterMasks[icut]) {
2263+
if ((a1.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) && (a2.isBarrelSelected_raw() & fConstructedLegBFilterMasksMap[icut])) {
22622264
twoTrackFilter |= (static_cast<uint32_t>(1) << icut);
22632265
// If the supposed pion passes a kaon cut, this is a K+K-. Skip it.
22642266
if (TPairType == VarManager::kDecayToKPi && fConfigSkipAmbiguousIdCombinations.value) {
@@ -2435,8 +2437,8 @@ struct AnalysisAsymmetricPairing {
24352437
uint32_t threeTrackFilter = static_cast<uint32_t>(0);
24362438
uint32_t threeTrackCommonFilter = static_cast<uint32_t>(0);
24372439
for (int icut = 0; icut < fNLegCuts; ++icut) {
2438-
// Find out which leg cut combination the triplet passes
2439-
if ((((a1.isBarrelSelected_raw() & fLegAFilterMask) | (a2.isBarrelSelected_raw() & fLegBFilterMask) | (a3.isBarrelSelected_raw() & fLegCFilterMask)) & fTrackCutFilterMasks[icut]) == fTrackCutFilterMasks[icut]) {
2440+
// Find out which leg cut combinations the triplet passes
2441+
if ((a1.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) && (a2.isBarrelSelected_raw() & fConstructedLegBFilterMasksMap[icut]) && (a3.isBarrelSelected_raw() & fConstructedLegCFilterMasksMap[icut])) {
24402442
threeTrackFilter |= (static_cast<uint32_t>(1) << icut);
24412443
if (tripletType == VarManager::kTripleCandidateToPKPi && fConfigSkipAmbiguousIdCombinations.value) {
24422444
// Check if the supposed pion passes as a proton or kaon, if so, skip this triplet. It is pKp or pKK.
@@ -2471,6 +2473,17 @@ struct AnalysisAsymmetricPairing {
24712473
if (t1 == t2 || t1 == t3 || t2 == t3) {
24722474
return;
24732475
}
2476+
// Check charge
2477+
if (tripletType == VarManager::kTripleCandidateToKPiPi) {
2478+
if (!((t1.sign() == -1 && t2.sign() == 1 && t3.sign() == 1) || (t1.sign() == 1 && t2.sign() == -1 && t3.sign() == -1))) {
2479+
return;
2480+
}
2481+
}
2482+
if (tripletType == VarManager::kTripleCandidateToPKPi) {
2483+
if (!((t1.sign() == 1 && t2.sign() == -1 && t3.sign() == 1) || (t1.sign() == -1 && t2.sign() == 1 && t3.sign() == -1))) {
2484+
return;
2485+
}
2486+
}
24742487

24752488
// store the ambiguity of the three legs in the last 3 digits of the two-track filter
24762489
if (t1.barrelAmbiguityInBunch() > 1 || t1.barrelAmbiguityOutOfBunch() > 1) {
@@ -2585,7 +2598,7 @@ struct AnalysisDileptonTrack {
25852598

25862599
// TODO: The filter expressions seem to always use the default value of configurables, not the values from the actual configuration file
25872600
Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast<uint8_t>(0);
2588-
Filter dileptonFilter = aod::reducedpair::pt > fConfigDileptonpTCut&& aod::reducedpair::mass > fConfigDileptonLowMass&& aod::reducedpair::mass<fConfigDileptonHighMass && aod::reducedpair::sign == 0 && aod::reducedpair::lxy> fConfigDileptonLxyCut;
2601+
Filter dileptonFilter = aod::reducedpair::pt > fConfigDileptonpTCut && aod::reducedpair::mass > fConfigDileptonLowMass && aod::reducedpair::mass < fConfigDileptonHighMass && aod::reducedpair::sign == 0 && aod::reducedpair::lxy > fConfigDileptonLxyCut;
25892602
Filter filterBarrel = aod::dqanalysisflags::isBarrelSelected > static_cast<uint32_t>(0);
25902603
Filter filterMuon = aod::dqanalysisflags::isMuonSelected > static_cast<uint32_t>(0);
25912604

@@ -2823,14 +2836,29 @@ struct AnalysisDileptonTrack {
28232836

28242837
// loop over hadrons
28252838
for (auto& assoc : assocs) {
2826-
if constexpr (TCandidateType == VarManager::kBtoJpsiEEK || TCandidateType == VarManager::kDstarToD0KPiPi) {
2839+
if constexpr (TCandidateType == VarManager::kBtoJpsiEEK) {
2840+
if (!assoc.isBarrelSelected_bit(fTrackCutBit)) {
2841+
continue;
2842+
}
2843+
auto track = assoc.template reducedtrack_as<TTracks>();
2844+
if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) {
2845+
continue;
2846+
}
2847+
VarManager::FillDileptonHadron(dilepton, track, fValuesHadron);
2848+
VarManager::FillDileptonTrackVertexing<TCandidateType, TEventFillMap, TTrackFillMap>(event, lepton1, lepton2, track, fValuesHadron);
2849+
}
2850+
if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) {
28272851
if (!assoc.isBarrelSelected_bit(fTrackCutBit)) {
28282852
continue;
28292853
}
28302854
auto track = assoc.template reducedtrack_as<TTracks>();
28312855
if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) {
28322856
continue;
28332857
}
2858+
// Check that the charge combination makes sense for D*+ -> D0 pi+ or D*- -> D0bar pi-
2859+
if (!((track.sign() == 1 && lepton1.sign() == -1 && lepton2.sign() == 1) || (track.sign() == -1 && lepton1.sign() == 1 && lepton2.sign() == -1))) {
2860+
continue;
2861+
}
28342862
VarManager::FillDileptonHadron(dilepton, track, fValuesHadron);
28352863
VarManager::FillDileptonTrackVertexing<TCandidateType, TEventFillMap, TTrackFillMap>(event, lepton1, lepton2, track, fValuesHadron);
28362864
}

0 commit comments

Comments
 (0)