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
00044 #include <xsh_data_pre.h>
00045 #include <xsh_error.h>
00046 #include <xsh_msg.h>
00047 #include <xsh_data_instrument.h>
00048 #include <xsh_dfs.h>
00049 #include <xsh_pfits.h>
00050 #include <tests.h>
00051 #include <cpl.h>
00052 #include <math.h>
00053 #include <getopt.h>
00054
00055
00056
00057
00058 #define MODULE_ID "XSH_SUBTRACT_DARK"
00059
00060 enum {
00061 DEBUG_OPT, HELP_OPT
00062 };
00063
00064 static struct option long_options[] = {
00065 {"debug", required_argument, 0, DEBUG_OPT},
00066 {"help", 0, 0, HELP_OPT},
00067 {0, 0, 0, 0}
00068 };
00069
00070 static void Help( void )
00071 {
00072 puts( "Unitary test of xsh_subtract_dark");
00073 puts( "Usage: test_xsh_subtract_dark [options] <input_files>");
00074
00075 puts( "Options" ) ;
00076 puts( " --debug=<n> : Level of debug LOW | MEDIUM | HIGH [MEDIUM]" );
00077 puts( " --help : What you see" ) ;
00078 puts( "\nInput Files" ) ;
00079 puts( "The input files argument MUST be in this order:" ) ;
00080 puts( " 1. Science frame in PRE format" ) ;
00081 puts( " 2. SOF [MASTER_DARK]");
00082 TEST_END();
00083 exit(0);
00084 }
00085
00086 static void HandleOptions( int argc, char **argv)
00087 {
00088 int opt ;
00089 int option_index = 0;
00090 while (( opt = getopt_long (argc, argv, "debug:help",
00091 long_options, &option_index)) != EOF ){
00092
00093 switch ( opt ) {
00094 case DEBUG_OPT:
00095 if ( strcmp( optarg, "LOW")==0){
00096 xsh_debug_level_set( XSH_DEBUG_LEVEL_LOW);
00097 }
00098 else if ( strcmp( optarg, "HIGH")==0){
00099 xsh_debug_level_set( XSH_DEBUG_LEVEL_HIGH);
00100 }
00101 break;
00102 case HELP_OPT:
00103 Help();
00104 break;
00105 default:
00106 break;
00107 }
00108 }
00109 return;
00110 }
00111
00112
00113
00114
00115
00122
00123
00124 int main(int argc, char** argv)
00125 {
00126 xsh_instrument * instrument = NULL ;
00127 cpl_frameset* set = NULL;
00128 cpl_frame* frame = NULL;
00129 cpl_frame* dark = NULL;
00130 char* sci_name = NULL;
00131 char* sof_name = NULL;
00132 cpl_frame* temp = NULL;
00133 int i = 0;
00134 xsh_pre* pre1 = NULL;
00135 xsh_pre* pre2 = NULL;
00136 xsh_pre* pre3 = NULL;
00137 float *data1 = NULL,*errs1 = NULL;
00138 int * qual1 = NULL;
00139 float *data2 = NULL,*errs2 = NULL;
00140 int * qual2 = NULL;
00141 float *data3 = NULL,*errs3 = NULL;
00142 int * qual3 = NULL;
00143 int ret=0;
00144
00145
00146 TESTS_INIT(MODULE_ID);
00147 cpl_msg_set_level( CPL_MSG_DEBUG);
00148 xsh_debug_level_set( XSH_DEBUG_LEVEL_MEDIUM);
00149
00150 HandleOptions( argc, argv);
00151
00152 if ( (argc-optind) >= 2 ) {
00153 sci_name = argv[optind];
00154 sof_name = argv[optind+1];
00155
00156
00157 check( set = sof_to_frameset( sof_name));
00158
00159
00160 check( instrument = xsh_dfs_set_groups( set));
00161 check( dark = xsh_find_master_dark( set, instrument));
00162 TESTS_XSH_FRAME_CREATE( frame, "OBJECT_SLIT_STARE_arm", sci_name);
00163 }
00164 else{
00165 xsh_msg("-------------------------------------------");
00166 xsh_msg("Execute default test : do --help for option");
00167 xsh_msg("-------------------------------------------");
00168
00169 instrument = xsh_instrument_new() ;
00170 xsh_instrument_set_mode( instrument, XSH_MODE_IFU ) ;
00171 xsh_instrument_set_arm( instrument, XSH_ARM_UVB ) ;
00172 xsh_instrument_set_lamp( instrument, XSH_LAMP_QTH ) ;
00173
00174
00175 set = cpl_frameset_new();
00176 for(i=0;i<2;i++){
00177 char framename[256];
00178
00179 sprintf(framename,"frame%d.fits",i);
00180 frame = xsh_test_create_frame(framename,10,10,
00181 XSH_LINEARITY_UVB,CPL_FRAME_GROUP_RAW, instrument);
00182 cpl_frameset_insert(set,frame);
00183 }
00184
00185
00186 check(xsh_prepare(set, NULL, NULL,"PRE",instrument,0));
00187
00188
00189
00190 check( frame = cpl_frame_duplicate(cpl_frameset_get_frame(set,0)));
00191 check( dark = cpl_frameset_get_frame(set,1));
00192 }
00193
00194 xsh_msg("SCI : %s",
00195 cpl_frame_get_filename( frame));
00196 XSH_ASSURE_NOT_NULL( dark);
00197 xsh_msg("DARK : %s",
00198 cpl_frame_get_filename( dark));
00199
00200 check( temp = xsh_subtract_dark(frame,dark, "tmp_sub.fits", instrument));
00201
00202 check(pre1 = xsh_pre_load(temp,instrument));
00203 check(pre2 = xsh_pre_load(frame,instrument));
00204 check(pre3 = xsh_pre_load(dark,instrument));
00205
00206 data1 = cpl_image_get_data_float(pre1->data);
00207 data2 = cpl_image_get_data_float(pre2->data);
00208 data3 = cpl_image_get_data_float(pre3->data);
00209 errs1 = cpl_image_get_data_float(pre1->errs);
00210 errs2 = cpl_image_get_data_float(pre2->errs);
00211 errs3 = cpl_image_get_data_float(pre3->errs);
00212 qual1 = cpl_image_get_data_int(pre1->qual);
00213 qual2 = cpl_image_get_data_int(pre2->qual);
00214 qual3 = cpl_image_get_data_int(pre3->qual);
00215
00216
00217 xsh_msg("exptime %f",pre2->exptime);
00218 for(i=0;i<100;i++){
00219 assure(data1[i] -(data2[i] -data3[i]*pre2->exptime) < XSH_FLOAT_PRECISION,
00220 CPL_ERROR_ILLEGAL_OUTPUT,"Wrong data part");
00221 assure(errs1[i] - (sqrt(errs2[i]*errs2[i]+errs3[i]*errs3[i]*pre2->exptime*
00222 pre2->exptime)) <
00223 XSH_FLOAT_PRECISION,CPL_ERROR_ILLEGAL_OUTPUT,"Wrong errs part");
00224 assure(qual1[i] == (qual2[i] + qual3[i]),CPL_ERROR_ILLEGAL_OUTPUT,
00225 "Wrong qual part");
00226 }
00227 xsh_msg("subtract dark ok");
00228
00229 cleanup:
00230 xsh_free_frame( &frame);
00231 xsh_pre_free(&pre1);
00232 xsh_pre_free(&pre2);
00233 xsh_pre_free(&pre3);
00234 xsh_instrument_free(&instrument);
00235 xsh_free_frameset(&set);
00236 xsh_free_frame(&temp);
00237
00238 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00239 xsh_error_dump(CPL_MSG_ERROR);
00240 ret=1;
00241 }
00242 TEST_END();
00243 return ret;
00244 }
00245