1 /*
2 # This file is part of the Astrometry.net suite.
3 # Licensed under a 3-clause BSD style license - see LICENSE
4 */
5 #include <math.h>
6 #include <stdio.h>
7 #include <string.h>
8
9 #include "os-features.h"
10 #include "cutest.h"
11 #include "2mass.h"
12 #include "2mass-fits.h"
13 #include "an-bool.h"
14 #include "starutil.h"
15
check_entry1(CuTest * tc,twomass_entry * entry)16 void check_entry1(CuTest* tc, twomass_entry* entry) {
17 CuAssertDblEquals(tc, 1.119851, entry->ra, 1e-6);
18 CuAssertDblEquals(tc, -89.91861, entry->dec, 1e-6);
19 CuAssertDblEquals(tc, 0.11, deg2arcsec(entry->err_major), 1e-2);
20 CuAssertDblEquals(tc, 0.06, deg2arcsec(entry->err_minor), 1e-2);
21 CuAssertDblEquals(tc, 90.0, entry->err_angle, 1e-1);
22 CuAssertIntEquals(tc, 0, strcmp("00042876-8955069 ", entry->designation));
23
24 CuAssertDblEquals(tc, 12.467, entry->j_m, 1e-3);
25 CuAssertDblEquals(tc, 0.018, entry->j_cmsig, 1e-3);
26 CuAssertDblEquals(tc, 0.021, entry->j_msigcom, 1e-3);
27 CuAssertDblEquals(tc, 359.4, entry->j_snr, 1e-1);
28
29 CuAssertDblEquals(tc, 12.131, entry->h_m, 1e-3);
30 CuAssertDblEquals(tc, 0.025, entry->h_cmsig, 1e-3);
31 CuAssertDblEquals(tc, 0.026, entry->h_msigcom, 1e-3);
32 CuAssertDblEquals(tc, 224.7, entry->h_snr, 1e-1);
33
34 CuAssertDblEquals(tc, 11.963, entry->k_m, 1e-3);
35 CuAssertDblEquals(tc, 0.023, entry->k_cmsig, 1e-3);
36 CuAssertDblEquals(tc, 0.025, entry->k_msigcom, 1e-3);
37 CuAssertDblEquals(tc, 133.7, entry->k_snr, 1e-1);
38
39 CuAssertIntEquals(tc, TWOMASS_QUALITY_A, entry->j_quality);
40 CuAssertIntEquals(tc, TWOMASS_QUALITY_A, entry->h_quality);
41 CuAssertIntEquals(tc, TWOMASS_QUALITY_A, entry->k_quality);
42
43 CuAssert(tc, "jqual", twomass_quality_flag(entry->j_quality, TWOMASS_QUALITY_A));
44 CuAssert(tc, "hqual", twomass_quality_flag(entry->h_quality, TWOMASS_QUALITY_A));
45 CuAssert(tc, "kqual", twomass_quality_flag(entry->k_quality, TWOMASS_QUALITY_A));
46
47 CuAssertIntEquals(tc, 2, entry->j_read_flag);
48 CuAssertIntEquals(tc, 2, entry->h_read_flag);
49 CuAssertIntEquals(tc, 2, entry->k_read_flag);
50
51 CuAssertIntEquals(tc, 1, entry->j_blend_flag);
52 CuAssertIntEquals(tc, 1, entry->h_blend_flag);
53 CuAssertIntEquals(tc, 1, entry->k_blend_flag);
54
55 CuAssertIntEquals(tc, TWOMASS_CC_NONE, entry->j_cc);
56 CuAssertIntEquals(tc, TWOMASS_CC_NONE, entry->h_cc);
57 CuAssertIntEquals(tc, TWOMASS_CC_NONE, entry->k_cc);
58
59 CuAssertIntEquals(tc, 6, entry->j_ndet_M);
60 CuAssertIntEquals(tc, 6, entry->j_ndet_N);
61 CuAssertIntEquals(tc, 6, entry->h_ndet_M);
62 CuAssertIntEquals(tc, 6, entry->h_ndet_N);
63 CuAssertIntEquals(tc, 6, entry->k_ndet_M);
64 CuAssertIntEquals(tc, 6, entry->k_ndet_N);
65
66 CuAssertDblEquals(tc, 37.2, deg2arcsec(entry->proximity), 1e-1);
67 CuAssertDblEquals(tc, 245, entry->prox_angle, 1e-1);
68 CuAssertIntEquals(tc, 1329023254, entry->prox_key);
69
70 CuAssertIntEquals(tc, 0, entry->galaxy_contam);
71 CuAssertIntEquals(tc, FALSE, entry->minor_planet);
72 CuAssertIntEquals(tc, 1101364107, entry->key);
73 CuAssertIntEquals(tc, FALSE, entry->northern_hemisphere);
74 CuAssertIntEquals(tc, 2000, entry->date_year);
75 CuAssertIntEquals(tc, 9, entry->date_month);
76 CuAssertIntEquals(tc, 22, entry->date_day);
77 CuAssertIntEquals(tc, 64, entry->scan);
78
79 CuAssertDblEquals(tc, 302.951, entry->glon, 1e-3);
80 CuAssertDblEquals(tc, -27.208, entry->glat, 1e-3);
81 CuAssertDblEquals(tc, 1.6, deg2arcsec(entry->x_scan), 1e-1);
82 CuAssertDblEquals(tc, 2451809.7124, entry->jdate, 1e-4);
83
84 CuAssertDblEquals(tc, 1.07, entry->j_psfchi, 1e-2);
85 CuAssertDblEquals(tc, 1.18, entry->h_psfchi, 1e-2);
86 CuAssertDblEquals(tc, 0.81, entry->k_psfchi, 1e-2);
87
88 CuAssertDblEquals(tc, 12.481, entry->j_m_stdap, 1e-3);
89 CuAssertDblEquals(tc, 0.014, entry->j_msig_stdap, 1e-3);
90 CuAssertDblEquals(tc, 12.112, entry->h_m_stdap, 1e-3);
91 CuAssertDblEquals(tc, 0.028, entry->h_msig_stdap, 1e-3);
92 CuAssertDblEquals(tc, 11.980, entry->k_m_stdap, 1e-3);
93 CuAssertDblEquals(tc, 0.012, entry->k_msig_stdap, 1e-3);
94
95 CuAssertDblEquals(tc, 332, deg2arcsec(entry->dist_edge_ns), 1e-1);
96 CuAssertDblEquals(tc, 251, deg2arcsec(entry->dist_edge_ew), 1e-1);
97 CuAssertIntEquals(tc, FALSE, entry->dist_flag_ns);
98 CuAssertIntEquals(tc, FALSE, entry->dist_flag_ew);
99 CuAssertIntEquals(tc, 1, entry->dup_src);
100 CuAssertIntEquals(tc, TRUE, entry->use_src);
101 CuAssertIntEquals(tc, TWOMASS_ASSOCIATION_NONE, entry->association);
102
103 CuAssert(tc, "dist null", !isfinite(entry->dist_opt));
104 CuAssert(tc, "dist null2", twomass_is_null_float(entry->dist_opt));
105 CuAssert(tc, "phiopt null", twomass_is_null_float(entry->phi_opt));
106 CuAssert(tc, "bmopt null", twomass_is_null_float(entry->b_m_opt));
107 CuAssert(tc, "vrmopt null", twomass_is_null_float(entry->vr_m_opt));
108 CuAssertIntEquals(tc, 0, entry->nopt_mchs);
109 CuAssertIntEquals(tc, TWOMASS_KEY_NULL, entry->xsc_key);
110
111 CuAssertIntEquals(tc, 59038, entry->scan_key);
112 CuAssertIntEquals(tc, 1357874, entry->coadd_key);
113 CuAssertIntEquals(tc, 267, entry->coadd);
114 }
115
test_read_2mass(CuTest * tc)116 void test_read_2mass(CuTest* tc) {
117 // Read some sample lines from the raw 2MASS catalog.
118 // psc_aaa.gz line 1.
119 char* line1 = "1.119851|-89.91861|0.11|0.06|90|00042876-8955069 |"
120 "12.467|0.018|0.021|359.4|" // jmag
121 "12.131|0.025|0.026|224.7|" // hmag
122 "11.963|0.023|0.025|133.7|" // kmag
123 "AAA|222|111|000|" // quality through cc
124 "666666|" // ndet
125 "37.2|245|1329023254|" // prox
126 "0|0|1101364107|s|2000-09-22|64|" // galaxy_contam through scan
127 "302.951|-27.208|1.6|2451809.7124|" // glat through jdate
128 "1.07|1.18|0.81|" // psfchi
129 "12.481|0.014|12.112|0.028|11.98|0.012|" // stdap
130 "332|251|sw|1|1|0|" // dist through association
131 "\\N|\\N|\\N|\\N|0|\\N|" // match
132 "59038|1357874|267";
133 twomass_entry entry;
134 twomass_fits* out;
135 twomass_fits* in;
136 twomass_entry* ein;
137 char* fn = "/tmp/test-2mass-0";
138
139 memset(&entry, 0, sizeof(twomass_entry));
140 CuAssertIntEquals(tc, 0, twomass_parse_entry(&entry, line1));
141
142 check_entry1(tc, &entry);
143
144 out = twomass_fits_open_for_writing(fn);
145 CuAssertPtrNotNull(tc, out);
146 CuAssertIntEquals(tc, 0, twomass_fits_count_entries(out));
147 CuAssertIntEquals(tc, 0, twomass_fits_write_headers(out));
148 CuAssertIntEquals(tc, 0, twomass_fits_write_entry(out, &entry));
149 CuAssertIntEquals(tc, 1, twomass_fits_count_entries(out));
150 CuAssertIntEquals(tc, 0, twomass_fits_fix_headers(out));
151 CuAssertIntEquals(tc, 0, twomass_fits_close(out));
152 out = NULL;
153
154 memset(&entry, 0, sizeof(twomass_entry));
155
156 in = twomass_fits_open(fn);
157 CuAssertPtrNotNull(tc, in);
158 CuAssertIntEquals(tc, 1, twomass_fits_count_entries(in));
159 ein = twomass_fits_read_entry(in);
160 CuAssertPtrNotNull(tc, ein);
161 check_entry1(tc, ein);
162 CuAssertIntEquals(tc, 0, twomass_fits_close(in));
163 in = NULL;
164
165 }
166
167
test_fits_empty(CuTest * tc)168 void test_fits_empty(CuTest* tc) {
169 char* fn = "/tmp/test-2mass-1";
170 twomass_fits* out;
171 out = twomass_fits_open_for_writing(fn);
172 CuAssertPtrNotNull(tc, out);
173 CuAssertIntEquals(tc, 0, twomass_fits_write_headers(out));
174 CuAssertIntEquals(tc, 0, twomass_fits_fix_headers(out));
175 CuAssertIntEquals(tc, 0, twomass_fits_close(out));
176 }
177