Cheetah - SKA - PSS - Prototype Time Domain Search Pipeline
DedispersionStrategyTest.cpp
1 #include "cheetah/ddtr/astroaccelerate/test/DedispersionStrategyTest.h"
2 #include "cheetah/ddtr/astroaccelerate/DedispersionStrategy.h"
3 #include "cheetah/ddtr/DedispersionTrialPlan.h"
4 #include <pss/astrotypes/units/Units.h>
5 
6 namespace ska {
7 namespace cheetah {
8 namespace ddtr {
9 namespace astroaccelerate {
10 namespace test {
11 
12 template<typename T>
13 DedispersionStrategyTest<T>::DedispersionStrategyTest()
14  : ::testing::Test()
15 {
16 }
17 
18 template<typename T>
19 DedispersionStrategyTest<T>::~DedispersionStrategyTest()
20 {
21 }
22 
23 template<typename T>
24 void DedispersionStrategyTest<T>::SetUp()
25 {
26 }
27 
28 template<typename T>
29 void DedispersionStrategyTest<T>::TearDown()
30 {
31 }
32 
33 template <typename NumericalRep>
35  public:
36  static constexpr unsigned UNROLLS = 8;
37  static constexpr unsigned SNUMREG = 8;
38  static constexpr unsigned SDIVINT = 14;
39  static constexpr unsigned SDIVINDM = 50;
40  static constexpr float SFDIVINDM = 50.0f;
41  static constexpr unsigned MIN_DMS_PER_SPS_RUN = 64;
42 };
43 
44 typedef ::testing::Types<unsigned char, unsigned short, float> NumericTypes;
45 TYPED_TEST_CASE(DedispersionStrategyTest, NumericTypes);
46 
47 TYPED_TEST(DedispersionStrategyTest, test_DedispersionStrategy_constructor)
48 {
49  typedef TypeParam NumericRep;
50 
51  data::DimensionSize<data::Time> number_of_spectra(1024U);
52  data::DimensionSize<data::Frequency> number_of_channels(512U);
53 
54  data::TimeFrequency<Cpu,NumericRep> tf(number_of_spectra, number_of_channels);
55  auto f1 = data::FrequencyType(1000.0 * pss::astrotypes::units::megahertz);
56  auto f2 = data::FrequencyType(1500.0 * pss::astrotypes::units::megahertz);
57  auto delta = (f2 - f1)/ (double)number_of_channels;
59  tf.sample_interval(0.001*data::second);
60  ddtr::DedispersionTrialPlan plan("test");
61  ASSERT_DOUBLE_EQ(0.0, plan.max_dm().value());
62 
63  plan.add_dm_range(40 * data::parsecs_per_cube_cm, 100 * data::parsecs_per_cube_cm, 20 * data::parsecs_per_cube_cm);
64  ASSERT_DOUBLE_EQ(100.0, plan.max_dm().value());
65 
66  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
67  ASSERT_DOUBLE_EQ(100.0, plan.max_dm().value());
68 
69  DedispersionStrategy<NumericRep> ds(tf,plan,128*1024*1024);
70  ASSERT_EQ(ds.nchans(), 512);
71  ASSERT_EQ(ds.nsamp(), 1024);
72  ASSERT_EQ(ds.tsamp(), 0.001*data::seconds);
73 
74 }
75 
76 TYPED_TEST(DedispersionStrategyTest, test_make_strategy)
77 {
78  typedef TypeParam NumericRep;
79  data::DimensionSize<data::Time> number_of_spectra(1024U);
80  data::DimensionSize<data::Frequency> number_of_channels(512U);
81 
82  data::TimeFrequency<Cpu,NumericRep> tf(number_of_spectra, number_of_channels);
83  auto f1 = data::FrequencyType(1000.0 * pss::astrotypes::units::megahertz);
84  auto f2 = data::FrequencyType(1500.0 * pss::astrotypes::units::megahertz);
85  auto delta = (f2 - f1)/ (double)number_of_channels;
87  tf.sample_interval(0.001*data::second);
88 
89  ddtr::DedispersionTrialPlan plan("test");
90  ASSERT_DOUBLE_EQ(0.0, plan.max_dm().value());
91 
92  plan.add_dm_range(40 * data::parsecs_per_cube_cm, 100 * data::parsecs_per_cube_cm, 20 * data::parsecs_per_cube_cm);
93  ASSERT_DOUBLE_EQ(100.0, plan.max_dm().value());
94 
95  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
96  ASSERT_DOUBLE_EQ(100.0, plan.max_dm().value());
97 
98  plan.add_dm_range(400 * data::parsecs_per_cube_cm, 500 * data::parsecs_per_cube_cm, 10 * data::parsecs_per_cube_cm);
99  ASSERT_DOUBLE_EQ(500.0, plan.max_dm().value());
100 
102  DedispersionStrategyType ds(tf,plan,128*1024*1024);
103  std::vector<typename DedispersionStrategyType::Dm> user_dm_low = ds.user_dm_low();
104  std::vector<typename DedispersionStrategyType::Dm> user_dm_high = ds.user_dm_high();
105  std::vector<typename DedispersionStrategyType::Dm> user_dm_step = ds.user_dm_step();
106 
107  ASSERT_EQ(user_dm_low[0], 40 * data::parsecs_per_cube_cm);
108  ASSERT_EQ(user_dm_low[1], 0 * data::parsecs_per_cube_cm);
109  ASSERT_EQ(user_dm_low[2], 400 * data::parsecs_per_cube_cm);
110  ASSERT_EQ(user_dm_high[0], 100 * data::parsecs_per_cube_cm);
111  ASSERT_EQ(user_dm_high[1], 40 * data::parsecs_per_cube_cm);
112  ASSERT_EQ(user_dm_high[2], 500 * data::parsecs_per_cube_cm);
113  ASSERT_EQ(user_dm_step[0], 20 * data::parsecs_per_cube_cm);
114  ASSERT_EQ(user_dm_step[1], 20 * data::parsecs_per_cube_cm);
115  ASSERT_EQ(user_dm_step[2], 10 * data::parsecs_per_cube_cm);
116  ASSERT_EQ(ds.nchans(), 512);
117  for(unsigned i=0; i<ds.range(); ++i)
119  ASSERT_EQ(user_dm_low[0] , ds.dm_low()[0]);
120 
121 }
122 
123 } // namespace test
124 } // namespace astroaccelerate
125 } // namespace ddtr
126 } // namespace cheetah
127 } // namespace ska
Configuration module to specify Dedispersion Trials.
void set_channel_frequencies_const_width(FrequencyType const &start, FrequencyType const &delta)
Set the frequency index based on evenly spaced channels.
void add_dm_range(Dm start, Dm end, Dm step)
get range of DM values
Some limits and constants for FLDO.
Definition: Brdz.h:35
Dm max_dm() const
the largest Dm value specified