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 #include <math.h>
00031
00032
00037
00038
00042
00043
00044
00045 #include <xsh_data_instrument.h>
00046 #include <xsh_data_arclist.h>
00047 #include <xsh_data_linetilt.h>
00048 #include <xsh_utils.h>
00049 #include <xsh_error.h>
00050 #include <xsh_msg.h>
00051 #include <xsh_pfits.h>
00052 #include <xsh_dfs.h>
00053 #include <cpl.h>
00054 #include <xsh_utils_table.h>
00055
00056
00057
00058
00059
00060 xsh_linetilt_list * xsh_linetilt_list_new( int size,
00061 cpl_propertylist * header )
00062 {
00063 xsh_linetilt_list * result = NULL ;
00064
00065 XSH_ASSURE_NOT_NULL( header ) ;
00066
00067
00068 check( result = cpl_malloc( sizeof( xsh_linetilt_list ) ) ) ;
00069 memset( result, 0, sizeof( xsh_linetilt_list ) ) ;
00070
00071 check( result->list = cpl_malloc( sizeof( xsh_linetilt * ) * size ) ) ;
00072 memset( result->list, 0, sizeof( xsh_linetilt * )*size ) ;
00073 result->full_size = size ;
00074 result->header = header ;
00075
00076 cleanup:
00077 return result ;
00078 }
00083
00084 void xsh_linetilt_list_free( xsh_linetilt_list ** list)
00085 {
00086 int i;
00087
00088 if (list && *list) {
00089 if ((*list)->list) {
00090 for (i=0; i< (*list)->size; i++) {
00091 xsh_linetilt * tilt = (*list)->list[i];
00092 xsh_linetilt_free( &tilt );
00093 }
00094 cpl_free((*list)->list);
00095 xsh_free_propertylist(&((*list)->header));
00096 }
00097 cpl_free(*list);
00098 *list = NULL;
00099 }
00100 }
00101
00106
00107 void xsh_linetilt_free( xsh_linetilt ** tilt)
00108 {
00109 if (tilt && (*tilt) ){
00110 if ((*tilt)->name != NULL) {
00111 cpl_free(( *tilt)->name );
00112 }
00113 cpl_free( *tilt );
00114 *tilt = NULL;
00115 }
00116 }
00117
00118 xsh_linetilt * xsh_linetilt_new( void )
00119 {
00120 xsh_linetilt * result = NULL ;
00121
00122 XSH_CALLOC( result, xsh_linetilt, 1) ;
00123
00124 cleanup:
00125 return result ;
00126 }
00127
00135 void xsh_linetilt_list_add( xsh_linetilt_list * list,
00136 xsh_linetilt * line, int idx )
00137 {
00138 XSH_ASSURE_NOT_NULL( list ) ;
00139 XSH_ASSURE_NOT_NULL( line ) ;
00140 list->list[idx] = line ;
00141 list->size++ ;
00142 cleanup:
00143 return ;
00144 }
00145
00157
00158 cpl_frame* xsh_linetilt_list_save(xsh_linetilt_list * list,
00159 xsh_instrument * instr,
00160 const char* filename,
00161 const char* tag,
00162 const double kappa,
00163 const int niter)
00164 {
00165 cpl_table* table = NULL;
00166 cpl_frame * result = NULL ;
00167 int i=0;
00168
00169
00170
00171
00172
00173 XSH_ASSURE_NOT_NULL(list);
00174 XSH_ASSURE_NOT_NULL(filename);
00175
00176
00177 check( table = cpl_table_new( XSH_LINETILT_TABLE_NB_COL));
00178
00179
00180 check(
00181 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_WAVELENGTH,
00182 CPL_TYPE_FLOAT));
00183 check(
00184 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_WAVELENGTH,
00185 XSH_LINETILT_TABLE_UNIT_WAVELENGTH));
00186
00187 check(
00188 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_NAME,
00189 CPL_TYPE_STRING));
00190 check(
00191 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_NAME,
00192 XSH_LINETILT_TABLE_UNIT_NAME));
00193
00194 check(
00195 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_ORDER,
00196 CPL_TYPE_INT));
00197 check(
00198 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_ORDER,
00199 XSH_LINETILT_TABLE_UNIT_ORDER));
00200
00201 check(
00202 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_FLUX,
00203 CPL_TYPE_DOUBLE));
00204 check(
00205 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_FLUX,
00206 XSH_LINETILT_TABLE_UNIT_FLUX));
00207
00208 check(
00209 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_INTENSITY,
00210 CPL_TYPE_DOUBLE));
00211 check(
00212 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_INTENSITY,
00213 XSH_LINETILT_TABLE_UNIT_INTENSITY));
00214
00215 check(
00216 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_CENPOSX,
00217 CPL_TYPE_DOUBLE));
00218 check(
00219 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_CENPOSX,
00220 XSH_LINETILT_TABLE_UNIT_CENPOSX));
00221
00222 check(
00223 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_CENPOSY,
00224 CPL_TYPE_DOUBLE));
00225 check(
00226 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_CENPOSY,
00227 XSH_LINETILT_TABLE_UNIT_CENPOSY));
00228
00229
00230 check(
00231 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_GAUSSY,
00232 CPL_TYPE_DOUBLE));
00233 check(
00234 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_GAUSSY,
00235 XSH_LINETILT_TABLE_UNIT_GAUSSY));
00236
00237 check(
00238 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_TILTY,
00239 CPL_TYPE_DOUBLE));
00240 check(
00241 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_TILTY,
00242 XSH_LINETILT_TABLE_UNIT_TILTY));
00243
00244 check(
00245 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_FWHM,
00246 CPL_TYPE_DOUBLE));
00247 check(
00248 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_FWHM,
00249 XSH_LINETILT_TABLE_UNIT_FWHM));
00250
00251 check(
00252 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_SHIFTY,
00253 CPL_TYPE_DOUBLE));
00254 check(
00255 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_SHIFTY,
00256 XSH_LINETILT_TABLE_UNIT_SHIFTY));
00257
00258 check(
00259 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_TILT,
00260 CPL_TYPE_DOUBLE));
00261 check(
00262 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_TILT,
00263 XSH_LINETILT_TABLE_UNIT_TILT));
00264
00265 check(
00266 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_CHISQ,
00267 CPL_TYPE_DOUBLE));
00268 check(
00269 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_CHISQ,
00270 XSH_LINETILT_TABLE_UNIT_CHISQ));
00271
00272 check(
00273 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_SPECRES,
00274 CPL_TYPE_DOUBLE));
00275 check(
00276 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_SPECRES,
00277 XSH_LINETILT_TABLE_UNIT_SPECRES));
00278 check(
00279 cpl_table_new_column(table,XSH_LINETILT_TABLE_COLNAME_FLAG,
00280 CPL_TYPE_INT));
00281 check(
00282 cpl_table_set_column_unit ( table, XSH_LINETILT_TABLE_COLNAME_FLAG,
00283 XSH_LINETILT_TABLE_UNIT_FLAG));
00284
00285
00286
00287
00288 check(cpl_table_set_size(table,list->size));
00289
00290
00291 for(i=0;i<list->size;i++){
00292 check(cpl_table_set_float(table,XSH_LINETILT_TABLE_COLNAME_WAVELENGTH,
00293 i,list->list[i]->wavelength));
00294 check(cpl_table_set_string(table,XSH_LINETILT_TABLE_COLNAME_NAME,
00295 i,list->list[i]->name));
00296 check(cpl_table_set_int(table,XSH_LINETILT_TABLE_COLNAME_ORDER,
00297 i,list->list[i]->order));
00298 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_FLUX,
00299 i,list->list[i]->area));
00300 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_INTENSITY,
00301 i,list->list[i]->intensity));
00302 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_CENPOSX,
00303 i,list->list[i]->cenposx));
00304 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_CENPOSY,
00305 i,list->list[i]->pre_pos_y));
00306 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_GAUSSY,
00307 i,list->list[i]->cenposy));
00308 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_TILTY,
00309 i,list->list[i]->tilt_y));
00310 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_FWHM,
00311 i,list->list[i]->deltay));
00312 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_SHIFTY,
00313 i,list->list[i]->shift_y));
00314 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_TILT,
00315 i,list->list[i]->tilt));
00316 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_CHISQ,
00317 i,list->list[i]->chisq));
00318
00319 check(cpl_table_set_double(table,XSH_LINETILT_TABLE_COLNAME_SPECRES,
00320 i,list->list[i]->specres));
00321
00322 check(cpl_table_set_int(table,XSH_LINETILT_TABLE_COLNAME_FLAG,
00323 i,list->list[i]->flag));
00324
00325 }
00326
00327
00328 check( xsh_pfits_set_pcatg(list->header,tag));
00329 check(cpl_table_save(table, list->header, NULL, filename, CPL_IO_DEFAULT));
00330
00331
00332 check(result=xsh_frame_product(filename,
00333 XSH_GET_TAG_FROM_MODE( XSH_TILT_TAB, instr),
00334 CPL_FRAME_TYPE_TABLE,
00335 CPL_FRAME_GROUP_PRODUCT,
00336 CPL_FRAME_LEVEL_TEMPORARY));
00337 xsh_add_temporary_file( filename ) ;
00338
00339 cleanup:
00340 XSH_TABLE_FREE( table);
00341 return result ;
00342 }
00343
00344
00352
00353 double * xsh_linetilt_list_get_posx( xsh_linetilt_list * list)
00354 {
00355 double* res = NULL, *p ;
00356 int i, size ;
00357
00358 XSH_ASSURE_NOT_NULL( list );
00359 size = list->size ;
00360 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00361 for( p = res, i = 0 ; i<size ; i++, p++ )
00362 *p = list->list[i]->cenposx ;
00363
00364 cleanup:
00365 return res;
00366 }
00367
00375
00376 double * xsh_linetilt_list_get_posy( xsh_linetilt_list * list)
00377 {
00378 double* res = NULL, *p ;
00379 int i, size ;
00380
00381 XSH_ASSURE_NOT_NULL( list );
00382 size = list->size ;
00383 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00384 for( p = res, i = 0 ; i<size ; i++, p++ )
00385 *p = list->list[i]->cenposy ;
00386
00387 cleanup:
00388 return res;
00389 }
00390
00398
00399 double * xsh_linetilt_list_get_deltay( xsh_linetilt_list * list)
00400 {
00401 double* res = NULL, *p ;
00402 int i, size ;
00403
00404 XSH_ASSURE_NOT_NULL( list );
00405 size = list->size ;
00406
00407 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00408 for( p = res, i = 0 ; i<size ; i++, p++ )
00409 *p = list->list[i]->deltay ;
00410
00411
00412 cleanup:
00413 return res;
00414 }
00415
00423
00424 double * xsh_linetilt_list_get_sigma_y( xsh_linetilt_list * list)
00425 {
00426 double* res = NULL, *p ;
00427 int i, size ;
00428
00429 XSH_ASSURE_NOT_NULL( list );
00430 size = list->size ;
00431
00432 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00433 for( p = res, i = 0 ; i<size ; i++, p++ )
00434 *p = list->list[i]->chisq ;
00435
00436
00437 cleanup:
00438 return res;
00439 }
00440
00448
00449 double * xsh_linetilt_list_get_pre_posy( xsh_linetilt_list * list)
00450 {
00451 double* res = NULL, *p ;
00452 int i, size ;
00453
00454 XSH_ASSURE_NOT_NULL( list );
00455 size = list->size ;
00456
00457 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00458 for( p = res, i = 0 ; i<size ; i++, p++ )
00459 *p = list->list[i]->pre_pos_y ;
00460
00461
00462 cleanup:
00463 return res;
00464 }
00465
00473
00474 double * xsh_linetilt_list_get_orders( xsh_linetilt_list * list)
00475 {
00476 double* res = NULL, *p ;
00477 int i, size ;
00478
00479 XSH_ASSURE_NOT_NULL( list );
00480 size = list->size ;
00481 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00482 for( p = res, i = 0 ; i<size ; i++, p++ )
00483 *p = list->list[i]->order ;
00484
00485 cleanup:
00486 return res;
00487 }
00488
00496
00497 double * xsh_linetilt_list_get_wavelengths( xsh_linetilt_list * list)
00498 {
00499 double* res = NULL, *p ;
00500 int i, size ;
00501
00502 XSH_ASSURE_NOT_NULL( list );
00503 size = list->size ;
00504 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00505 for( p = res, i = 0 ; i<size ; i++, p++ )
00506 *p = list->list[i]->wavelength ;
00507
00508 cleanup:
00509 return res;
00510 }
00511
00519
00520 double * xsh_linetilt_list_get_slits( xsh_linetilt_list * list)
00521 {
00522 double* res = NULL, *p ;
00523 int i, size ;
00524
00525 XSH_ASSURE_NOT_NULL( list );
00526 size = list->size ;
00527 check( res = cpl_malloc( list->size * sizeof(double) ) ) ;
00528 for( p = res, i = 0 ; i<size ; i++, p++ )
00529 *p = list->list[i]->slit ;
00530
00531 cleanup:
00532 return res;
00533 }
00534
00542
00543 int * xsh_linetilt_list_get_slit_index( xsh_linetilt_list * list)
00544 {
00545 int * res = NULL, *p ;
00546 int i, size ;
00547
00548 XSH_ASSURE_NOT_NULL( list );
00549 size = list->size ;
00550 check( res = cpl_malloc( list->size * sizeof(int) ) ) ;
00551 for( p = res, i = 0 ; i<size ; i++, p++ )
00552 *p = list->list[i]->slit_index ;
00553
00554 cleanup:
00555 return res;
00556 }
00557
00566 cpl_propertylist * xsh_linetilt_list_get_header( xsh_linetilt_list * list)
00567 {
00568 cpl_propertylist * res = NULL ;
00569
00570 XSH_ASSURE_NOT_NULL( list );
00571
00572 res = list->header ;
00573
00574 cleanup:
00575 return res;
00576 }
00577
00587 int xsh_linetilt_is_duplicate( xsh_linetilt_list * list, float lambda,
00588 int order )
00589 {
00590 int i, res = 0 ;
00591 XSH_ASSURE_NOT_NULL( list );
00592
00593 for( i = 0 ; i<list->size ; i++ ) {
00594 if ( list->list[i]->wavelength == lambda &&
00595 list->list[i]->order == order ) {
00596 res = 1 ;
00597 break ;
00598 }
00599 }
00600
00601 cleanup:
00602 return res ;
00603 }
00604
00605 #if 0
00606 static int xsh_arclist_lambda_compare(const void* one, const void* two){
00607 xsh_arcline** a = NULL;
00608 xsh_arcline** b = NULL;
00609 float la, lb;
00610
00611 a = (xsh_arcline**) one;
00612 b = (xsh_arcline**) two;
00613
00614 la = (*a)->wavelength;
00615 lb = (*b)->wavelength;
00616
00617 if (la <= lb)
00618 return -1;
00619 else
00620 return 1;
00621
00622
00623 }
00624
00625
00626
00633
00634 void xsh_arclist_lambda_sort(xsh_arclist* list){
00635 qsort(list->list,list->size,sizeof(xsh_arcline*),
00636 xsh_arclist_lambda_compare);
00637 }
00638
00639
00646
00647 int xsh_arclist_get_size(xsh_arclist* list){
00648 int i=0;
00649
00650 XSH_ASSURE_NOT_NULL(list);
00651 i = list->size;
00652
00653 cleanup:
00654 return i;
00655 }
00656
00657
00658
00665
00666 int xsh_arclist_get_nbrejected(xsh_arclist* list){
00667 int i=0;
00668
00669 XSH_ASSURE_NOT_NULL(list);
00670 i = list->nbrejected;
00671
00672 cleanup:
00673 return i;
00674 }
00675
00676
00684
00685 float xsh_arclist_get_wavelength(xsh_arclist* list, int index)
00686 {
00687 float f = 0.0;
00688
00689 XSH_ASSURE_NOT_NULL(list);
00690 XSH_ASSURE_NOT_ILLEGAL(index >= 0 && index < list->size);
00691 f = list->list[index]->wavelength;
00692
00693 cleanup:
00694 return f;
00695 }
00696
00697
00704
00705 void xsh_arclist_reject(xsh_arclist* list, int index)
00706 {
00707 XSH_ASSURE_NOT_NULL(list);
00708 XSH_ASSURE_NOT_ILLEGAL(index >= 0 && index < list->size);
00709
00710 list->rejected[index] = 1;
00711 list->nbrejected++;
00712
00713 cleanup:
00714 return;
00715
00716 }
00717
00718
00725
00726 void xsh_arclist_restore(xsh_arclist* list, int index)
00727 {
00728 XSH_ASSURE_NOT_NULL(list);
00729 XSH_ASSURE_NOT_ILLEGAL(index >= 0 && index < list->size);
00730
00731 list->rejected[index] = 0;
00732 list->nbrejected--;
00733
00734 cleanup:
00735 return;
00736
00737 }
00738
00745
00746 int xsh_arclist_is_rejected(xsh_arclist* list, int index)
00747 {
00748 int res = 0;
00749
00750 XSH_ASSURE_NOT_NULL(list);
00751 XSH_ASSURE_NOT_ILLEGAL(index >= 0 && index < list->size);
00752
00753 res = list->rejected[index];
00754 cleanup:
00755 return res;
00756 }
00757
00758
00764
00765 cpl_propertylist* xsh_arclist_get_header(xsh_arclist* list)
00766 {
00767 cpl_propertylist * res = NULL;
00768
00769 XSH_ASSURE_NOT_NULL(list);
00770 res = list->header;
00771 cleanup:
00772 return res;
00773 }
00774
00775
00781
00782 void xsh_dump_arclist( xsh_arclist* list)
00783 {
00784 int i = 0;
00785
00786 XSH_ASSURE_NOT_NULL(list);
00787
00788 xsh_msg( "ARCLINE_LIST Dump %d lines",list->size);
00789
00790 for(i=0; i< list->size; i++) {
00791 const char* name = list->list[i]->name;
00792 const char* comment = list->list[i]->comment;
00793 if (name == NULL) name ="";
00794 if (comment == NULL) comment ="";
00795 xsh_msg(" Wavelength %f name %s flux %d comment %s",
00796 list->list[i]->wavelength, name,
00797 list->list[i]->flux, comment);
00798 }
00799 xsh_msg( "END ARCLINE_LIST");
00800
00801 cleanup:
00802 return;
00803 }
00804
00805
00812
00813 xsh_arclist* xsh_arclist_load(cpl_frame* frame){
00814 cpl_table* table = NULL;
00815 const char* tablename = NULL;
00816 xsh_arclist* result = NULL;
00817 int i = 0;
00818
00819
00820 XSH_ASSURE_NOT_NULL(frame);
00821
00822
00823 check( tablename = cpl_frame_get_filename(frame));
00824
00825 XSH_TABLE_LOAD( table, tablename);
00826
00827
00828 XSH_CALLOC(result,xsh_arclist,1);
00829
00830
00831 check(result->size = cpl_table_get_nrow(table));
00832 XSH_CALLOC(result->list, xsh_arcline*, result->size);
00833 XSH_CALLOC(result->rejected, int, result->size);
00834 result->nbrejected = 0;
00835
00836 check(result->header = cpl_propertylist_load(tablename, 0));
00837
00838
00839 for(i=0;i<result->size;i++){
00840 const char* name ="";
00841 const char* comment ="";
00842 xsh_arcline* arc = (xsh_arcline*)cpl_malloc(sizeof(xsh_arcline));
00843
00844 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00845 CPL_TYPE_FLOAT, i, &(arc->wavelength)));
00846 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_NAME,
00847 CPL_TYPE_STRING, i, &name));
00848 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_FLUX,
00849 CPL_TYPE_INT, i, &(arc->flux)));
00850 check(xsh_get_table_value(table, XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00851 CPL_TYPE_STRING, i, &comment));
00852 if (name != NULL) {
00853 arc->name = xsh_stringdup(name);
00854 }
00855 else {
00856 arc->name = NULL;
00857 }
00858 if (comment != NULL) {
00859 arc->comment = xsh_stringdup(comment);
00860 }
00861 else {
00862 arc->comment = NULL;
00863 }
00864 result->list[i] = arc;
00865 }
00866
00867 cleanup:
00868 if (cpl_error_get_code () != CPL_ERROR_NONE) {
00869 xsh_error_msg("can't load frame %s",cpl_frame_get_filename(frame));
00870 xsh_arclist_free(&result);
00871 }
00872 XSH_TABLE_FREE( table);
00873 return result;
00874 }
00875
00876
00881
00882 void xsh_arcline_free(xsh_arcline** arc)
00883 {
00884 if (arc && (*arc)){
00885 if ((*arc)->name != NULL) {
00886 cpl_free((*arc)->name);
00887 }
00888 if ((*arc)->comment != NULL) {
00889 cpl_free((*arc)->comment);
00890 }
00891 cpl_free(*arc);
00892 *arc = NULL;
00893 }
00894 }
00895
00896
00901
00902 void xsh_arclist_free(xsh_arclist** list)
00903 {
00904 int i;
00905
00906 if (list && *list) {
00907 if ((*list)->list) {
00908 for (i=0; i< (*list)->size; i++) {
00909 xsh_arcline* arc = (*list)->list[i];
00910 xsh_arcline_free(&arc);
00911 }
00912 cpl_free((*list)->list);
00913 xsh_free_propertylist(&((*list)->header));
00914 }
00915 XSH_FREE((*list)->rejected);
00916 cpl_free(*list);
00917 *list = NULL;
00918 }
00919 }
00920
00921 void xsh_arclist_clean(xsh_arclist* list)
00922 {
00923 int i, j;
00924
00925 XSH_ASSURE_NOT_NULL(list);
00926
00927 j = 0;
00928 for(i=0;i<list->size;i++)
00929 {
00930 if(xsh_arclist_is_rejected(list,i)){
00931 xsh_arcline_free(&list->list[i]);
00932 }
00933 else{
00934 j++;
00935 list->list[j-1] = list->list[i];
00936 list->rejected[j] = 0;
00937 }
00938 }
00939 list->size = j;
00940 list->nbrejected = 0;
00941
00942 cleanup:
00943 return;
00944 }
00945
00954
00955 cpl_frame*
00956 xsh_arclist_save(xsh_arclist* list,const char* filename,const char* tag)
00957 {
00958 cpl_table* table = NULL;
00959 cpl_frame * result = NULL ;
00960 int i=0;
00961
00962 XSH_ASSURE_NOT_NULL(list);
00963 XSH_ASSURE_NOT_NULL(filename);
00964
00965
00966 check(table = cpl_table_new(XSH_ARCLIST_TABLE_NB_COL));
00967
00968
00969 check(
00970 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00971 CPL_TYPE_FLOAT));
00972 check(
00973 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
00974 XSH_ARCLIST_TABLE_UNIT_WAVELENGTH));
00975 check(
00976 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_NAME,
00977 CPL_TYPE_STRING));
00978 check(
00979 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_NAME,
00980 XSH_ARCLIST_TABLE_UNIT_NAME));
00981
00982 check(
00983 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_FLUX,
00984 CPL_TYPE_INT));
00985 check(
00986 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_FLUX,
00987 XSH_ARCLIST_TABLE_UNIT_FLUX));
00988
00989 check(
00990 cpl_table_new_column(table,XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00991 CPL_TYPE_STRING));
00992 check(
00993 cpl_table_set_column_unit ( table, XSH_ARCLIST_TABLE_COLNAME_COMMENT,
00994 XSH_ARCLIST_TABLE_UNIT_COMMENT));
00995
00996 check(cpl_table_set_size(table,list->size));
00997
00998
00999 for(i=0;i<list->size;i++){
01000 check(cpl_table_set_float(table,XSH_ARCLIST_TABLE_COLNAME_WAVELENGTH,
01001 i,list->list[i]->wavelength));
01002 check(cpl_table_set_string(table,XSH_ARCLIST_TABLE_COLNAME_NAME,
01003 i,list->list[i]->name));
01004 check(cpl_table_set_int(table,XSH_ARCLIST_TABLE_COLNAME_FLUX,
01005 i,list->list[i]->flux));
01006 check(cpl_table_set_string(table,XSH_ARCLIST_TABLE_COLNAME_COMMENT,
01007 i,list->list[i]->comment));
01008 }
01009
01010
01011 check(cpl_table_save(table, list->header, NULL, filename, CPL_IO_DEFAULT));
01012
01013
01014 check(result=xsh_frame_product(filename,
01015 tag,
01016 CPL_FRAME_TYPE_TABLE,
01017 CPL_FRAME_GROUP_PRODUCT,
01018 CPL_FRAME_LEVEL_TEMPORARY));
01019
01020
01021 cleanup:
01022 XSH_TABLE_FREE( table);
01023 return result ;
01024 }
01025 #endif
01026