24 #include "cheetah/sps_clustering/test/FofTest.h" 29 namespace sps_clustering {
46 void FofTest::TearDown()
50 TEST_F(FofTest, test_constructor)
54 typename Config::Dm dm_tolerance(17.0 * pss::astrotypes::units::parsecs_per_cube_cm);
55 typename Config::MsecTimeType width_tolerance(0.025 * boost::units::si::seconds);
56 typename Config::MsecTimeType time_tolerance(10 * boost::units::si::seconds);
57 config.dm_tolerance(dm_tolerance);
58 config.pulse_width_tolerance(width_tolerance);
59 config.time_tolerance(time_tolerance);
60 Fof another_clusterer(config);
63 TEST_F(FofTest, test_empty_list)
67 typename Config::Dm dm_tolerance(17.0 * pss::astrotypes::units::parsecs_per_cube_cm);
68 typename Config::MsecTimeType width_tolerance(0.025 * boost::units::si::seconds);
69 typename Config::MsecTimeType time_tolerance(10 * boost::units::si::seconds);
70 config.dm_tolerance(dm_tolerance);
71 config.pulse_width_tolerance(width_tolerance);
72 config.time_tolerance(time_tolerance);
74 Fof clusterer(config);
75 clusterer.linking_length(0.414);
77 data::SpCcl<NumericalRep> cand_list;
78 ASSERT_NO_THROW(clusterer(cand_list));
79 auto groups = clusterer(cand_list);
80 ASSERT_EQ(groups.size(),0U);
86 TEST_F(FofTest, test_group_one_candidate)
89 data::SpCcl<NumericalRep>::BlocksType tf_v;
90 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
91 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
92 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
95 data::SpCcl<NumericalRep> cand_list(tf_v);
98 typename Config::Dm dm(12.0 * pss::astrotypes::units::parsecs_per_cube_cm);
100 typename Config::MsecTimeType width(0.005 * boost::units::si::seconds);
102 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
106 for (std::size_t idx=0; idx<1; ++idx)
108 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
109 cand_list.push_back(candidate);
110 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.001*boost::units::si::seconds);
111 dm +=
typename Config::Dm(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
116 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
117 typename Config::MsecTimeType width_tolerance(0.01 * boost::units::si::seconds);
118 typename Config::MsecTimeType time_tolerance(0.001 * boost::units::si::seconds);
119 config.dm_tolerance(dm_tolerance);
120 config.pulse_width_tolerance(width_tolerance);
121 config.time_tolerance(time_tolerance);
122 config.linking_length(10);
123 config.num_threads(1);
124 Fof clusterer(config);
125 auto groups = clusterer(cand_list);
126 ASSERT_EQ(groups.size(),1U);
127 ASSERT_EQ(groups[0].size(),1U);
130 TEST_F(FofTest, test_group_two_candidates)
133 data::SpCcl<NumericalRep>::BlocksType tf_v;
134 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
135 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
136 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
140 data::SpCcl<NumericalRep> cand_list(tf_v);
143 typename Config::Dm dm(1000.0 * pss::astrotypes::units::parsecs_per_cube_cm);
145 typename Config::MsecTimeType width(0.256 * boost::units::si::seconds);
147 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
151 for (std::size_t idx=0; idx<2; ++idx)
153 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
154 cand_list.push_back(candidate);
155 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.001*boost::units::si::seconds);
160 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
161 typename Config::MsecTimeType width_tolerance(0.002 * boost::units::si::seconds);
162 typename Config::MsecTimeType time_tolerance(0.01 * boost::units::si::seconds);
163 config.dm_tolerance(dm_tolerance);
164 config.pulse_width_tolerance(width_tolerance);
165 config.time_tolerance(time_tolerance);
166 config.linking_length(5);
167 Fof clusterer(config);
168 auto groups = clusterer(cand_list);
169 ASSERT_EQ(groups.size(),1U);
170 ASSERT_EQ(groups[0].size(),2U);
174 TEST_F(FofTest, test_dm_grouping)
177 data::SpCcl<NumericalRep>::BlocksType tf_v;
178 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
179 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
180 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
184 data::SpCcl<NumericalRep> cand_list(tf_v);
187 data::SpCcl<NumericalRep>::SpCandidateType::Dm dm(200.234 * pss::astrotypes::units::parsecs_per_cube_cm);
189 typename Config::MsecTimeType width(0.00734 * boost::units::si::seconds);
191 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
195 for (std::size_t idx=0; idx<10; ++idx)
197 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
198 cand_list.push_back(candidate);
199 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.00001*boost::units::si::seconds);
200 dm +=
typename Config::Dm(0.0001 * pss::astrotypes::units::parsecs_per_cube_cm);
204 data::SpCcl<NumericalRep>::SpCandidateType::Dm dm2(263.245 * pss::astrotypes::units::parsecs_per_cube_cm);
205 for (std::size_t idx=0; idx<10; ++idx)
207 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm2, tstart, width, sigma, idx);
208 cand_list.push_back(candidate);
209 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.00001*boost::units::si::seconds);
210 dm2 +=
typename Config::Dm(0.0001 * pss::astrotypes::units::parsecs_per_cube_cm);
217 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
218 typename Config::MsecTimeType width_tolerance(0.002 * boost::units::si::seconds);
219 typename Config::MsecTimeType time_tolerance(0.01 * boost::units::si::seconds);
220 config.dm_tolerance(dm_tolerance);
221 config.pulse_width_tolerance(width_tolerance);
222 config.time_tolerance(time_tolerance);
223 config.linking_length(1.717);
224 Fof clusterer(config);
225 auto groups = clusterer(cand_list);
226 ASSERT_EQ(groups.size(),2U);
229 TEST_F(FofTest, test_group_multiple_candidates)
232 data::SpCcl<NumericalRep>::BlocksType tf_v;
233 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
234 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
235 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
239 data::SpCcl<NumericalRep> cand_list(tf_v);
242 typename Config::Dm dm(1000.0 * pss::astrotypes::units::parsecs_per_cube_cm);
244 typename Config::MsecTimeType width(0.256 * boost::units::si::seconds);
246 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
250 for (std::size_t idx=0; idx<500; ++idx)
252 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
253 cand_list.push_back(candidate);
254 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.001*boost::units::si::seconds);
259 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
260 typename Config::MsecTimeType width_tolerance(0.002 * boost::units::si::seconds);
261 typename Config::MsecTimeType time_tolerance(0.01 * boost::units::si::seconds);
262 config.dm_tolerance(dm_tolerance);
263 config.pulse_width_tolerance(width_tolerance);
264 config.time_tolerance(time_tolerance);
265 config.linking_length(5);
266 Fof clusterer(config);
267 auto groups = clusterer(cand_list);
268 ASSERT_EQ(groups.size(),1U);
269 ASSERT_EQ(groups[0].size(),500U);
273 TEST_F(FofTest, test_width_negative_index)
277 data::SpCcl<NumericalRep>::BlocksType tf_v;
278 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
279 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
280 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
283 data::SpCcl<NumericalRep> cand_list(tf_v);
286 typename Config::Dm dm(12.0 * pss::astrotypes::units::parsecs_per_cube_cm);
288 typename Config::MsecTimeType width(0.002 * boost::units::si::seconds);
290 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
294 for (std::size_t idx=0; idx<5; ++idx)
296 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
297 cand_list.push_back(candidate);
298 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.001*boost::units::si::seconds);
303 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
304 typename Config::MsecTimeType width_tolerance(0.01 * boost::units::si::seconds);
305 typename Config::MsecTimeType time_tolerance(0.001 * boost::units::si::seconds);
306 config.dm_tolerance(dm_tolerance);
307 config.pulse_width_tolerance(width_tolerance);
308 config.time_tolerance(time_tolerance);
309 config.linking_length(10);
310 Fof clusterer(config);
311 auto groups = clusterer(cand_list);
312 ASSERT_EQ(groups.size(),1U);
313 ASSERT_EQ(groups[0].size(),5U);
316 TEST_F(FofTest, test_dm_negative_index)
321 data::SpCcl<NumericalRep>::BlocksType tf_v;
322 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
323 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
324 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
327 data::SpCcl<NumericalRep> cand_list(tf_v);
330 typename Config::Dm dm(0.0 * pss::astrotypes::units::parsecs_per_cube_cm);
332 typename Config::MsecTimeType width(0.001 * boost::units::si::seconds);
334 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
338 for (std::size_t idx=0; idx<5; ++idx)
340 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
341 cand_list.push_back(candidate);
342 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.001*boost::units::si::seconds);
347 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
348 typename Config::MsecTimeType width_tolerance(0.01 * boost::units::si::seconds);
349 typename Config::MsecTimeType time_tolerance(0.001 * boost::units::si::seconds);
350 config.dm_tolerance(dm_tolerance);
351 config.pulse_width_tolerance(width_tolerance);
352 config.time_tolerance(time_tolerance);
353 config.linking_length(10);
354 Fof clusterer(config);
355 auto groups = clusterer(cand_list);
356 ASSERT_EQ(groups.size(),1U);
357 ASSERT_EQ(groups[0].size(),5U);
360 TEST_F(FofTest, test_time_negative_index)
365 data::SpCcl<NumericalRep>::BlocksType tf_v;
366 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
367 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
368 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
371 data::SpCcl<NumericalRep> cand_list(tf_v);
374 typename Config::Dm dm(12.0 * pss::astrotypes::units::parsecs_per_cube_cm);
376 typename Config::MsecTimeType width(0.001 * boost::units::si::seconds);
378 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(0.0 * boost::units::si::seconds);
382 for (std::size_t idx=0; idx<5; ++idx)
384 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
385 cand_list.push_back(candidate);
386 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.001*boost::units::si::seconds);
391 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
392 typename Config::MsecTimeType width_tolerance(0.01 * boost::units::si::seconds);
393 typename Config::MsecTimeType time_tolerance(0.001 * boost::units::si::seconds);
394 config.dm_tolerance(dm_tolerance);
395 config.pulse_width_tolerance(width_tolerance);
396 config.time_tolerance(time_tolerance);
397 config.linking_length(10);
398 Fof clusterer(config);
399 auto groups = clusterer(cand_list);
400 ASSERT_EQ(groups.size(),1U);
401 ASSERT_EQ(groups[0].size(),5U);
404 TEST_F(FofTest, test_group_multiple_candidates_all_parameters)
407 data::SpCcl<NumericalRep>::BlocksType tf_v;
408 data::TimeFrequency<Cpu, NumericalRep> tf1(data::DimensionSize<data::Time>(100), data::DimensionSize<data::Frequency>(16));
409 tf1.sample_interval(data::TimeFrequency<Cpu, NumericalRep>::TimeType(1 * boost::units::si::milli * boost::units::si::seconds));
410 tf_v.push_back(std::make_shared<data::TimeFrequency<Cpu, NumericalRep>>(tf1));
414 data::SpCcl<NumericalRep> cand_list(tf_v);
417 typename Config::Dm dm(50.0 * pss::astrotypes::units::parsecs_per_cube_cm);
419 typename Config::MsecTimeType width(0.256 * boost::units::si::seconds);
421 data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType tstart(2.0 * boost::units::si::seconds);
425 for (std::size_t idx=0; idx<10; ++idx)
427 for (std::size_t ind=0; ind < 50; ++ind)
429 data::SpCcl<NumericalRep>::SpCandidateType candidate(dm, tstart, width, sigma, idx);
430 cand_list.push_back(candidate);
431 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.002*boost::units::si::seconds);
432 width += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.002*boost::units::si::seconds);
433 dm += 1.0 * pss::astrotypes::units::parsecs_per_cube_cm;
435 tstart += data::SpCcl<NumericalRep>::SpCandidateType::MsecTimeType(0.1*boost::units::si::seconds);
440 typename Config::Dm dm_tolerance(1.0 * pss::astrotypes::units::parsecs_per_cube_cm);
441 typename Config::MsecTimeType width_tolerance(0.002 * boost::units::si::seconds);
442 typename Config::MsecTimeType time_tolerance(0.01 * boost::units::si::seconds);
443 config.dm_tolerance(dm_tolerance);
444 config.pulse_width_tolerance(width_tolerance);
445 config.time_tolerance(time_tolerance);
446 config.linking_length(1.5);
447 Fof clusterer(config);
448 auto groups = clusterer(cand_list);
449 ASSERT_EQ(groups.size(),10U);
450 ASSERT_EQ(groups[0].size(),50U);
Some limits and constants for FLDO.