107 #include <uves_physmod_stability_check.h>
108 #include <uves_utils_wrappers.h>
109 #include <uves_msg.h>
110 #include <uves_error.h>
162 cpl_table* tmp_tbl1=NULL;
163 cpl_table* tmp_tbl2=NULL;
164 cpl_table* tmp_tbl3=NULL;
165 cpl_table* tmp_tbl4=NULL;
167 cpl_table* tmp_tbl5=NULL;
177 check_nomsg(cpl_table_duplicate_column(m_tbl,
"X",m_tbl,
"XMES"));
178 check_nomsg(cpl_table_duplicate_column(m_tbl,
"Y",m_tbl,
"YMES"));
179 check_nomsg(cpl_table_duplicate_column(m_tbl,
"S",m_tbl,
"STATUS"));
180 check_nomsg(cpl_table_duplicate_column(m_tbl,
"O",m_tbl,
"ORDER"));
181 check_nomsg(cpl_table_duplicate_column(m_tbl,
"ID",m_tbl,
"IDENT"));
183 check_nomsg(cpl_table_duplicate_column(r_tbl,
"X",r_tbl,
"XMES"));
184 check_nomsg(cpl_table_duplicate_column(r_tbl,
"Y",r_tbl,
"YMES"));
185 check_nomsg(cpl_table_duplicate_column(r_tbl,
"S",r_tbl,
"STATUS"));
186 check_nomsg(cpl_table_duplicate_column(r_tbl,
"O",r_tbl,
"ORDER"));
187 check_nomsg(cpl_table_duplicate_column(r_tbl,
"ID",r_tbl,
"IDENT"));
192 cpl_table_save(m_tbl, NULL, NULL,
"m_tbl.fits", CPL_IO_DEFAULT);
193 cpl_table_save(r_tbl, NULL, NULL,
"r_tbl.fits", CPL_IO_DEFAULT);
196 uves_msg_warning(
"Actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
201 uves_msg_warning(
"After correction actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
203 }
else if (msz < rsz) {
205 uves_msg_warning(
"Actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
209 uves_msg_warning(
"After correction actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
212 cpl_table_save(m_tbl, NULL, NULL,
"after_m_tbl.fits", CPL_IO_DEFAULT);
213 cpl_table_save(r_tbl, NULL, NULL,
"after_r_tbl.fits", CPL_IO_DEFAULT);
216 check_nomsg(cpl_table_duplicate_column(r_tbl,
"Xm",m_tbl,
"X"));
217 check_nomsg(cpl_table_duplicate_column(r_tbl,
"Ym",m_tbl,
"Y"));
218 check_nomsg(cpl_table_duplicate_column(r_tbl,
"Sm",m_tbl,
"S"));
219 check_nomsg(cpl_table_duplicate_column(r_tbl,
"Om",m_tbl,
"O"));
220 check_nomsg(cpl_table_duplicate_column(r_tbl,
"IDm",m_tbl,
"ID"));
221 check_nomsg(cpl_table_duplicate_column(r_tbl,
"WAVEm",m_tbl,
"WAVE"));
224 check_nomsg(cpl_table_duplicate_column(r_tbl,
"DX",r_tbl,
"Xm"));
225 check_nomsg(cpl_table_duplicate_column(r_tbl,
"DY",r_tbl,
"Ym"));
226 check_nomsg(cpl_table_duplicate_column(r_tbl,
"DO",r_tbl,
"Om"));
227 check_nomsg(cpl_table_duplicate_column(r_tbl,
"DID",r_tbl,
"IDm"));
228 check_nomsg(cpl_table_duplicate_column(r_tbl,
"DW",r_tbl,
"WAVEm"));
231 check_nomsg(cpl_table_subtract_columns(r_tbl,
"DX",
"X"));
232 check_nomsg(cpl_table_subtract_columns(r_tbl,
"DY",
"Y"));
233 check_nomsg(cpl_table_subtract_columns(r_tbl,
"DO",
"O"));
234 check_nomsg(cpl_table_subtract_columns(r_tbl,
"DID",
"ID"));
235 check_nomsg(cpl_table_subtract_columns(r_tbl,
"DW",
"WAVE"));
238 check(cpl_table_power_column(r_tbl,
"DW",2.),
"Error computing power column");
239 check(cpl_table_power_column(r_tbl,
"DW",0.5),
"Error computing power column");
242 check(tmp_tbl1=uves_extract_table_rows(r_tbl,
"DO",CPL_EQUAL_TO,
243 0),
"Error selecting DO");
244 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,
"DW",CPL_LESS_THAN,
245 0.001),
"Error selecting DW");
246 check(tmp_tbl3=uves_extract_table_rows(tmp_tbl2,
"DID",CPL_LESS_THAN,
247 0.001),
"Error selecting DID");
248 check(tmp_tbl4=uves_extract_table_rows(tmp_tbl3,
"S",CPL_EQUAL_TO,
249 0),
"Error selecting S");
250 check(tmp_tbl5=uves_extract_table_rows(tmp_tbl4,
"Sm",CPL_EQUAL_TO,
251 0),
"Error selecting Sm");
254 check_nomsg(*med_dx=cpl_table_get_column_median(tmp_tbl5,
"DX"));
255 check_nomsg(*med_dy=cpl_table_get_column_median(tmp_tbl5,
"DY"));
256 check_nomsg(*avg_dx=cpl_table_get_column_mean(tmp_tbl5,
"DX"));
257 check_nomsg(*avg_dy=cpl_table_get_column_mean(tmp_tbl5,
"DY"));
258 check_nomsg(std_dx=cpl_table_get_column_stdev(tmp_tbl5,
"DX"));
259 check_nomsg(std_dy=cpl_table_get_column_stdev(tmp_tbl5,
"DY"));
264 uves_msg(
"Stability check results: Mean DX = %5.3f Mean DY = %5.3f",
267 check_nomsg(*med_dx=cpl_table_get_double(tmp_tbl5,
"DX",ref,&status));
269 uves_free_table(&tmp_tbl1);
270 uves_free_table(&tmp_tbl2);
273 check(tmp_tbl1=uves_extract_table_rows(tmp_tbl5,
"DX",CPL_GREATER_THAN,
274 *avg_dx-3*std_dx),
"Error selecting DO");
276 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,
"DX",CPL_LESS_THAN,
277 *avg_dx+3*std_dx),
"Error selecting DO");
279 check_nomsg(*med_dx=cpl_table_get_column_median(tmp_tbl2,
"DX"));
281 uves_free_table(&tmp_tbl1);
282 uves_free_table(&tmp_tbl2);
288 check_nomsg(*med_dy=cpl_table_get_double(tmp_tbl5,
"DY",ref,&status));
294 check(tmp_tbl1=uves_extract_table_rows(tmp_tbl5,
"DY",CPL_GREATER_THAN,
295 *avg_dy-3*std_dy),
"Error selecting DO");
297 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,
"DY",CPL_LESS_THAN,
298 *avg_dy+3*std_dy),
"Error selecting DO");
300 check_nomsg(*med_dy=cpl_table_get_column_median(tmp_tbl2,
"DY"));
302 uves_free_table(&tmp_tbl1);
303 uves_free_table(&tmp_tbl2);
306 uves_msg(
"Stability check results: Median DX = %5.3f Median DY = %5.3f",
310 uves_free_table(&tmp_tbl1);
311 uves_free_table(&tmp_tbl2);
312 uves_free_table(&tmp_tbl3);
313 uves_free_table(&tmp_tbl4);
314 uves_free_table(&tmp_tbl5);
351 check_nomsg(pmw=cpl_table_get_data_double(*m_tbl,col));
352 check_nomsg(prw=cpl_table_get_data_double(*r_tbl,col));
353 check_nomsg(pmc=cpl_table_get_data_int(*m_tbl,
"CHECK"));
354 check_nomsg(prc=cpl_table_get_data_int(*r_tbl,
"CHECK"));
355 check_nomsg(pmo=cpl_table_get_data_int(*m_tbl,
"CHECK"));
356 check_nomsg(pro=cpl_table_get_data_int(*r_tbl,
"CHECK"));
362 if((pmw[i]==prw[j]) && (pmo[i]==pro[j])) {
408 check_nomsg(uves_propertylist_append_bool(plist,
"ORDER",0));
409 check_nomsg(uves_propertylist_append_bool(plist,
"WAVE",0));
412 uves_free_propertylist(&plist);
415 ord_min=(cpl_table_get_column_min(*m_tbl,
"ORDER")>
416 cpl_table_get_column_min(*r_tbl,
"ORDER")) ?
417 cpl_table_get_column_min(*m_tbl,
"ORDER") :
418 cpl_table_get_column_min(*r_tbl,
"ORDER");
422 ord_max=(cpl_table_get_column_max(*m_tbl,
"ORDER")<
423 cpl_table_get_column_max(*r_tbl,
"ORDER")) ?
424 cpl_table_get_column_max(*m_tbl,
"ORDER") :
425 cpl_table_get_column_max(*r_tbl,
"ORDER");
434 wav_min=(cpl_table_get_column_min(*m_tbl,
"WAVE")>
435 cpl_table_get_column_min(*r_tbl,
"WAVE")) ?
436 cpl_table_get_column_min(*m_tbl,
"WAVE") :
437 cpl_table_get_column_min(*r_tbl,
"WAVE");
441 wav_max=(cpl_table_get_column_max(*m_tbl,
"WAVE")<
442 cpl_table_get_column_max(*r_tbl,
"WAVE")) ?
443 cpl_table_get_column_max(*m_tbl,
"WAVE") :
444 cpl_table_get_column_max(*r_tbl,
"WAVE");
451 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,
"ORDER",CPL_NOT_LESS_THAN,ord_min));
452 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,
"ORDER",CPL_NOT_GREATER_THAN,ord_max));
453 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_LESS_THAN,wav_min));
454 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_GREATER_THAN,wav_max));
456 check_nomsg(tmp=cpl_table_extract_selected(*m_tbl));
457 uves_free_table(m_tbl);
463 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,
"ORDER",CPL_NOT_LESS_THAN,ord_min));
464 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,
"ORDER",CPL_NOT_GREATER_THAN,ord_max));
465 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_LESS_THAN,wav_min));
466 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_GREATER_THAN,wav_max));
468 check_nomsg(tmp=cpl_table_extract_selected(*r_tbl));
469 uves_free_table(r_tbl);
474 cpl_table_new_column(*m_tbl,
"CHECK",CPL_TYPE_INT);
475 cpl_table_new_column(*r_tbl,
"CHECK",CPL_TYPE_INT);
476 cpl_table_fill_column_window_int(*r_tbl,
"CHECK",0,nr,0);
477 cpl_table_fill_column_window_int(*m_tbl,
"CHECK",0,nm,0);
480 for(i=ord_min;i<=ord_max;i++) {
482 cpl_table_and_selected_int(*m_tbl,
"ORDER",CPL_EQUAL_TO,i);
483 cpl_table_and_selected_int(*r_tbl,
"ORDER",CPL_EQUAL_TO,i);
488 cpl_table_select_all(*m_tbl);
489 cpl_table_select_all(*r_tbl);
492 wav_min=(cpl_table_get_column_min(*m_tbl,
"WAVE")>
493 cpl_table_get_column_min(*r_tbl,
"WAVE")) ?
494 cpl_table_get_column_min(*m_tbl,
"WAVE") :
495 cpl_table_get_column_min(*r_tbl,
"WAVE");
499 wav_max=(cpl_table_get_column_max(*m_tbl,
"WAVE")<
500 cpl_table_get_column_max(*r_tbl,
"WAVE")) ?
501 cpl_table_get_column_max(*m_tbl,
"WAVE") :
502 cpl_table_get_column_max(*r_tbl,
"WAVE");
508 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,
"ORDER",CPL_NOT_LESS_THAN,ord_min));
509 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,
"ORDER",CPL_NOT_GREATER_THAN,ord_max));
510 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_LESS_THAN,wav_min));
511 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_GREATER_THAN,wav_max));
512 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,
"CHECK",CPL_EQUAL_TO,1));
514 check_nomsg(tmp=cpl_table_extract_selected(*m_tbl));
515 uves_free_table(m_tbl);
518 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,
"ORDER",CPL_NOT_LESS_THAN,ord_min));
519 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,
"ORDER",CPL_NOT_GREATER_THAN,ord_max));
520 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_LESS_THAN,wav_min));
521 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,
"WAVE",CPL_NOT_GREATER_THAN,wav_max));
522 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,
"CHECK",CPL_EQUAL_TO,1));
524 check_nomsg(tmp=cpl_table_extract_selected(*r_tbl));
525 uves_free_table(r_tbl);
int uves_physmod_stability_check(cpl_table *m_tbl, cpl_table *r_tbl, double *med_dx, double *med_dy, double *avg_dx, double *avg_dy)
This procedure run a stability check.
#define uves_msg_warning(...)
Print an warning message.
static int uves_physmod_align_tables(cpl_table **m_tbl, cpl_table **r_tbl)
This procedure compares two input tables and eventually alignes them.
uves_propertylist * uves_propertylist_new(void)
Create an empty property list.
#define uves_msg(...)
Print a message on 'info' or 'debug' level.
static int flames_align_table_column(cpl_table **m_tbl, cpl_table **r_tbl, const char *col)
This procedure compares two input tables and eventually alignes them.