00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00100
00102 #ifdef HAVE_CONFIG_H
00103 # include <config.h>
00104 #endif
00105
00106
00107
00108
00109
00110 #include <uves_physmod_stability_check.h>
00111 #include <uves_utils_wrappers.h>
00112 #include <uves_msg.h>
00113 #include <uves_error.h>
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 static int
00126 uves_physmod_align_tables(cpl_table** m_tbl,
00127 cpl_table** r_tbl);
00128
00129
00130 static int
00131 flames_align_table_column(cpl_table** m_tbl,cpl_table** r_tbl,const char* col);
00132
00133
00134
00135
00136
00137
00153
00154
00155 int uves_physmod_stability_check(cpl_table* m_tbl,
00156 cpl_table* r_tbl,
00157 double* med_dx,
00158 double* med_dy,
00159 double* avg_dx,
00160 double* avg_dy)
00161
00162 {
00163
00164
00165 cpl_table* tmp_tbl1=NULL;
00166 cpl_table* tmp_tbl2=NULL;
00167 cpl_table* tmp_tbl3=NULL;
00168 cpl_table* tmp_tbl4=NULL;
00169
00170 cpl_table* tmp_tbl5=NULL;
00171
00172
00173 double std_dx=0;
00174 double std_dy=0;
00175
00176 int msz=0;
00177 int rsz=0;
00178 int ref=0;
00179 int status=0;
00180 check_nomsg(cpl_table_duplicate_column(m_tbl,"X",m_tbl,"XMES"));
00181 check_nomsg(cpl_table_duplicate_column(m_tbl,"Y",m_tbl,"YMES"));
00182 check_nomsg(cpl_table_duplicate_column(m_tbl,"S",m_tbl,"STATUS"));
00183 check_nomsg(cpl_table_duplicate_column(m_tbl,"O",m_tbl,"ORDER"));
00184 check_nomsg(cpl_table_duplicate_column(m_tbl,"ID",m_tbl,"IDENT"));
00185
00186 check_nomsg(cpl_table_duplicate_column(r_tbl,"X",r_tbl,"XMES"));
00187 check_nomsg(cpl_table_duplicate_column(r_tbl,"Y",r_tbl,"YMES"));
00188 check_nomsg(cpl_table_duplicate_column(r_tbl,"S",r_tbl,"STATUS"));
00189 check_nomsg(cpl_table_duplicate_column(r_tbl,"O",r_tbl,"ORDER"));
00190 check_nomsg(cpl_table_duplicate_column(r_tbl,"ID",r_tbl,"IDENT"));
00191
00192 check_nomsg(msz=cpl_table_get_nrow(m_tbl));
00193 check_nomsg(rsz=cpl_table_get_nrow(r_tbl));
00194
00195 cpl_table_save(m_tbl, NULL, NULL, "m_tbl.fits", CPL_IO_DEFAULT);
00196 cpl_table_save(r_tbl, NULL, NULL, "r_tbl.fits", CPL_IO_DEFAULT);
00197 if(msz > rsz) {
00198 check_nomsg(cpl_table_set_size(r_tbl,msz));
00199 uves_msg_warning("Actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
00200 uves_physmod_align_tables(&m_tbl,&r_tbl);
00201
00202 check_nomsg(msz=cpl_table_get_nrow(m_tbl));
00203 check_nomsg(rsz=cpl_table_get_nrow(r_tbl));
00204 uves_msg_warning("After correction actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
00205
00206 } else if (msz < rsz) {
00207 check_nomsg(cpl_table_set_size(m_tbl,rsz));
00208 uves_msg_warning("Actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
00209 uves_physmod_align_tables(&m_tbl,&r_tbl);
00210 check_nomsg(msz=cpl_table_get_nrow(m_tbl));
00211 check_nomsg(rsz=cpl_table_get_nrow(r_tbl));
00212 uves_msg_warning("After correction actual and reference tables have different sizes: act=%d ref=%d",msz,rsz);
00213
00214 }
00215 cpl_table_save(m_tbl, NULL, NULL, "after_m_tbl.fits", CPL_IO_DEFAULT);
00216 cpl_table_save(r_tbl, NULL, NULL, "after_r_tbl.fits", CPL_IO_DEFAULT);
00217
00218
00219 check_nomsg(cpl_table_duplicate_column(r_tbl,"Xm",m_tbl,"X"));
00220 check_nomsg(cpl_table_duplicate_column(r_tbl,"Ym",m_tbl,"Y"));
00221 check_nomsg(cpl_table_duplicate_column(r_tbl,"Sm",m_tbl,"S"));
00222 check_nomsg(cpl_table_duplicate_column(r_tbl,"Om",m_tbl,"O"));
00223 check_nomsg(cpl_table_duplicate_column(r_tbl,"IDm",m_tbl,"ID"));
00224 check_nomsg(cpl_table_duplicate_column(r_tbl,"WAVEm",m_tbl,"WAVE"));
00225
00226
00227 check_nomsg(cpl_table_duplicate_column(r_tbl,"DX",r_tbl,"Xm"));
00228 check_nomsg(cpl_table_duplicate_column(r_tbl,"DY",r_tbl,"Ym"));
00229 check_nomsg(cpl_table_duplicate_column(r_tbl,"DO",r_tbl,"Om"));
00230 check_nomsg(cpl_table_duplicate_column(r_tbl,"DID",r_tbl,"IDm"));
00231 check_nomsg(cpl_table_duplicate_column(r_tbl,"DW",r_tbl,"WAVEm"));
00232
00233
00234 check_nomsg(cpl_table_subtract_columns(r_tbl,"DX","X"));
00235 check_nomsg(cpl_table_subtract_columns(r_tbl,"DY","Y"));
00236 check_nomsg(cpl_table_subtract_columns(r_tbl,"DO","O"));
00237 check_nomsg(cpl_table_subtract_columns(r_tbl,"DID","ID"));
00238 check_nomsg(cpl_table_subtract_columns(r_tbl,"DW","WAVE"));
00239
00240
00241 check(cpl_table_power_column(r_tbl,"DW",2.),"Error computing power column");
00242 check(cpl_table_power_column(r_tbl,"DW",0.5),"Error computing power column");
00243
00244
00245 check(tmp_tbl1=uves_extract_table_rows(r_tbl,"DO",CPL_EQUAL_TO,
00246 0),"Error selecting DO");
00247 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,"DW",CPL_LESS_THAN,
00248 0.001),"Error selecting DW");
00249 check(tmp_tbl3=uves_extract_table_rows(tmp_tbl2,"DID",CPL_LESS_THAN,
00250 0.001),"Error selecting DID");
00251 check(tmp_tbl4=uves_extract_table_rows(tmp_tbl3,"S",CPL_EQUAL_TO,
00252 0),"Error selecting S");
00253 check(tmp_tbl5=uves_extract_table_rows(tmp_tbl4,"Sm",CPL_EQUAL_TO,
00254 0),"Error selecting Sm");
00255 check_nomsg(ref=cpl_table_get_nrow(tmp_tbl5)/2);
00256
00257 check_nomsg(*med_dx=cpl_table_get_column_median(tmp_tbl5,"DX"));
00258 check_nomsg(*med_dy=cpl_table_get_column_median(tmp_tbl5,"DY"));
00259 check_nomsg(*avg_dx=cpl_table_get_column_mean(tmp_tbl5,"DX"));
00260 check_nomsg(*avg_dy=cpl_table_get_column_mean(tmp_tbl5,"DY"));
00261 check_nomsg(std_dx=cpl_table_get_column_stdev(tmp_tbl5,"DX"));
00262 check_nomsg(std_dy=cpl_table_get_column_stdev(tmp_tbl5,"DY"));
00263
00264
00265
00266
00267 uves_msg("Stability check results: Mean DX = %5.3f Mean DY = %5.3f",
00268 *avg_dx,*avg_dy);
00269 check_nomsg(uves_sort_table_1(tmp_tbl5,"DX",0));
00270 check_nomsg(*med_dx=cpl_table_get_double(tmp_tbl5,"DX",ref,&status));
00271
00272 uves_free_table(&tmp_tbl1);
00273 uves_free_table(&tmp_tbl2);
00274
00275 if(std_dx > 0) {
00276 check(tmp_tbl1=uves_extract_table_rows(tmp_tbl5,"DX",CPL_GREATER_THAN,
00277 *avg_dx-3*std_dx),"Error selecting DO");
00278
00279 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,"DX",CPL_LESS_THAN,
00280 *avg_dx+3*std_dx),"Error selecting DO");
00281
00282 check_nomsg(*med_dx=cpl_table_get_column_median(tmp_tbl2,"DX"));
00283
00284 uves_free_table(&tmp_tbl1);
00285 uves_free_table(&tmp_tbl2);
00286 }
00287
00288
00289
00290 check_nomsg(uves_sort_table_1(tmp_tbl5,"DY",0));
00291 check_nomsg(*med_dy=cpl_table_get_double(tmp_tbl5,"DY",ref,&status));
00292
00293
00294
00295
00296 if(std_dy > 0) {
00297 check(tmp_tbl1=uves_extract_table_rows(tmp_tbl5,"DY",CPL_GREATER_THAN,
00298 *avg_dy-3*std_dy),"Error selecting DO");
00299
00300 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,"DY",CPL_LESS_THAN,
00301 *avg_dy+3*std_dy),"Error selecting DO");
00302
00303 check_nomsg(*med_dy=cpl_table_get_column_median(tmp_tbl2,"DY"));
00304
00305 uves_free_table(&tmp_tbl1);
00306 uves_free_table(&tmp_tbl2);
00307 }
00308
00309 uves_msg("Stability check results: Median DX = %5.3f Median DY = %5.3f",
00310 *med_dx,*med_dy);
00311
00312 cleanup:
00313 uves_free_table(&tmp_tbl1);
00314 uves_free_table(&tmp_tbl2);
00315 uves_free_table(&tmp_tbl3);
00316 uves_free_table(&tmp_tbl4);
00317 uves_free_table(&tmp_tbl5);
00318
00319 return 0;
00320
00321
00322 }
00323
00324
00335
00336
00337
00338 static int
00339 flames_align_table_column(cpl_table** m_tbl,cpl_table** r_tbl,const char* col)
00340 {
00341
00342 double* pmw=NULL;
00343 double* prw=NULL;
00344 int* pmc=NULL;
00345 int* prc=NULL;
00346 int* pmo=NULL;
00347 int* pro=NULL;
00348 int nm=0;
00349 int nr=0;
00350 int i=0;
00351 int j=0;
00352
00353
00354 check_nomsg(pmw=cpl_table_get_data_double(*m_tbl,col));
00355 check_nomsg(prw=cpl_table_get_data_double(*r_tbl,col));
00356 check_nomsg(pmc=cpl_table_get_data_int(*m_tbl,"CHECK"));
00357 check_nomsg(prc=cpl_table_get_data_int(*r_tbl,"CHECK"));
00358 check_nomsg(pmo=cpl_table_get_data_int(*m_tbl,"CHECK"));
00359 check_nomsg(pro=cpl_table_get_data_int(*r_tbl,"CHECK"));
00360 check_nomsg(nm=cpl_table_get_nrow(*m_tbl));
00361 check_nomsg(nr=cpl_table_get_nrow(*r_tbl));
00362 for(i=0;i<nm;i++) {
00363 for(j=0;j<nr;j++) {
00364
00365 if((pmw[i]==prw[j]) && (pmo[i]==pro[j])) {
00366 pmc[i]=1;
00367 prc[j]=1;
00368 }
00369
00370 }
00371 }
00372 cleanup:
00373
00374 return 0;
00375
00376 }
00377
00378
00388
00389
00390 static int
00391 uves_physmod_align_tables(cpl_table** m_tbl,
00392 cpl_table** r_tbl)
00393 {
00394 cpl_table* tmp=NULL;
00395
00396 uves_propertylist* plist=NULL;
00397 int ord_min=0;
00398 int ord_max=0;
00399 double wav_min=0;
00400 double wav_max=0;
00401 int i=0;
00402 int nm=0;
00403 int nr=0;
00404 int nsel=0;
00405
00406
00407 check_nomsg(nm=cpl_table_get_nrow(*m_tbl));
00408 check_nomsg(nr=cpl_table_get_nrow(*r_tbl));
00409
00410 check_nomsg(plist=uves_propertylist_new());
00411 check_nomsg(uves_propertylist_append_bool(plist,"ORDER",0));
00412 check_nomsg(uves_propertylist_append_bool(plist,"WAVE",0));
00413 check_nomsg(uves_table_sort(*m_tbl,plist));
00414 check_nomsg(uves_table_sort(*r_tbl,plist));
00415 uves_free_propertylist(&plist);
00416
00417
00418 ord_min=(cpl_table_get_column_min(*m_tbl,"ORDER")>
00419 cpl_table_get_column_min(*r_tbl,"ORDER")) ?
00420 cpl_table_get_column_min(*m_tbl,"ORDER") :
00421 cpl_table_get_column_min(*r_tbl,"ORDER");
00422
00423
00424
00425 ord_max=(cpl_table_get_column_max(*m_tbl,"ORDER")<
00426 cpl_table_get_column_max(*r_tbl,"ORDER")) ?
00427 cpl_table_get_column_max(*m_tbl,"ORDER") :
00428 cpl_table_get_column_max(*r_tbl,"ORDER");
00429
00430
00431
00432
00433 uves_msg_warning("ord_min=%d",ord_min);
00434 uves_msg_warning("ord_max=%d",ord_max);
00435
00436
00437 wav_min=(cpl_table_get_column_min(*m_tbl,"WAVE")>
00438 cpl_table_get_column_min(*r_tbl,"WAVE")) ?
00439 cpl_table_get_column_min(*m_tbl,"WAVE") :
00440 cpl_table_get_column_min(*r_tbl,"WAVE");
00441
00442
00443
00444 wav_max=(cpl_table_get_column_max(*m_tbl,"WAVE")<
00445 cpl_table_get_column_max(*r_tbl,"WAVE")) ?
00446 cpl_table_get_column_max(*m_tbl,"WAVE") :
00447 cpl_table_get_column_max(*r_tbl,"WAVE");
00448
00449
00450 uves_msg_warning("wav_min=%g",wav_min);
00451 uves_msg_warning("wav_max=%g",wav_max);
00452
00453
00454 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
00455 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
00456 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
00457 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
00458 uves_msg_warning("nsel=%d",nsel);
00459 check_nomsg(tmp=cpl_table_extract_selected(*m_tbl));
00460 uves_free_table(m_tbl);
00461 check_nomsg(*m_tbl=cpl_table_duplicate(tmp));
00462
00463
00464
00465
00466 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
00467 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
00468 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
00469 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
00470 uves_msg_warning("nsel=%d",nsel);
00471 check_nomsg(tmp=cpl_table_extract_selected(*r_tbl));
00472 uves_free_table(r_tbl);
00473 check_nomsg(*r_tbl=cpl_table_duplicate(tmp));
00474
00475
00476
00477 cpl_table_new_column(*m_tbl,"CHECK",CPL_TYPE_INT);
00478 cpl_table_new_column(*r_tbl,"CHECK",CPL_TYPE_INT);
00479 cpl_table_fill_column_window_int(*r_tbl,"CHECK",0,nr,0);
00480 cpl_table_fill_column_window_int(*m_tbl,"CHECK",0,nm,0);
00481
00482
00483 for(i=ord_min;i<=ord_max;i++) {
00484
00485 cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_EQUAL_TO,i);
00486 cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_EQUAL_TO,i);
00487 flames_align_table_column(m_tbl,r_tbl,"WAVE");
00488
00489
00490 }
00491 cpl_table_select_all(*m_tbl);
00492 cpl_table_select_all(*r_tbl);
00493
00494
00495 wav_min=(cpl_table_get_column_min(*m_tbl,"WAVE")>
00496 cpl_table_get_column_min(*r_tbl,"WAVE")) ?
00497 cpl_table_get_column_min(*m_tbl,"WAVE") :
00498 cpl_table_get_column_min(*r_tbl,"WAVE");
00499
00500
00501
00502 wav_max=(cpl_table_get_column_max(*m_tbl,"WAVE")<
00503 cpl_table_get_column_max(*r_tbl,"WAVE")) ?
00504 cpl_table_get_column_max(*m_tbl,"WAVE") :
00505 cpl_table_get_column_max(*r_tbl,"WAVE");
00506
00507
00508 uves_msg_warning("wav_min=%g",wav_min);
00509 uves_msg_warning("wav_max=%g",wav_max);
00510
00511 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
00512 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
00513 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
00514 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
00515 check_nomsg(nsel=cpl_table_and_selected_int(*m_tbl,"CHECK",CPL_EQUAL_TO,1));
00516 uves_msg_warning("nsel=%d",nsel);
00517 check_nomsg(tmp=cpl_table_extract_selected(*m_tbl));
00518 uves_free_table(m_tbl);
00519 check_nomsg(*m_tbl=cpl_table_duplicate(tmp));
00520
00521 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_LESS_THAN,ord_min));
00522 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"ORDER",CPL_NOT_GREATER_THAN,ord_max));
00523 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_LESS_THAN,wav_min));
00524 check_nomsg(nsel=cpl_table_and_selected_double(*m_tbl,"WAVE",CPL_NOT_GREATER_THAN,wav_max));
00525 check_nomsg(nsel=cpl_table_and_selected_int(*r_tbl,"CHECK",CPL_EQUAL_TO,1));
00526 uves_msg_warning("nsel=%d",nsel);
00527 check_nomsg(tmp=cpl_table_extract_selected(*r_tbl));
00528 uves_free_table(r_tbl);
00529 check_nomsg(*r_tbl=cpl_table_duplicate(tmp));
00530
00531
00532
00533 cleanup:
00534
00535
00536
00537
00538
00539
00540 return 0;
00541 }
00542
00543