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