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