8 #include <tst/Verify.h>
10 #include <utl/AugerUnits.h>
12 #include <cppunit/extensions/HelperMacros.h>
13 #include <boost/tuple/tuple.hpp>
15 #include <utl/TimeDistribution.h>
16 #include <utl/MultiTimeDistribution.h>
18 #include <utl/TimeDistributionAlgorithm.h>
32 CPPUNIT_TEST(testInitialize);
33 CPPUNIT_TEST(testBinSizes);
34 CPPUNIT_TEST(testOperatorBracket);
35 CPPUNIT_TEST(testSparsness);
36 CPPUNIT_TEST(testAssignment);
38 CPPUNIT_TEST(testEqual);
39 CPPUNIT_TEST(testOperatorArithmetic);
43 CPPUNIT_TEST(testSparseIterator);
44 CPPUNIT_TEST(testMultiTimeDistribution);
46 CPPUNIT_TEST(testAlgorithms);
48 CPPUNIT_TEST_SUITE_END();
65 for (
int i = -10 ; i <= 10 ; ++i)
66 td1->AddTime(i,
double(i));
71 for (
int i = 0 ; i < 30 ; ++i) {
72 const double time = (1/3.0)*i - 5 + 1e-6;
77 for (
int i = 0 ; i < 30 ; ++i) {
78 const double time = (1/3.0)*i - 5 + 1e-6;
79 td2weighted->AddTime(time, 2.0);
86 for (
int i = -10 ; i <= 0 ; ++i)
87 td3->AddTime(i,
double(i));
88 for (
int i = 11 ; i <= 20 ; ++i)
89 td3->AddTime(i,
double(i));
94 for (
int i = -10 ; i <= 10 ; ++i)
99 for (
int i = 3 ; i <= 5 ; ++i)
100 td5->AddTime(i,
double(i));
101 for (
int i = 25; i <= 30; ++i)
102 td5->AddTime(i,
double(i));
106 for (
int i = 3 ; i <= 5 ; ++i)
107 td6->AddTime(i,
double(i));
125 CPPUNIT_ASSERT(Verify<CloseTo>(td1->GetBinning(), 1*
nanosecond));
132 tdi != td1->SparseEnd(); ++tdi)
133 CPPUNIT_ASSERT(Verify<CloseTo>(
double(tdi->get<0>()), tdi->get<1>()));
142 for (
int i = -10 ; i <= 10 ; ++i) {
143 CPPUNIT_ASSERT(Verify<CloseTo>(copyTd[i],
double(i)));
144 CPPUNIT_ASSERT(Verify<CloseTo>(copyTd.
At(i), double(i)));
152 for (
int i = -10 ; i <= 10 ; ++i) {
153 CPPUNIT_ASSERT(Verify<CloseTo>((*td1)[i],
double(i)));
154 CPPUNIT_ASSERT(Verify<CloseTo>(td1->At(i), double(i)));
155 CPPUNIT_ASSERT(Verify<Equal>((*td4)[i], i));
156 CPPUNIT_ASSERT(Verify<Equal>(td4->At(i), i));
159 CPPUNIT_ASSERT(Verify<CloseTo>((*td1)[i],
double(i) + 2));
160 CPPUNIT_ASSERT(Verify<CloseTo>(td1->At(i), double(i) + 2));
163 CPPUNIT_ASSERT(Verify<Equal>((*td4)[i], i + 2));
164 CPPUNIT_ASSERT(Verify<Equal>(td4->At(i), i + 2));
168 for (
int i = -20 ; i < -10 ; ++i) {
169 CPPUNIT_ASSERT(Verify<CloseTo>((*td1)[i], 0.0));
170 CPPUNIT_ASSERT(Verify<CloseTo>(td1->At(i), 0.0));
171 CPPUNIT_ASSERT(Verify<Equal>((*td4)[i], 0));
172 CPPUNIT_ASSERT(Verify<Equal>(td4->At(i), 0));
175 CPPUNIT_ASSERT(Verify<CloseTo>((*td1)[i], 10.0));
176 CPPUNIT_ASSERT(Verify<CloseTo>(td1->At(i), 10.0));
178 CPPUNIT_ASSERT(Verify<Equal>((*td4)[i], 10));
179 CPPUNIT_ASSERT(Verify<Equal>(td4->At(i), 10));
181 for (
int i = 11 ; i < 20 ; ++i) {
182 CPPUNIT_ASSERT(Verify<CloseTo>((*td1)[i], 0.0));
183 CPPUNIT_ASSERT(Verify<CloseTo>(td1->At(i), 0.0));
184 CPPUNIT_ASSERT(Verify<Equal>((*td4)[i], 0));
185 CPPUNIT_ASSERT(Verify<Equal>(td4->At(i), 0));
189 for (
int i = -5 ; i < 4 ; ++i) {
190 CPPUNIT_ASSERT(Verify<CloseTo>((*td2)[i], 3.0));
191 CPPUNIT_ASSERT(Verify<CloseTo>(td2->At(i), 3.0));
196 for (
int i = -5 ; i < 4 ; ++i) {
197 CPPUNIT_ASSERT(Verify<CloseTo>((*td2weighted)[i], 6.0));
198 CPPUNIT_ASSERT(Verify<CloseTo>(td2weighted->At(i), 6.0));
202 for (
int i = 0 ; i < 30 ; ++i) {
203 const double time = (1/3.0)*i - 5 + 1e-6;
204 CPPUNIT_ASSERT(Verify<CloseTo>((*td2)[time], 3.0));
205 CPPUNIT_ASSERT(Verify<CloseTo>(td2->At(time), 3.0));
209 CPPUNIT_ASSERT(Verify<Equal>(td3->GetStart(), -10));
210 CPPUNIT_ASSERT(Verify<Equal>(td3->GetNumSlots(), 31));
211 CPPUNIT_ASSERT(Verify<Equal>(td3->GetStop(), 20));
214 CPPUNIT_ASSERT(Verify<Equal>(tdEmpty.
GetNumSlots(), 0));
215 CPPUNIT_ASSERT(Verify<Equal>(tdEmpty.
GetStart(), 0));
216 CPPUNIT_ASSERT(Verify<Equal>(tdEmpty.
GetStop(), -1));
224 for (
int i = 0; i < 10; ++i)
226 for (
int i = 0; i < 10; ++i)
227 CPPUNIT_ASSERT(Verify<Equal>(td.
At(i), i));
230 CPPUNIT_ASSERT(Verify<Equal>(first->get<0>(), 1));
231 CPPUNIT_ASSERT(Verify<Equal>(first->get<1>(), 1));
235 CPPUNIT_ASSERT(Verify<Equal>(first->get<0>(), 2));
236 CPPUNIT_ASSERT(Verify<Equal>(first->get<1>(), 2));
240 CPPUNIT_ASSERT(Verify<Equal>(first->get<0>(), 3));
241 CPPUNIT_ASSERT(Verify<Equal>(first->get<1>(), 3));
243 for (
int i = 0; i < 10; ++i)
251 for (
int i = 0; i < 10; ++i)
253 for (
int i = 0; i < 10; ++i)
254 CPPUNIT_ASSERT(Verify<CloseTo>(td.
At(i), double(i)));
256 CPPUNIT_ASSERT(Verify<CloseTo>(first->get<0>(), 1));
257 CPPUNIT_ASSERT(Verify<CloseTo>(first->get<1>(),
double(1)));
260 CPPUNIT_ASSERT(Verify<CloseTo>(first->get<0>(), 2));
261 CPPUNIT_ASSERT(Verify<CloseTo>(first->get<1>(),
double(2)));
264 CPPUNIT_ASSERT(Verify<CloseTo>(first->get<0>(), 3));
265 CPPUNIT_ASSERT(Verify<CloseTo>(first->get<1>(),
double(3)));
266 for (
int i = 0; i < 10; ++i)
290 CPPUNIT_ASSERT(Verify<Equal>(sit->get<0>(),
int(sit->get<1>())));
292 CPPUNIT_ASSERT(Verify<Equal>(sum, 30-1));
296 if (i <= 0 || (i >= 11 && i <= 20) || (i >= 3 && i <= 5) ||
297 (i >= 30 && i <= 35)) {
298 CPPUNIT_ASSERT(Verify<Equal>(i,
int(tdSum[i])));
299 CPPUNIT_ASSERT(Verify<Equal>(i,
int(tdSum.
At(i))));
305 CPPUNIT_ASSERT(Verify<Equal>(2*i,
int(tdSum2[i])));
306 CPPUNIT_ASSERT(Verify<Equal>(2*i,
int(tdSum2.
At(i))));
316 sit != td3->SparseEnd(); ++sit, ++i) {
319 CPPUNIT_ASSERT((*sit == boost::make_tuple<const int, const double>(i, i)));
325 sit != td3->SparseEnd(); ++sit, ++i) {
328 CPPUNIT_ASSERT(sit->get<0>() == i);
329 CPPUNIT_ASSERT(sit->get<1>() == i);
335 sit != td3->SparseEnd(); ++sit, ++i) {
339 CPPUNIT_ASSERT((*copyIt == boost::make_tuple<const int, const double>(i, i)));
349 for (
int i = 0; i < 3; ++i)
351 for (
int i = 0; i < 3; ++i) {
352 CPPUNIT_ASSERT(Verify<CloseTo>(td[i],
double(i)));
353 CPPUNIT_ASSERT(Verify<CloseTo>(td.
At(i), double(i)));
355 for (
int i = 0; i < 3; ++i)
357 for (
int i = 0; i < 3; ++i) {
358 CPPUNIT_ASSERT(Verify<CloseTo>(td[i],
double(i)));
359 CPPUNIT_ASSERT(Verify<CloseTo>(td.
At(i), double(i)));
362 for (
int i = 0; i < 3; ++i) {
363 CPPUNIT_ASSERT(Verify<CloseTo>(td[i], 0.));
364 CPPUNIT_ASSERT(Verify<CloseTo>(td.
At(i), 0.));
366 for (
int i = 0; i < 3; ++i)
368 for (
int i = 0; i < 3; ++i) {
369 CPPUNIT_ASSERT(Verify<CloseTo>(td[i],
double(i)));
370 CPPUNIT_ASSERT(Verify<CloseTo>(td.
At(i), double(i)));
374 CPPUNIT_ASSERT(Verify<Equal>(mtd.
HasLabel(0),
true));
375 CPPUNIT_ASSERT(Verify<Equal>(mtd.
HasLabel(1),
false));
380 CPPUNIT_ASSERT(Verify<Equal>(mtd.
GetNLabels(), 3
U));
384 CPPUNIT_ASSERT(Verify<CloseTo>(tdSource[-5], -5.0));
385 CPPUNIT_ASSERT(Verify<CloseTo>(tdSource[5], 5.0));
390 iter != mtd.
End(); ++iter, ++i)
391 CPPUNIT_ASSERT(Verify<Equal>(iter->GetLabel(), i));
397 iter != mcopy.
End(); ++iter, ++i) {
398 CPPUNIT_ASSERT(Verify<Equal>(iter->GetLabel(), i));
401 for (
int j = 0 ; j < 2 ; ++j)
402 CPPUNIT_ASSERT(Verify<Equal>(ta[j],
double(j)));
409 for (
int i = 0; i < 3; ++i)
414 CPPUNIT_ASSERT(Verify<Equal>(tdiSource[0], 0));
415 CPPUNIT_ASSERT(Verify<Equal>(tdiSource[2], 2));
433 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, -1, 7), 30.0));
434 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, -100, 100), 30.0));
435 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, 2, 4), 15.0));
436 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, 4, 2), 15.0));
437 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, 100, -100), 30.0));
438 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, 50, 100), 0.0));
439 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, 100, 50), 0.0));
440 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, -100, -50), 0.0));
441 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, -50, -100), 0.0));
442 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(td, 2, 2), 4.0));
454 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, 2, 4),
sqrt(2.0/3.0)));
455 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, 4, 2),
sqrt(2.0/3.0)));
456 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, 0, 2),
sqrt(32./9.)));
457 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, 50, 100), 0.0));
458 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, 100, 50), 0.0));
459 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, -100, -50), 0.0));
460 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, -50, -100), 0.0));
461 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::RMS(td, 2, 2), 0.0));
463 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, -1, 2), 7.0/9.0));
464 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, -100, 2), 7.0/9.0));
465 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, 50, 100), 0.0));
466 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, 100, 50), 0.0));
467 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, -100, -50), 0.0));
468 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, -50, -100), 0.0));
469 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Centroid(td, 2, 2), 2.0));
483 CPPUNIT_ASSERT(Verify<CloseTo>(TimeDistributionAlgorithm::Sum(tdi, -1, 7), 30.0));
485 CPPUNIT_ASSERT(Verify<CloseTo> (TimeDistributionAlgorithm::RMS(td, 2, 4),
sqrt(2.0/3.0)));
486 CPPUNIT_ASSERT(Verify<CloseTo> (TimeDistributionAlgorithm::Centroid(td, -1, 2), 7.0/9.0));
493 CPPUNIT_ASSERT(tdi == *td4);
495 CPPUNIT_ASSERT(tdi != *td4);
498 CPPUNIT_ASSERT(tdd == *td1);
500 CPPUNIT_ASSERT(tdd != *td1);
void testSparseIterator()
T At(const double time) const
void testMultiTimeDistribution()
int GetStart() const
First slot with data.
void AddTimeDistribution(const double binSize, const int label)
boost::transform_iterator< LabeledObjectFunctor, typename MultiObjectContainer::iterator, LabeledObjectType > Iterator
TimeDistribution< double > TimeDistributionD
Base class for all exceptions used in the auger offline code.
Histogram class for time distributions with suppressed empty bins.
void Clear()
Remove contents of the TimeDistribution.
void SetTime(const double time, const T weight=T(1))
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
TimeDistribution< T > & GetTimeDistribution(const int label=0)
Returns the trace for /par source.
double GetBinning() const
Size of one slot.
constexpr double nanosecond
int GetStop() const
Last slot with data (1 less than First slot if no data)
void Expected()
Print `Expected' for expected failures.
SparseIterator SparseEnd() const
void testOperatorBracket()
int GetNumSlots() const
Number of slots from first slot with data up to last slot with data, including empty slots...
TimeDistribution< int > TimeDistributionI
void testOperatorArithmetic()
unsigned int GetNLabels() const
double Mean(const std::vector< double > &v)
SparseIterator SparseBegin() const
Iterator over time slots with data in them (skips empty slots).
void AddTime(const double time, const T weight=T(1))
Add an entry (optionally weighted) for the given time. Slot will be computed.
TimeDistributionD * td2weighted
boost::transform_iterator< InternalMapFunctor, InternalConstIterator, Tuple > SparseIterator
bool HasLabel(const int label) const