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 #ifdef HAVE_CONFIG_H
00028 #include <config.h>
00029 #endif
00030
00031
00039
00040
00044
00045
00046
00047 #include <xsh_data_arclist.h>
00048 #include <xsh_utils.h>
00049 #include <xsh_error.h>
00050 #include <xsh_msg.h>
00051 #include <xsh_pfits.h>
00052 #include <cpl.h>
00053 #include <xsh_utils_table.h>
00054 #include <math.h>
00055 #include <xsh_drl.h>
00056
00057
00058
00059 static int xsh_arclist_lambda_compare(const void* one, const void* two){
00060 xsh_arcline** a = NULL;
00061 xsh_arcline** b = NULL;
00062 float la, lb;
00063
00064 a = (xsh_arcline**) one;
00065 b = (xsh_arcline**) two;
00066
00067 la = (*a)->wavelength;
00068 lb = (*b)->wavelength;
00069
00070 if (la <= lb)
00071 return -1;
00072 else
00073 return 1;
00074
00075
00076 }
00077
00078
00079
00086
00087 void xsh_arclist_lambda_sort(xsh_arclist* list){
00088 qsort(list->list,list->size,sizeof(xsh_arcline*),
00089 xsh_arclist_lambda_compare);
00090 }
00091
00092
00099
00100 int xsh_arclist_get_size(xsh_arclist* list){
00101 int i=0;
00102
00103 XSH_ASSURE_NOT_NULL(list);
00104 i = list->size;
00105
00106 cleanup:
00107 return i;
00108 }
00109
00110
00111
00118
00119 int xsh_arclist_get_nbrejected(xsh_arclist* list){
00120 int i=0;
00121
00122 XSH_ASSURE_NOT_NULL(list);
00123 i = list->nbrejected;
00124
00125 cleanup:
00126 return i;
00127 }
00128
00129
00137
00138 float xsh_arclist_get_wavelength(xsh_arclist* list, int idx)
00139 {
00140 float f = 0.0;
00141
00142 XSH_ASSURE_NOT_NULL(list);
00143 XSH_ASSURE_NOT_ILLEGAL(idx >= 0 && idx < list->size);
00144 f = list->list[idx]->wavelength;
00145
00146 cleanup:
00147 return f;
00148 }
00149
00150
00157
00158 void xsh_arclist_reject(xsh_arclist* list, int idx)
00159 {
00160 XSH_ASSURE_NOT_NULL(list);
00161 XSH_ASSURE_NOT_ILLEGAL(idx >= 0 && idx < list->size);
00162
00163 if (list->rejected[idx] == 0){
00164 list->rejected[idx] = 1;
00165 list->nbrejected++;
00166 }
00167
00168 cleanup:
00169 return;
00170
00171 }
00172
00173
00180
00181 void xsh_arclist_restore(xsh_arclist* list, int idx)
00182 {
00183 XSH_ASSURE_NOT_NULL(list);
00184 XSH_ASSURE_NOT_ILLEGAL(idx >= 0 && idx < list->size);
00185
00186 if (list->rejected[idx] == 1){
00187 list->rejected[idx] = 0;
00188 list->nbrejected--;
00189 }
00190
00191 cleanup:
00192 return;
00193
00194 }
00195
00204
00205 int xsh_arclist_is_rejected(xsh_arclist* list, int idx)
00206 {
00207 int res = 0;
00208
00209 XSH_ASSURE_NOT_NULL(list);
00210 XSH_ASSURE_NOT_ILLEGAL(idx >= 0 && idx < list->size);
00211
00212 res = list->rejected[idx];
00213 cleanup:
00214 return res;
00215 }
00216
00217
00223
00224 cpl_propertylist* xsh_arclist_get_header(xsh_arclist* list)
00225 {
00226 cpl_propertylist * res = NULL;
00227
00228 XSH_ASSURE_NOT_NULL(list);
00229 res = list->header;
00230 cleanup:
00231 return res;
00232 }
00233
00234
00240
00241 void xsh_dump_arclist( xsh_arclist* list)
00242 {
00243 int i = 0;
00244
00245 XSH_ASSURE_NOT_NULL(list);
00246
00247 xsh_msg( "ARCLINE_LIST Dump %d lines",list->size);
00248
00249 for(i=0; i< list->size; i++) {
00250 const char* name = list->list[i]->name;
00251 const char* comment = list->list[i]->comment;
00252 if (name == NULL) name ="";
00253 if (comment == NULL) comment ="";
00254 xsh_msg(" Wavelength %f name %s flux %d comment %s",
00255 list->list[i]->wavelength, name,
00256 list->list[i]->flux, comment);
00257 }
00258 xsh_msg( "END ARCLINE_LIST");
00259
00260 cleanup:
00261 return;
00262 }
00263
00264
00271
00272 xsh_arclist* xsh_arclist_load(cpl_frame* frame){
00273 cpl_table* table = NULL;
00274 const char* tablename = NULL;
00275 xsh_arclist* result = NULL;
00276 int i = 0;
00277
00278
00279 XSH_ASSURE_NOT_NULL( frame);
00280
00281
00282 check(tablename = cpl_frame_get_filename(frame));
00283
00284 XSH_TABLE_LOAD( table, tablename);
00285
00286
00287 XSH_CALLOC(result,xsh_arclist,1);
00288
00289
00290 check(result->size = cpl_table_get_nrow(table));
00291 XSH_CALLOC(result->list, xsh_arcline*, result->size);
00292 XSH_CALLOC(result->rejected, int, result->size);
00293 result->nbrejected = 0;
00294
00295 check(result->header = cpl_propertylist_load(tablename, 0));
00296
00297
00298 for(i=0;i<result->size;i++){
00299 const char* name ="";
00300 const char* comment ="";
00301 xsh_arcline* arc = (xsh_arcline*)cpl_malloc(sizeof(xsh_arcline));
00302
00303 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00304 CPL_TYPE_FLOAT, i, &(arc->wavelength)));
00305 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_NAME,
00306 CPL_TYPE_STRING, i, &name));
00307 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_FLUX,
00308 CPL_TYPE_INT, i, &(arc->flux)));
00309 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00310 CPL_TYPE_STRING, i, &comment));
00311 if (name != NULL) {
00312 arc->name = xsh_stringdup(name);
00313 }
00314 else {
00315 arc->name = NULL;
00316 }
00317 if (comment != NULL) {
00318 arc->comment = xsh_stringdup(comment);
00319 }
00320 else {
00321 arc->comment = NULL;
00322 }
00323 result->list[i] = arc;
00324 }
00325
00326 cleanup:
00327 if (cpl_error_get_code () != CPL_ERROR_NONE) {
00328 xsh_error_msg("can't load frame %s",cpl_frame_get_filename(frame));
00329 xsh_arclist_free(&result);
00330 }
00331 XSH_TABLE_FREE( table);
00332 return result;
00333 }
00334
00335
00340
00341 void xsh_arcline_free(xsh_arcline** arc)
00342 {
00343 if (arc && (*arc)){
00344 if ((*arc)->name != NULL) {
00345 cpl_free((*arc)->name);
00346 }
00347 if ((*arc)->comment != NULL) {
00348 cpl_free((*arc)->comment);
00349 }
00350 cpl_free(*arc);
00351 *arc = NULL;
00352 }
00353 }
00354
00355
00360
00361 void xsh_arclist_free(xsh_arclist** list)
00362 {
00363 int i;
00364
00365 if (list && *list) {
00366 if ((*list)->list) {
00367 for (i=0; i< (*list)->size; i++) {
00368 xsh_arcline* arc = (*list)->list[i];
00369 xsh_arcline_free(&arc);
00370 }
00371 cpl_free((*list)->list);
00372 xsh_free_propertylist(&((*list)->header));
00373 }
00374 XSH_FREE((*list)->rejected);
00375 cpl_free(*list);
00376 *list = NULL;
00377 }
00378 }
00379
00380
00392
00393 void xsh_arclist_clean_from_list( xsh_arclist* list, double* lambda, int size)
00394 {
00395 int i=0, j=0;
00396 int nrejected=0;
00397 XSH_ASSURE_NOT_NULL( list);
00398 XSH_ASSURE_NOT_NULL( lambda);
00399
00400 for( i=0; i< list->size; i++){
00401 int find = 0;
00402 double arc_lambda = 0.0;
00403
00404 check( arc_lambda = xsh_arclist_get_wavelength( list, i));
00405
00406 for ( j = 0 ; j<size ; j++ ) {
00407 if ( fabs( arc_lambda-lambda[j]) <= WAVELENGTH_PRECISION ) {
00408 find = 1 ;
00409 break ;
00410 }
00411 }
00412 if ( find == 0 ) {
00413 check( xsh_arclist_reject( list, i));
00414 nrejected++;
00415 }
00416
00417
00418 }
00419 XSH_REGDEBUG("cleanarclines list size %d rejected %d (%d)", list->size,
00420 list->nbrejected, size );
00421
00422 check( xsh_arclist_clean( list));
00423 cleanup:
00424 return;
00425 }
00426
00427
00428 void xsh_arclist_clean_from_list_not_flagged( xsh_arclist* list, double* lambda, int* flag, int size)
00429 {
00430 int i=0, j=0;
00431 int nrejected=0;
00432 XSH_ASSURE_NOT_NULL( list);
00433 XSH_ASSURE_NOT_NULL( lambda);
00434
00435 for( i=0; i< list->size; i++){
00436 int find = 0;
00437 double arc_lambda = 0.0;
00438
00439 check( arc_lambda = xsh_arclist_get_wavelength( list, i));
00440 for ( j = 0 ; j<size ; j++ ) {
00441 if ( fabs( arc_lambda-lambda[j]) <= WAVELENGTH_PRECISION &&
00442 (flag[j] == 0) ) {
00443 find = 1 ;
00444 break ;
00445 }
00446 }
00447 if ( find == 0 ) {
00448 check( xsh_arclist_reject( list, i));
00449
00450 nrejected++;
00451 }
00452
00453 }
00454
00455 XSH_REGDEBUG("cleanarclines list size %d rejected %d (%d)", list->size,
00456 list->nbrejected, size );
00457 check( xsh_arclist_clean( list));
00458
00459
00460 cleanup:
00461 return;
00462 }
00463
00464
00465 void xsh_arclist_clean(xsh_arclist* list)
00466 {
00467 int i, j;
00468
00469 XSH_ASSURE_NOT_NULL(list);
00470
00471 j = 0;
00472 for(i=0;i<list->size;i++)
00473 {
00474 if(xsh_arclist_is_rejected(list,i)){
00475 xsh_arcline_free(&list->list[i]);
00476 }
00477 else{
00478 list->list[j] = list->list[i];
00479 list->rejected[j] = 0;
00480 j++;
00481 }
00482 }
00483 list->size = j;
00484 list->nbrejected = 0;
00485
00486 cleanup:
00487 return;
00488 }
00489
00498
00499 cpl_frame*
00500 xsh_arclist_save(xsh_arclist* list,const char* filename,const char* tag)
00501 {
00502 cpl_table* table = NULL;
00503 cpl_frame * result = NULL ;
00504 int i=0;
00505
00506 XSH_ASSURE_NOT_NULL(list);
00507 XSH_ASSURE_NOT_NULL(filename);
00508
00509
00510 check(table = cpl_table_new(XSH_ARCLIST_TABLE_NB_COL));
00511
00512
00513 check(
00514 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00515 CPL_TYPE_FLOAT));
00516 check(
00517 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00518 XSH_ARCLIST_TABLE_UNIT_WAVELENGTH));
00519 check(
00520 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_NAME,
00521 CPL_TYPE_STRING));
00522 check(
00523 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_NAME,
00524 XSH_ARCLIST_TABLE_UNIT_NAME));
00525
00526 check(
00527 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_FLUX,
00528 CPL_TYPE_INT));
00529 check(
00530 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_FLUX,
00531 XSH_ARCLIST_TABLE_UNIT_FLUX));
00532
00533 check(
00534 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00535 CPL_TYPE_STRING));
00536 check(
00537 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00538 XSH_ARCLIST_TABLE_UNIT_COMMENT));
00539
00540 check(cpl_table_set_size(table,list->size));
00541
00542
00543 for(i=0;i<list->size;i++){
00544 check(cpl_table_set_float(table,XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00545 i,list->list[i]->wavelength));
00546 check(cpl_table_set_string(table,XSH_ARCLIST_TABLE_COLNAME_NAME,
00547 i,list->list[i]->name));
00548 check(cpl_table_set_int(table,XSH_ARCLIST_TABLE_COLNAME_FLUX,
00549 i,list->list[i]->flux));
00550 check(cpl_table_set_string(table,XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00551 i,list->list[i]->comment));
00552 }
00553
00554
00555 check(cpl_table_save(table, list->header, NULL, filename, CPL_IO_DEFAULT));
00556
00557
00558 check(result=xsh_frame_product(filename,tag,
00559 CPL_FRAME_TYPE_TABLE,
00560 CPL_FRAME_GROUP_PRODUCT,
00561 CPL_FRAME_LEVEL_TEMPORARY));
00562
00563 cleanup:
00564 XSH_TABLE_FREE( table);
00565 return result ;
00566 }
00567