FORS Pipeline Reference Manual  5.0.9
create_stetson.c
1 #include<cpl.h>
2 
3 #include<stdio.h>
4 #include<string.h>
5 #include<errno.h>
6 
7 /*
8  This program creates a standard star FITS table from Stetson's list of ASCII data
9 
10 
11  Usage
12 
13  1. Get all Stetson *.pho and *.pos files
14  2. Filter out headers, append to single file:
15  $ cat *.pho | grep -v "vary?" > stetson.pho
16  $ cat *.pos | grep -v Reference > stetson.pos
17  3. Convert to FITS
18  $ create_stetson_fits stetson.pho stetson.pos stetson.fits
19  This program will verify that the object names in the 2 ASCII
20  files match row by row .
21 
22 */
23 
24 /*
25  This research used the facilities of the Canadian Astronomy Data Centre operated
26  by the National Research Council of Canada with the support of the Canadian Space Agency.
27 */
28 
29 #define DIE \
30 do { \
31  fprintf(stderr, "Error at %s:%d\n", __func__, __LINE__); \
32  if (errno) perror(NULL); \
33  cpl_end(); \
34  exit(EXIT_FAILURE); \
35 } while (0)
36 
37 #define CHECK \
38 do { \
39  if (cpl_error_get_code()) { \
40  cpl_msg_error(cpl_func, "%s", cpl_error_get_where()); \
41  DIE; \
42  } \
43 } while (0)
44 
45 int main(int argc, char *argv[])
46 {
47  cpl_table *table;
48  int size = 0;
49  const int maxsize = 100*1000;
50 
51  cpl_init(CPL_INIT_DEFAULT);
52 
53  if (argc != 4) {
54  fprintf(stderr,
55  "Usage:\n %s [stetson.pho] [stetson.pos] [stetson.fits]\n", argv[0]);
56  DIE;
57  }
58 
59  const char *filename_pho = argv[1];
60  const char *filename_pos = argv[2];
61  const char *filename_out = argv[3];
62 
63  table = cpl_table_new(maxsize);
64  CHECK;
65 
66  struct {
67  const char *colname;
68  cpl_type type;
69  const char *unit;
70  } data[] = {
71 
72  {"OBJECT", CPL_TYPE_STRING, NULL},
73 
74  {"RA" , CPL_TYPE_DOUBLE, "degree"},
75  {"DEC", CPL_TYPE_DOUBLE, "degree"},
76 
77  /* estimated intrinsic variability in magnitude RMS */
78  {"VAR", CPL_TYPE_FLOAT, "mag rms"},
79 
80  /* B: magnitude */
81  /* ERR_B: magnitude error */
82  /* N_B: number of observations obtained on photometric occasions */
83  /* n_B: total number of observations */
84 
85  {"B" , CPL_TYPE_FLOAT, "mag"},
86  {"ERR_B", CPL_TYPE_FLOAT, "mag"},
87  {"N_B" , CPL_TYPE_INT, NULL},
88  {"n_B" , CPL_TYPE_INT, NULL},
89 
90  {"V" , CPL_TYPE_FLOAT, "mag"},
91  {"ERR_V", CPL_TYPE_FLOAT, "mag"},
92  {"N_V" , CPL_TYPE_INT, NULL},
93  {"n_V" , CPL_TYPE_INT, NULL},
94 
95  {"R" , CPL_TYPE_FLOAT, "mag"},
96  {"ERR_R", CPL_TYPE_FLOAT, "mag"},
97  {"N_R" , CPL_TYPE_INT, NULL},
98  {"n_R" , CPL_TYPE_INT, NULL},
99 
100  {"I" , CPL_TYPE_FLOAT, "mag"},
101  {"ERR_I", CPL_TYPE_FLOAT, "mag"},
102  {"N_I" , CPL_TYPE_INT, NULL},
103  {"n_I" , CPL_TYPE_INT, NULL}
104 
105  };
106 
107  {
108  unsigned i;
109  for (i = 0; i < sizeof(data) / sizeof(*data); i++) {
110  cpl_table_new_column (table, data[i].colname, data[i].type);
111  if (data[i].unit != NULL) {
112  cpl_table_set_column_unit(table, data[i].colname, data[i].unit);
113  }
114  }
115  }
116  CHECK;
117 
118  {
119  char name_pho[1000];
120  char name_pos[1000];
121  float mag[5];
122  float err[5];
123  int N[5];
124  int n[5];
125  float var;
126  float dummy;
127  int items_assigned;
128 
129  FILE *file_pho = fopen(filename_pho, "r");
130  FILE *file_pos = fopen(filename_pos, "r");
131 
132  if (file_pho == NULL) DIE;
133  if (file_pos == NULL) DIE;
134 
135  size = 0;
136  while((items_assigned = fscanf(file_pho,
137  "%s"
138  "%f %f %d %d "
139  "%f %f %d %d "
140  "%f %f %d %d "
141  "%f %f %d %d "
142  "%f",
143  name_pho,
144  &mag[0], &err[0], &N[0], &n[0],
145  &mag[1], &err[1], &N[1], &n[1],
146  &mag[2], &err[2], &N[2], &n[2],
147  &mag[3], &err[3], &N[3], &n[3], &var))
148  != EOF) {
149  double ra, dec;
150  int i;
151 
152  printf("%d: %s ", items_assigned, name_pho);
153  printf("%f %f %d %d ", mag[0], err[0], N[0], n[0]);
154  printf("%f %f %d %d ", mag[1], err[1], N[1], n[1]);
155  printf("%f %f %d %d ", mag[2], err[2], N[2], n[2]);
156  printf("%f %f %d %d ", mag[3], err[3], N[3], n[3]);
157  printf("%f ", var);
158 
159  if (items_assigned != 18) DIE;
160 
161 
162  /* Read RA, DEC */
163  if (fscanf(file_pos,
164  "%lf %lf "
165  "%f %f %f "
166  "%f %f %f "
167  "%f %f %f %f "
168  "%s",
169  &ra, &dec,
170  &dummy, &dummy, &dummy, //hexagesimal RA
171  &dummy, &dummy, &dummy, //hexagesimal DEC
172  &dummy, &dummy, &dummy, &dummy, //offset in arcsecs, pixels
173  name_pos) != 13) DIE;
174 
175  printf("%s (%f, %f)", name_pos, ra, dec);
176  printf("\n");
177 
178  if (strcmp(name_pho, name_pos) != 0) {
179  fprintf(stderr, "Mismatching OBJECT name: %s (pho), %s (pos)\n",
180  name_pho, name_pos);
181  DIE;
182  }
183 
184  cpl_table_set_string(table, data[0].colname, size, name_pho);
185  cpl_table_set_double(table, data[1].colname, size, ra);
186  cpl_table_set_double(table, data[2].colname, size, dec);
187  cpl_table_set_float (table, data[3].colname, size, var);
188 
189  for (i = 0; i < 4; i++) {
190  /* zero or two of N and n must be zero */
191  if (N[i] == 0 && n[i] != 0) DIE;
192  if (N[i] != 0 && n[i] == 0) DIE;
193 
194  if (N[i] != 0) {
195  cpl_table_set_float (table, data[i*4+4].colname, size, mag[i]);
196  cpl_table_set_float (table, data[i*4+5].colname, size, err[i]);
197  cpl_table_set_int (table, data[i*4+6].colname, size, N[i]);
198  cpl_table_set_int (table, data[i*4+7].colname, size, n[i]);
199  } else {
200  cpl_table_set_invalid(table, data[i*4+4].colname, size);
201  cpl_table_set_invalid(table, data[i*4+5].colname, size);
202  cpl_table_set_invalid(table, data[i*4+6].colname, size);
203  cpl_table_set_invalid(table, data[i*4+7].colname, size);
204  }
205  }
206  size++;
207  }
208  fclose(file_pho);
209 
210  fclose(file_pos);
211  }
212 
213 
214  CHECK;
215 
216  cpl_table_set_size(table, size);
217 
218  cpl_table_save(table, NULL, NULL, filename_out, CPL_IO_DEFAULT);
219 
220  CHECK;
221 
222  fprintf(stdout, "Created %s\n", filename_out);
223 
224  return 0;
225 }
int main(void)
Generic library tests.
Definition: fors-test.c:57