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_the_map.h>
00050 #include <xsh_data_localization.h>
00051 #include <xsh_data_spectralformat.h>
00052
00053 #include <xsh_drl.h>
00054 #include <xsh_pfits.h>
00055
00056 #include <xsh_badpixelmap.h>
00057
00058 #include <cpl.h>
00059 #include <math.h>
00060
00061 #include <getopt.h>
00062
00063
00064
00065
00066
00067 #define MODULE_ID "XSH_RECTIFY"
00068
00069
00070
00071
00072 enum {
00073 KERNEL_OPT, RADIUS_OPT, BIN_LAMBDA_OPT, BIN_SPACE_OPT, HELP_OPT,
00074 MIN_ORDER_OPT, MAX_ORDER_OPT, SLIT_MIN_OPT, NSLIT_OPT,
00075 DEBUG_OPT
00076 } ;
00077
00078 static const char * Options = "" ;
00079
00080 static struct option long_options[] = {
00081 {"kernel", required_argument, 0, KERNEL_OPT},
00082 {"radius", required_argument, 0, RADIUS_OPT},
00083 {"bin-lambda", required_argument, 0, BIN_LAMBDA_OPT},
00084 {"bin-space", required_argument, 0, BIN_SPACE_OPT},
00085 {"order-min", required_argument, 0, MIN_ORDER_OPT},
00086 {"order-max", required_argument, 0, MAX_ORDER_OPT},
00087 {"slit-min",required_argument, 0, SLIT_MIN_OPT},
00088 {"slit-n",required_argument, 0, NSLIT_OPT},
00089 {"debug", required_argument, 0, DEBUG_OPT},
00090 {"help", 0, 0, HELP_OPT},
00091 {0, 0, 0, 0}
00092 };
00093
00094 static void Help( void )
00095 {
00096 puts( "Unitary test of xsh_rectify" ) ;
00097 puts( "Usage: test_rectify [options] <input_files>" ) ;
00098 puts( "Options" ) ;
00099 puts( " --kernel=<name> : TANH, SINC, SINC2, LANCZOS, HAMMING, HANN [TANH]");
00100 puts( " --radius=<nn> : Radius [4]" ) ;
00101 puts( " --bin-lambda=<n> : Bin in Lambda [0.1]" ) ;
00102 puts( " --bin-space=<n> : Bin in Slit [0.1]" ) ;
00103 puts( " --order-min=<n> : Minimum abs order" );
00104 puts( " --order-max=<n> : Maximum abs order" );
00105 puts( " --slit-min=<n> : Minimum slit to rectify" );
00106 puts( " --slit-n=<n> : Number of pixels in slit rectified frame" );
00107 puts( " --debug=<n> : Level of debug NONE | LOW | MEDIUM | HIGH [MEDIUM]" );
00108 puts( " --help : What you see" ) ;
00109 puts( "\nInput Files" ) ;
00110 puts( "The input files argument MUST be in this order:" ) ;
00111 puts( " 1. Science frame in PRE format" ) ;
00112 puts( " 2. SOF\n" ) ;
00113 puts( " 3. [OPTIONAL] Shift slit tab\n" ) ;
00114 TEST_END();
00115 }
00116
00117 static void HandleOptions( int argc, char **argv,
00118 xsh_rectify_param *rectify_par, int *order_min, int *order_max,
00119 double *slit_min, int *nslit)
00120 {
00121 int opt ;
00122 int option_index = 0;
00123
00124 while (( opt = getopt_long (argc, argv, Options,
00125 long_options, &option_index)) != EOF )
00126 switch ( opt ) {
00127 case KERNEL_OPT:
00128 strcpy( rectify_par->rectif_kernel, optarg);
00129 if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_TANH)) == 0){
00130 rectify_par->kernel_type = CPL_KERNEL_TANH;
00131 }
00132 else if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_TANH)) == 0){
00133 rectify_par->kernel_type = CPL_KERNEL_TANH;
00134 }
00135 else if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_SINC)) == 0){
00136 rectify_par->kernel_type = CPL_KERNEL_SINC;
00137 }
00138 else if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_SINC2)) == 0){
00139 rectify_par->kernel_type = CPL_KERNEL_SINC2;
00140 }
00141 else if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_LANCZOS)) == 0){
00142 rectify_par->kernel_type = CPL_KERNEL_LANCZOS;
00143 }
00144 else if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_HAMMING)) == 0){
00145 rectify_par->kernel_type = CPL_KERNEL_HAMMING;
00146 }
00147 else if ( strcmp( optarg, RECTIFY_KERNEL_PRINT( CPL_KERNEL_HANN)) == 0){
00148 rectify_par->kernel_type = CPL_KERNEL_HANN;
00149 }
00150 else{
00151 xsh_msg("Invalid kernel option %s", optarg);
00152 Help();
00153 exit(0);
00154 }
00155 break;
00156 case RADIUS_OPT:
00157 rectify_par->rectif_radius = atof( optarg);
00158 break ;
00159 case BIN_LAMBDA_OPT:
00160 sscanf( optarg, "%lf", &rectify_par->rectif_bin_lambda ) ;
00161 break ;
00162 case BIN_SPACE_OPT:
00163 sscanf( optarg, "%lf", &rectify_par->rectif_bin_space ) ;
00164 break ;
00165 case MIN_ORDER_OPT:
00166 sscanf( optarg, "%d", order_min);
00167 break;
00168 case MAX_ORDER_OPT:
00169 sscanf( optarg, "%d", order_max);
00170 break;
00171 case SLIT_MIN_OPT:
00172 sscanf( optarg, "%lf", slit_min) ;
00173 break ;
00174 case NSLIT_OPT:
00175 sscanf( optarg, "%d", nslit);
00176 break ;
00177 case DEBUG_OPT:
00178 if ( strcmp( optarg, "LOW")==0){
00179 xsh_debug_level_set( XSH_DEBUG_LEVEL_LOW);
00180 }
00181 else if ( strcmp( optarg, "HIGH")==0){
00182 xsh_debug_level_set( XSH_DEBUG_LEVEL_HIGH);
00183 }
00184 else if ( strcmp( optarg, "NONE")==0){
00185 xsh_debug_level_set( XSH_DEBUG_LEVEL_NONE);
00186 }
00187 break;
00188 default: Help() ; exit( 0 ) ;
00189 }
00190 }
00191
00200 int main( int argc, char **argv)
00201 {
00202
00203 int ret = 0 ;
00204
00205 xsh_instrument* instrument = NULL;
00206
00207 const char *sof_name = NULL;
00208 cpl_frameset *set = NULL;
00209 const char * sci_name = NULL ;
00210
00211 cpl_frameset *wavesol_frameset = NULL;
00212 cpl_frameset *result_frameset = NULL;
00213 cpl_frameset *merge_frameset = NULL;
00214 cpl_frame *sci_frame = NULL;
00215 cpl_frame *orderlist_frame = NULL;
00216 cpl_frame *slitmap_frame = NULL;
00217 cpl_frame *wavesol_frame = NULL;
00218 cpl_frame *model_frame = NULL;
00219 cpl_frame *spectralformat_frame = NULL;
00220 cpl_frame *recorder_frame = NULL ;
00221 cpl_frame *recordereso_frame = NULL ;
00222 cpl_frame *recordertab_frame = NULL ;
00223 int order_min = -1, order_max = -1;
00224 int rec_min_index=-1, rec_max_index=-1;
00225 xsh_order_list* order_list = NULL;
00226 xsh_rectify_param rectify_par;
00227 int nslit_c=20, nslit=-100;
00228 double slit_min_c=0, slit_min=-100;
00229 XSH_MODE mode = XSH_MODE_SLIT;
00230 xsh_merge_param merge_par = { MEAN_MERGE_METHOD};
00231 cpl_frame *spectrum_frame = NULL;
00232 cpl_frame *slit_shifttab_frame = NULL;
00233 const char *slit_shifttab_name = NULL;
00234 cpl_frameset *slit_shifttab_frameset = NULL;
00235 const int decode_bp=2147483647;
00236
00237
00238 TESTS_INIT(MODULE_ID);
00239 cpl_msg_set_level(CPL_MSG_DEBUG);
00240 xsh_debug_level_set(XSH_DEBUG_LEVEL_MEDIUM);
00241
00242
00243 strcpy( rectify_par.rectif_kernel, "default");
00244 rectify_par.kernel_type = CPL_KERNEL_TANH;
00245 rectify_par.rectif_radius = 4 ;
00246 rectify_par.rectif_bin_lambda = 0.1 ;
00247 rectify_par.rectif_bin_space = 0.1 ;
00248 rectify_par.conserve_flux = FALSE;
00249 rectify_par.rectify_full_slit=CPL_TRUE;
00250
00251 HandleOptions( argc, argv, &rectify_par, &order_min, &order_max,
00252 &slit_min, &nslit);
00253
00254 if ( (argc - optind) >=2 ) {
00255 sci_name = argv[optind];
00256 sof_name = argv[optind+1];
00257 if ( (argc - optind) >=3 ) {
00258 slit_shifttab_name = argv[optind+2];
00259 }
00260 }
00261 else {
00262 Help();
00263 exit(0);
00264 }
00265
00266 check( set = sof_to_frameset( sof_name));
00267
00268 check( instrument = xsh_dfs_set_groups( set));
00269
00270 check( spectralformat_frame = xsh_find_spectral_format( set, instrument));
00271 check( orderlist_frame = xsh_find_order_tab_edges( set, instrument));
00272 check( slitmap_frame = xsh_find_slitmap( set, instrument));
00273
00274 TESTS_XSH_FRAME_CREATE( sci_frame, "SLIT_STARE_DIVIDED_arm", sci_name);
00275 check( mode = xsh_instrument_get_mode( instrument));
00276 xsh_instrument_set_decode_bp( instrument, decode_bp ) ;
00277 if ( slit_shifttab_name != NULL){
00278 if ( mode == XSH_MODE_SLIT){
00279 TESTS_XSH_FRAME_CREATE( slit_shifttab_frame, "SHIFTTAB_arm", slit_shifttab_name);
00280 }
00281 else{
00282 int i;
00283 slit_shifttab_frameset = cpl_frameset_new();
00284 for( i=0; i< 3; i++){
00285 TESTS_XSH_FRAME_CREATE( slit_shifttab_frame, "SHIFTTAB_arm", slit_shifttab_name);
00286 cpl_frameset_insert( slit_shifttab_frameset, slit_shifttab_frame);
00287 }
00288 }
00289 }
00290 xsh_msg("SCI : %s",
00291 cpl_frame_get_filename( sci_frame));
00292 xsh_msg("ORDERLIST : %s",
00293 cpl_frame_get_filename( orderlist_frame));
00294 xsh_msg("SPECTRALFORMAT : %s",
00295 cpl_frame_get_filename( spectralformat_frame));
00296 if ( slitmap_frame != NULL){
00297 xsh_msg("SLITMAP : %s",
00298 cpl_frame_get_filename( slitmap_frame));
00299 }
00300 if ( slit_shifttab_frame != NULL){
00301 xsh_msg("SHIFTTAB : %s",
00302 cpl_frame_get_filename( slit_shifttab_frame));
00303 }
00304
00305 if ( mode == XSH_MODE_SLIT){
00306 wavesol_frame = xsh_find_wave_tab_2d( set, instrument);
00307
00308 if ( wavesol_frame == NULL){
00309 model_frame = xsh_find_model_config_tab( set, instrument);
00310 }
00311
00312 if ( wavesol_frame != NULL){
00313 xsh_msg("WAVESOL : %s",
00314 cpl_frame_get_filename( wavesol_frame));
00315 }
00316 else {
00317 xsh_msg("MODEL : %s",
00318 cpl_frame_get_filename( model_frame));
00319 }
00320 }
00321 else{
00322 wavesol_frameset = xsh_find_wave_tab_ifu( set, instrument);
00323 cpl_error_reset();
00324 if ( wavesol_frameset == NULL){
00325 model_frame = xsh_find_model_config_tab( set, instrument);
00326 xsh_msg("MODEL : %s",
00327 cpl_frame_get_filename( model_frame));
00328 }
00329 else{
00330 int iframe;
00331 int size;
00332
00333 size = cpl_frameset_get_size( wavesol_frameset);
00334 for(iframe=0; iframe < size; iframe++){
00335 cpl_frame *frame = cpl_frameset_get_frame(wavesol_frameset, iframe);
00336 xsh_msg("WAVESOL : %s",
00337 cpl_frame_get_filename( frame));
00338 }
00339 }
00340 }
00341
00342 xsh_msg(" Parameters ");
00343 xsh_msg(" kernel %s", RECTIFY_KERNEL_PRINT( rectify_par.kernel_type));
00344 xsh_msg(" radius %f", rectify_par.rectif_radius);
00345 xsh_msg(" bin-space %f", rectify_par.rectif_bin_space);
00346 xsh_msg(" bin-lambda %f", rectify_par.rectif_bin_lambda);
00347
00348
00349 check( order_list = xsh_order_list_load ( orderlist_frame, instrument));
00350
00351 if ( order_min != -1) {
00352 check( rec_min_index = xsh_order_list_get_index_by_absorder( order_list,
00353 order_min));
00354 xsh_msg("Order min %d => index %d", order_min, rec_min_index);
00355 }
00356 else{
00357 rec_min_index = 0;
00358 }
00359
00360 if ( order_max != -1) {
00361 check( rec_max_index = xsh_order_list_get_index_by_absorder( order_list,
00362 order_max));
00363 xsh_msg("Order max %d => index %d", order_max, rec_max_index);
00364 }
00365 else{
00366 rec_max_index = order_list->size;
00367 }
00368
00369
00370
00371 check( xsh_rec_slit_size( &rectify_par,
00372 &slit_min_c, &nslit_c, mode));
00373
00374 if (slit_min == -100){
00375 slit_min = slit_min_c;
00376 }
00377 if ( nslit == -100){
00378 nslit = nslit_c;
00379 }
00380
00381 if ( mode == XSH_MODE_SLIT){
00382 const char *tag = XSH_GET_TAG_FROM_ARM( XSH_ORDER2D, instrument);
00383 check( recorder_frame = xsh_rectify_orders( sci_frame, order_list,
00384 wavesol_frame, model_frame, instrument, &rectify_par,
00385 spectralformat_frame, NULL, "RECTIFIED.fits", tag, &recordereso_frame,
00386 &recordertab_frame,rec_min_index, rec_max_index, slit_min, nslit, 0,
00387 slit_shifttab_frame));
00388 check( spectrum_frame = xsh_merge_ord( recorder_frame, instrument,
00389 &merge_par,"test"));
00390 }
00391 else{
00392 xsh_msg("Rectify in IFU");
00393 check( result_frameset = xsh_rectify_orders_ifu( sci_frame, order_list,
00394 wavesol_frameset, slit_shifttab_frameset, model_frame, instrument, &rectify_par,
00395 spectralformat_frame, slitmap_frame,NULL,NULL,rec_min_index,
00396 rec_max_index, "test"));
00397 xsh_msg( "Merge in IFU");
00398 check( merge_frameset = xsh_merge_ord_ifu( result_frameset, instrument, &merge_par,"test"));
00399 }
00400
00401 cleanup:
00402 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00403 xsh_error_dump(CPL_MSG_ERROR);
00404 ret = 1;
00405 }
00406 xsh_free_frame( &slit_shifttab_frame);
00407 xsh_order_list_free( &order_list);
00408 xsh_free_frame( &sci_frame);
00409 xsh_free_frameset( &result_frameset);
00410 xsh_free_frameset( &wavesol_frameset);
00411 xsh_free_frameset( &set);
00412 xsh_instrument_free( &instrument);
00413 xsh_free_frame( &recorder_frame);
00414 xsh_free_frame( &recordereso_frame);
00415 xsh_free_frame( &recordertab_frame);
00416 xsh_free_frame( &spectrum_frame);
00417 TEST_END();
00418 return ret;
00419 }