diff --git a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h index 59f1e5f31bbf74fb59a8607eb7226331cfb5da10..60e5cb7560171dd2118d3bf8a237180eab2bb4a2 100644 --- a/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h +++ b/Control/AthenaMonitoringKernel/AthenaMonitoringKernel/HistogramFiller.h @@ -14,6 +14,8 @@ #include "AthenaMonitoringKernel/IHistogramProvider.h" #include "AthenaMonitoringKernel/IMonitoredVariable.h" +class TProfile; + namespace Monitored { // Forward declare generic histogram filler (see HistogramFillerUtils.h) diff --git a/Control/AthenaMonitoringKernel/src/HistogramFiller/VecHistogramFiller1D.h b/Control/AthenaMonitoringKernel/src/HistogramFiller/VecHistogramFiller1D.h index 27ecc1c19d164512785a5911276f544c6c78052d..fd212d1f54c519520ddaabff8b2c06695a641943 100644 --- a/Control/AthenaMonitoringKernel/src/HistogramFiller/VecHistogramFiller1D.h +++ b/Control/AthenaMonitoringKernel/src/HistogramFiller/VecHistogramFiller1D.h @@ -15,7 +15,7 @@ namespace Monitored { virtual unsigned fill(const HistogramFiller::VariablesPack& vars) const override { - if ( ATH_UNLIKELY( vars.var[0] == nullptr or vars.size() != 0 ) ) { return 0; } + if ( ATH_UNLIKELY(vars.size() == 0 or vars.var[0] == nullptr) ) { return 0; } std::function<bool(size_t)> cutMaskAccessor; if (vars.cut) { @@ -33,7 +33,7 @@ namespace Monitored { auto histogram = this->histogram<TH1>(); const unsigned offset = m_histDef->kVecUO ? 0 : 1; for (unsigned i = 0; i < vars.var[0]->size(); ++i) { - if (cutMaskAccessor && cutMaskAccessor(i)) { + if (cutMaskAccessor == nullptr or cutMaskAccessor(i)) { const double value = vars.var[0]->get(i); histogram->AddBinContent(i+offset, value); histogram->SetEntries(histogram->GetEntries() + value); diff --git a/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable1DTestSuite.cxx b/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable1DTestSuite.cxx index 4133e65d0efb96343a29913f455dee260cac8006..9723b256e8accd9b03bfeb86b79ffbc852db6946 100644 --- a/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable1DTestSuite.cxx +++ b/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable1DTestSuite.cxx @@ -23,6 +23,7 @@ #include "AthenaMonitoringKernel/MonitoredScalar.h" #include "../src/HistogramFiller/HistogramFillerRebinable.h" +#include "mocks/MockHistogramDef.h" #include "mocks/MockHistogramProvider.h" using namespace std; @@ -223,7 +224,7 @@ class HistogramFillerRebinable1DTestSuite { private: MsgStream m_log; - HistogramDef m_histogramDef; + MockHistogramDef m_histogramDef; shared_ptr<MockHistogramProvider> m_histogramProvider; shared_ptr<TH1D> m_histogram; diff --git a/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable2DTestSuite.cxx b/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable2DTestSuite.cxx index f55abb00313aa8dc81bd34a738c6fe8c2514d0f8..dfc5328225e65a1dca76eb4dd83b4bcaaa850abb 100644 --- a/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable2DTestSuite.cxx +++ b/Control/AthenaMonitoringKernel/test/HistogramFillerRebinable2DTestSuite.cxx @@ -26,6 +26,7 @@ #include "AthenaMonitoringKernel/MonitoredScalar.h" #include "../src/HistogramFiller/HistogramFillerRebinable.h" +#include "mocks/MockHistogramDef.h" #include "mocks/MockHistogramProvider.h" using namespace std; @@ -122,7 +123,7 @@ class HistogramFillerRebinable2DTestSuite { private: MsgStream m_log; - HistogramDef m_histogramDef; + MockHistogramDef m_histogramDef; shared_ptr<MockHistogramProvider> m_histogramProvider; shared_ptr<TH2D> m_histogram; diff --git a/Control/AthenaMonitoringKernel/test/HistogramFillerVec1DTestSuite.cxx b/Control/AthenaMonitoringKernel/test/HistogramFillerVec1DTestSuite.cxx new file mode 100644 index 0000000000000000000000000000000000000000..c4f9c011a55fdbe595534a52cb76d347bd2800a9 --- /dev/null +++ b/Control/AthenaMonitoringKernel/test/HistogramFillerVec1DTestSuite.cxx @@ -0,0 +1,192 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +#include <list> +#include <functional> +#include <memory> + +#include "TestTools/initGaudi.h" +#include "TestTools/expect.h" +#include "GaudiKernel/MsgStream.h" +#include "GaudiKernel/ITHistSvc.h" +#include "AthenaKernel/getMessageSvc.h" + +#include "TH1.h" + +#include "AthenaMonitoringKernel/MonitoredCollection.h" +#include "../src/HistogramFiller/VecHistogramFiller1D.h" + +#include "mocks/MockHistogramDef.h" +#include "mocks/MockHistogramProvider.h" + +using namespace std; +using namespace Monitored; + +#define REGISTER_TEST_CASE(TEST_CASE_NAME, KVECUO) registerTestCase(&HistogramFillerVec1DTestSuite::TEST_CASE_NAME, #TEST_CASE_NAME, KVECUO) + +class HistogramFillerVec1DTestSuite { + // ==================== All registered test cases ==================== + private: + list<function<void(void)>> registeredTestCases() { + return { + REGISTER_TEST_CASE(test_fillWithVector, false), + REGISTER_TEST_CASE(test_fillWithShortVector, false), + REGISTER_TEST_CASE(test_fillWithVectorUO, true), + REGISTER_TEST_CASE(test_fillWithShortVectorUO, true) + }; + } + + // ==================== Test code ==================== + private: + void beforeEach(bool kVecUO) { + if (kVecUO) { + m_histogramDef.kVecUO = true; + } else { + m_histogramDef.kVec = true; + } + m_histogramProvider.reset(new MockHistogramProvider()); + m_histogram.reset(new TH1D("MockHistogram", "Mock Histogram", 5, 0.0, 5.0)); + m_testObj.reset(new VecHistogramFiller1D(m_histogramDef, m_histogramProvider)); + + m_histogramProvider->mock_histogram = [this]() { return m_histogram.get(); }; + } + + void afterEach() { + } + + void test_fillWithVector() { + + using Coll = vector<double>; + Coll values({1., 2., 3., 4., 5.}); + auto var = Monitored::Collection("values", values); + + HistogramFiller::VariablesPack vars({&var}); + + VALUE(m_histogram->GetXaxis()->GetNbins()) EXPECTED(5); + VALUE(m_histogram->GetXaxis()->GetXmin()) EXPECTED(0.0); + VALUE(m_histogram->GetXaxis()->GetXmax()) EXPECTED(5.0); + + m_testObj->fill(vars); + + for (unsigned i: {0, 6}) { + VALUE(m_histogram->GetBinContent(i)) EXPECTED(0.0); + } + for (unsigned i = 0; i != values.size(); ++ i) { + VALUE(m_histogram->GetBinContent(i+1)) EXPECTED(values[i]); + } + } + + void test_fillWithShortVector() { + + using Coll = vector<double>; + Coll values({1., 2., 3.}); + auto var = Monitored::Collection("values", values); + + HistogramFiller::VariablesPack vars({&var}); + + VALUE(m_histogram->GetXaxis()->GetNbins()) EXPECTED(5); + VALUE(m_histogram->GetXaxis()->GetXmin()) EXPECTED(0.0); + VALUE(m_histogram->GetXaxis()->GetXmax()) EXPECTED(5.0); + + m_testObj->fill(vars); + + for (unsigned i: {0, 4, 5, 6}) { + VALUE(m_histogram->GetBinContent(i)) EXPECTED(0.0); + } + for (unsigned i = 0; i != values.size(); ++ i) { + VALUE(m_histogram->GetBinContent(i+1)) EXPECTED(values[i]); + } + } + + void test_fillWithVectorUO() { + + using Coll = vector<double>; + Coll values({1., 2., 3., 4., 5., 6., 7.}); + auto var = Monitored::Collection("values", values); + + HistogramFiller::VariablesPack vars({&var}); + + VALUE(m_histogram->GetXaxis()->GetNbins()) EXPECTED(5); + VALUE(m_histogram->GetXaxis()->GetXmin()) EXPECTED(0.0); + VALUE(m_histogram->GetXaxis()->GetXmax()) EXPECTED(5.0); + + m_testObj->fill(vars); + + for (unsigned i = 0; i != values.size(); ++ i) { + VALUE(m_histogram->GetBinContent(i)) EXPECTED(values[i]); + } + } + + void test_fillWithShortVectorUO() { + + using Coll = vector<double>; + Coll values({1., 2., 3., 4., 5.}); + auto var = Monitored::Collection("values", values); + + HistogramFiller::VariablesPack vars({&var}); + + VALUE(m_histogram->GetXaxis()->GetNbins()) EXPECTED(5); + VALUE(m_histogram->GetXaxis()->GetXmin()) EXPECTED(0.0); + VALUE(m_histogram->GetXaxis()->GetXmax()) EXPECTED(5.0); + + m_testObj->fill(vars); + + for (unsigned i: {5, 6}) { + VALUE(m_histogram->GetBinContent(i)) EXPECTED(0.0); + } + for (unsigned i = 0; i != values.size(); ++ i) { + VALUE(m_histogram->GetBinContent(i)) EXPECTED(values[i]); + } + } + + // ==================== Helper methods ==================== + private: + + // ==================== Initialization & run ==================== + public: + HistogramFillerVec1DTestSuite() + : m_log(Athena::getMessageSvc(), "HistogramFillerVec1DTestSuite") { + } + + void run() { + for (function<void(void)> testCase : registeredTestCases()) { + testCase(); + } + } + + // ==================== Test case registration ==================== + private: + typedef void (HistogramFillerVec1DTestSuite::*TestCase)(void); + + function<void(void)> registerTestCase(TestCase testCase, const string& testCaseName, bool kVecUO) { + return [this, testCase, testCaseName, kVecUO]() { + m_log << MSG::INFO << "Current test case: " << testCaseName << endmsg; + beforeEach(kVecUO); + invoke(testCase, this); + afterEach(); + }; + } + + // ==================== Properties ==================== + private: + MsgStream m_log; + + MockHistogramDef m_histogramDef; + shared_ptr<MockHistogramProvider> m_histogramProvider; + shared_ptr<TH1D> m_histogram; + + shared_ptr<VecHistogramFiller1D> m_testObj; +}; + +int main() { + ISvcLocator* pSvcLoc; + + if (!Athena_test::initGaudi("GenericMon.txt", pSvcLoc)) { + throw runtime_error("This test can not be run: GenericMon.txt is missing"); + } + + HistogramFillerVec1DTestSuite().run(); + + return 0; +}