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 #ifdef HAVE_CONFIG_H
00026 #include <config.h>
00027 #endif
00028
00029
00035
00038
00039
00040
00041
00042 #include <xsh_data_instrument.h>
00043 #include <xsh_pfits.h>
00044 #include <xsh_drl_check.h>
00045 #include <xsh_msg.h>
00046 #include <xsh_utils.h>
00047 #include <tests.h>
00048 #include <cpl.h>
00049 #include <math.h>
00050 #include <stdlib.h>
00051 #include <getopt.h>
00052 #include <xsh_cpl_size.h>
00053
00054
00055
00056
00057 #define MODULE_ID "XSH_SUBTRACT_SKY_SINGLE"
00058
00059 #define SYNTAX "Test the xsh_subtract_sky_single function\n"\
00060 "usage :\n test_xsh_subtract_sky_single [<opt>] SCI_FRAME ORDER_TABLE SLITMAP WAVEMAP [LOCALIZATION} \n" \
00061 "SCI_FRAME => Science frame NOCOSMIC and flat field [DIV_FF]\n"\
00062 "ORDER_TABLE => Order table frame\n"\
00063 "SLITMAP => Slit Map Frame\n"\
00064 "WAVEMAP => Wave Map frame\n"\
00065 "LOCALIZATION => Localization frame (optional)\n\n"\
00066 "Options:\n"\
00067 " --nbkpts=<nn> : Number of break points (default 100)\n"\
00068 " --method=<n> : 0 => BSPLINE 1 => MEDIAN [BSPLINE]\n"\
00069 " --pos1=<n> : Sky position 1 [0]\n"\
00070 " --hheight1=<n> : Sky half height 1 [0]\n"\
00071 " --pos2=<n> : Sky position 2 [0]\n"\
00072 " --hheight2=<n> : Sky half height 2 [0]\n"\
00073 " --debug=<n> : Level of debug LOW | MEDIUM | HIGH [MEDIUM]\n"\
00074 "The output file (after subtraction) is 'SUBTRACTED_FLUX.fits'\n"
00075
00076
00077 static const char * Options = "?" ;
00078
00079 enum {
00080 NBKPTS_OPT,
00081 METHOD_OPT,
00082 POS1_OPT,
00083 HHEIGHT1_OPT,
00084 POS2_OPT,
00085 HHEIGHT2_OPT,
00086 DEBUG_OPT
00087 } ;
00088
00089 static struct option LongOptions[] = {
00090 {"nbkpts", required_argument, 0, NBKPTS_OPT},
00091 {"method", required_argument, 0, METHOD_OPT},
00092 {"pos1", required_argument, 0, POS1_OPT},
00093 {"hheight1", required_argument, 0, HHEIGHT1_OPT},
00094 {"pos2", required_argument, 0, POS2_OPT},
00095 {"hheight2", required_argument, 0, HHEIGHT2_OPT},
00096 {"debug", required_argument, 0, DEBUG_OPT},
00097 {NULL, 0, 0, 0}
00098 } ;
00099
00100 static void HandleOptions( int argc, char ** argv, xsh_subtract_sky_single_param* sky_par)
00101 {
00102 int opt ;
00103 int option_index = 0;
00104
00105 while( (opt = getopt_long( argc, argv, Options,
00106 LongOptions, &option_index )) != EOF )
00107 switch( opt ) {
00108 case NBKPTS_OPT:
00109 sscanf( optarg, "%d", &(sky_par->nbkpts1) ) ;
00110 break ;
00111 case METHOD_OPT:
00112 sscanf( optarg, "%d", &(sky_par->method));
00113 break ;
00114 case POS1_OPT:
00115 sky_par->pos1 = atof( optarg);
00116 break ;
00117 case HHEIGHT1_OPT:
00118 sky_par->hheight1 = atof(optarg);
00119 break ;
00120 case POS2_OPT:
00121 sky_par->pos2 = atof( optarg);
00122 break ;
00123 case HHEIGHT2_OPT:
00124 sky_par->hheight2 = atof(optarg);
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 default:
00135 printf( SYNTAX);
00136 exit( 0 ) ;
00137 }
00138 }
00139
00140 static void get_max_pos( cpl_frame * frame, xsh_instrument * instrument )
00141 {
00142 cpl_size x = 0, y = 0 ;
00143 xsh_pre * pre = NULL ;
00144 double max = 0 ;
00145
00146
00147 pre = xsh_pre_load( frame, instrument ) ;
00148 max = cpl_image_get_max( pre->data ) ;
00149 cpl_image_get_maxpos( pre->data, &x, &y ) ;
00150 xsh_msg( "Maximum value: %lf at %" CPL_SIZE_FORMAT ",%" CPL_SIZE_FORMAT "", max, x, y ) ;
00151 xsh_pre_free( &pre ) ;
00152 }
00153
00154
00161
00162
00163 int main(int argc, char** argv)
00164 {
00165 cpl_frame * sci_frame = NULL ;
00166 cpl_frame * order_frame = NULL ;
00167 cpl_frame * slitmap_frame = NULL ;
00168 cpl_frame * wavemap_frame= NULL ;
00169 cpl_frame * local_frame = NULL ;
00170
00171 char * sci_name = NULL, * order_name = NULL, * slitmap_name = NULL,
00172 * wavemap_name = NULL, * local_name = NULL ;
00173
00174 xsh_instrument * instrument = NULL ;
00175 cpl_frame * sky_spectrum = NULL ;
00176 cpl_frame * sky_spectrum_eso = NULL ;
00177
00178
00179 cpl_frame * result = NULL ;
00180 xsh_subtract_sky_single_param sky_par = {1000, 1000,7,20, 5., -1, -1,
00181 BSPLINE_METHOD,FINE, 7, 1.5,
00182 0.,0.,0.,0.};
00183 int nb_frames = 0 ;
00184 char * tag ;
00185 XSH_ARM arm = XSH_ARM_UNDEFINED;
00186 cpl_propertylist *plist = NULL;
00187 int ret=0;
00188 const int decode_bp=2147483647;
00189 TESTS_INIT(MODULE_ID);
00190 cpl_msg_set_level(CPL_MSG_DEBUG);
00191 xsh_debug_level_set(XSH_DEBUG_LEVEL_MEDIUM);
00192
00193
00194 sky_par.slit_edges_mask = 1.5;
00195 sky_par.median_hsize = 7;
00196 sky_par.nbkpts1 = 3000;
00197 sky_par.nbkpts2 = 3000;
00198 sky_par.bezier_spline_order = 7;
00199 sky_par.niter = 20;
00200 sky_par.ron = -1;
00201 sky_par.kappa = 5;
00202 sky_par.gain = -1;
00203 sky_par.bspline_sampling = FINE;
00204 sky_par.pos1 = 0.0;
00205 sky_par.hheight1 = 0.0;
00206 sky_par.pos2 = 0.0;
00207 sky_par.hheight2 = 0.0;
00208
00209
00210 HandleOptions( argc, argv, &sky_par );
00211
00212 xsh_msg( "Nb of breakpts = %d", sky_par.nbkpts1);
00213
00214
00215 nb_frames = argc - optind;
00216 if ( nb_frames >= 4 ) {
00217 sci_name = argv[optind] ;
00218 order_name = argv[optind+1] ;
00219 slitmap_name = argv[optind+2] ;
00220 wavemap_name = argv[optind+3] ;
00221 if ( nb_frames == 5 )
00222 local_name = argv[optind+4] ;
00223 }
00224 else{
00225 xsh_msg( "Not enough Input Frames\n" ) ;
00226 printf(SYNTAX);
00227 TEST_END();
00228 exit(0);
00229 }
00230
00231 xsh_msg("Sci frame : %s", sci_name);
00232 xsh_msg("Order frame : %s", order_name);
00233 xsh_msg("Slit map frame : %s",slitmap_name);
00234 xsh_msg("Wave map frame : %s",wavemap_name);
00235 if (local_name != NULL){
00236 xsh_msg("Localization frame : %s", local_name);
00237 }
00238
00239 xsh_msg("---Parameters");
00240 xsh_msg("method : %s", SKY_METHOD_PRINT(sky_par.method));
00241 xsh_msg("slit edges mask : %f", sky_par.slit_edges_mask);
00242
00243 xsh_msg("position1 : %f hheight1 : %f", sky_par.pos1, sky_par.hheight1);
00244 xsh_msg("position2 : %f hheight2 : %f", sky_par.pos2, sky_par.hheight2);
00245
00246 if (sky_par.method == MEDIAN_METHOD){
00247 xsh_msg("median half size : %d", sky_par.median_hsize);
00248 }
00249 check( plist = cpl_propertylist_load( sci_name, 0));
00250 check( arm = xsh_pfits_get_arm( plist));
00251
00252 TESTS_XSH_INSTRUMENT_CREATE( instrument, XSH_MODE_SLIT, arm,
00253 XSH_LAMP_UNDEFINED, "xsh_scired_slit_stare");
00254
00255
00256 tag = XSH_GET_TAG_FROM_ARM(XSH_OBJECT_SLIT_STARE, instrument) ;
00257 TESTS_XSH_FRAME_CREATE( sci_frame, tag, sci_name ) ;
00258
00259 get_max_pos( sci_frame, instrument ) ;
00260 xsh_instrument_set_decode_bp( instrument, decode_bp ) ;
00261 tag = XSH_GET_TAG_FROM_LAMP(XSH_ORDER_TAB_EDGES,instrument) ;
00262 TESTS_XSH_FRAME_CREATE( order_frame, tag, order_name ) ;
00263 cpl_frame_set_group( order_frame, CPL_FRAME_GROUP_CALIB ) ;
00264
00265 tag = XSH_GET_TAG_FROM_ARM(XSH_SLIT_MAP,instrument) ;
00266 TESTS_XSH_FRAME_CREATE( slitmap_frame, tag, slitmap_name ) ;
00267 cpl_frame_set_group( slitmap_frame, CPL_FRAME_GROUP_CALIB ) ;
00268
00269 tag = XSH_GET_TAG_FROM_ARM(XSH_WAVE_MAP,instrument) ;
00270 TESTS_XSH_FRAME_CREATE( wavemap_frame, tag, wavemap_name ) ;
00271 cpl_frame_set_group( wavemap_frame, CPL_FRAME_GROUP_CALIB ) ;
00272
00273 if ( local_name != NULL ) {
00274 tag = XSH_GET_TAG_FROM_ARM(XSH_LOCALIZATION,instrument) ;
00275 TESTS_XSH_FRAME_CREATE( local_frame, tag, local_name ) ;
00276 cpl_frame_set_group( local_frame, CPL_FRAME_GROUP_CALIB ) ;
00277 }
00278
00279 check(result = xsh_subtract_sky_single( sci_frame, order_frame,
00280 slitmap_frame, wavemap_frame,
00281 local_frame, NULL,NULL,instrument,
00282 sky_par.nbkpts1, &sky_par,
00283 &sky_spectrum,&sky_spectrum_eso,
00284 "test",1));
00285
00286
00287
00288
00289
00290
00291
00292 cleanup:
00293 xsh_instrument_free( &instrument);
00294 xsh_free_frame( &sci_frame);
00295 xsh_free_frame( &order_frame);
00296 xsh_free_frame( &slitmap_frame);
00297 xsh_free_frame( &wavemap_frame);
00298 xsh_free_frame( &local_frame);
00299 xsh_free_frame( &sky_spectrum);
00300 xsh_free_frame( &sky_spectrum_eso);
00301 xsh_free_frame( &result);
00302 xsh_free_propertylist( &plist);
00303
00304 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00305 xsh_msg( "ERROR in xsh_subtract_sky_single" ) ;
00306 xsh_error_dump( CPL_MSG_ERROR);
00307 ret=1;
00308 }
00309 TEST_END();
00310 return ret;
00311 }