astrotypes  0.0
HeaderTest.cpp
Go to the documentation of this file.
1 /*
2  * MIT License
3  *
4  * Copyright (c) 2018 PulsarSearchSoft
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #include "../HeaderTest.h"
25 #include "../SigProcTestFile.h"
28 #include <sstream>
29 #include <fstream>
30 
31 
32 namespace pss {
33 namespace astrotypes {
34 namespace sigproc {
35 namespace test {
36 
37 
39  : ::testing::Test()
40 {
41 }
42 
44 {
45 }
46 
48 {
49 }
50 
52 {
53 }
54 
56 {
57  std::stringstream ss;
58  //h.write(ss);
59  ss << h;
60  Header r;
61  r.read(ss);
62  return r;
63 }
64 
65 TEST_F(HeaderTest, test_size)
66 {
67  Header h;
68  std::stringstream ss;
69  h.write(ss);
70 
71  Header r;
72  r.read(ss);
73 
74  ASSERT_EQ(r.size(), ss.str().size());
75  ASSERT_EQ(r.size(), h.size());
76 }
77 
78 TEST_F(HeaderTest, test_write_read_default)
79 {
80  Header header;
81  Header read_header = save_restore(header);
82  ASSERT_EQ(read_header, header);
83 }
84 
85 TEST_F(HeaderTest, test_operator_eq_empty)
86 {
87  Header header1;
88  Header header2;
89  ASSERT_TRUE(header1 == header2);
90  ASSERT_FALSE(header1 != header2);
91 }
92 
93 TEST_F(HeaderTest, test_telescope_id)
94 {
95  unsigned s(10);
96 
97  Header h;
98  ASSERT_FALSE(h.telescope_id().is_set());
99  h.telescope_id(s);
100  ASSERT_TRUE(h.telescope_id().is_set());
101  ASSERT_EQ(h.telescope_id(), s);
102  Header h2 = save_restore(h);
103  ASSERT_EQ(h2.telescope_id(), h.telescope_id());
104  ASSERT_TRUE(h == h2);
105  ASSERT_FALSE(h != h2);
106  h.reset();
107  ASSERT_FALSE(h == h2);
108  ASSERT_FALSE(h.telescope_id().is_set());
109 }
110 
111 TEST_F(HeaderTest, test_machine_id)
112 {
113  unsigned s(20);
114 
115  Header h;
116  ASSERT_FALSE(h.machine_id().is_set());
117  h.machine_id(s);
118  ASSERT_TRUE(h.machine_id().is_set());
119  ASSERT_EQ(h.machine_id(), s);
120  Header h2 = save_restore(h);
121  ASSERT_EQ(h2.machine_id(), h.machine_id());
122  ASSERT_TRUE(h == h2);
123  ASSERT_FALSE(h != h2);
124  h.reset();
125  ASSERT_FALSE(h.machine_id().is_set());
126 }
127 
128 TEST_F(HeaderTest, test_raw_data_file)
129 {
130  std::string s("abc");
131 
132  Header h;
133  ASSERT_FALSE(h.raw_data_file().is_set());
134  h.raw_data_file(s);
135  ASSERT_TRUE(h.raw_data_file().is_set());
136  ASSERT_EQ(h.raw_data_file(), s);
137  Header h2 = save_restore(h);
138  ASSERT_EQ(h2.raw_data_file(), h.raw_data_file());
139  ASSERT_TRUE(h == h2);
140  ASSERT_FALSE(h != h2);
141  h.reset();
142  ASSERT_FALSE(h.raw_data_file().is_set());
143 }
144 
145 TEST_F(HeaderTest, test_barycentric)
146 {
147  Header h;
148  ASSERT_FALSE(h.barycentric().is_set());
149  h.barycentric(false);
150  ASSERT_TRUE(h.barycentric().is_set());
151  ASSERT_EQ(*h.barycentric(), 0U);
152  Header h2 = save_restore(h);
153  ASSERT_EQ(*h2.barycentric(), *h.barycentric());
154  ASSERT_TRUE(h == h2);
155  ASSERT_FALSE(h != h2);
156  h.reset();
157  ASSERT_FALSE(h.barycentric().is_set());
158 }
159 
160 TEST_F(HeaderTest, test_pulsarcentric)
161 {
162  Header h;
163  ASSERT_FALSE(h.pulsarcentric().is_set());
164  h.pulsarcentric(true);
165  ASSERT_TRUE(h.pulsarcentric().is_set());
166  ASSERT_EQ(*h.pulsarcentric(), 1U);
167  Header h2 = save_restore(h);
168  ASSERT_EQ(*h2.pulsarcentric(), *h.pulsarcentric());
169  ASSERT_TRUE(h == h2);
170  ASSERT_FALSE(h != h2);
171  h.reset();
172  ASSERT_FALSE(h.pulsarcentric().is_set());
173 }
174 
175 TEST_F(HeaderTest, test_source_name)
176 {
177  std::string s("abc");
178 
179  Header h;
180  ASSERT_FALSE(h.source_name().is_set());
181  h.source_name(s);
182  ASSERT_TRUE(h.source_name().is_set());
183  ASSERT_EQ(h.source_name(), s);
184  Header h2 = save_restore(h);
185  ASSERT_EQ(h2.source_name(), h.source_name());
186  ASSERT_TRUE(h == h2);
187  ASSERT_FALSE(h != h2);
188  h.reset();
189  ASSERT_FALSE(h.source_name().is_set());
190 }
191 
192 TEST_F(HeaderTest, test_az_start)
193 {
194  boost::units::quantity<units::Degree, double> angle(150 * units::degrees);
195 
196  Header h;
197  ASSERT_FALSE(h.az_start().is_set());
198  h.az_start(angle);
199  ASSERT_TRUE(h.az_start().is_set());
200  ASSERT_EQ(h.az_start(), angle);
201  Header h2 = save_restore(h);
202  ASSERT_EQ(h2.az_start(), h.az_start());
203  ASSERT_TRUE(h == h2);
204  ASSERT_FALSE(h != h2);
205  h.reset();
206  ASSERT_FALSE(h.az_start().is_set());
207 }
208 
209 TEST_F(HeaderTest, test_za_start)
210 {
211  boost::units::quantity<units::Degree, double> angle(150 * units::degrees);
212 
213  Header h;
214  ASSERT_FALSE(h.za_start().is_set());
215  h.za_start(angle);
216  ASSERT_TRUE(h.za_start().is_set());
217  ASSERT_EQ(h.za_start(), angle);
218  Header h2 = save_restore(h);
219  ASSERT_EQ(h2.za_start(), h.za_start());
220  ASSERT_TRUE(h == h2);
221  ASSERT_FALSE(h != h2);
222  h.reset();
223  ASSERT_FALSE(h.za_start().is_set());
224 }
225 
226 TEST_F(HeaderTest, number_of_channels)
227 {
228  Header h;
229  ASSERT_EQ(0, h.number_of_channels());
230  h.number_of_channels(332);
231  ASSERT_EQ(332, h.number_of_channels());
232  Header h2 = save_restore(h);
233  ASSERT_EQ(h2.number_of_channels(), h.number_of_channels());
234  ASSERT_TRUE(h == h2);
235  ASSERT_FALSE(h != h2);
236 
237  h.reset();
238  ASSERT_EQ(0, h.number_of_channels());
239 }
240 
241 TEST_F(HeaderTest, number_of_channels_with_DimensionSize)
242 {
243  Header h;
246  Header h2 = save_restore(h);
247  ASSERT_EQ(h2.number_of_channels(), h.number_of_channels());
248  ASSERT_TRUE(h == h2);
249  ASSERT_FALSE(h != h2);
250 
251  h.reset();
252  ASSERT_EQ(0, h.number_of_channels());
253 }
254 
255 
256 TEST_F(HeaderTest, number_of_bits)
257 {
258  Header h;
259  ASSERT_EQ(0, h.number_of_bits());
260  h.number_of_bits(32);
261  ASSERT_EQ(32, h.number_of_bits());
262  Header h2 = save_restore(h);
263  ASSERT_EQ(h2.number_of_bits(), h.number_of_bits());
264  ASSERT_TRUE(h == h2);
265  ASSERT_FALSE(h != h2);
266  h.reset();
267  ASSERT_EQ(0, h.number_of_bits());
268 }
269 
270 TEST_F(HeaderTest, test_data_type)
271 {
272  Header h1;
274 
275  // test just the data type field
276  Header h2;
278  ASSERT_NE(h1, h2);
280  ASSERT_EQ(h1, h2);
281  Header restored = save_restore(h1);
282  ASSERT_EQ(h1, restored);
283 
284  // Test dependednt types (samps etv)
285  // Case Filterbank
286  // should ignore different number of samples
287  h1.number_of_samples(10);
288  h2.number_of_samples(20);
289  ASSERT_EQ(h1, h2);
290  h1.number_of_channels(10);
291  ASSERT_NE(h1, h2);
292  h2.number_of_channels(10);
293 
294  // Case TimeSeries
295  // number of samples should is now an imprtant variable
298  h1.number_of_samples(10);
299  h2.number_of_samples(20);
300  ASSERT_NE(h1, h2);
301  h2.number_of_samples(10);
302  ASSERT_EQ(h1, h2);
303 
304  // didference in number of channels should be ignored
306  ASSERT_EQ(h1, h2);
307 }
308 
309 TEST_F(HeaderTest, test_tstart)
310 {
311  units::MJD mjd(100.0 * units::days);
312 
313  Header h;
314  ASSERT_FALSE(h.tstart().is_set());
315  h.tstart(mjd);
316  ASSERT_TRUE(h.tstart().is_set());
317  ASSERT_EQ(h.tstart(), mjd);
318  Header h2 = save_restore(h);
319  ASSERT_EQ(h2.tstart(), h.tstart());
320  ASSERT_TRUE(h == h2);
321  ASSERT_FALSE(h != h2);
322  h.reset();
323  ASSERT_FALSE(h.tstart().is_set());
324 
325  // tstart should eb ignored in header comparision
326  h2.tstart(units::MJD(250*units::days));
327  ASSERT_TRUE(h == h2);
328 }
329 
330 TEST_F(HeaderTest, test_sample_interval)
331 {
332  boost::units::quantity<units::Seconds, double> zero(0.0 * units::milliseconds);
333  boost::units::quantity<units::Seconds, double> t(20.0 * units::milliseconds);
334  Header h;
335  ASSERT_EQ(zero, h.sample_interval());
336  h.sample_interval(t);
337  Header h2 = save_restore(h);
338  ASSERT_EQ(h2.sample_interval(), h.sample_interval());
339  ASSERT_EQ(t, h.sample_interval());
340  ASSERT_TRUE(h == h2);
341  ASSERT_FALSE(h != h2);
342  h.reset();
343  ASSERT_EQ(zero, h.sample_interval());
344 }
345 
346 TEST_F(HeaderTest, test_fch1)
347 {
348  boost::units::quantity<units::MegaHertz, double> freq(150 * units::megahertz);
349 
350  Header h;
351  ASSERT_FALSE(h.fch1().is_set());
352  h.fch1(freq);
353  ASSERT_TRUE(h.fch1().is_set());
354  ASSERT_EQ(h.fch1(), freq);
355  Header h2 = save_restore(h);
356  ASSERT_EQ(h2.fch1(), h.fch1());
357  ASSERT_TRUE(h == h2);
358  ASSERT_FALSE(h != h2);
359  h.reset();
360  ASSERT_FALSE(h.fch1().is_set());
361 }
362 
363 TEST_F(HeaderTest, test_foff)
364 {
365  boost::units::quantity<units::MegaHertz, double> freq(150 * units::megahertz);
366 
367  Header h;
368  ASSERT_FALSE(h.foff().is_set());
369  h.foff(freq);
370  ASSERT_TRUE(h.foff().is_set());
371  ASSERT_EQ(h.foff(), freq);
372  Header h2 = save_restore(h);
373  ASSERT_EQ(h2.foff(), h.foff());
374  ASSERT_TRUE(h == h2);
375  ASSERT_FALSE(h != h2);
376  h.reset();
377  ASSERT_FALSE(h.foff().is_set());
378 }
379 
380 TEST_F(HeaderTest, test_frequency_channels)
381 {
382  std::vector<boost::units::quantity<units::MegaHertz, double>> channels;
383  for(double i=100.0; i < 500.0; ++i) {
384  channels.push_back( boost::units::quantity<units::MegaHertz, double>(i * units::megahertz) );
385  }
386  Header h;
387  ASSERT_EQ(h.frequency_channels().size(), 0U);
388  h.frequency_channels(channels);
389  Header h2 = save_restore(h);
390  ASSERT_EQ(h2.frequency_channels(), h.frequency_channels());
391  ASSERT_TRUE(h == h2);
392  ASSERT_FALSE(h != h2);
393  h.reset();
394  ASSERT_EQ(h.frequency_channels().size(), 0U);
395 }
396 
397 TEST_F(HeaderTest, test_extract_info_from_time_frequency)
398 {
399  Header header;
401  header << data;
402  ASSERT_EQ(header.number_of_bits(), 16U);
403  ASSERT_EQ(4U, header.number_of_channels());
404 }
405 
406 TEST_F(HeaderTest, test_ref_dm)
407 {
408  units::DispersionMeasure<double> dm(100 * units::parsecs_per_cube_cm);
409 
410  Header h;
411  ASSERT_FALSE(h.ref_dm().is_set());
412  h.ref_dm(dm);
413  ASSERT_TRUE(h.ref_dm().is_set());
414  ASSERT_EQ(h.ref_dm(), dm);
415  Header h2 = save_restore(h);
416  ASSERT_EQ(h2.ref_dm(), h.ref_dm());
417  ASSERT_TRUE(h == h2);
418  ASSERT_FALSE(h != h2);
419  h.reset();
420  ASSERT_FALSE(h.ref_dm().is_set());
421 }
422 
423 TEST_F(HeaderTest, test_period)
424 {
425  boost::units::quantity<units::Seconds, double> p(100 * units::milliseconds);
426 
427  Header h;
428  ASSERT_FALSE(h.period().is_set());
429  h.period(p);
430  ASSERT_TRUE(h.period().is_set());
431  ASSERT_EQ(h.period(), p);
432  Header h2 = save_restore(h);
433  ASSERT_EQ(h2.period(), h.period());
434  ASSERT_TRUE(h == h2);
435  h.reset();
436  ASSERT_FALSE(h.period().is_set());
437 }
438 
439 TEST_F(HeaderTest, info_adapter_write)
440 {
441  Header h;
442  h.number_of_bits(16);
443  h.number_of_channels(100);
444  h.sample_interval(boost::units::quantity<units::Seconds, double>(.01768888 * units::milliseconds));
445  std::vector<boost::units::quantity<units::MegaHertz, double>> channels;
446  for(double i=100.0; i < 140.0; ++i) {
447  channels.push_back( boost::units::quantity<units::MegaHertz, double>(i * units::megahertz) );
448  }
449  h.frequency_channels(channels);
450  std::stringstream ss1;
451  ss1 << Header::Info() << h;
452  std::cout << ss1.str() << "\n";
453 }
454 
455 TEST_F(HeaderTest, read_filterbank_file_test)
456 {
457  Header header;
458  SigProcFilterBankTestFile test_file;
459  std::ifstream s(test_file.file(), std::ios::in | std::ios::binary);
460  s >> header;
461  ASSERT_EQ(header.number_of_bits(), 8U);
462  ASSERT_EQ(header.number_of_channels(), test_file.number_of_channels());
463  ASSERT_EQ(header.number_of_ifs(), test_file.number_of_ifs());
464 }
465 
466 TEST_F(HeaderTest, copy_constructor_test)
467 {
468  Header header1;
469  header1.number_of_channels(300);
470  header1.number_of_bits(65);
471  std::vector<boost::units::quantity<units::MegaHertz, double>> channels;
472  for(double i=100.0; i < 140.0; ++i) {
473  channels.push_back( boost::units::quantity<units::MegaHertz, double>(i * units::megahertz) );
474  }
475  header1.frequency_channels(channels);
476 
477  Header header2(header1);
478 
479  ASSERT_TRUE(header1 == header2);
480  Header header3;
481  header3 = header2;
482  ASSERT_TRUE(header1 == header3);
483 }
484 
485 } // namespace test
486 } // namespace sigproc
487 } // namespace astrotypes
488 } // namespace pss
boost::units::quantity< units::Seconds, double > sample_interval() const
return the sample_interval (if defined)
Definition: Header.cpp:271
unsigned number_of_bits() const
return the number of bits
Definition: Header.cpp:348
utils::Optional< unsigned > const & number_of_samples() const
return the number of time samples (optional)
Definition: Header.cpp:359
utils::Optional< boost::units::quantity< units::Seconds, double > > const & period() const
return the folding period (if defined)
Definition: Header.cpp:322
TEST_F(FileReaderTest, test_filterbank_file_tf_data)
utils::Optional< std::string > const & source_name() const
return the value of the source name (if any)
Definition: Header.cpp:211
Store SigProc header information.
Definition: Header.h:73
utils::Optional< std::string > const & raw_data_file() const
return the value of the raw data filename (if any)
Definition: Header.cpp:167
utils::Optional< unsigned > const & barycentric() const
the value of the barycentric field (if any)
Definition: Header.cpp:221
void reset()
reset all header variables to an undefined state
Definition: HeaderBase.cpp:58
std::size_t size() const
returns the number of bytes in the header
Definition: HeaderBase.cpp:230
DimensionSize< units::Frequency > number_of_channels() const
boost::units::quantity< DispersionMeasureUnit, T > DispersionMeasure
utils::Optional< boost::units::quantity< units::Degree, double > > az_start() const
getters/setters for the telscope azimuth at start of scan (in degrees)
Definition: Header.cpp:241
ModifiedJulianClock::time_point MJD
Definition: Time.h:47
std::vector< boost::units::quantity< units::MegaHertz, double > > const & frequency_channels() const
return a list of frequency channels (if set)
Definition: Header.cpp:302
utils::Optional< unsigned > telescope_id() const
return the telescope_id identifier (if any)
Definition: Header.cpp:147
DimensionSize< units::Frequency > number_of_channels() const
return the number of frequency channels
Definition: Header.cpp:332
utils::Optional< boost::units::quantity< units::MegaHertz, double > > const & fch1() const
get the frequency of the first channel
Definition: Header.cpp:282
Header save_restore(Header const &h)
Definition: HeaderTest.cpp:55
void data_type(DataType type)
set the data type
Definition: Header.cpp:188
A template class representing values associated with a time and frequecny such as Stokes values or vo...
utils::Optional< unsigned > machine_id() const
return the machine_id identifier (if any)
Definition: Header.cpp:157
void write(std::ostream &stream) const
write header data to the provided stream
Definition: HeaderBase.cpp:145
bool is_set() const
if the value has been explicitly set then return true
Definition: Optional.cpp:56
utils::Optional< boost::units::quantity< units::MegaHertz, double > > const & foff() const
get the band width of a channel (assumes homogenous badwidth for each channel)
Definition: Header.cpp:292
utils::Optional< units::ModifiedJulianDate > const & tstart() const
return the date of the start of the data block
Definition: Header.cpp:261
utils::Optional< boost::units::quantity< units::Degree, double > > za_start() const
getters/setters for the telscope zenith at start of scan (in degrees)
Definition: Header.cpp:251
utils::Optional< units::DispersionMeasure< double > > const & ref_dm() const
return the reference Dispersion Measure
Definition: Header.cpp:312
void read(std::istream &stream)
read in header data from the provided stream
Definition: HeaderBase.cpp:100
utils::Optional< unsigned > const & pulsarcentric() const
the value of the pulsarcentric field (if any)
Definition: Header.cpp:231