From 44bbc74b5a9e5fdba11ca96b6113b499eede8d1e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 4 Feb 2022 09:20:36 +0100 Subject: [PATCH] [QC-741] Mergers: support merging histograms with averages --- Utilities/Mergers/src/MergerAlgorithm.cxx | 12 +++++++++++- Utilities/Mergers/test/test_Algorithm.cxx | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Utilities/Mergers/src/MergerAlgorithm.cxx b/Utilities/Mergers/src/MergerAlgorithm.cxx index 77fa191cc04bc..db2f0f31c9f98 100644 --- a/Utilities/Mergers/src/MergerAlgorithm.cxx +++ b/Utilities/Mergers/src/MergerAlgorithm.cxx @@ -89,7 +89,17 @@ void merge(TObject* const target, TObject* const other) if (target->InheritsFrom(TH1::Class())) { // this includes TH1, TH2, TH3 - errorCode = reinterpret_cast(target)->Merge(&otherCollection); + auto targetTH1 = reinterpret_cast(target); + if (targetTH1->TestBit(TH1::kIsAverage)) { + // Merge() does not support averages, we have to use Add() + // this will break if collection.size != 1 + if (auto otherTH1 = dynamic_cast(otherCollection.First())) { + errorCode = targetTH1->Add(otherTH1); + } + } else { + // Add() does not support histograms with labels, thus we resort to Merge() by default + errorCode = targetTH1->Merge(&otherCollection); + } } else if (target->InheritsFrom(THnBase::Class())) { // this includes THn and THnSparse errorCode = reinterpret_cast(target)->Merge(&otherCollection); diff --git a/Utilities/Mergers/test/test_Algorithm.cxx b/Utilities/Mergers/test/test_Algorithm.cxx index 026afac303977..3cb15998cd244 100644 --- a/Utilities/Mergers/test/test_Algorithm.cxx +++ b/Utilities/Mergers/test/test_Algorithm.cxx @@ -330,3 +330,17 @@ BOOST_AUTO_TEST_CASE(Deleting) // I am afraid we can't check more than that. BOOST_CHECK_NO_THROW(algorithm::deleteTCollections(main)); } + +BOOST_AUTO_TEST_CASE(AverageHisto) +{ + TH1F* target = new TH1F("histo 1", "histo 1", bins, min, max); + target->SetBit(TH1::kIsAverage); + target->Fill(5); + + TH1F* other = new TH1F("histo 2", "histo 2", bins, min, max); + other->SetBit(TH1::kIsAverage); + other->Fill(5); + + BOOST_CHECK_NO_THROW(algorithm::merge(target, other)); + BOOST_CHECK_CLOSE(target->GetBinContent(other->FindBin(5)), 1.0, 0.001); +} \ No newline at end of file