create_stetson.c

00001 #include<cpl.h>
00002 
00003 #include<stdio.h>
00004 #include<string.h>
00005 #include<errno.h>
00006 
00007 /*
00008    This program creates a standard star FITS table from Stetson's list of ASCII data
00009 
00010 
00011   Usage
00012 
00013   1. Get all Stetson  *.pho and *.pos files
00014   2. Filter out headers, append to single file:
00015         $ cat *.pho | grep -v "vary?"   > stetson.pho
00016         $ cat *.pos | grep -v Reference > stetson.pos
00017   3. Convert to FITS
00018         $ create_stetson_fits stetson.pho stetson.pos stetson.fits
00019      This program will verify that the object names in the 2 ASCII 
00020      files match row by row .
00021 
00022 */
00023 
00024 /*
00025   This research used the facilities of the Canadian Astronomy Data Centre operated
00026   by the National Research Council of Canada with the support of the Canadian Space Agency.
00027 */
00028 
00029 #define DIE \
00030 do { \
00031     fprintf(stderr, "Error at %s:%d\n", __func__, __LINE__); \
00032     if (errno) perror(NULL); \
00033     cpl_end(); \
00034     exit(EXIT_FAILURE); \
00035 } while (0)
00036 
00037 #define CHECK \
00038 do { \
00039     if (cpl_error_get_code()) { \
00040         cpl_msg_error(cpl_func, "%s", cpl_error_get_where()); \
00041         DIE; \
00042     } \
00043 } while (0)
00044 
00045 int main(int argc, char *argv[])
00046 {
00047     cpl_table *table;
00048     int size = 0;
00049     const int maxsize = 100*1000;
00050 
00051     cpl_init(CPL_INIT_DEFAULT);
00052 
00053     if (argc != 4) {
00054         fprintf(stderr,
00055                 "Usage:\n    %s  [stetson.pho] [stetson.pos]  [stetson.fits]\n", argv[0]);
00056         DIE;
00057     }
00058     
00059     const char *filename_pho = argv[1];
00060     const char *filename_pos = argv[2];
00061     const char *filename_out = argv[3];
00062 
00063     table = cpl_table_new(maxsize);
00064     CHECK;
00065     
00066     struct {
00067         const char *colname;
00068         cpl_type type;
00069         const char *unit;
00070     } data[] = {
00071 
00072         {"OBJECT", CPL_TYPE_STRING, NULL},
00073 
00074         {"RA" , CPL_TYPE_DOUBLE, "degree"},
00075         {"DEC", CPL_TYPE_DOUBLE, "degree"},
00076 
00077         /* estimated intrinsic variability in magnitude RMS */
00078         {"VAR", CPL_TYPE_FLOAT, "mag rms"},
00079 
00080         /*  B:     magnitude */
00081         /*  ERR_B: magnitude error */
00082         /*  N_B:   number of observations obtained on photometric occasions */
00083         /*  n_B:   total number of observations */
00084 
00085         {"B"    , CPL_TYPE_FLOAT, "mag"},
00086         {"ERR_B", CPL_TYPE_FLOAT, "mag"},
00087         {"N_B"  , CPL_TYPE_INT, NULL},
00088         {"n_B"  , CPL_TYPE_INT, NULL},
00089 
00090         {"V"    , CPL_TYPE_FLOAT, "mag"},
00091         {"ERR_V", CPL_TYPE_FLOAT, "mag"},
00092         {"N_V"  , CPL_TYPE_INT, NULL},
00093         {"n_V"  , CPL_TYPE_INT, NULL},
00094 
00095         {"R"    , CPL_TYPE_FLOAT, "mag"},
00096         {"ERR_R", CPL_TYPE_FLOAT, "mag"},
00097         {"N_R"  , CPL_TYPE_INT, NULL},
00098         {"n_R"  , CPL_TYPE_INT, NULL},
00099 
00100         {"I"    , CPL_TYPE_FLOAT, "mag"},
00101         {"ERR_I", CPL_TYPE_FLOAT, "mag"},
00102         {"N_I"  , CPL_TYPE_INT, NULL},
00103         {"n_I"  , CPL_TYPE_INT, NULL}
00104         
00105     };
00106     
00107     {
00108         unsigned i;
00109         for (i = 0; i < sizeof(data) / sizeof(*data); i++) {
00110             cpl_table_new_column     (table, data[i].colname, data[i].type);
00111             if (data[i].unit != NULL) {
00112                 cpl_table_set_column_unit(table, data[i].colname, data[i].unit);
00113             }
00114         }
00115     }
00116     CHECK;
00117 
00118     {
00119         char name_pho[1000];
00120         char name_pos[1000];
00121         float mag[5];
00122         float err[5];
00123         int N[5];
00124         int n[5];
00125         float var;
00126         float dummy;
00127         int items_assigned;
00128 
00129         FILE *file_pho = fopen(filename_pho, "r");
00130         FILE *file_pos = fopen(filename_pos, "r");
00131 
00132         if (file_pho == NULL) DIE;
00133         if (file_pos == NULL) DIE;
00134         
00135         size = 0;
00136         while((items_assigned = fscanf(file_pho, 
00137                                        "%s"
00138                                        "%f %f %d %d "
00139                                        "%f %f %d %d "
00140                                        "%f %f %d %d "
00141                                        "%f %f %d %d "
00142                                        "%f",
00143                                        name_pho, 
00144                                        &mag[0], &err[0], &N[0], &n[0],
00145                                        &mag[1], &err[1], &N[1], &n[1],
00146                                        &mag[2], &err[2], &N[2], &n[2],
00147                                        &mag[3], &err[3], &N[3], &n[3], &var))
00148               != EOF) {
00149             double ra, dec;
00150             int i;
00151 
00152             printf("%d: %s ", items_assigned, name_pho);
00153             printf("%f %f %d %d ", mag[0], err[0], N[0], n[0]);
00154             printf("%f %f %d %d ", mag[1], err[1], N[1], n[1]);
00155             printf("%f %f %d %d ", mag[2], err[2], N[2], n[2]);
00156             printf("%f %f %d %d ", mag[3], err[3], N[3], n[3]);
00157             printf("%f ", var);
00158                 
00159             if (items_assigned != 18) DIE;
00160 
00161 
00162             /* Read RA, DEC */
00163             if (fscanf(file_pos,
00164                        "%lf %lf "
00165                        "%f %f %f "
00166                        "%f %f %f "
00167                        "%f %f %f %f "
00168                        "%s",
00169                        &ra, &dec,
00170                        &dummy, &dummy, &dummy, //hexagesimal RA
00171                        &dummy, &dummy, &dummy, //hexagesimal DEC
00172                        &dummy, &dummy, &dummy, &dummy,  //offset in arcsecs, pixels
00173                        name_pos) != 13) DIE;
00174                        
00175             printf("%s (%f, %f)", name_pos, ra, dec);
00176             printf("\n");
00177 
00178             if (strcmp(name_pho, name_pos) != 0) {
00179                 fprintf(stderr, "Mismatching OBJECT name: %s (pho), %s (pos)\n",
00180                         name_pho, name_pos);
00181                 DIE;                
00182             }
00183             
00184             cpl_table_set_string(table, data[0].colname, size, name_pho);
00185             cpl_table_set_double(table, data[1].colname, size, ra);
00186             cpl_table_set_double(table, data[2].colname, size, dec);
00187             cpl_table_set_float (table, data[3].colname, size, var);
00188             
00189             for (i = 0; i < 4; i++) {
00190                 /* zero or two of N and n must be zero */
00191                 if (N[i] == 0 && n[i] != 0) DIE;
00192                 if (N[i] != 0 && n[i] == 0) DIE;
00193                 
00194                 if (N[i] != 0) {
00195                     cpl_table_set_float (table, data[i*4+4].colname, size, mag[i]);
00196                     cpl_table_set_float (table, data[i*4+5].colname, size, err[i]);
00197                     cpl_table_set_int   (table, data[i*4+6].colname, size,   N[i]);
00198                     cpl_table_set_int   (table, data[i*4+7].colname, size,   n[i]);
00199                 } else {
00200                     cpl_table_set_invalid(table, data[i*4+4].colname, size);
00201                     cpl_table_set_invalid(table, data[i*4+5].colname, size);
00202                     cpl_table_set_invalid(table, data[i*4+6].colname, size);
00203                     cpl_table_set_invalid(table, data[i*4+7].colname, size);
00204                 }
00205             }
00206             size++;
00207         }
00208         fclose(file_pho);
00209 
00210 //        fclose(file_pos);
00211     }
00212 
00213 
00214     CHECK;
00215 
00216     cpl_table_set_size(table, size);
00217    
00218     cpl_table_save(table, NULL, NULL, filename_out, CPL_IO_DEFAULT);
00219 
00220     CHECK;
00221     
00222     fprintf(stdout, "Created %s\n", filename_out);
00223 
00224     return 0;
00225 }

Generated on Fri Mar 4 09:46:00 2011 for FORS Pipeline Reference Manual by  doxygen 1.4.7