Cheetah - SKA - PSS - Prototype Time Domain Search Pipeline
DedispersionTrialPlanTest.cpp
1 /*
2  * The MIT License (MIT)
3  *
4  * Copyright (c) 2016 The SKA organisation
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 "cheetah/ddtr/test/DedispersionTrialPlanTest.h"
25 #include "cheetah/ddtr/DedispersionTrialPlan.h"
26 #include "panda/Log.h"
27 
28 namespace ska {
29 namespace cheetah {
30 namespace ddtr {
31 namespace test {
32 
33 
34 DedispersionTrialPlanTest::DedispersionTrialPlanTest()
35  : ::testing::Test()
36 {
37 }
38 
39 DedispersionTrialPlanTest::~DedispersionTrialPlanTest()
40 {
41 }
42 
43 void DedispersionTrialPlanTest::SetUp()
44 {
45 }
46 
47 void DedispersionTrialPlanTest::TearDown()
48 {
49 }
50 
51 TEST_F(DedispersionTrialPlanTest, test_dm_constant)
52 {
53  DedispersionTrialPlan plan("test");
54  ASSERT_DOUBLE_EQ(plan.dm_constant().value(), data::dm_constant::s_mhz::dm_constant.value());
55 }
56 
57 TEST_F(DedispersionTrialPlanTest, test_max_dm)
58 {
59  DedispersionTrialPlan plan("test");
60  ASSERT_DOUBLE_EQ(0.0, plan.max_dm().value());
61 
62  plan.add_dm_range(40 * data::parsecs_per_cube_cm, 100 * data::parsecs_per_cube_cm, 20 * data::parsecs_per_cube_cm);
63  ASSERT_DOUBLE_EQ(100.0, plan.max_dm().value());
64 
65  plan.add_dm_range(0 * data::parsecs_per_cube_cm, 40 * data::parsecs_per_cube_cm, 20 * data::parsecs_per_cube_cm); // should not affect the max dm
66  ASSERT_DOUBLE_EQ(100.0, plan.max_dm().value());
67 
68  plan.add_dm_range(400 * data::parsecs_per_cube_cm, 500 * data::parsecs_per_cube_cm, 10 * data::parsecs_per_cube_cm);
69  ASSERT_DOUBLE_EQ(500.0, plan.max_dm().value());
70 
71  // should also work with dedispersion_config objects directly
72  DedispersionConfig dd_config(800 * data::parsecs_per_cube_cm, 900 * data::parsecs_per_cube_cm, 50 * data::parsecs_per_cube_cm);
73  plan.dedispersion_config(dd_config);
74  ASSERT_DOUBLE_EQ(900.0, plan.max_dm().value());
75 }
76 
77 TEST_F(DedispersionTrialPlanTest, test_maximum_delay)
78 {
79  DedispersionTrialPlan plan("test");
80  plan.add_dm_range(40 * data::parsecs_per_cube_cm, 100 * data::parsecs_per_cube_cm, 20 * data::parsecs_per_cube_cm);
81  ASSERT_EQ(4, plan.dm_trials().size());
82 
83  boost::units::quantity<data::MegaHertz, double> low(100.0 * boost::units::si::mega * boost::units::si::hertz);
84  boost::units::quantity<data::MegaHertz, double> high(300.0 * boost::units::si::mega * boost::units::si::hertz);
85  boost::units::quantity<boost::units::si::time, double> delay = plan.maximum_delay(low, high);
86  ASSERT_DOUBLE_EQ(36.883356385430226, delay.value());
87 
88 }
89 
90 TEST_F(DedispersionTrialPlanTest, test_maximum_delay_offset)
91 {
92  DedispersionTrialPlan plan("test");
93  plan.add_dm_range(40 * data::parsecs_per_cube_cm, 100 * data::parsecs_per_cube_cm, 20 * data::parsecs_per_cube_cm);
94 
95  data::TimeFrequency<Cpu, uint16_t> tf(data::DimensionSize<data::Frequency>(100), data::DimensionSize<data::Time>(100));
96  typedef typename data::TimeFrequency<Cpu, uint16_t>::TimeType TimeType;
97  tf.sample_interval( TimeType(100.0 * boost::units::si::milli * boost::units::si::seconds) );
98  tf.set_channel_frequencies_const_width(100.0 * boost::units::si::mega * boost::units::si::hertz, 2.0 * boost::units::si::mega * boost::units::si::hertz);
99  auto offset = plan.maximum_delay_offset(tf);
100  ASSERT_EQ(offset,369);
101 }
102 
103 TEST_F(DedispersionTrialPlanTest, test_generate_dmtrials_metadata_one_range)
104 {
105  DedispersionTrialPlan plan("test");
106  plan.add_dm_range(0 * data::parsecs_per_cube_cm, 10 * data::parsecs_per_cube_cm, 1 * data::parsecs_per_cube_cm);
107 
108  data::TimeFrequency<Cpu, uint16_t> tf(data::DimensionSize<data::Frequency>(77), data::DimensionSize<data::Time>(131072));
109  typedef typename data::TimeFrequency<Cpu, uint16_t>::TimeType TimeType;
110  tf.sample_interval( TimeType(34.567 * boost::units::si::micro * boost::units::si::seconds) );
111  tf.set_channel_frequencies_const_width(350.0 * boost::units::si::mega * boost::units::si::hertz, -0.028935 * boost::units::si::mega * boost::units::si::hertz);
112  std::size_t nspectra = tf.number_of_spectra();
113  data::DimensionSize<data::Time> overlap = plan.maximum_delay_offset(tf);
114  ASSERT_LT(overlap, nspectra);
115  std::shared_ptr<data::DmTrialsMetadata> dm_trials_metadata;
116  dm_trials_metadata = plan.generate_dmtrials_metadata(tf.sample_interval(), nspectra, overlap);
117  std::size_t number_dm_trial_values = 11;
118  ASSERT_EQ(dm_trials_metadata->size(), number_dm_trial_values);
119  ASSERT_EQ(tf.sample_interval(), dm_trials_metadata->fundamental_sampling_interval());
120  ASSERT_EQ(dm_trials_metadata->duration(), (nspectra - overlap) * tf.sample_interval());
121 }
122 
123 TEST_F(DedispersionTrialPlanTest, test_generate_dmtrials_metadata_two_ranges)
124 {
125  DedispersionTrialPlan plan("test");
126  plan.add_dm_range(0 * data::parsecs_per_cube_cm, 10 * data::parsecs_per_cube_cm, 1 * data::parsecs_per_cube_cm);
127  plan.add_dm_range(0 * data::parsecs_per_cube_cm, 100 * data::parsecs_per_cube_cm, 1 * data::parsecs_per_cube_cm);
128 
129  data::TimeFrequency<Cpu, uint16_t> tf(data::DimensionSize<data::Frequency>(77), data::DimensionSize<data::Time>(670400));
130  typedef typename data::TimeFrequency<Cpu, uint16_t>::TimeType TimeType;
131  tf.sample_interval( TimeType(34.567 * boost::units::si::micro * boost::units::si::seconds) );
132  tf.set_channel_frequencies_const_width(350.0 * boost::units::si::mega * boost::units::si::hertz, -0.028935 * boost::units::si::mega * boost::units::si::hertz);
133  std::size_t nspectra = tf.number_of_spectra();
134  data::DimensionSize<data::Time> overlap = plan.maximum_delay_offset(tf);
135 
136  ASSERT_LT(overlap, nspectra);
137  std::shared_ptr<data::DmTrialsMetadata> dm_trials_metadata;
138  dm_trials_metadata = plan.generate_dmtrials_metadata(tf.sample_interval(), nspectra, overlap);
139  std::size_t number_dm_trial_values = 112;
140  ASSERT_EQ(dm_trials_metadata->size(), number_dm_trial_values);
141  ASSERT_EQ(tf.sample_interval(), dm_trials_metadata->fundamental_sampling_interval());
142  ASSERT_EQ(dm_trials_metadata->duration(), (nspectra - overlap) * tf.sample_interval());
143 }
144 
145 TEST_F(DedispersionTrialPlanTest, test_generate_dmtrials_metadata_exception_catch)
146 {
147  DedispersionTrialPlan plan("test");
148  plan.add_dm_range(0 * data::parsecs_per_cube_cm, 10 * data::parsecs_per_cube_cm, 1 * data::parsecs_per_cube_cm);
149 
150  data::TimeFrequency<Cpu, uint16_t> tf(data::DimensionSize<data::Frequency>(7776), data::DimensionSize<data::Time>(27000));
151  typedef typename data::TimeFrequency<Cpu, uint16_t>::TimeType TimeType;
152  tf.sample_interval( TimeType(34.567 * boost::units::si::micro * boost::units::si::seconds) );
153  tf.set_channel_frequencies_const_width(350.0 * boost::units::si::mega * boost::units::si::hertz, -0.028935 * boost::units::si::mega * boost::units::si::hertz);
154  std::size_t nspectra = tf.number_of_spectra();
155  data::DimensionSize<data::Time> overlap = plan.maximum_delay_offset(tf);
156  ASSERT_GT(overlap, nspectra);
157  ASSERT_THROW(plan.generate_dmtrials_metadata(tf.sample_interval(), nspectra, overlap), panda::Error);
158 }
159 
160 TEST_F(DedispersionTrialPlanTest, test_generate_dmtrials_metadata_no_exception)
161 {
162  DedispersionTrialPlan plan("test");
163  plan.add_dm_range(0 * data::parsecs_per_cube_cm, 10 * data::parsecs_per_cube_cm, 1 * data::parsecs_per_cube_cm);
164 
165  data::TimeFrequency<Cpu, uint16_t> tf(data::DimensionSize<data::Frequency>(7776), data::DimensionSize<data::Time>(131072));
166  typedef typename data::TimeFrequency<Cpu, uint16_t>::TimeType TimeType;
167  tf.sample_interval( TimeType(34.567 * boost::units::si::micro * boost::units::si::seconds) );
168  tf.set_channel_frequencies_const_width(350.0 * boost::units::si::mega * boost::units::si::hertz, -0.028935 * boost::units::si::mega * boost::units::si::hertz);
169  std::size_t nspectra = tf.number_of_spectra();
170  data::DimensionSize<data::Time> overlap = plan.maximum_delay_offset(tf);
171  ASSERT_LT(overlap, nspectra);
172  ASSERT_NO_THROW(plan.generate_dmtrials_metadata(tf.sample_interval(), nspectra, overlap));
173 }
174 
175 } // namespace test
176 } // namespace ddtr
177 } // namespace cheetah
178 } // namespace ska
Some limits and constants for FLDO.
Definition: Brdz.h:35