@@ -538,8 +538,11 @@ struct AnalysisTrackSelection {
538538 VarManager::ResetValues (0 , VarManager::kNBarrelTrackVariables );
539539 // fill event information which might be needed in histograms/cuts that combine track and event properties
540540 VarManager::FillEvent<TEventFillMap>(event);
541- auto eventMC = event.reducedMCevent ();
542- VarManager::FillEvent<VarManager::ObjTypes::ReducedEventMC>(eventMC);
541+ ReducedMCEvent* eventMC = nullptr ;
542+ if (event.has_reducedMCevent ()) {
543+ auto eventMC = event.reducedMCevent ();
544+ VarManager::FillEvent<VarManager::ObjTypes::ReducedEventMC>(eventMC);
545+ }
543546
544547 auto track = assoc.template reducedtrack_as <TTracks>();
545548 VarManager::FillTrack<TTrackFillMap>(track);
@@ -550,7 +553,9 @@ struct AnalysisTrackSelection {
550553 if (track.has_reducedMCTrack ()) {
551554 auto trackMC = track.reducedMCTrack ();
552555 auto eventMCfromTrack = trackMC.reducedMCevent ();
553- isCorrectAssoc = (eventMCfromTrack.globalIndex () == eventMC.globalIndex ());
556+ if (eventMC != nullptr ) {
557+ isCorrectAssoc = (eventMCfromTrack.globalIndex () == eventMC->globalIndex ());
558+ }
554559 VarManager::FillTrackMC (tracksMC, trackMC);
555560 }
556561
@@ -1970,7 +1975,7 @@ struct AnalysisSameEventPairing {
19701975 continue ;
19711976 }
19721977 if (sig->CheckSignal (true , t1_raw, t2_raw)) {
1973- VarManager::FillPairMC (t1, t2);
1978+ VarManager::FillPairMC<VarManager:: kDecayToEE > (t1, t2);
19741979 fHistMan ->FillHistClass (Form (" MCTruthGenPair_%s" , sig->GetName ()), VarManager::fgValues);
19751980 }
19761981 } // end loop over MC signals
@@ -2052,11 +2057,13 @@ struct AnalysisAsymmetricPairing {
20522057 Configurable<uint32_t > fConfigLegCFilterMask {" cfgLegCFilterMask" , 0 , " Filter mask corresponding to cuts in event-selection" };
20532058 Configurable<string> fConfigCommonTrackCuts {" cfgCommonTrackCuts" , " " , " Comma separated list of cuts to be applied to all legs" };
20542059 Configurable<string> fConfigPairCuts {" cfgPairCuts" , " " , " Comma separated list of pair cuts" };
2060+ Configurable<string> fConfigPairCutsJSON {" cfgPairCutsJSON" , " " , " Additional list of pair cuts in JSON format" };
20552061 Configurable<bool > fConfigSkipAmbiguousIdCombinations {" cfgSkipAmbiguousIdCombinations" , true , " Choose whether to skip pairs/triples which pass a stricter combination of cuts, e.g. KKPi triplets for D+ -> KPiPi" };
20562062
20572063 Configurable<std::string> fConfigHistogramSubgroups {" cfgAsymmetricPairingHistogramsSubgroups" , " barrel,vertexing" , " Comma separated list of asymmetric-pairing histogram subgroups" };
20582064 Configurable<bool > fConfigSameSignHistograms {" cfgSameSignHistograms" , false , " Include same sign pair histograms for 2-prong decays" };
20592065 // 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" };
20602067 Configurable<bool > fConfigQA {" cfgQA" , false , " If true, fill QA histograms" };
20612068 Configurable<std::string> fConfigAddJSONHistograms {" cfgAddJSONHistograms" , " " , " Histograms in JSON format" };
20622069
@@ -2080,7 +2087,8 @@ struct AnalysisAsymmetricPairing {
20802087
20812088 std::map<int , std::vector<TString>> fTrackHistNames ;
20822089 std::map<int , std::vector<TString>> fBarrelHistNamesMCmatched ;
2083- std::vector<AnalysisCompositeCut> fPairCuts ;
2090+ std::vector<AnalysisCompositeCut*> fPairCuts ;
2091+ int fNPairHistPrefixes ;
20842092
20852093 std::vector<MCSignal> fRecMCSignals ;
20862094 std::vector<MCSignal> fGenMCSignals ;
@@ -2109,6 +2117,9 @@ struct AnalysisAsymmetricPairing {
21092117 Partition<soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts>> legBCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegBFilterMask ) > static_cast <uint32_t >(0 );
21102118 Partition<soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts>> legCCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegCFilterMask ) > static_cast <uint32_t >(0 );
21112119
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+
21122123 void init (o2::framework::InitContext& context)
21132124 {
21142125 if (context.mOptions .get <bool >(" processDummy" )) {
@@ -2129,7 +2140,16 @@ struct AnalysisAsymmetricPairing {
21292140 if (!cutNamesStr.IsNull ()) {
21302141 std::unique_ptr<TObjArray> objArray (cutNamesStr.Tokenize (" ," ));
21312142 for (int icut = 0 ; icut < objArray->GetEntries (); ++icut) {
2132- fPairCuts .push_back (*dqcuts::GetCompositeCut (objArray->At (icut)->GetName ()));
2143+ fPairCuts .push_back (dqcuts::GetCompositeCut (objArray->At (icut)->GetName ()));
2144+ }
2145+ }
2146+ // Extra pair cuts via JSON
2147+ TString addPairCutsStr = fConfigPairCutsJSON .value ;
2148+ if (addPairCutsStr != " " ) {
2149+ std::vector<AnalysisCut*> addPairCuts = dqcuts::GetCutsFromJSON (addPairCutsStr.Data ());
2150+ for (auto & t : addPairCuts) {
2151+ fPairCuts .push_back ((AnalysisCompositeCut*)t);
2152+ cutNamesStr += Form (" ,%s" , t->GetName ());
21332153 }
21342154 }
21352155
@@ -2148,6 +2168,15 @@ struct AnalysisAsymmetricPairing {
21482168 string tempCuts;
21492169 getTaskOptionValue<string>(context, " analysis-track-selection" , " cfgTrackCuts" , tempCuts, false );
21502170 TString tempCutsStr = tempCuts;
2171+ // check also the cuts added via JSON and add them to the string of cuts
2172+ getTaskOptionValue<string>(context, " analysis-track-selection" , " cfgBarrelTrackCutsJSON" , tempCuts, false );
2173+ TString addTrackCutsStr = tempCuts;
2174+ if (addTrackCutsStr != " " ) {
2175+ std::vector<AnalysisCut*> addTrackCuts = dqcuts::GetCutsFromJSON (addTrackCutsStr.Data ());
2176+ for (auto & t : addTrackCuts) {
2177+ tempCutsStr += Form (" ,%s" , t->GetName ());
2178+ }
2179+ }
21512180 std::unique_ptr<TObjArray> objArray (tempCutsStr.Tokenize (" ," ));
21522181 // Get the common leg cuts
21532182 int commonCutIdx;
@@ -2306,7 +2335,7 @@ struct AnalysisAsymmetricPairing {
23062335 pairHistPrefixes.push_back (" PairsBarrelSEPP" );
23072336 pairHistPrefixes.push_back (" PairsBarrelSEMM" );
23082337 }
2309- int fNPairHistPrefixes = pairHistPrefixes.size ();
2338+ fNPairHistPrefixes = pairHistPrefixes.size ();
23102339
23112340 for (int iPrefix = 0 ; iPrefix < fNPairHistPrefixes ; ++iPrefix) {
23122341 names.push_back (Form (" %s_%s" , pairHistPrefixes[iPrefix].Data (), legsStr.Data ()));
@@ -2318,6 +2347,12 @@ struct AnalysisAsymmetricPairing {
23182347 histNames += Form (" %s;" , names[fNPairHistPrefixes + iPrefix].Data ());
23192348 }
23202349 }
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+ }
23212356 fTrackHistNames [icut] = names;
23222357
23232358 std::unique_ptr<TObjArray> objArrayCommon (commonNamesStr.Tokenize (" ," ));
@@ -2361,6 +2396,12 @@ struct AnalysisAsymmetricPairing {
23612396 names.push_back (Form (" %s_%s_%s" , pairHistPrefixes[iPrefix].Data (), legsStr.Data (), sig.GetName ()));
23622397 histNames += Form (" %s;" , names[iPrefix].Data ());
23632398 }
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+ }
23642405 fBarrelHistNamesMCmatched [offset + icut] = names;
23652406
23662407 for (int iCommonCut = 0 ; iCommonCut < fNCommonTrackCuts ; ++iCommonCut) {
@@ -2489,6 +2530,8 @@ struct AnalysisAsymmetricPairing {
24892530 template <bool TTwoProngFitter, int TPairType, uint32_t TEventFillMap, uint32_t TTrackFillMap, typename TEvents, typename TTrackAssocs, typename TTracks>
24902531 void runAsymmetricPairing (TEvents const & events, Preslice<TTrackAssocs>& preslice, TTrackAssocs const & /* assocs*/ , TTracks const & /* tracks*/ , ReducedMCEvents const & /* mcEvents*/ , ReducedMCTracks const & /* mcTracks*/ )
24912532 {
2533+ fPairCount .clear ();
2534+
24922535 if (events.size () > 0 ) { // Additional protection to avoid crashing of events.begin().runNumber()
24932536 if (fCurrentRun != events.begin ().runNumber ()) {
24942537 initParamsFromCCDB (events.begin ().timestamp (), false );
@@ -2558,6 +2601,18 @@ struct AnalysisAsymmetricPairing {
25582601 continue ;
25592602 }
25602603
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+
25612616 sign1 = t1.sign ();
25622617 sign2 = t2.sign ();
25632618 // store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter
@@ -2573,6 +2628,7 @@ struct AnalysisAsymmetricPairing {
25732628 mcDecision = 0 ;
25742629 for (auto sig = fRecMCSignals .begin (); sig != fRecMCSignals .end (); sig++, isig++) {
25752630 if (t1.has_reducedMCTrack () && t2.has_reducedMCTrack ()) {
2631+ VarManager::FillPairMC<TPairType>(t1.reducedMCTrack (), t2.reducedMCTrack ());
25762632 if ((*sig).CheckSignal (true , t1.reducedMCTrack (), t2.reducedMCTrack ())) {
25772633 mcDecision |= static_cast <uint32_t >(1 ) << isig;
25782634 }
@@ -2592,18 +2648,27 @@ struct AnalysisAsymmetricPairing {
25922648 if (sign1 * sign2 < 0 ) { // +- pairs
25932649 fHistMan ->FillHistClass (histNames[icut][0 ].Data (), VarManager::fgValues); // reconstructed, unmatched
25942650 if (isAmbi && fConfigQA ) {
2595- 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);
25962655 }
25972656 } else if (fConfigSameSignHistograms .value ) {
25982657 if (sign1 > 0 ) { // ++ pairs
25992658 fHistMan ->FillHistClass (histNames[icut][1 ].Data (), VarManager::fgValues);
26002659 if (isAmbi && fConfigQA ) {
2601- 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);
26022664 }
26032665 } else { // -- pairs
26042666 fHistMan ->FillHistClass (histNames[icut][2 ].Data (), VarManager::fgValues);
26052667 if (isAmbi && fConfigQA ) {
2606- 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);
26072672 }
26082673 }
26092674 }
@@ -2612,11 +2677,20 @@ struct AnalysisAsymmetricPairing {
26122677 if (mcDecision & (static_cast <uint32_t >(1 ) << isig)) {
26132678 if (sign1 * sign2 < 0 ) {
26142679 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+ }
26152683 } else if (fConfigSameSignHistograms .value ) {
26162684 if (sign1 > 0 ) {
26172685 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+ }
26182689 } else {
26192690 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+ }
26202694 }
26212695 }
26222696 }
@@ -2648,9 +2722,9 @@ struct AnalysisAsymmetricPairing {
26482722 }
26492723 }
26502724 } // end loop (common cuts)
2651- for ( unsigned int iPairCut = 0 ; iPairCut < fPairCuts . size (); iPairCut++) {
2652- AnalysisCompositeCut cut = fPairCuts .at (iPairCut);
2653- if (!(cut. IsSelected (VarManager::fgValues))) // apply pair cuts
2725+ int iPairCut = 0 ;
2726+ for ( auto cut = fPairCuts . begin (); cut ! = fPairCuts .end (); cut++, iPairCut++) {
2727+ if (!((* cut)-> IsSelected (VarManager::fgValues))) // apply pair cuts
26542728 continue ;
26552729 pairFilter |= (static_cast <uint32_t >(1 ) << iPairCut);
26562730 // Histograms with pair cuts
@@ -2881,11 +2955,10 @@ struct AnalysisAsymmetricPairing {
28812955 } // end loop (MC signals)
28822956 }
28832957 } // end loop (common cuts)
2884- for ( unsigned int iPairCut = 0 ; iPairCut < fPairCuts . size (); iPairCut++) {
2885- AnalysisCompositeCut cut = fPairCuts .at (iPairCut);
2886- if (!(cut. IsSelected (VarManager::fgValues))) { // apply pair cuts
2958+ int iPairCut = 0 ;
2959+ for ( auto cut = fPairCuts . begin (); cut ! = fPairCuts .end (); cut++, iPairCut++) {
2960+ if (!((* cut)-> IsSelected (VarManager::fgValues))) // apply pair cuts
28872961 continue ;
2888- }
28892962 // Histograms with pair cuts
28902963 fHistMan ->FillHistClass (histNames[fNLegCuts * (fNCommonTrackCuts + 1 ) + icut * fNPairCuts + iPairCut][0 ].Data (), VarManager::fgValues);
28912964 for (unsigned int isig = 0 ; isig < fRecMCSignals .size (); isig++) { // loop over MC signals
0 commit comments