83 struct {
double jd;
const char *label; } epochs[] = {
84 { 2459019.833333,
"2020-06-19" },
85 { 2461112.5,
"2026-01-01" },
89 for (
auto &ep : epochs) {
98 GTEST_LOG_(INFO) << ep.label <<
" round-trip: RA=" << ra_err <<
"\" Dec=" << dec_err <<
"\"";
99 EXPECT_LT(ra_err, 1.0) <<
"Round-trip RA error at " << ep.label;
100 EXPECT_LT(dec_err, 1.0) <<
"Round-trip Dec error at " << ep.label;
109TEST(Libastro, HorizontalAccuracy_vs_IMCCE)
111 static constexpr double TOLERANCE_ARCSEC = 60.0;
113 auto cases = load_golden();
114 ASSERT_GT(cases.size(), 0u) <<
"Could not load horizontal_golden.json";
116 double max_az_err = 0, max_alt_err = 0;
118 for (
auto &c : cases) {
127 double az_err = az_diff_arcsec(hrz.
azimuth, c.az_truth);
128 double alt_err = std::abs(hrz.
altitude - c.alt_truth) * 3600.0;
129 max_az_err = std::max(max_az_err, az_err);
130 max_alt_err = std::max(max_alt_err, alt_err);
132 GTEST_LOG_(INFO) << c.object <<
" at " << c.site
133 <<
" az_err=" << az_err <<
"\" alt_err=" << alt_err <<
"\"";
134 EXPECT_LT(az_err, TOLERANCE_ARCSEC)
135 <<
"Az error for " << c.object <<
" at " << c.site
136 <<
": " << az_err <<
"\" (truth=" << c.az_truth <<
" got=" << hrz.
azimuth <<
")";
137 EXPECT_LT(alt_err, TOLERANCE_ARCSEC)
138 <<
"Alt error for " << c.object <<
" at " << c.site
139 <<
": " << alt_err <<
"\" (truth=" << c.alt_truth <<
" got=" << hrz.
altitude <<
")";
142 GTEST_LOG_(INFO) <<
"Horizontal accuracy (" << n <<
" cases):"
143 <<
" max az_err=" << max_az_err <<
"\""
144 <<
" max alt_err=" << max_alt_err <<
"\"";
153TEST(Libastro, ObserverLongitudeMatters)
155 auto cases = load_golden();
156 ASSERT_GT(cases.size(), 0u);
158 double alt_min = 999.0, alt_max = -999.0;
160 for (
auto &c : cases) {
161 if (c.object !=
"Vega")
continue;
168 alt_min = std::min(alt_min, hrz.
altitude);
169 alt_max = std::max(alt_max, hrz.
altitude);
172 ASSERT_GE(vega_count, 3) <<
"Need at least 3 Vega cases";
173 EXPECT_GT(alt_max - alt_min, 30.0)
174 <<
"Vega altitude spread=" << (alt_max - alt_min)
175 <<
" deg — expected >30 deg. Observer longitude may be ignored.";
176 GTEST_LOG_(INFO) <<
"Vega altitude spread: " << alt_min <<
" to " << alt_max
177 <<
" deg (spread=" << (alt_max - alt_min) <<
" deg)";
186TEST(Libastro, ObserverLatitudeMatters)
188 auto cases = load_golden();
189 ASSERT_GT(cases.size(), 0u);
191 double alt_greenwich = 999.0, alt_siding = 999.0;
192 for (
auto &c : cases) {
193 if (c.object !=
"Polaris")
continue;
200 if (c.site ==
"Greenwich") alt_greenwich = hrz.
altitude;
201 if (c.site ==
"Siding Spring") alt_siding = hrz.
altitude;
203 ASSERT_NE(alt_greenwich, 999.0) <<
"Greenwich Polaris case missing";
204 ASSERT_NE(alt_siding, 999.0) <<
"Siding Spring Polaris case missing";
206 EXPECT_GT(alt_greenwich, 0.0)
207 <<
"Polaris should be above horizon at Greenwich (got " << alt_greenwich <<
" deg)";
208 EXPECT_LT(alt_siding, 0.0)
209 <<
"Polaris should be below horizon at Siding Spring (got " << alt_siding <<
" deg)";
210 GTEST_LOG_(INFO) <<
"Polaris: Greenwich=" << alt_greenwich
211 <<
" deg, Siding Spring=" << alt_siding <<
" deg";
219TEST(Libastro, RoundTrip_HorizontalToEquatorial)
221 auto cases = load_golden();
222 ASSERT_GT(cases.size(), 0u);
224 double max_ra_err = 0, max_dec_err = 0;
225 for (
auto &c : cases) {
242 max_ra_err = std::max(max_ra_err, ra_err);
243 max_dec_err = std::max(max_dec_err, dec_err);
245 GTEST_LOG_(INFO) << c.object <<
" at " << c.site
246 <<
" ra_err=" << ra_err <<
"\" dec_err=" << dec_err <<
"\"";
247 EXPECT_LT(ra_err, 1.0) <<
"Round-trip RA error for " << c.object <<
" at " << c.site;
248 EXPECT_LT(dec_err, 1.0) <<
"Round-trip Dec error for " << c.object <<
" at " << c.site;
250 GTEST_LOG_(INFO) <<
"Round-trip max: RA=" << max_ra_err <<
"\" Dec=" << max_dec_err <<
"\"";
void J2000toObserved(IEquatorialCoordinates *J2000pos, double jd, IEquatorialCoordinates *observed)
*J2000toObserved converts catalogue to observed
void EquatorialToHorizontal(IEquatorialCoordinates *object, IGeographicCoordinates *observer, double JD, IHorizontalCoordinates *position)
EquatorialToHorizontal Calculate horizontal coordinates from equatorial coordinates.
void HorizontalToEquatorial(IHorizontalCoordinates *object, IGeographicCoordinates *observer, double JD, IEquatorialCoordinates *position)
HorizontalToEquatorial Calculate Equatorial EOD Coordinates from horizontal coordinates.
void ObservedToJ2000(IEquatorialCoordinates *observed, double jd, IEquatorialCoordinates *J2000pos)
ObservedToJ2000 converts an observed position to a J2000 catalogue position removes aberration,...