1 /*
2  # This file is part of the Astrometry.net suite.
3  # Licensed under a 3-clause BSD style license - see LICENSE
4  */
5 
6 /*
7  Checks the consistency of "quad" and "qidx" files.
8  */
9 
10 #include <string.h>
11 
12 #include "starutil.h"
13 #include "quadfile.h"
14 #include "qidxfile.h"
15 #include "bl.h"
16 #include "fitsioutils.h"
17 
18 #define OPTIONS "hf:"
19 const char HelpString[] =
20     "quadidx -f fname\n";
21 
22 
main(int argc,char * argv[])23 int main(int argc, char *argv[]) {
24     int argidx, argchar;
25     char *qidxfname = NULL;
26     char *quadfname = NULL;
27     quadfile* quad;
28     qidxfile* qidx;
29     int q, s;
30     int dimquads;
31 
32     while ((argchar = getopt (argc, argv, OPTIONS)) != -1)
33         switch (argchar) {
34         case 'f':
35             qidxfname = mk_qidxfn(optarg);
36             quadfname = mk_quadfn(optarg);
37             break;
38         case '?':
39             fprintf(stderr, "Unknown option `-%c'.\n", optopt);
40         case 'h':
41             fprintf(stderr, HelpString);
42             return (HELP_ERR);
43         default:
44             return (OPT_ERR);
45         }
46 
47     if (optind < argc) {
48         for (argidx = optind; argidx < argc; argidx++)
49             fprintf (stderr, "Non-option argument %s\n", argv[argidx]);
50         fprintf(stderr, HelpString);
51         return (OPT_ERR);
52     }
53 
54     quad = quadfile_open(quadfname, 0);
55     if (!quad) {
56         fprintf(stderr, "Couldn't open quads file %s.\n", quadfname);
57         exit(-1);
58     }
59 
60     qidx = qidxfile_open(qidxfname, 0);
61     if (!qidx) {
62         fprintf(stderr, "Couldn't open qidx file %s.\n", qidxfname);
63         exit(-1);
64     }
65 
66     if (quad->numquads != qidx->numquads) {
67         fprintf(stderr, "Number of quads does not agree: %i vs %i\n",
68                 quad->numquads, qidx->numquads);
69         exit(-1);
70     }
71 
72     dimquads = quadfile_dimquads(quad);
73 
74     printf("Checking stars...\n");
75     for (s=0; s<qidx->numstars; s++) {
76         uint32_t* quads;
77         int nquads;
78         int j;
79         qidxfile_get_quads(qidx, s, &quads, &nquads);
80         for (j=0; j<nquads; j++) {
81             int star[dimquads];
82             int k, n;
83             quadfile_get_stars(quad, quads[j], star);
84             n = 0;
85             for (k=0; k<dimquads; k++) {
86                 if (star[k] == s)
87                     n++;
88             }
89             if (n != 1) {
90                 fprintf(stderr, "Star %i, quad %i: found %i instances of the quad in the qidx (not 1)\n",
91                         s, quads[j], n);
92                 fprintf(stderr, "  found: ");
93                 for (k=0; k<dimquads; k++) {
94                     fprintf(stderr, "%i ", star[k]);
95                 }
96                 fprintf(stderr, "\n");
97             }
98         }
99     }
100 
101     printf("Checking quads...\n");
102     for (q=0; q<quad->numquads; q++) {
103         int star[dimquads];
104         uint32_t* quads;
105         int nquads;
106         int j;
107         quadfile_get_stars(quad, q, star);
108         for (j=0; j<dimquads; j++) {
109             int k;
110             int n;
111             qidxfile_get_quads(qidx, star[j], &quads, &nquads);
112             n = 0;
113             for (k=0; k<nquads; k++) {
114                 if (quads[k] == q)
115                     n++;
116             }
117             if (n != 1) {
118                 fprintf(stderr, "Quad %i, star %i: found %i instances of the quad in the qidx (not 1)\n",
119                         q, star[j], n);
120                 fprintf(stderr, "  found: ");
121                 for (k=0; k<nquads; k++) {
122                     fprintf(stderr, "%i ", quads[k]);
123                 }
124                 fprintf(stderr, "\n");
125             }
126         }
127     }
128 
129     quadfile_close(quad);
130     qidxfile_close(qidx);
131 
132     return 0;
133 }
134