@@ -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 ;
0 commit comments