24 #include "cheetah/fldo/test_utils/FldoTester.h" 25 #include "cheetah/fldo/CommonDefs.h" 26 #include "cheetah/fldo/Types.h" 27 #include "cheetah/generators/GaussianNoise.h" 28 #include "cheetah/generators/GaussianNoiseConfig.h" 30 #include "cheetah/sigproc/SigProcFileStream.h" 31 #include "cheetah/fldo/cuda/CommonDefs.h" 32 #include <boost/filesystem.hpp> 33 #include "panda/test/gtest.h" 45 template<
class FldoAlgo>
46 typename FldoTesterTraits<FldoAlgo>::Api& FldoTesterTraits<FldoAlgo>::api(PoolType& pool)
50 _config.template config<typename FldoAlgo::Config>().active(
true);
51 _api.reset(
new Api(_config, _handler));
56 template<
class FldoAlgo>
57 typename FldoTesterTraits<FldoAlgo>::FldoHandler& FldoTesterTraits<FldoAlgo>::handler()
62 template <
typename TestTraits>
63 FldoTester<TestTraits>::FldoTester()
68 template <
typename TestTraits>
69 FldoTester<TestTraits>::~FldoTester()
73 template<
typename TestTraits>
74 void FldoTester<TestTraits>::SetUp()
78 template<
typename TestTraits>
79 void FldoTester<TestTraits>::TearDown()
84 constexpr
int candidate_number = 5 ;
86 void load_candidates(data::Scl &scl_data)
88 typedef data::Candidate<Cpu, float> CandidateType;
95 double period, pdot,dm;
98 myfile.exceptions (std::ifstream::failbit | std::ifstream::badbit );
100 myfile.open (panda::test::test_file(
"candidates.txt"), std::fstream::in);
101 std::size_t ident = 0;
102 while (getline(myfile, line)) {
103 std::stringstream ss;
106 ss >> period >> pdot >> dm;
107 PANDA_LOG_DEBUG <<
"period: " << period <<
" pdot: " << pdot <<
" dm: " << dm;
108 CandidateType::MsecTimeType period_val(period * boost::units::si::seconds);
109 CandidateType::Dm dm_val(dm * data::parsecs_per_cube_cm);
110 CandidateType::SecPerSecType pdot_val(pdot);
112 CandidateType candidate(period_val, pdot_val, dm_val, ident);
115 scl_data.push_back(candidate);
119 catch(std::ifstream::failure e) {
120 PANDA_LOG_ERROR <<
"Exception opening/reading/closing Candidates file:" 123 #else // -> !DEEP_TESTING 126 double fake_period[] = {1.17574016e-03, 5.94685039e-04, 7.88370079e-04, 1.12340000e-03 , 9.82055118e-04 };
127 double fake_pdot[] = {0.0, 0.0, 0.0, 0.0, 0.0};
128 double fake_dm[] = {1.01000000e+01, 1.01000000e+01, 1.01000000e+01, 1.01000000e+01, 1.01000000e+01 };
129 for (
int i = 0 ; i < candidate_number ; i++ ) {
130 period = fake_period[i];
133 PANDA_LOG_DEBUG <<
"period: " << period <<
" pdot: " << pdot <<
" dm: " << dm;
134 CandidateType::MsecTimeType period_val(period * boost::units::si::seconds);
135 CandidateType::Dm dm_val(dm * data::parsecs_per_cube_cm);
136 CandidateType::SecPerSecType pdot_val(pdot);
138 CandidateType candidate(period_val, pdot_val, dm_val, i);
140 scl_data.push_back(candidate);
143 #endif //DEEP_TESTING 145 for (data::VectorLike<std::vector<data::Scl::CandidateType>>::ConstIterator it = scl_data.begin() ;
146 it != scl_data.end(); ++it) {
147 PANDA_LOG_DEBUG <<
" period " << (*it).period()
148 <<
" pdot " << (*it).pdot()
149 <<
" dm " << (*it).dm()
150 <<
" ident " << (*it).ident() ;
153 std::sort (scl_data.begin(), scl_data.end(), [](CandidateType first, CandidateType second) {
154 return (first.period() < second.period());});
157 POOL_ALGORITHM_TYPED_TEST_P(FldoTester, test_empty_data)
159 typedef typename TypeParam::TimeFrequencyType DataType;
161 auto& api = traits.api(pool);
163 std::vector<std::shared_ptr<DataType>> tf_data;
165 auto job = api(tf_data, scl_data);
168 std::shared_ptr<data::Ocld> results = traits.handler().data();
169 ASSERT_NE(
nullptr, results.get());
170 ASSERT_EQ(0U, results->size());
178 POOL_ALGORITHM_TYPED_TEST_P(FldoTester, test_empty_gaussian_data)
180 typedef typename TypeParam::TimeFrequencyType DataType;
182 auto& api = traits.api(pool);
184 typename DataType::FrequencyType delta( 1.0 * boost::units::si::mega * boost::units::si::hertz);
185 typename DataType::FrequencyType start( 100.0 * boost::units::si::mega * boost::units::si::hertz);
186 typedef data::Candidate<Cpu, float> CandidateType;
188 generators::GaussianNoiseConfig config;
189 generators::GaussianNoise<typename DataType::DataType> noise(config);
192 std::vector<std::shared_ptr<DataType>> tf_data;
194 for(
int i = 0; i < 64 ; ++i) {
195 std::shared_ptr<DataType> time_frequency_data(
new DataType(data::DimensionSize<data::Time>(512), data::DimensionSize<data::Frequency>(1024)));
196 time_frequency_data->set_channel_frequencies_const_width(start, delta);
197 boost::units::quantity<boost::units::si::time, double> dt(64 * boost::units::si::micro * boost::units::si::seconds);
199 time_frequency_data->sample_interval(dt);
200 noise.next(*time_frequency_data);
202 tf_data.emplace_back(time_frequency_data);
207 load_candidates(scl_data);
211 ASSERT_FALSE(traits.handler().executed());
212 auto job = api(tf_data, scl_data);
215 ASSERT_TRUE(traits.handler().executed());
239 POOL_ALGORITHM_TYPED_TEST_P(FldoTester, test_sigproc_file)
241 typedef typename TypeParam::TimeFrequencyType DataType;
243 auto& api = traits.api(pool);
246 std::ifstream file_stream;
247 std::stringstream ss;
249 file_stream.exceptions (std::ifstream::failbit | std::ifstream::badbit );
251 file_stream.open(panda::test::test_file(ss.str()), std::ios::binary);
252 sigproc::SigProcHeader r;
255 PANDA_LOG_DEBUG <<
"number of bits: " << r.number_of_bits();
256 PANDA_LOG_DEBUG <<
"header size: " << r.size();
259 size_t nchannels = r.number_of_channels();
260 size_t file_size = boost::filesystem::file_size(panda::test::test_file(ss.str()));
261 uint64_t nsamples = (file_size - r.size()) * (8/r.number_of_bits());
262 PANDA_LOG_DEBUG <<
"number of channels: " << nchannels;
263 PANDA_LOG_DEBUG <<
"number of samples: " << nsamples;
267 if ((nsamples % (nsubints * nchannels * fldo::cuda::max_prebin)) != 0) {
268 nsamples = (uint64_t)((nsamples/(((
float)nsubints) *nchannels* fldo::cuda::max_prebin))) * (nsubints * nchannels * fldo::cuda::max_prebin);
271 std::vector<std::shared_ptr<DataType>> tf_data;
272 sigproc::Config config;
274 config.set_sigproc_files(panda::test::test_file(ss.str()));
279 config.set_chunk_samples(nsamples/nsubints/nchannels);
280 sigproc::SigProcFileStream stream(config);
281 panda::DataManager<sigproc::SigProcFileStream> chunk_manager(stream);
283 for (
int i = 0; i < nsubints; ++i) {
284 PANDA_LOG_DEBUG <<
"Loading subint: " << i;
285 std::tuple<std::shared_ptr<DataType>> data = chunk_manager.next();
286 std::shared_ptr<DataType> time_frequency_data = std::get<0>(data);
287 tf_data.emplace_back(time_frequency_data);
289 PANDA_LOG <<
"Loaded data from file! ";
292 load_candidates(scl_data);
294 auto job = api(tf_data, scl_data);
296 std::shared_ptr<data::Ocld> results = api.handler().data();
298 ASSERT_EQ(0U, results->size());
300 catch(std::ifstream::failure e) {
302 s <<
"Exception accessing data file:" 304 PANDA_LOG_ERROR << s.str();
309 #endif // DEEP_TESTING 314 REGISTER_TYPED_TEST_CASE_P(FldoTester, test_empty_data, test_empty_gaussian_data, test_sigproc_file);
316 REGISTER_TYPED_TEST_CASE_P(FldoTester, test_empty_data, test_empty_gaussian_data);
Some limits and constants for FLDO.