50 double candidate_period, test_period, candidate_dm, test_dm, period_ratio;
51 std::vector<bool> identified_as_harmonic(ccl.size(), {
false});
52 std::vector<double> harmonic_ratio;
53 std::size_t candidate_index, test_candidate_index;
54 data::Ccl::CandidateType candidate, test_candidate;
57 auto scl = std::make_shared<data::Scl>();
60 std::sort(ccl.begin(), ccl.end(), sort_vector_by_sigma_asc);
64 for (std::size_t bottom = 1; bottom <= top; bottom++) {
65 harmonic_ratio.push_back((
double) top/bottom);
70 std::sort(harmonic_ratio.begin(), harmonic_ratio.end());
73 auto iter = unique(harmonic_ratio.begin(), harmonic_ratio.end());
74 harmonic_ratio.resize(distance(harmonic_ratio.begin(), iter));
80 candidate_index = std::find(identified_as_harmonic.begin(), identified_as_harmonic.end(), 0) - identified_as_harmonic.begin();
81 if (candidate_index >= identified_as_harmonic.size()) {
85 PANDA_LOG_DEBUG <<
"candidate_index = " << candidate_index;
88 candidate = ccl[candidate_index];
89 candidate_period = boost::units::quantity_cast<
double>(candidate.period());
90 candidate_dm = boost::units::quantity_cast<
double>(candidate.dm());
92 PANDA_LOG_DEBUG <<
"candidate_period = " << candidate_period <<
", candidate_dm = " << candidate_dm;
95 scl->push_back(candidate);
98 identified_as_harmonic[candidate_index] = 1;
101 for (test_candidate_index = candidate_index + 1; test_candidate_index < ccl.size(); test_candidate_index++) {
103 if (identified_as_harmonic[test_candidate_index]) {
107 PANDA_LOG_DEBUG <<
"test_cand_index = " << test_candidate_index;
109 test_candidate = ccl[test_candidate_index];
110 test_period = boost::units::quantity_cast<
double>(test_candidate.period());
111 test_dm = boost::units::quantity_cast<
double>(test_candidate.dm());
113 PANDA_LOG_DEBUG <<
"test_period = " << test_period <<
", test_dm = " << test_dm;
116 if (candidate_period >= test_period) {
117 period_ratio = candidate_period/test_period;
119 period_ratio = test_period/candidate_period;
123 for (
auto iter = harmonic_ratio.begin(); iter != harmonic_ratio.end(); ++iter) {
124 if (std::abs(period_ratio - *iter) < (_config.match_factor() * *iter)) {
126 if (std::abs(candidate_dm - test_dm) < 10) {
128 identified_as_harmonic[test_candidate_index] = 2;
129 PANDA_LOG_DEBUG <<
"Harmonic found!";
std::size_t num_candidate_harmonics() const
The max number of harmonics to search.