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 #ifdef HAVE_CONFIG_H
00027 # include <config.h>
00028 #endif
00029
00030
00036
00039
00040
00041
00042
00043 #include <tests.h>
00044
00045 #include <xsh_data_pre.h>
00046 #include <xsh_error.h>
00047 #include <xsh_msg.h>
00048 #include <xsh_data_instrument.h>
00049 #include <xsh_data_rec.h>
00050 #include <xsh_data_localization.h>
00051 #include <xsh_drl.h>
00052 #include <xsh_pfits.h>
00053
00054 #include <xsh_badpixelmap.h>
00055 #include <xsh_parameters.h>
00056
00057 #include <cpl.h>
00058 #include <math.h>
00059
00060 #include <getopt.h>
00061
00062
00063
00064
00065
00066 #define MODULE_ID "XSH_EXTRACT_CLEAN"
00067
00068 enum {
00069 DECODEBP_OPT,METHOD_OPT,DEBUG_OPT,HELP_OPT
00070 } ;
00071
00072 static struct option long_options[] = {
00073 {"decode-bp", required_argument, 0, DECODEBP_OPT},
00074 {"method", required_argument, 0, METHOD_OPT},
00075 {"debug", required_argument, 0, DEBUG_OPT},
00076 {"help", 0, 0, HELP_OPT},
00077 {0, 0, 0, 0}
00078 };
00079
00080 static void Help( void )
00081 {
00082 puts( "Unitary test of xsh_extract_clean");
00083 puts( "Usage: test_xsh_extract_clean [options] <input_files>");
00084
00085 puts( "Options" ) ;
00086 puts( " --decode-bp=<n> : Integer representation of the bits to be considered bad when decoding the bad pixel mask pixel values.");
00087 puts( " --method=<n> : method for extraction CLEAN | LOCALIZATION | FULL | NOD");
00088 puts( " --debug=<n> : Level of debug LOW | MEDIUM | HIGH [MEDIUM]" );
00089 puts( " --help : What you see" ) ;
00090 puts( "\nInput Files" ) ;
00091 puts( "The input files argument MUST be in this order:" ) ;
00092 puts( " 1. Rectified frame 2D" ) ;
00093 puts( " 2. Localization table");
00094 TEST_END();
00095 exit(0);
00096 }
00097
00098 static void HandleOptions( int argc, char **argv,
00099 xsh_extract_param *extract_par,int* decode_bp)
00100 {
00101 int opt ;
00102 int option_index = 0;
00103
00104 while (( opt = getopt_long (argc, argv, "slit_position:slit_height:method",
00105 long_options, &option_index)) != EOF ){
00106
00107 switch ( opt ) {
00108 case METHOD_OPT:
00109 if ( strcmp(optarg, EXTRACT_METHOD_PRINT( LOCALIZATION_METHOD)) == 0){
00110 extract_par->method = LOCALIZATION_METHOD;
00111 }
00112 else if ( strcmp(optarg, EXTRACT_METHOD_PRINT( FULL_METHOD)) == 0){
00113 extract_par->method = FULL_METHOD;
00114 }
00115 else if ( strcmp(optarg, EXTRACT_METHOD_PRINT( CLEAN_METHOD)) == 0){
00116 extract_par->method = CLEAN_METHOD;
00117 }
00118 else if ( strcmp(optarg, EXTRACT_METHOD_PRINT( NOD_METHOD)) == 0){
00119 extract_par->method = NOD_METHOD;
00120 }
00121 else{
00122 xsh_msg("WRONG method %s", optarg);
00123 exit(-1);
00124 }
00125 break ;
00126 case DEBUG_OPT:
00127 if ( strcmp( optarg, "LOW")==0){
00128 xsh_debug_level_set( XSH_DEBUG_LEVEL_LOW);
00129 }
00130 else if ( strcmp( optarg, "HIGH")==0){
00131 xsh_debug_level_set( XSH_DEBUG_LEVEL_HIGH);
00132 }
00133 break;
00134 case DECODEBP_OPT:
00135 *decode_bp=atoi(optarg);
00136 break;
00137
00138 case HELP_OPT:
00139 Help();
00140 break;
00141 default:
00142 Help();
00143 break;
00144 }
00145 }
00146 return;
00147 }
00148
00149 cpl_error_code xsh_set_wcs(cpl_propertylist* header, const double crpix1,
00150 const double crval1, const double cdelt1, const double crpix2,
00151 const double crval2, const double cdelt2) {
00152 cpl_propertylist_append_double(header, "CRPIX1", crpix1);
00153 cpl_propertylist_append_double(header, "CRVAL1", crval1);
00154 cpl_propertylist_append_double(header, "CDELT1", cdelt1);
00155 cpl_propertylist_append_string(header, "CTYPE1", "LINEAR");
00156
00157 cpl_propertylist_append_double(header, "CRPIX2", crpix2);
00158 cpl_propertylist_append_double(header, "CRVAL2", crval2);
00159 cpl_propertylist_append_double(header, "CDELT2", cdelt2);
00160 cpl_propertylist_append_string(header, "CTYPE2", "LINEAR");
00161
00162 xsh_pfits_set_cd11(header, cdelt1);
00163 xsh_pfits_set_cd12(header, 0);
00164 xsh_pfits_set_cd21(header, 0);
00165 xsh_pfits_set_cd22(header, cdelt2);
00166
00167 return cpl_error_get_code();
00168 }
00169
00170
00171
00172
00173 static cpl_frame*
00174 xsh_extract_local_clean(cpl_frame* frame2D,xsh_instrument* instrument)
00175 {
00176 cpl_frame* extracted=NULL;
00177 float* prof = 0;
00178 int nbad=0;
00179 int ngood=0;
00180 int islit=0;
00181 int nslit=0;
00182 int idx=0;
00183 int nlambda=0;
00184 int ilambda=0;
00185 int mask_hsize=3;
00186 int mask_size=mask_hsize*2+1;
00187 int m=0;
00188 int mdx=0;
00189
00190 int* qual=NULL;
00191 float* flux=NULL;
00192 float* errs=NULL;
00193
00194 int* sub_qual=NULL;
00195 float* sub_flux=NULL;
00196 float* sub_errs=NULL;
00197
00198 int* res_qual=NULL;
00199 double* res_flux=NULL;
00200 double* res_errs=NULL;
00201 double* res_lambda=NULL;
00202
00203 double* lambda=NULL;
00204
00205 double fluxval=0;
00206 double errval=0;
00207
00208
00209 int qualval=0;
00210 float num_fct=0;
00211 float den_fct=0;
00212 float num_add=0;
00213 float den_add=0;
00214 int nbad_max=0;
00215 double ipol_fct=0;
00216 const char* fname=NULL;
00217 cpl_image* ima_data=NULL;
00218 cpl_image* ima_errs=NULL;
00219 cpl_image* ima_qual=NULL;
00220
00221 cpl_image* sub_ima_data=NULL;
00222 cpl_image* sub_ima_errs=NULL;
00223 cpl_image* sub_ima_qual=NULL;
00224 cpl_propertylist* header=NULL;
00225 cpl_propertylist* plist=NULL;
00226 double crpix1 = 1;
00227 double crval1 = 533.68;
00228 double cdelt1 = 0.04;
00229 double crpix2 = 1;
00230 double crval2 = -5.3;
00231 double cdelt2 = 0.16;
00232 const char* res_name="extracted_signal.fits";
00233
00234 cpl_table* res_table=NULL;
00235 int slit_size=0;
00236 int slit_border=6;
00237 int hslit=8;
00238 int slit_min=slit_border;
00239 int slit_max=slit_min+2*hslit;
00240
00241 int nbad_sub=0;
00242 int mslit=0;
00243
00244 fname=cpl_frame_get_filename(frame2D);
00245 ima_data=cpl_image_load(fname,CPL_TYPE_FLOAT,0,0);
00246 ima_errs=cpl_image_load(fname,CPL_TYPE_FLOAT,0,1);
00247 ima_qual=cpl_image_load(fname,CPL_TYPE_INT,0,2);
00248 header=cpl_propertylist_load(fname,0);
00249
00250 nlambda=xsh_pfits_get_naxis1(header);
00251 nslit=xsh_pfits_get_naxis2(header);
00252
00253 crval1=xsh_pfits_get_crval1(header);
00254 cdelt1=xsh_pfits_get_cdelt1(header);
00255
00256 crval2=xsh_pfits_get_crval2(header);
00257 cdelt2=xsh_pfits_get_cdelt2(header);
00258
00259
00260 flux=cpl_image_get_data_float(ima_data);
00261 errs=cpl_image_get_data_float(ima_errs);
00262 check(qual=cpl_image_get_data_int(ima_qual));
00263
00264 res_table=cpl_table_new(nlambda);
00265 cpl_table_new_column(res_table,"wave",CPL_TYPE_DOUBLE);
00266 cpl_table_new_column(res_table,"flux",CPL_TYPE_DOUBLE);
00267 cpl_table_new_column(res_table,"errs",CPL_TYPE_DOUBLE);
00268 cpl_table_new_column(res_table,"qual",CPL_TYPE_INT);
00269
00270 cpl_table_fill_column_window_double(res_table,"wave",0,nlambda,0.);
00271 cpl_table_fill_column_window_double(res_table,"flux",0,nlambda,0.);
00272 cpl_table_fill_column_window_double(res_table,"errs",0,nlambda,0.);
00273 cpl_table_fill_column_window_int(res_table,"qual",0,nlambda,0);
00274
00275 check(res_lambda=cpl_table_get_data_double(res_table,"wave"));
00276 res_flux=cpl_table_get_data_double(res_table,"flux");
00277 res_errs=cpl_table_get_data_double(res_table,"errs");
00278 res_qual=cpl_table_get_data_int(res_table,"qual");
00279
00280 lambda = cpl_malloc(nlambda * sizeof(double));
00281
00282 nbad_max = mask_size * nslit;
00283
00284 slit_min = nslit / 2 - hslit;
00285 slit_max = nslit / 2 + hslit;
00286
00287 slit_size = slit_max - slit_min + 1;
00288
00289 xsh_msg_debug("mask size=%d", mask_size);
00290
00291 for (ilambda = 0; ilambda < nlambda; ilambda++) {
00292 fluxval = 0;
00293 errval = 0;
00294 qualval = 0;
00295 lambda[ilambda] = (float) (crval1 + cdelt1 * ilambda);
00296
00297 xsh_extract_clean_slice(flux,errs,qual,lambda,ilambda,instrument,slit_min, slit_max,nlambda,nslit,mask_hsize,&fluxval, &errval,&qualval);
00298
00299 res_lambda[ilambda] = lambda[ilambda];
00300 res_flux[ilambda] = fluxval;
00301 res_errs[ilambda] = sqrt(errval);
00302 res_qual[ilambda] = qualval;
00303
00304
00305 }
00306
00307
00308 check(cpl_table_save(res_table,NULL,NULL,res_name,CPL_IO_DEFAULT));
00309
00310 extracted = cpl_frame_new();
00311 cpl_frame_set_filename(extracted, res_name);
00312 cpl_frame_set_level(extracted, CPL_FRAME_LEVEL_TEMPORARY);
00313 cpl_frame_set_group(extracted, CPL_FRAME_GROUP_RAW ) ;
00314 cpl_frame_set_tag(extracted,"TEST");
00315
00316 cleanup:
00317
00318 XSH_FREE(lambda);
00319 xsh_free_propertylist(&header);
00320 xsh_free_image(&ima_data);
00321 xsh_free_image(&ima_errs);
00322 xsh_free_image(&ima_qual);
00323 xsh_free_table(&res_table);
00324
00325 return extracted;
00326 }
00327
00335 int main( int argc, char **argv)
00336 {
00337
00338 int ret = 0 ;
00339 xsh_instrument* instrument = NULL;
00340 cpl_propertylist *header= NULL;
00341 const char *tag = "TELL_SLIT_ORDER2D_VIS";
00342 cpl_frame* result = NULL;
00343 cpl_frame* result_eso = NULL;
00344
00345 char* rec_name = "sym_extract2d.fits";
00346 cpl_frame* rec_frame = NULL;
00347
00348 int decode_bp=DECODE_BP_FLAG_DEF;
00349 int sx=300;
00350 int sy=68;
00351
00352 const double crpix1=1.;
00353 const double crval1=533.68;
00354 const double cdelt1=0.04;
00355 xsh_extract_param extract_obj = { CLEAN_METHOD};
00356 const double crpix2=1.;
00357 const double crval2=-5.3;
00358 const double cdelt2=0.16;
00359 cpl_image* data=NULL;
00360 cpl_image* errs=NULL;
00361 cpl_image* qual=NULL;
00362 float* pdata=NULL;
00363 int* pqual=NULL;
00364 XSH_ARM arm = XSH_ARM_VIS;
00365 int i=0;
00366 int j=0;
00367 int k=0;
00368 int sc=sy/2;
00369 float* val=NULL;
00370 const int rad=3;
00371 const int nval=2*rad+1;
00372 const float crh=10000.;
00373
00374
00375 TESTS_INIT(MODULE_ID);
00376
00377 cpl_msg_set_level(CPL_MSG_DEBUG);
00378 xsh_debug_level_set(XSH_DEBUG_LEVEL_MEDIUM) ;
00379
00380
00381
00382 HandleOptions( argc, argv, &extract_obj,&decode_bp);
00383 xsh_msg("argc=%d optind=%d",argc,optind);
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397 data=cpl_image_new(sx,sy,CPL_TYPE_FLOAT);
00398
00399 qual=cpl_image_new(sx,sy,CPL_TYPE_INT);
00400 pdata=cpl_image_get_data_float(data);
00401 pqual=cpl_image_get_data_int(qual);
00402
00403
00404 val = cpl_malloc(nval * sizeof(float));
00405 val[0]=4.;
00406 val[1]=9.;
00407 val[2]=16.;
00408 val[3]=25.;
00409 val[4]=16.;
00410 val[5]=9.;
00411 val[6]=4.;
00412
00413 for (k = -rad; k <= rad; k++) {
00414 j = sc - k;
00415 for (i = 0; i < sx; i++) {
00416 pdata[j * sx + i] = val[k + rad];
00417 }
00418 }
00419
00420
00421
00422
00423
00424
00425 j=sc;
00426 i=12;
00427
00428
00429 pdata[j * sx + i]=crh;
00430 pqual[j * sx + i]=1;
00431 xsh_msg_debug("ingest CRH at pix[%d,%d]=pix[%g,%g]",i,j,crval1+i*cdelt1,crval2+j*cdelt2);
00432
00433
00434
00435
00436 j=sc-1;
00437 i=52;
00438 pdata[j * sx + i]=crh;
00439 pqual[j * sx + i]=1;
00440
00441 j=sc+1;
00442 pdata[j * sx + i]=crh;
00443 pqual[j * sx + i]=1;
00444
00445
00446 j=sc;
00447 i=102;
00448 pdata[j * sx + i]=crh;
00449 pqual[j * sx + i]=1;
00450 i=103;
00451 pdata[j * sx + i]=crh;
00452 pqual[j * sx + i]=1;
00453
00454
00455
00456 j=sc;
00457 for (i = 106; i <= 116; i++) {
00458 pdata[j * sx + i]=crh;
00459 pqual[j * sx + i]=1;
00460 }
00461
00462
00463 j=sc+2;
00464 i=152;
00465 pdata[j * sx + i]=crh;
00466 pqual[j * sx + i]=1;
00467
00468 j=sc+1;
00469 i=152;
00470 pdata[j * sx + i]=crh;
00471 pqual[j * sx + i]=1;
00472
00473 j=sc;
00474 i=152;
00475 pdata[j * sx + i]=crh;
00476 pqual[j * sx + i]=1;
00477 j=sc-1;
00478
00479 i=152;
00480 pdata[j * sx + i]=crh;
00481 pqual[j * sx + i]=1;
00482
00483 j=sc-1;
00484 i=153;
00485 pdata[j * sx + i]=crh;
00486 pqual[j * sx + i]=1;
00487
00488
00489
00490 for (k = -rad; k <= rad; k++) {
00491 j = sc - k;
00492 i=202;
00493 pdata[j * sx + i] = crh;
00494 pqual[j * sx + i]=1;
00495 }
00496
00497
00498
00499 for (j= 0; j < sy; j++) {
00500 i=252;
00501 pdata[j * sx + i] = crh;
00502 pqual[j * sx + i]=1;
00503 }
00504
00505
00506
00507
00508 errs=cpl_image_duplicate(data);
00509 cpl_image_power(errs,0.5);
00510 cpl_image_add_scalar(errs,1);
00511
00512 header=cpl_propertylist_new();
00513 xsh_set_wcs(header, crpix1,crval1, cdelt1, crpix2,crval2, cdelt2);
00514 cpl_image_save(data, rec_name, XSH_PRE_DATA_BPP, header, CPL_IO_DEFAULT);
00515 cpl_image_save(errs, rec_name, XSH_PRE_ERRS_BPP, NULL, CPL_IO_EXTEND);
00516 cpl_image_save(qual, rec_name, XSH_PRE_QUAL_BPP, NULL, CPL_IO_EXTEND);
00517
00518 rec_frame = cpl_frame_new();
00519 XSH_ASSURE_NOT_NULL (rec_frame);
00520 cpl_frame_set_filename( rec_frame, rec_name) ;
00521
00522 cpl_frame_set_level( rec_frame, CPL_FRAME_LEVEL_TEMPORARY);
00523 cpl_frame_set_group( rec_frame, CPL_FRAME_GROUP_RAW ) ;
00524 cpl_frame_set_tag( rec_frame, tag);
00525
00526
00527 instrument = xsh_instrument_new();
00528 xsh_instrument_set_mode( instrument, XSH_MODE_IFU ) ;
00529 xsh_instrument_set_lamp( instrument, XSH_LAMP_QTH ) ;
00530 xsh_instrument_set_arm( instrument, arm);
00531 xsh_instrument_set_decode_bp(instrument,decode_bp);
00532
00533
00534
00535 check(result = xsh_extract_local_clean(rec_frame,instrument));
00536
00537 cleanup:
00538
00539 XSH_FREE(val);
00540 xsh_free_image( &data);
00541 xsh_free_image( &errs);
00542 xsh_free_image( &qual);
00543
00544 xsh_instrument_free( &instrument);
00545 xsh_free_frame( &rec_frame);
00546 xsh_free_frame( &result);
00547 xsh_free_propertylist( &header);
00548
00549 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00550 xsh_error_dump(CPL_MSG_ERROR);
00551 ret= 1;
00552 }
00553
00554 TEST_END();
00555 return ret ;
00556 }
00557