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_badpixelmap.h>
00048 #include <xsh_data_instrument.h>
00049 #include <xsh_dfs.h>
00050 #include <xsh_pfits.h>
00051 #include <tests.h>
00052
00053 #include <cpl.h>
00054 #include <math.h>
00055
00056
00057
00058
00059 #define MODULE_ID "XSH_DATA_PRE"
00060
00061 #define SYNTAX "Test the pre frame\n"\
00062 "use : ./test_xsh_data_pre PRE \n"\
00063 "PRE => the pre frame\n"
00064
00065
00072
00073 int main( int argc, char** argv)
00074 {
00075 int ret = 0;
00076 xsh_instrument * instrument = NULL ;
00077 char *pre_name = NULL;
00078 cpl_frame *pre_frame = NULL;
00079 xsh_pre *pre = NULL;
00080
00081 cpl_propertylist* header = NULL;
00082 int naxis1;
00083 cpl_image *errs_img = NULL;
00084 cpl_image* qual_img = NULL;
00085 float *errs = NULL;
00086 int *qual = NULL;
00087 FILE* pre_file = NULL;
00088 int i, j;
00089 double data_mean=0.0, data_stdev=0.0, data_median=0.0;
00090 int binx;
00091
00092
00093 TESTS_INIT( MODULE_ID);
00094 cpl_msg_set_level( CPL_MSG_DEBUG);
00095 xsh_debug_level_set( XSH_DEBUG_LEVEL_MEDIUM) ;
00096
00097
00098 if (argc > 1){
00099 pre_name = argv[1];
00100 }
00101 else{
00102 printf(SYNTAX);
00103 TEST_END();
00104 return 0;
00105 }
00106
00107 XSH_ASSURE_NOT_NULL( pre_name);
00108 check (header = cpl_propertylist_load( pre_name, 0));
00109 check ( naxis1 = xsh_pfits_get_naxis1( header));
00110 check ( binx = xsh_pfits_get_binx( header));
00111
00112
00113 instrument = xsh_instrument_new() ;
00114 xsh_instrument_set_mode( instrument, XSH_MODE_IFU);
00115 if ( naxis1 == (2048/binx) ){
00116 xsh_instrument_set_arm( instrument, XSH_ARM_UVB);
00117 }
00118 else if (naxis1 == (2044/binx) ){
00119 xsh_instrument_set_arm( instrument, XSH_ARM_VIS);
00120 }
00121 else if (naxis1 == (1024/binx) ){
00122 xsh_instrument_set_arm( instrument, XSH_ARM_NIR);
00123 }
00124 else{
00125 xsh_msg(" Invalid naxis1 size %d", naxis1);
00126 XSH_ASSURE_NOT_NULL( pre);
00127 }
00128 xsh_instrument_set_lamp( instrument, XSH_LAMP_QTH ) ;
00129
00130
00131 pre_frame = cpl_frame_new();
00132 cpl_frame_set_filename( pre_frame, pre_name) ;
00133 cpl_frame_set_level( pre_frame, CPL_FRAME_LEVEL_TEMPORARY);
00134 cpl_frame_set_group( pre_frame, CPL_FRAME_GROUP_RAW );
00135 cpl_frame_set_tag( pre_frame, "BIAS_UVB");
00136
00137 check( pre = xsh_pre_load( pre_frame, instrument));
00138
00139 {
00140 int a=0, b=0;
00141 xsh_pre_window_best_median_flux_pos( pre, 1598, 2720,
00142 3, 1, &a, &b);
00143 xsh_msg("find max at %d %d",a,b);
00144 }
00145 check( xsh_pre_median_mean_stdev( pre, &data_mean, &data_median, &data_stdev));
00146
00147 xsh_msg(" Statistics on DATA: median %f mean %f stdev %f",
00148 data_median, data_mean, data_stdev);
00149
00150 check( errs_img = xsh_pre_get_errs( pre));
00151 check( qual_img = xsh_pre_get_qual( pre));
00152 check ( errs = cpl_image_get_data_float( errs_img));
00153 check ( qual = cpl_image_get_data_int( qual_img));
00154 xsh_msg("Save order tab in BADPIXEL.reg");
00155 pre_file = fopen( "BADPIXEL.reg", "w");
00156 fprintf( pre_file, "# Region file format: DS9 version 4.0\n"\
00157 "global color=red font=\"helvetica 4 normal\""\
00158 "select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 "\
00159 "source\nimage\n");
00160 xsh_msg( "XSH_GOOD_PIXEL_LEVEL %d",XSH_GOOD_PIXEL_LEVEL);
00161 for(j=0; j< pre->ny; j++){
00162 for(i=0; i<pre->nx; i++){
00163 if ( qual[i+j*pre->nx] > XSH_GOOD_PIXEL_LEVEL){
00164 fprintf( pre_file, "point(%f,%f) #point=cross color=red font="\
00165 "\"helvetica 4 normal\"\n", i+1.0, j+1.0);
00166 }
00167 else if ( (qual[i+j*pre->nx] & 16) == 16){
00168 fprintf( pre_file, "point(%f,%f) #point=cross color=green font="\
00169 "\"helvetica 4 normal\"\n", i+1.0, j+1.0);
00170 }
00171 }
00172 }
00173 fclose( pre_file);
00174
00175 cleanup:
00176 xsh_free_frame( &pre_frame);
00177 xsh_pre_free( &pre);
00178 xsh_instrument_free( &instrument);
00179 xsh_free_propertylist( &header);
00180
00181 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00182 xsh_error_dump(CPL_MSG_ERROR);
00183 ret = 1;
00184 }
00185 TEST_END();
00186 return ret;
00187
00188 #if 0
00189
00190 frame = xsh_test_create_frame(dataname, nx, ny,
00191 XSH_LINEARITY_UVB,CPL_FRAME_GROUP_RAW, instrument);
00192
00193 check(pre1 = xsh_pre_create(frame,NULL,NULL, instrument));
00194 xsh_msg("Create PRE %s OK",dataname);
00195
00196
00197 check(preframe = xsh_pre_save(pre1,pre_name, "PRE_TAG",1 ));
00198 xsh_msg("Save PRE %s OK",pre_name);
00199
00200
00201 cpl_frame_set_tag(preframe,XSH_LINEARITY_UVB);
00202 cpl_frame_set_group(preframe,CPL_FRAME_GROUP_RAW);
00203
00204
00205 check(pre2 = xsh_pre_load(preframe,instrument));
00206 xsh_msg("Load PRE %s OK",dataname);
00207
00208
00209 check_msg(conad = xsh_pfits_get_conad(pre2->data_header),
00210 "Can't find conad in header");
00211 check_msg(ron = xsh_pfits_get_ron(pre2->data_header),
00212 "Can't find ron in header");
00213
00214 xsh_msg("Header PRE OK");
00215
00216
00217 assure(xsh_pre_get_nx(pre2) == nx,CPL_ERROR_ILLEGAL_OUTPUT,
00218 "wrong nx in PRE format");
00219 assure(xsh_pre_get_ny(pre2) == ny,CPL_ERROR_ILLEGAL_OUTPUT,
00220 "wrong ny in PRE format");
00221 assure(xsh_pre_get_group(pre2) == CPL_FRAME_GROUP_RAW,
00222 CPL_ERROR_ILLEGAL_OUTPUT,"wrong group in PRE format");
00223 assure(pre2->data != NULL,CPL_ERROR_ILLEGAL_OUTPUT,
00224 "PRE data is NULL");
00225 assure(pre2->errs != NULL,CPL_ERROR_ILLEGAL_OUTPUT,
00226 "PRE errs is NULL");
00227 assure(pre2->qual != NULL,CPL_ERROR_ILLEGAL_OUTPUT,
00228 "PRE qual is NULL");
00229
00230 xsh_msg("Format PRE OK");
00231
00232
00233 tdata = cpl_image_get_data_float(pre2->data);
00234 terrs = cpl_image_get_data_float(pre2->errs);
00235 for(i = 0; i < nx * ny; i++){
00236 assure((terrs[i] - sqrt(fabs(tdata[i])+ron*ron) < XSH_FLOAT_PRECISION),
00237 CPL_ERROR_ILLEGAL_OUTPUT,"WRONG errs part");
00238 }
00239 xsh_msg("Data PRE OK");
00240
00241
00242 pre3 = xsh_pre_duplicate(pre2);
00243 residual = xsh_pre_duplicate(pre2);
00244 check(xsh_pre_subtract(residual, pre3));
00245
00246 avg_residual = cpl_image_get_stdev(xsh_pre_get_data(residual));
00247 avg_err = cpl_image_get_stdev(xsh_pre_get_errs(residual));
00248
00249 xsh_msg("avg residual = %f ; avg uncertainty = %f",
00250 avg_residual, avg_err);
00251
00252 assure(avg_residual <= avg_err, CPL_ERROR_ILLEGAL_OUTPUT,
00253 "Residual is not zero");
00254
00255
00256
00257 tdata = cpl_image_get_data_float(residual->data);
00258 terrs = cpl_image_get_data_float(residual->errs);
00259 tqual = cpl_image_get_data_int(residual->qual);
00260 tdata1 = cpl_image_get_data_float(pre2->data);
00261 terrs1 = cpl_image_get_data_float(pre2->errs);
00262 tqual1 = cpl_image_get_data_int(pre2->qual);
00263 tdata2 = cpl_image_get_data_float(pre3->data);
00264 terrs2 = cpl_image_get_data_float(pre3->errs);
00265 tqual2 = cpl_image_get_data_int(pre3->qual);
00266 for (i = 0; i < nx * ny; i++) {
00267 assure(tdata[i] <= terrs[i],CPL_ERROR_ILLEGAL_OUTPUT,
00268 "Residual is non-zero at %d : ",i);
00269 assure(terrs[i] -(sqrt(pow(terrs1[i],2)+pow(terrs2[i],2))) <
00270 XSH_FLOAT_PRECISION,
00271 CPL_ERROR_ILLEGAL_OUTPUT,
00272 "Wrong errs at %d : ",i);
00273 assure(tqual[i] == (tqual1[i]+tqual2[i]),CPL_ERROR_ILLEGAL_OUTPUT,
00274 "Wrong qual part");
00275 }
00276 xsh_msg("subtract two PRE OK");
00277
00278
00279 check(addtest = xsh_pre_duplicate(pre2));
00280 check(xsh_pre_add(addtest, pre3));
00281 tdata = cpl_image_get_data_float(addtest->data);
00282 terrs = cpl_image_get_data_float(addtest->errs);
00283 tqual = cpl_image_get_data_int(addtest->qual);
00284 tdata1 = cpl_image_get_data_float(pre2->data);
00285 terrs1 = cpl_image_get_data_float(pre2->errs);
00286 tqual1 = cpl_image_get_data_int(pre2->qual);
00287 tdata2 = cpl_image_get_data_float(pre3->data);
00288 terrs2 = cpl_image_get_data_float(pre3->errs);
00289 tqual2 = cpl_image_get_data_int(pre3->qual);
00290
00291 for (i = 0; i < nx * ny; i++) {
00292 assure(tdata[i] -(tdata1[i]+tdata2[i]) < XSH_FLOAT_PRECISION,
00293 CPL_ERROR_ILLEGAL_OUTPUT,
00294 "Wrong data at %d : ",i);
00295 assure(terrs[i] -(sqrt(pow(terrs1[i],2)+pow(terrs2[i],2))) <
00296 XSH_FLOAT_PRECISION,
00297 CPL_ERROR_ILLEGAL_OUTPUT,
00298 "Wrong errs at %d : ",i);
00299 assure(tqual[i] == (tqual1[i]+tqual2[i]),CPL_ERROR_ILLEGAL_OUTPUT,
00300 "Wrong qual part");
00301 }
00302 xsh_msg("Add two PRE OK");
00303
00304 cleanup:
00305 xsh_instrument_free(&instrument);
00306 xsh_pre_free(&pre1);
00307 xsh_pre_free(&pre2);
00308 xsh_pre_free(&pre3);
00309 xsh_pre_free(&residual);
00310 xsh_pre_free(&addtest);
00311 xsh_free_frame(&frame);
00312 xsh_free_frame(&preframe);
00313
00314 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00315 xsh_error_dump(CPL_MSG_ERROR);
00316 return 1;
00317 } else {
00318 return 0;
00319 }
00320 #endif
00321 }
00322