FORS Pipeline Reference Manual 4.9.20
|
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 }