00001 #include<cpl.h>
00002
00003 #include<stdio.h>
00004 #include<string.h>
00005 #include<errno.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
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
00078 {"VAR", CPL_TYPE_FLOAT, "mag rms"},
00079
00080
00081
00082
00083
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
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,
00171 &dummy, &dummy, &dummy,
00172 &dummy, &dummy, &dummy, &dummy,
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
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
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 }