@@ -1714,6 +1714,8 @@ struct AnalysisSameEventPairing {
17141714 } fConfigCuts ;
17151715
17161716 Configurable<bool > fConfigQA {" cfgQA" , false , " If true, fill QA histograms" };
1717+ Configurable<bool > fConfigAmbiguousBarrelHistograms {" cfgAmbiguousBarrelHistograms" , true , " If true, add the in/out-of-bunch ambiguity histogram classes for barrel pairs" };
1718+ Configurable<bool > fConfigAmbiguousMuonHistograms {" cfgAmbiguousMuonHistograms" , true , " If true, add the in/out-of-bunch ambiguity histogram classes for muon pairs" };
17171719 Configurable<std::string> fConfigAddSEPHistogram {" cfgAddSEPHistogram" , " " , " Comma separated list of histograms" };
17181720 Configurable<std::string> fConfigAddJSONHistograms {" cfgAddJSONHistograms" , " " , " Histograms in JSON format" };
17191721
@@ -1913,7 +1915,7 @@ struct AnalysisSameEventPairing {
19131915 Form (" PairsBarrelSEPM_%s" , objArray->At (icut)->GetName ()),
19141916 Form (" PairsBarrelSEPP_%s" , objArray->At (icut)->GetName ()),
19151917 Form (" PairsBarrelSEMM_%s" , objArray->At (icut)->GetName ())};
1916- if (fConfigQA ) {
1918+ if (fConfigQA && fConfigAmbiguousBarrelHistograms ) {
19171919 // assign separate hist directories for ambiguous tracks
19181920 names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunch_%s" , objArray->At (icut)->GetName ()));
19191921 names.push_back (Form (" PairsBarrelSEPP_ambiguousInBunch_%s" , objArray->At (icut)->GetName ()));
@@ -1956,12 +1958,14 @@ struct AnalysisSameEventPairing {
19561958 if (fConfigQA ) {
19571959 names.push_back (Form (" PairsBarrelSEPMCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
19581960 names.push_back (Form (" PairsBarrelSEPMIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1959- names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1960- names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1961- names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1962- names.push_back (Form (" PairsBarrelSEPM_ambiguousOutOfBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1963- names.push_back (Form (" PairsBarrelSEPM_ambiguousOutOfBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1964- names.push_back (Form (" PairsBarrelSEPM_ambiguousOutOfBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1961+ if (fConfigAmbiguousBarrelHistograms ) {
1962+ names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1963+ names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1964+ names.push_back (Form (" PairsBarrelSEPM_ambiguousInBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1965+ names.push_back (Form (" PairsBarrelSEPM_ambiguousOutOfBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1966+ names.push_back (Form (" PairsBarrelSEPM_ambiguousOutOfBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1967+ names.push_back (Form (" PairsBarrelSEPM_ambiguousOutOfBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
1968+ }
19651969 }
19661970 for (auto const & n : names) {
19671971 histNames += Form (" %s;" , n.Data ());
@@ -2004,7 +2008,7 @@ struct AnalysisSameEventPairing {
20042008 Form (" PairsMuonSEPM_%s" , objArray->At (icut)->GetName ()),
20052009 Form (" PairsMuonSEPP_%s" , objArray->At (icut)->GetName ()),
20062010 Form (" PairsMuonSEMM_%s" , objArray->At (icut)->GetName ())};
2007- if (fConfigQA ) {
2011+ if (fConfigQA && fConfigAmbiguousMuonHistograms ) {
20082012 // assign separate hist directories for ambiguous tracks
20092013 names.push_back (Form (" PairsMuonSEPM_ambiguousInBunch_%s" , objArray->At (icut)->GetName ()));
20102014 names.push_back (Form (" PairsMuonSEPP_ambiguousInBunch_%s" , objArray->At (icut)->GetName ()));
@@ -2045,12 +2049,14 @@ struct AnalysisSameEventPairing {
20452049 if (fConfigQA ) {
20462050 names.push_back (Form (" PairsMuonSEPMCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
20472051 names.push_back (Form (" PairsMuonSEPMIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2048- names.push_back (Form (" PairsMuonSEPM_ambiguousInBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2049- names.push_back (Form (" PairsMuonSEPM_ambiguousInBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2050- names.push_back (Form (" PairsMuonSEPM_ambiguousInBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2051- names.push_back (Form (" PairsMuonSEPM_ambiguousOutOfBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2052- names.push_back (Form (" PairsMuonSEPM_ambiguousOutOfBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2053- names.push_back (Form (" PairsMuonSEPM_ambiguousOutOfBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2052+ if (fConfigAmbiguousMuonHistograms ) {
2053+ names.push_back (Form (" PairsMuonSEPM_ambiguousInBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2054+ names.push_back (Form (" PairsMuonSEPM_ambiguousInBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2055+ names.push_back (Form (" PairsMuonSEPM_ambiguousInBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2056+ names.push_back (Form (" PairsMuonSEPM_ambiguousOutOfBunch_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2057+ names.push_back (Form (" PairsMuonSEPM_ambiguousOutOfBunchCorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2058+ names.push_back (Form (" PairsMuonSEPM_ambiguousOutOfBunchIncorrectAssoc_%s_%s" , objArray->At (icut)->GetName (), sig->GetName ()));
2059+ }
20542060 }
20552061 for (auto const & n : names) {
20562062 histNames += Form (" %s;" , n.Data ());
@@ -2154,12 +2160,15 @@ struct AnalysisSameEventPairing {
21542160 if (fConfigQA ) {
21552161 names.push_back (Form (" PairsEleMuSEPMCorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
21562162 names.push_back (Form (" PairsEleMuSEPMIncorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2157- names.push_back (Form (" PairsEleMuSEPM_ambiguousInBunch_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2158- names.push_back (Form (" PairsEleMuSEPM_ambiguousInBunchCorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2159- names.push_back (Form (" PairsEleMuSEPM_ambiguousInBunchIncorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2160- names.push_back (Form (" PairsEleMuSEPM_ambiguousOutOfBunch_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2161- names.push_back (Form (" PairsEleMuSEPM_ambiguousOutOfBunchCorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2162- names.push_back (Form (" PairsEleMuSEPM_ambiguousOutOfBunchIncorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2163+ // the e-mu ambiguity classes mix a barrel and a muon leg, so they need both switches
2164+ if (fConfigAmbiguousBarrelHistograms && fConfigAmbiguousMuonHistograms ) {
2165+ names.push_back (Form (" PairsEleMuSEPM_ambiguousInBunch_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2166+ names.push_back (Form (" PairsEleMuSEPM_ambiguousInBunchCorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2167+ names.push_back (Form (" PairsEleMuSEPM_ambiguousInBunchIncorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2168+ names.push_back (Form (" PairsEleMuSEPM_ambiguousOutOfBunch_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2169+ names.push_back (Form (" PairsEleMuSEPM_ambiguousOutOfBunchCorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2170+ names.push_back (Form (" PairsEleMuSEPM_ambiguousOutOfBunchIncorrectAssoc_%s_%s_%s" , trackCutName.Data (), muonCutName.Data (), sig->GetName ()));
2171+ }
21632172 }
21642173 for (auto const & n : names) {
21652174 histNames += Form (" %s;" , n.Data ());
@@ -2309,6 +2318,12 @@ struct AnalysisSameEventPairing {
23092318 histNamesMC = fMuonHistNamesMCmatched ;
23102319 ncuts = fNCutsMuon ;
23112320 }
2321+ // the in/out-of-bunch ambiguity hist classes are only booked (and therefore only fillable) when the
2322+ // corresponding switch is on; the indices below assume they are appended last in each name vector
2323+ bool fillAmbiguousHistos = fConfigAmbiguousBarrelHistograms ;
2324+ if constexpr (TPairType == VarManager::kDecayToMuMu ) {
2325+ fillAmbiguousHistos = fConfigAmbiguousMuonHistograms ;
2326+ }
23122327
23132328 auto twoTrackFilter = static_cast <uint32_t >(0 );
23142329 int sign1 = 0 ;
@@ -2629,15 +2644,15 @@ struct AnalysisSameEventPairing {
26292644 } else { // incorrect track-collision association
26302645 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][4 ].Data (), dqefficiency_helpers::varValues ());
26312646 }
2632- if (isAmbiInBunch) { // ambiguous in bunch
2647+ if (fillAmbiguousHistos && isAmbiInBunch) { // ambiguous in bunch
26332648 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][5 ].Data (), dqefficiency_helpers::varValues ());
26342649 if (isCorrectAssoc_leg1 && isCorrectAssoc_leg2) {
26352650 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][6 ].Data (), dqefficiency_helpers::varValues ());
26362651 } else {
26372652 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][7 ].Data (), dqefficiency_helpers::varValues ());
26382653 }
26392654 }
2640- if (isAmbiOutOfBunch) { // ambiguous out of bunch
2655+ if (fillAmbiguousHistos && isAmbiOutOfBunch) { // ambiguous out of bunch
26412656 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][8 ].Data (), dqefficiency_helpers::varValues ());
26422657 if (isCorrectAssoc_leg1 && isCorrectAssoc_leg2) {
26432658 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][9 ].Data (), dqefficiency_helpers::varValues ());
@@ -2647,7 +2662,7 @@ struct AnalysisSameEventPairing {
26472662 }
26482663 }
26492664 }
2650- if (fConfigQA ) {
2665+ if (fConfigQA && fillAmbiguousHistos ) {
26512666 if (isAmbiInBunch) {
26522667 fHistMan ->FillHistClass (histNames[icut][3 ].Data (), dqefficiency_helpers::varValues ());
26532668 }
@@ -2664,7 +2679,7 @@ struct AnalysisSameEventPairing {
26642679 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][1 ].Data (), dqefficiency_helpers::varValues ());
26652680 }
26662681 }
2667- if (fConfigQA ) {
2682+ if (fConfigQA && fillAmbiguousHistos ) {
26682683 if (isAmbiInBunch) {
26692684 fHistMan ->FillHistClass (histNames[icut][4 ].Data (), dqefficiency_helpers::varValues ());
26702685 }
@@ -2679,7 +2694,7 @@ struct AnalysisSameEventPairing {
26792694 fHistMan ->FillHistClass (histNamesMC[icut * fRecMCSignals .size () + isig][2 ].Data (), dqefficiency_helpers::varValues ());
26802695 }
26812696 }
2682- if (fConfigQA ) {
2697+ if (fConfigQA && fillAmbiguousHistos ) {
26832698 if (isAmbiInBunch) {
26842699 fHistMan ->FillHistClass (histNames[icut][5 ].Data (), dqefficiency_helpers::varValues ());
26852700 }
@@ -2859,6 +2874,8 @@ struct AnalysisSameEventPairing {
28592874 const auto & histNames = fTrackMuonHistNames ;
28602875 const auto & histNamesMC = fTrackMuonHistNamesMCmatched ;
28612876 int nPairCuts = !fPairCuts .empty () ? static_cast <int >(fPairCuts .size ()) : 1 ;
2877+ // e-mu pairs have one barrel and one muon leg, so the ambiguity classes need both switches
2878+ bool fillAmbiguousHistos = fConfigAmbiguousBarrelHistograms && fConfigAmbiguousMuonHistograms ;
28622879
28632880 uint32_t twoTrackFilter = 0 ;
28642881 uint32_t mcDecision = 0 ;
@@ -3021,7 +3038,7 @@ struct AnalysisSameEventPairing {
30213038 } else {
30223039 fHistMan ->FillHistClass (mcNames[2 ].Data (), dqefficiency_helpers::varValues ());
30233040 }
3024- if (!fConfigQA || mcNames.size () < 11 ) {
3041+ if (!fConfigQA || mcNames.size () < 5 ) {
30253042 continue ;
30263043 }
30273044 // QA fills (PM only, mirroring the dilepton MC layout: indices 3..10)
@@ -3031,6 +3048,9 @@ struct AnalysisSameEventPairing {
30313048 } else {
30323049 fHistMan ->FillHistClass (mcNames[4 ].Data (), dqefficiency_helpers::varValues ());
30333050 }
3051+ if (!fillAmbiguousHistos || mcNames.size () < 11 ) {
3052+ continue ;
3053+ }
30343054 if (isAmbiInBunch) {
30353055 fHistMan ->FillHistClass (mcNames[5 ].Data (), dqefficiency_helpers::varValues ());
30363056 if (isCorrectPair) {
0 commit comments