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
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 #if 0
00406 while( ( j < size) &&
00407 ( fabs( arc_lambda-lambda[j]) <= WAVELENGTH_PRECISION)){
00408 find = 1;
00409 j++;
00410 }
00411
00412 if ( find == 0){
00413 check( xsh_arclist_reject( list, i));
00414 }
00415 #else
00416 for ( j = 0 ; j<size ; j++ ) {
00417 if ( fabs( arc_lambda-lambda[j]) <= WAVELENGTH_PRECISION ) {
00418 find = 1 ;
00419 break ;
00420 }
00421 }
00422 if ( find == 0 ) check( xsh_arclist_reject( list, i));
00423 #endif
00424
00425 }
00426 XSH_REGDEBUG("cleanarclines list size %d rejected %d (%d)", list->size,
00427 list->nbrejected, size );
00428 check( xsh_arclist_clean( list));
00429 cleanup:
00430 return;
00431 }
00432
00433 void xsh_arclist_clean(xsh_arclist* list)
00434 {
00435 int i, j;
00436
00437 XSH_ASSURE_NOT_NULL(list);
00438
00439 j = 0;
00440 for(i=0;i<list->size;i++)
00441 {
00442 if(xsh_arclist_is_rejected(list,i)){
00443 xsh_arcline_free(&list->list[i]);
00444 }
00445 else{
00446 list->list[j] = list->list[i];
00447 list->rejected[j] = 0;
00448 j++;
00449 }
00450 }
00451 list->size = j;
00452 list->nbrejected = 0;
00453
00454 cleanup:
00455 return;
00456 }
00457
00466
00467 cpl_frame*
00468 xsh_arclist_save(xsh_arclist* list,const char* filename,const char* tag)
00469 {
00470 cpl_table* table = NULL;
00471 cpl_frame * result = NULL ;
00472 int i=0;
00473
00474 XSH_ASSURE_NOT_NULL(list);
00475 XSH_ASSURE_NOT_NULL(filename);
00476
00477
00478 check(table = cpl_table_new(XSH_ARCLIST_TABLE_NB_COL));
00479
00480
00481 check(
00482 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00483 CPL_TYPE_FLOAT));
00484 check(
00485 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00486 XSH_ARCLIST_TABLE_UNIT_WAVELENGTH));
00487 check(
00488 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_NAME,
00489 CPL_TYPE_STRING));
00490 check(
00491 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_NAME,
00492 XSH_ARCLIST_TABLE_UNIT_NAME));
00493
00494 check(
00495 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_FLUX,
00496 CPL_TYPE_INT));
00497 check(
00498 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_FLUX,
00499 XSH_ARCLIST_TABLE_UNIT_FLUX));
00500
00501 check(
00502 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00503 CPL_TYPE_STRING));
00504 check(
00505 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00506 XSH_ARCLIST_TABLE_UNIT_COMMENT));
00507
00508 check(cpl_table_set_size(table,list->size));
00509
00510
00511 for(i=0;i<list->size;i++){
00512 check(cpl_table_set_float(table,XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00513 i,list->list[i]->wavelength));
00514 check(cpl_table_set_string(table,XSH_ARCLIST_TABLE_COLNAME_NAME,
00515 i,list->list[i]->name));
00516 check(cpl_table_set_int(table,XSH_ARCLIST_TABLE_COLNAME_FLUX,
00517 i,list->list[i]->flux));
00518 check(cpl_table_set_string(table,XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00519 i,list->list[i]->comment));
00520 }
00521
00522
00523 check(cpl_table_save(table, list->header, NULL, filename, CPL_IO_DEFAULT));
00524 check( xsh_add_temporary_file( filename));
00525
00526 check(result=xsh_frame_product(filename,tag,
00527 CPL_FRAME_TYPE_TABLE,
00528 CPL_FRAME_GROUP_PRODUCT,
00529 CPL_FRAME_LEVEL_TEMPORARY));
00530
00531 cleanup:
00532 XSH_TABLE_FREE( table);
00533 return result ;
00534 }
00535