testHistogram.cc
Go to the documentation of this file.
1 
9 #include <iostream>
10 #include <utl/Histogram.h>
11 #include <utl/CountedObject.h>
12 #include <utl/CountedObjectRegistry.h>
13 
14 #include <tst/Verify.h>
15 #include <cppunit/extensions/HelperMacros.h>
16 
17 using namespace std;
18 using namespace utl;
19 using namespace tst;
20 
21 #define ASSERT_EQUAL(x, y) CPPUNIT_ASSERT(Verify<Equal>(x, y))
22 #define ASSERT_CLOSE(x, y) CPPUNIT_ASSERT(Verify<CloseTo>(x, y))
23 
24 #define ASSERT_OBJECT_COUNTS(o, c, d) \
25  ASSERT_EQUAL(CountedObject<o>::GetObjectsCreated(), c); \
26  ASSERT_EQUAL(CountedObject<o>::GetObjectsDestroyed(), d)
27 
28 #define ASSERT_EXTENDED_OBJECT_COUNTS(o, c, d, cp, a) \
29  ASSERT_OBJECT_COUNTS(o, c, d); \
30  ASSERT_EQUAL(CountedObject<o>::GetObjectsCopied(), cp); \
31  ASSERT_EQUAL(CountedObject<o>::GetObjectsAssigned(), a)
32 
33 
37 class HistogramTest : public CppUnit::TestFixture {
38 
39  CPPUNIT_TEST_SUITE(HistogramTest);
40  CPPUNIT_TEST(testEqualBinning);
41  CPPUNIT_TEST(testVariableBinning);
42  CPPUNIT_TEST(testSharedBinning);
43  CPPUNIT_TEST(testHistogramWrap);
44  CPPUNIT_TEST(testBinEdges);
45  CPPUNIT_TEST_SUITE_END();
46 
47 public:
48  void setUp() { }
49 
50  void tearDown() { }
51 
52  void
54  {
55  const double eps = 1e-9;
56 
57  Histogram<double> h1(10, 0, 1);
58 
59  ASSERT_EQUAL(h1.GetNBins(), size_t(10));
60  ASSERT_EQUAL(h1.GetStart(), 0.);
61  ASSERT_EQUAL(h1.GetStop(), 1.);
62  ASSERT_EQUAL(h1.GetBinIndex(-eps), size_t(Histogram<double>::eUnderflow));
63  ASSERT_EQUAL(h1.GetBinIndex(0.), size_t(0));
64  for (int i = 1; i < 10; ++i) {
65  ASSERT_EQUAL(h1.GetBinIndex(i/10. - eps), size_t(i-1));
66  ASSERT_EQUAL(h1.GetBinIndex(i/10. + eps), size_t(i));
67  }
68  ASSERT_EQUAL(h1.GetBinIndex(1 - eps), size_t(9));
69  ASSERT_EQUAL(h1.GetBinIndex(1.), size_t(Histogram<double>::eOverflow));
70  for (int i = 0; i < 10; ++i)
71  ASSERT_EQUAL(h1.GetBin(i), 0.);
72 
73  h1.Fill(0.45);
74  ASSERT_EQUAL(h1.GetBin(4), 1.);
75 
76  const double some = 123;
77  vector<double> dataBins(10, some);
78 
79  Histogram<double> h2(0, 1, dataBins);
80 
81  ASSERT_EQUAL(h2.GetNBins(), size_t(10));
82  ASSERT_EQUAL(h2.GetStart(), 0.);
83  ASSERT_EQUAL(h2.GetStop(), 1.);
84  // check it is really a copy
85  for (int i = 0; i < 10; ++i) {
86  ASSERT_EQUAL(h2.GetBin(i), some);
87  dataBins[i] = 0;
88  ASSERT_EQUAL(h2.GetBin(i), some);
89  }
90  }
91 
92  void
94  {
95  const double eps = 1e-9;
96 
97  vector<double> binEdges;
98  for (int i = 0; i <= 10; ++i)
99  binEdges.push_back(i/10.);
100 
101  VariableBinHistogram<double> h1(binEdges);
102 
103  ASSERT_EQUAL(h1.GetNBins(), size_t(10));
104  ASSERT_EQUAL(h1.GetStart(), 0.);
105  ASSERT_EQUAL(h1.GetStop(), 1.);
106  ASSERT_EQUAL(h1.GetBinIndex(-eps), size_t(Histogram<double>::eUnderflow));
107  ASSERT_EQUAL(h1.GetBinIndex(0.), size_t(0));
108  for (int i = 1; i < 10; ++i) {
109  ASSERT_EQUAL(h1.GetBinIndex(i/10. - eps), size_t(i-1));
110  ASSERT_EQUAL(h1.GetBinIndex(i/10. + eps), size_t(i));
111  }
112  ASSERT_EQUAL(h1.GetBinIndex(1 - eps), size_t(9));
113  ASSERT_EQUAL(h1.GetBinIndex(1.), size_t(Histogram<double>::eOverflow));
114  // check it is really a copy
115  for (int i = 0; i <= 10; ++i) {
116  ASSERT_CLOSE(h1.GetBinLowerEdges()[i], i/10.);
117  binEdges[i] = 0;
118  ASSERT_CLOSE(h1.GetBinLowerEdges()[i], i/10.);
119  binEdges[i] = i/10.;
120  }
121 
122  const double some = 123;
123  vector<double> dataBins(10, some);
124 
125  VariableBinHistogram<double, double> h2(binEdges, dataBins);
126 
127  ASSERT_EQUAL(h2.GetNBins(), size_t(10));
128  ASSERT_EQUAL(h2.GetStart(), 0.);
129  ASSERT_EQUAL(h2.GetStop(), 1.);
130  // check it is really a copy
131  for (int i = 0; i <= 10; ++i) {
132  ASSERT_CLOSE(h2.GetBinLowerEdges()[i], i/10.);
133  binEdges[i] = 0;
134  ASSERT_CLOSE(h2.GetBinLowerEdges()[i], i/10.);
135  if (i < 10) {
136  ASSERT_EQUAL(h2.GetBin(i), some);
137  dataBins[i] = 0;
138  ASSERT_EQUAL(h2.GetBin(i), some);
139  }
140  }
141  }
142 
143  void
145  {
146  vector<int> edges(10);
147  for (int i = 0; i < 10; ++i)
148  edges[i] = i*i;
149 
150  SharedBinHistogram<int> h(edges);
151 
152  ASSERT_EQUAL(h.GetNBins(), size_t(9));
153  ASSERT_EQUAL(h.GetStart(), 0);
154  ASSERT_EQUAL(h.GetStop(), 9*9);
155  ASSERT_EQUAL(h.GetBinLowerEdge(0), 0);
156  ASSERT_EQUAL(h.GetBinLowerEdge(1), 1);
157  ASSERT_EQUAL(h.GetBinLowerEdge(2), 4);
158 
159  // check it is a reference
160  edges[0] = edges[1] = edges[2] = 13;
161  ASSERT_EQUAL(h.GetBinLowerEdge(0), 13);
162  ASSERT_EQUAL(h.GetBinLowerEdge(1), 13);
163  ASSERT_EQUAL(h.GetBinLowerEdge(2), 13);
164  ASSERT_EQUAL(h.GetBinLowerEdge(3), 9);
165  }
166 
167  void
169  {
170  const int n = 120;
171  vector<char> x(n+1);
172  vector<unsigned short int> y(n);
173  for (int i = 0; i < n; ++i) {
174  x[i] = i;
175  y[i] = i;
176  }
177  x[n] = n;
178 
180 
181  ASSERT_EQUAL(hw.GetNBins(), size_t(n));
182  ASSERT_EQUAL(hw.GetStart(), 0.);
183  ASSERT_EQUAL(hw.GetStop(), 1.);
184  ASSERT_EQUAL(hw.GetBin(10), (unsigned short int)(10));
185  // check for reference
186  y[0] = 13;
187  ASSERT_EQUAL(hw.GetBin(0), (unsigned short int)(13));
188 
190 
191  ASSERT_EQUAL(vhw.GetNBins(), size_t(n));
192  ASSERT_EQUAL(vhw.GetStart(), char(0));
193  ASSERT_EQUAL(vhw.GetStop(), char(n));
194  ASSERT_EQUAL(vhw.GetBin(0), (unsigned short int)(13));
195  ASSERT_EQUAL(vhw.GetBin(10), (unsigned short int)(10));
196  ASSERT_EQUAL(vhw.GetBinLowerEdge(0), char(0));
197  ASSERT_EQUAL(vhw.GetBinUpperEdge(0), char(1));
198  ASSERT_EQUAL(vhw.GetBinLowerEdge(1), char(1));
199  ASSERT_EQUAL(vhw.GetBinUpperEdge(1), char(2));
200  ASSERT_EQUAL(vhw.GetBinLowerEdge(2), char(2));
201  ASSERT_EQUAL(vhw.GetBinUpperEdge(2), char(3));
202  // test for reference
203  x[0] = 13;
204  ASSERT_EQUAL(vhw.GetBinLowerEdge(0), char(13));
205  y[0] = 666;
206  ASSERT_EQUAL(hw.GetBin(0), (unsigned short int)(666));
207  }
208 
209  void
211  {
212  Histogram<double> h(10, 0, 10);
213 
214  h.Fill(-0.001);
215  h.Fill(10);
216  for (int i = 0; i < 10; ++i)
217  h.Fill(i);
218 
219  for (int i = 0; i < 10; ++i)
220  ASSERT_EQUAL(h.GetBin(i), 1.);
221  }
222 
223 };
224 
225 
227 
228 
229 // Configure (x)emacs for this file ...
230 // Local Variables:
231 // mode: c++
232 // End:
void testVariableBinning()
size_t GetNBins() const
Definition: Histogram.h:40
void testHistogramWrap()
void testEqualBinning()
void Fill(const double x)
Definition: Histogram.h:210
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
#define ASSERT_CLOSE(x, y)
const BinType & GetBin(const size_t i) const
Definition: Histogram.h:222
#define ASSERT_EQUAL(x, y)
double eps
double GetStop() const
Definition: Histogram.h:44
void testSharedBinning()
BinEdgeType GetBinLowerEdge(const size_t bin) const
Definition: Histogram.h:95
double GetStart() const
Definition: Histogram.h:42

, generated on Tue Sep 26 2023.