testFFTDataContainer.cc
Go to the documentation of this file.
1 
8 #include <iostream>
9 
10 #include <tst/Verify.h>
11 
12 #include <revt/Channel.h>
13 #include <revt/Station.h>
14 
15 #include <utl/FFTDataContainer.h>
16 #include <utl/AugerException.h>
17 #include <utl/AugerUnits.h>
18 
19 #include <cppunit/extensions/HelperMacros.h>
20 
21 using namespace std;
22 using namespace utl;
23 using namespace tst;
24 using namespace revt;
25 
29 class testFFTDataContainer : public CppUnit::TestFixture {
30 
31  static const long numtestsamples = 1999; // must be an uneven number!
32 
33  CPPUNIT_TEST_SUITE(testFFTDataContainer);
34 //CPPUNIT_TEST(testEqualAndCopyCtor);
35  CPPUNIT_TEST(testChannelFFTs);
36  CPPUNIT_TEST(testStationFFTs);
37 //CPPUNIT_TEST_EXCEPTION(testBinException, InvalidTraceBoundException);
38  CPPUNIT_TEST_SUITE_END();
39 
40 private:
43 
44 public:
45  void
47  {
48  }
49 
50  void
52  {
53  }
54 
55 /*
56  void
57  testEqualAndCopyCtor()
58  {
59  ChannelFFTDataContainer copyFFTDataContainer(ourChannelContainer);
60  CPPUNIT_ASSERT(copyFFTDataContainer == ourChannelContainer);
61  CPPUNIT_ASSERT(!(copyFFTDataContainer != ourChannelContainer));
62  }
63 */
64  void
66  {
67 
68  // put some test data into the time series
69  ChannelTimeSeries& timeSeries = ourChannelContainer.GetTimeSeries();
70  CPPUNIT_ASSERT(Verify<Equal>(timeSeries.GetSize(), ChannelTimeSeries::SizeType(0))); // trace of fresh container should be empty
71  for(unsigned int i=0; i<numtestsamples; i++)
72  {
73  timeSeries.PushBack(numtestsamples-i);
74  }
75  timeSeries.SetBinning(12.5*ns); // fictitious 12.5 ns spacing (80 MSPS)
76  ourChannelContainer.SetNyquistZone(2); // 40 to 80 MHz
77 
78  // test reading the time trace
79  const ChannelTimeSeries ourTimeSeries1 = ourChannelContainer.GetConstTimeSeries();
80  CPPUNIT_ASSERT(Verify<Equal>(ourTimeSeries1.GetSize(), ChannelTimeSeries::SizeType(numtestsamples)));
81  for (unsigned int i=0; i<numtestsamples; i++)
82  {
83  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries1[i], static_cast<double>(numtestsamples-i)));
84  }
85 
86  // test automatic forward transform
87  const ChannelFrequencySpectrum ourFrequencySpectrum1 = ourChannelContainer.GetConstFrequencySpectrum();
88  CPPUNIT_ASSERT(Verify<CloseTo>(ourChannelContainer.GetFrequencyOfBin(0),80.0*megahertz));
89  CPPUNIT_ASSERT(Verify<CloseTo>(ourChannelContainer.GetFrequencyOfBin(ourFrequencySpectrum1.GetSize()-1),40.0*megahertz));
90 
91  // sum up energy in frequency spectrum
92  double energyInFreq = 0.0;
93  for (unsigned int i=0; i<ourFrequencySpectrum1.GetSize(); i++)
94  {
95  energyInFreq += pow(abs(ourFrequencySpectrum1[i]),2)*ourFrequencySpectrum1.GetBinning();
96  if (i!=0)
97  energyInFreq += pow(abs(ourFrequencySpectrum1[i]),2)*ourFrequencySpectrum1.GetBinning(); // negative frequencies
98  }
99 
100  // access time series data without transform
101  const ChannelTimeSeries ourTimeSeries2 = ourChannelContainer.GetConstTimeSeries();
102  CPPUNIT_ASSERT(Verify<Equal>(ourTimeSeries2.GetSize(), ChannelTimeSeries::SizeType(numtestsamples-1))); // automatic clipping of the trace done?
103  for (unsigned int i=0; i<numtestsamples-1; i++)
104  {
105 // cout << ourTimeSeries2[i] << "\n";
106  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries2[i], static_cast<double>(numtestsamples-i)));
107  }
108 
109  // test automatic backward transform
110  ChannelFrequencySpectrum frequencySpectrum = ourChannelContainer.GetFrequencySpectrum(); // write access, invalidates time domain data
111  // CAUTION: the user could now access the time series with the old reference ourTimeSeries2;
112  // then the time domain data would not be updated although the frequency domain data was changed
113  // in the last step; if the user asks for a new TimeSeries as done here, everything is fine
114  const ChannelTimeSeries ourTimeSeries3 = ourChannelContainer.GetConstTimeSeries();
115  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries3.GetBinning(),12.5*ns));
116  double energyInTime = 0.0;
117  for (unsigned int i=0; i<numtestsamples-1; i++)
118  {
119 // cout << ourTimeSeries2[i] << "\n";
120  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries3[i], static_cast<double>(numtestsamples-i)));
121  energyInTime += pow(ourTimeSeries3[i],2)*ourTimeSeries3.GetBinning(); // sum up energy in time domain
122  }
123  // check if equal energy in both domains
124  CPPUNIT_ASSERT(Verify<CloseTo>(energyInTime,energyInFreq));
125  }
126 
127  void
129  {
130  // put some test data into the time series
131  StationTimeSeries& timeSeries = ourStationContainer.GetTimeSeries();
132  CPPUNIT_ASSERT(Verify<Equal>(timeSeries.GetSize(), StationTimeSeries::SizeType(0))); // trace of fresh container should be empty
133  double tmpvector[3]={0.0,0.0,0.0};
134  for(unsigned int i=0; i<numtestsamples; i++)
135  {
136  tmpvector[0]=(numtestsamples-i);
137  tmpvector[1]=(numtestsamples-i)*2.0;
138  tmpvector[2]=(numtestsamples-i)*3.0;
139  timeSeries.PushBack(Vector3D(tmpvector));
140  }
141  timeSeries.SetBinning(12.5);
142 
143  // test reading the time trace
144  const StationTimeSeries ourTimeSeries1 = ourStationContainer.GetConstTimeSeries();
145  CPPUNIT_ASSERT(Verify<Equal>(ourTimeSeries1.GetSize(), StationTimeSeries::SizeType(numtestsamples)));
146  for (unsigned int i=0; i<numtestsamples; i++)
147  {
148  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries1[i][0], static_cast<double>(numtestsamples-i)));
149  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries1[i][1], static_cast<double>(numtestsamples-i)*2.0));
150  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries1[i][2], static_cast<double>(numtestsamples-i)*3.0));
151  }
152 
153  // test automatic forward transform
154  const StationFrequencySpectrum ourFrequencySpectrum1 = ourStationContainer.GetConstFrequencySpectrum();
155  CPPUNIT_ASSERT(Verify<CloseTo>(ourStationContainer.GetFrequencyOfBin(0),0.0*megahertz));
156  CPPUNIT_ASSERT(Verify<CloseTo>(ourStationContainer.GetFrequencyOfBin(ourFrequencySpectrum1.GetSize()-1),40.0*megahertz));
157 
158  // sum up energy in frequency spectrum
159  double energyInFreq = 0.0;
160  for (unsigned int i=0; i<ourFrequencySpectrum1.GetSize(); i++)
161  {
162  energyInFreq += ourFrequencySpectrum1[i].GetMag2()*ourFrequencySpectrum1.GetBinning();
163  if (i!=0)
164  energyInFreq += ourFrequencySpectrum1[i].GetMag2()*ourFrequencySpectrum1.GetBinning(); // negative frequencies
165  }
166 
167  // access time series data without transform
168  const StationTimeSeries ourTimeSeries2 = ourStationContainer.GetConstTimeSeries();
169  CPPUNIT_ASSERT(Verify<Equal>(ourTimeSeries2.GetSize(), StationTimeSeries::SizeType(numtestsamples-1))); // automatic clipping of the trace done?
170  for (unsigned int i=0; i<numtestsamples-1; i++)
171  {
172 // cout << ourTimeSeries2[i][0] << std::endl;
173  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries2[i][0], static_cast<double>(numtestsamples-i)));
174  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries2[i][1], static_cast<double>(numtestsamples-i)*2.0));
175  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries2[i][2], static_cast<double>(numtestsamples-i)*3.0));
176  }
177 
178  // test automatic backward transform
179  StationFrequencySpectrum frequencySpectrum = ourStationContainer.GetFrequencySpectrum(); // write access, invalidates time domain data
180  // CAUTION: the user could now access the time series with the old reference ourTimeSeries2;
181  // then the time domain data would not be updated although the frequency domain data was changed
182  // in the last step; if the user asks for a new TimeSeries as done here, everything is fine
183  const StationTimeSeries ourTimeSeries3 = ourStationContainer.GetConstTimeSeries();
184  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries3.GetBinning(),12.5*ns));
185  double energyInTime = 0.0;
186  for (unsigned int i=0; i<numtestsamples-1; i++)
187  {
188 // cout << ourTimeSeries2[i][0] << "\n";
189  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries3[i][0], static_cast<double>(numtestsamples-i)));
190  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries3[i][1], static_cast<double>(numtestsamples-i)*2.0));
191  CPPUNIT_ASSERT(Verify<CloseTo>(ourTimeSeries3[i][2], static_cast<double>(numtestsamples-i)*3.0));
192  energyInTime += ourTimeSeries3[i].GetMag2()*ourTimeSeries3.GetBinning(); // sum up energy in time domain
193  }
194 
195  // check if equal energy in both domains
196  CPPUNIT_ASSERT(Verify<CloseTo>(energyInTime,energyInFreq));
197  }
198 
199 /*
200  void
201  testBinException()
202  {
203  }
204 */
205 
206 };
207 
209 
210 // Configure (x)emacs for this file ...
211 // Local Variables:
212 // mode: c++
213 // End:
double GetBinning() const
size of one slot
Definition: Trace.h:138
ChannelFFTDataContainer ourChannelContainer
utl::SVector< 3, double > Vector3D
Definition: Trace-fwd.h:32
double pow(const double x, const unsigned int i)
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
StationFFTDataContainer ourStationContainer
std::vector< double >::size_type SizeType
Definition: Trace.h:58
const double ns
double abs(const SVector< n, T > &v)
constexpr double megahertz
Definition: AugerUnits.h:155
SizeType GetSize() const
Definition: Trace.h:156
void SetBinning(const double binning)
Definition: Trace.h:139
void PushBack(const T &value)
Insert a single value at the end.
Definition: Trace.h:119

, generated on Tue Sep 26 2023.