Skip to content
Snippets Groups Projects
Histogram1DTest.h 7.33 KiB
Newer Older
  • Learn to ignore specific revisions
  • #ifndef HISTOGRAM1DTEST_H
    #define HISTOGRAM1DTEST_H
    
    #include "Histogram1D.h"
    #include "Exceptions.h"
    
    #include <memory>
    
    #include "gtest/gtest.h"
    
    class Histogram1DTest : public ::testing::Test
    {
     protected:
        Histogram1DTest(){}
        virtual ~Histogram1DTest(){}
    };
    
    TEST_F(Histogram1DTest, FixedBinConstructor)
    {
        Histogram1D hist(5, 0.0, 5.0);
    
    
        EXPECT_EQ(size_t(1), hist.getRank());
        EXPECT_EQ(size_t(5), hist.getTotalNumberOfBins());
    
        EXPECT_EQ(0.0, hist.getXmin());
        EXPECT_EQ(5.0, hist.getXmax());
        EXPECT_EQ(std::string("x-axis"), hist.getXaxis()->getName());
        EXPECT_THROW(hist.getYaxis(), LogicErrorException);
        for(size_t index=0; index<hist.getTotalNumberOfBins(); ++index) {
            EXPECT_EQ(index, hist.getGlobalBin(index));
    
            EXPECT_EQ(int(index), hist.getXaxisIndex(index));
    
        }
    }
    
    TEST_F(Histogram1DTest, FixedBinDefaultContent)
    {
        Histogram1D hist(5, 0.0, 5.0);
    
        // bin centers
    
        std::vector<double> bin_centers = {0.5, 1.5, 2.5, 3.5, 4.5};
    
        std::vector<double> centers = hist.getBinCenters();
        for(size_t index=0; index < bin_centers.size(); ++index) {
            EXPECT_EQ(centers[index], bin_centers[index]);
            EXPECT_EQ(hist.getXaxisValue(index), bin_centers[index]);
            EXPECT_EQ(hist.getXaxis()->getBinCenter(index), bin_centers[index]);
        }
    
        // default bin values
        std::vector<double> values = hist.getBinValues();
        for(size_t index=0; index < bin_centers.size(); ++index) {
            EXPECT_EQ(hist.getBinContent(index), 0.0);
            EXPECT_EQ(values[index], 0.0);
        }
    
        // default bin errors
        std::vector<double> errors = hist.getBinErrors();
        for(size_t index=0; index < bin_centers.size(); ++index) {
            EXPECT_EQ(hist.getBinError(index), 0.0);
            EXPECT_EQ(errors[index], 0.0);
        }
    
        // default bin entries
        for(size_t index=0; index < bin_centers.size(); ++index) {
            EXPECT_EQ(hist.getBinNumberOfEntries(index), 0);
        }
    
    }
    
    TEST_F(Histogram1DTest, FixedBinFill)
    {
        Histogram1D hist(5, 0.0, 5.0);
    
        // filling two different bins
    
        hist.fill(0.5, 88.0);
        hist.fill(4.5, 99.0);
        EXPECT_EQ(hist.getBinContent(0), 88.0);
        EXPECT_EQ(hist.getBinNumberOfEntries(0), 1);
        EXPECT_EQ(hist.getBinError(0), 0.0);
    
        EXPECT_EQ(hist.getBinContent(4), 99.0);
        EXPECT_EQ(hist.getBinNumberOfEntries(4), 1);
        EXPECT_EQ(hist.getBinError(4), 0.0);
    
    
        std::vector<double> values = {88.0, 0.0, 0.0, 0.0, 99.0};
    
        for(size_t index=0; index<hist.getTotalNumberOfBins(); ++index) {
            EXPECT_EQ(hist.getBinValues()[index], values[index]);
            EXPECT_EQ(hist.getBinErrors()[index], 0.0);
        }
    
        // resetting histograms
        hist.reset();
        EXPECT_EQ(hist.getBinContent(0), 0.0);
        EXPECT_EQ(hist.getBinNumberOfEntries(0), 0);
        EXPECT_EQ(hist.getBinError(0), 0.0);
        EXPECT_EQ(hist.getBinContent(4), 0.0);
        EXPECT_EQ(hist.getBinNumberOfEntries(4), 0);
        EXPECT_EQ(hist.getBinError(4), 0.0);
    
        // another fill
        const double xvalue(1.5);
        const int xbin = 1;
    
    
        hist.fill(xvalue, 1.0);
    
        hist.fill(xvalue, 3.0);
        EXPECT_EQ(2, hist.getBinNumberOfEntries(xbin));
        EXPECT_EQ(4.0, hist.getBinContent(xbin));
    
        EXPECT_EQ(2.0, hist.getBinAverage(xbin));
    
        EXPECT_EQ(1.0, hist.getBinError(xbin));
    
    
        // another fill
        hist.reset();
        hist.fill(xvalue, 1.0);
        hist.fill(xvalue, 2.0);
        hist.fill(xvalue, 3.0);
        EXPECT_EQ(3, hist.getBinNumberOfEntries(xbin));
        EXPECT_EQ(6.0, hist.getBinContent(xbin));
    
        EXPECT_EQ(2.0, hist.getBinAverage(xbin));
    
        EXPECT_EQ(2.0/3.0, hist.getBinError(xbin)*hist.getBinError(xbin));
    
    //     -1.0  -0.5        0.5   1.0        2.0  X
    
    TEST_F(Histogram1DTest, crop)
    {
    
        std::vector<double> xedges = {-1.0, -0.5, 0.5, 1.0, 2.0};
        std::vector<double> xvalues = {-0.75, 0.0, 0.75, 1.5};
    
        Histogram1D hist(4, xedges);
    
        for(size_t i=0; i<xvalues.size(); ++i) {
            hist.fill(xvalues[i], i*10);
        }
    
    
        std::unique_ptr<Histogram1D > crop(hist.crop(-0.49, 0.99));
    
    
        EXPECT_EQ(-0.5, crop->getXmin());
        EXPECT_EQ(1.0, crop->getXmax());
    
        EXPECT_EQ(10.0, crop->getBinContent(0));
        EXPECT_EQ(20.0, crop->getBinContent(1));
    }
    
    
    
    TEST_F(Histogram1DTest, CreateHistogram)
    {
        OutputData<double> data;
        data.addAxis("x-axis", 10, 0.0, 10.0);
        for(size_t i=0; i<data.getAllocatedSize(); ++i) {
            data[i] = double(i);
        }
    
    
        std::unique_ptr<IHistogram> hist(IHistogram::createHistogram(data));
    
        EXPECT_EQ(size_t(1), hist->getRank());
    
        EXPECT_EQ(data.getAllocatedSize(), hist->getNbinsX());
        EXPECT_EQ(data.getAxis(0)->getMin(), hist->getXmin());
        EXPECT_EQ(data.getAxis(0)->getMax(), hist->getXmax());
        for(size_t i=0; i<hist->getTotalNumberOfBins(); ++i) {
            EXPECT_EQ(data[i], hist->getBinContent(i));
            EXPECT_EQ(data[i], hist->getBinAverage(i));
            EXPECT_EQ(1, hist->getBinNumberOfEntries(i));
            EXPECT_EQ(0.0, hist->getBinError(i));
        }
    }
    
    TEST_F(Histogram1DTest, CreateOutputData)
    {
        Histogram1D hist(10, -5.0, 5.0);
    
        for(size_t i=0; i<hist.getNbinsX(); ++i) {
            hist.fill(hist.getXaxisValue(i), 1.0);
            hist.fill(hist.getXaxisValue(i), 3.0);
        }
    
    
        std::unique_ptr<OutputData<double> > data(hist.createOutputData(IHistogram::DataType::INTEGRAL));
    
        EXPECT_EQ(size_t(1), data->getRank());
    
        EXPECT_EQ(data->getAllocatedSize(), hist.getNbinsX());
        EXPECT_EQ(data->getAxis(0)->getMin(), hist.getXmin());
        EXPECT_EQ(data->getAxis(0)->getMax(), hist.getXmax());
        for(size_t i=0; i<data->getAllocatedSize(); ++i) {
            EXPECT_EQ(4.0, (*data)[i]);
        }
    
    
        data.reset(hist.createOutputData(IHistogram::DataType::AVERAGE));
    
        for(size_t i=0; i<data->getAllocatedSize(); ++i) {
            EXPECT_EQ(2.0, (*data)[i]);
        }
    
    
        data.reset(hist.createOutputData(IHistogram::DataType::STANDARD_ERROR));
    
        for(size_t i=0; i<data->getAllocatedSize(); ++i) {
            EXPECT_EQ(1.0, (*data)[i]);
        }
    
    
        data.reset(hist.createOutputData(IHistogram::DataType::NENTRIES));
    
        for(size_t i=0; i<data->getAllocatedSize(); ++i) {
            EXPECT_EQ(2.0, (*data)[i]);
        }
    }
    
    TEST_F(Histogram1DTest, GetMaximumGetMinimum)
    {
        Histogram1D hist(10, -5.0, 5.0);
        hist.fill(-4.5, 10.);
        EXPECT_EQ(10.0, hist.getMaximum());
    
        EXPECT_EQ(size_t(0), hist.getMaximumBinIndex());
    
        EXPECT_EQ(size_t(1), hist.getMinimumBinIndex());
    
    
        hist.fill(-3.5, 20.0);
        EXPECT_EQ(20.0, hist.getMaximum());
    
        EXPECT_EQ(size_t(1), hist.getMaximumBinIndex());
    
    TEST_F(Histogram1DTest, Scale)
    {
        Histogram1D hist(10, -5.0, 5.0);
    
        for(size_t i=0; i<hist.getTotalNumberOfBins(); ++i) {
            hist.fill(-4.5+i, 1.0);
        }
        hist.scale(10.0);
        for(size_t i=0; i<hist.getTotalNumberOfBins(); ++i) {
            EXPECT_EQ(10.0, hist.getBinContent(i));
        }
    
    }
    
    TEST_F(Histogram1DTest, Integral)
    {
        Histogram1D hist(10, -5.0, 5.0);
    
        for(size_t i=0; i<hist.getTotalNumberOfBins(); ++i) {
            hist.fill(-4.5+i, 1.0);
        }
        EXPECT_EQ(10.0, hist.integral());
    }
    
    TEST_F(Histogram1DTest, Addition)
    {
        Histogram1D hist1(10, -5.0, 5.0);
        for(size_t i=0; i<hist1.getTotalNumberOfBins(); ++i) {
            hist1.fill(-4.5+i, 1.0);
        }
    
        Histogram1D hist2(10, -5.0, 5.0);
        for(size_t i=0; i<hist2.getTotalNumberOfBins(); ++i) {
            hist2.fill(-4.5+i, 2.0);
        }
    
        hist1 += hist2;
        for(size_t i=0; i<hist1.getTotalNumberOfBins(); ++i) {
            EXPECT_EQ(3.0, hist1.getBinContent(i));
        }
    }