24 #include "cheetah/ddtr/test_utils/DdtrTester.h" 25 #include "cheetah/ddtr/Ddtr.h" 26 #include "cheetah/generators/GaussianNoiseConfig.h" 27 #include "cheetah/generators/GaussianNoise.h" 28 #include "cheetah/generators/PulsarInjection.h" 29 #include "cheetah/generators/PulsarInjectionConfig.h" 30 #include "cheetah/data/TimeFrequency.h" 31 #include "cheetah/sigproc/SigProcWriter.h" 44 template <
typename TestTraits>
45 DdtrTester<TestTraits>::DdtrTester()
46 : cheetah::utils::test::AlgorithmTester<TestTraits>()
50 template <
typename TestTraits>
51 DdtrTester<TestTraits>::~DdtrTester()
55 template<
typename TestTraits>
56 void DdtrTester<TestTraits>::SetUp()
60 template<
typename TestTraits>
61 void DdtrTester<TestTraits>::TearDown()
65 template<
typename ArchitectureTag,
typename NumericalT,
typename TimeFreqT>
66 DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::DdtrTesterTraits()
72 template<
typename ArchitectureTag,
typename NumericalT,
typename TimeFreqT>
73 typename DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::Api& DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::api(PoolType& pool)
75 typedef ddtr::DedispersionConfig::Dm Dm;
78 _config.add_dm_range(Dm(0.0 * data::parsecs_per_cube_cm),Dm(1000.0 * data::parsecs_per_cube_cm), Dm(100.0 * data::parsecs_per_cube_cm));
79 _config.set_pool(pool);
80 _api.reset(
new Api(_config,
81 [
this](std::shared_ptr<DmType> data)
83 PANDA_LOG <<
"DM handler called";
85 _dm_data.push_back(data);
87 PANDA_LOG <<
"dm_call_count:"<<_dm_call_count;
93 template<
typename ArchitectureTag,
typename NumericalT,
typename TimeFreqT>
94 typename DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::DmDataContainerType
const& DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::dm_data()
const 100 void dump_host_buffer(T* buffer,
size_t size, std::string filename)
102 std::ofstream outfile;
103 outfile.open(filename.c_str(),std::ifstream::out | std::ifstream::binary);
104 outfile.write((
char*)buffer, size*
sizeof(T));
108 template<
typename ArchitectureTag,
typename NumericalT,
typename TimeFreqT>
109 ddtr::Config& DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::config()
114 template<
typename ArchitectureTag,
typename NumericalT,
typename TimeFreqT>
115 bool DdtrTesterTraits<ArchitectureTag, NumericalT, TimeFreqT>::dm_handler_called()
const 121 template<
typename ArchitectureTag,
typename NumericalT,
typename TimeFreqT>
124 return _dm_call_count;
127 POOL_ALGORITHM_TYPED_TEST_P(
DdtrTester, test_handlers)
136 typedef typename TypeParam::NumericalRep NumericalRep;
137 auto& api = traits.api(pool);
144 typedef typename TypeParam::TimeFrequencyType DataType;
148 std::size_t chunk_samples=10000;
149 for(
int ii=0; ii < 4; ++ii)
151 std::shared_ptr<DataType> data = DataType::make_shared(pss::astrotypes::DimensionSize<pss::astrotypes::units::Time>(chunk_samples),
152 pss::astrotypes::DimensionSize<pss::astrotypes::units::Frequency>(10));
153 data->sample_interval(
typename DataType::TimeType(150.0 * boost::units::si::milli * boost::units::si::seconds));
154 data->set_channel_frequencies_const_width(data::FrequencyType(1000.0 * boost::units::si::mega * data::hz), data::FrequencyType(-30.0 * boost::units::si::mega * data::hz));
155 PANDA_LOG_DEBUG <<
"Populating test vector with generator data";
156 generator.next(*data);
159 PANDA_LOG_DEBUG <<
"In loop on count " << count;
162 while (!traits.dm_handler_called())
164 std::this_thread::sleep_for(std::chrono::seconds(1));
166 ASSERT_TRUE(traits.dm_handler_called());
172 POOL_ALGORITHM_TYPED_TEST_P(
DdtrTester, test_algorithm)
183 auto& api = traits.api(pool);
189 typedef typename TypeParam::TimeFrequencyType DataType;
193 std::size_t chunk_samples=10000;
194 std::size_t no_of_chans=10;
195 for (
int ii=0; ii<4; ++ii)
197 std::shared_ptr<DataType> data = DataType::make_shared(pss::astrotypes::DimensionSize<pss::astrotypes::units::Time>(chunk_samples),
198 pss::astrotypes::DimensionSize<pss::astrotypes::units::Frequency>(no_of_chans));
199 data->sample_interval(
typename DataType::TimeType(150.0 * boost::units::si::milli * boost::units::si::seconds));
200 data->set_channel_frequencies_const_width(data::FrequencyType(1000.0 * boost::units::si::mega * data::hz), data::FrequencyType(-30.0 * boost::units::si::mega * data::hz));
201 PANDA_LOG_DEBUG <<
"Populating test vector with dispersed pulsed data";
204 std::fill(data->begin(), data->end(), 0);
207 float dm_constant = 4.1493775933609e3;
208 std::vector<data::FrequencyType>
const& channel_freqs = data->channel_frequencies();
209 data::FrequencyType freq_top = *std::max_element(channel_freqs.begin(), channel_freqs.end());
210 std::vector<float> delays;
211 for (
auto freq: channel_freqs)
213 delays.push_back(dm_constant * 500.0 * (1.0/(freq.value()*freq.value()) - 1.0/(freq_top.value()*freq_top.value())) / data->sample_interval().value());
216 for(std::size_t ii=0; ii<no_of_chans; ++ii)
218 typename DataType::Channel ts = data->channel(ii);
219 std::size_t delay = std::size_t(round(delays[ii]));
220 ts[pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>(delay)] = 1;
221 ts[pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>(delay + 1)] = 1;
222 ts[pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>(delay + 2)] = 1;
225 PANDA_LOG_DEBUG <<
"Calling API";
228 PANDA_LOG <<
"In loop on count " << count;
231 while(!traits.dm_handler_called())
233 std::this_thread::sleep_for(std::chrono::seconds(1));
237 auto const& dm_data = traits.dm_data();
238 auto const& dm_trials = (*dm_data[0]);
239 std::vector<float> max_values;
240 std::vector<float> trial_nos;
243 for (
auto it=dm_trials.cbegin();it!=dm_trials.cend();++it)
245 std::size_t max_value = *std::max_element(it->cbegin(),it->cend());
246 trial_nos.push_back(cnt);
247 max_values.push_back(max_value);
250 ASSERT_TRUE(*std::max_element(max_values.begin(),max_values.end())==10);
251 ASSERT_TRUE(std::distance(max_values.begin(), std::max_element(max_values.begin(),max_values.end()))==5);
254 POOL_ALGORITHM_TYPED_TEST_P(
DdtrTester, test_pulse_with_noise)
265 typedef typename TypeParam::NumericalRep NumericalRep;
266 auto& api = traits.api(pool);
273 typedef typename TypeParam::TimeFrequencyType DataType;
278 std::size_t chunk_samples=10000;
279 std::size_t no_of_chans=10;
280 for (
int ii=0; ii<4; ++ii)
282 std::shared_ptr<DataType> data = DataType::make_shared(pss::astrotypes::DimensionSize<pss::astrotypes::units::Time>(chunk_samples),
283 pss::astrotypes::DimensionSize<pss::astrotypes::units::Frequency>(no_of_chans));
284 data->sample_interval(
typename DataType::TimeType(50.0 * boost::units::si::milli * boost::units::si::seconds));
285 data->set_channel_frequencies_const_width(data::FrequencyType(1000.0 * boost::units::si::mega * data::hz), data::FrequencyType(-30.0 * boost::units::si::mega * data::hz));
286 PANDA_LOG_DEBUG <<
"Populating test vector with dispersed pulsed data";
288 generator.next(*data);
290 float dm_constant = 4.1493775933609e3;
291 std::vector<data::FrequencyType>
const& channel_freqs = data->channel_frequencies();
292 data::FrequencyType freq_top = *std::max_element(channel_freqs.begin(), channel_freqs.end());
293 std::vector<float> delays;
294 for (
auto freq: channel_freqs)
296 delays.push_back(dm_constant * 500.0 * (1.0/(freq.value()*freq.value()) - 1.0/(freq_top.value()*freq_top.value())) / data->sample_interval().value());
299 for(std::size_t ii=0;ii<no_of_chans;++ii)
301 typename DataType::Channel ts = data->channel(ii);
302 std::size_t delay = std::size_t(round(delays[ii]));
303 ts[pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>(delay)] += 100;
304 ts[pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>(delay + 1)] += 100;
305 ts[pss::astrotypes::DimensionIndex<pss::astrotypes::units::Time>(delay + 2)] += 100;
308 PANDA_LOG_DEBUG <<
"Calling API";
311 PANDA_LOG <<
"In loop on count " << count;
314 while(!traits.dm_handler_called())
316 std::this_thread::sleep_for(std::chrono::seconds(1));
320 auto const& dm_data = traits.dm_data();
321 auto const& dm_trials = (*dm_data[0]);
322 std::vector<float> max_values;
323 std::vector<float> trial_nos;
326 for (
auto it=dm_trials.cbegin(); it!=dm_trials.cend(); ++it)
328 std::size_t max_value = *std::max_element(it->cbegin(),it->cend());
329 trial_nos.push_back(cnt);
330 max_values.push_back(max_value);
333 ASSERT_TRUE(std::distance(max_values.begin(), std::max_element(max_values.begin(),max_values.end()))==5);
339 REGISTER_TYPED_TEST_CASE_P(
DdtrTester, test_handlers, test_algorithm, test_pulse_with_noise);
Some limits and constants for FLDO.
std::size_t dm_handler_call_count() const
return true if the dm_handler has been called