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 #include <xsh_data_spectrum.h>
00053 #include <xsh_utils_table.h>
00054
00055 #include <xsh_drl.h>
00056 #include <xsh_pfits.h>
00057
00058 #include <xsh_badpixelmap.h>
00059
00060 #include <cpl.h>
00061 #include <math.h>
00062
00063 #include <getopt.h>
00064
00065
00066
00067
00068
00069 #define MODULE_ID "XSH_BUILD_CUBE"
00070
00071
00072
00073
00074 enum {
00075 SLITBIN_OPT, CENTER_IFU_OPT, DEBUG_OPT, HELP_OPT
00076 };
00077
00078 static struct option long_options[] = {
00079 {"slit-bin", required_argument, 0, SLITBIN_OPT},
00080 {"center-ifu", required_argument, 0, CENTER_IFU_OPT},
00081 {"debug", required_argument, 0, DEBUG_OPT},
00082 {"help", 0, 0, HELP_OPT},
00083 {0, 0, 0, 0}
00084 };
00085
00086 static void Help( void )
00087 {
00088 puts( "Unitary test of xsh_build_cube");
00089 puts( "Usage: test_xsh_build_cube [options] <sof>");
00090
00091 puts( "Options" ) ;
00092 puts( " --slit-bin=<n> : Binning on slit");
00093 puts( " --center-ifu=<n> : If n=1 center cube at 0 arcsec");
00094 puts( " --debug=<n> : Level of debug LOW | MEDIUM | HIGH [MEDIUM]" );
00095 puts( " --help : What you see" ) ;
00096 puts( "\nInput Files" ) ;
00097 puts( " 1. SOF [ORDER_TAB_EDGES_IFU_arm, OFFSET_TAB_DOWN_IFU_arm, OFFSET_TAB_CEN_IFU_arm, OFFSET_TAB_UP_IFU_arm]");
00098 TEST_END();
00099 exit(0);
00100 }
00101
00102 static void HandleOptions( int argc, char **argv, double *slit_bin, int *ifu_center)
00103 {
00104 int opt ;
00105 int option_index = 0;
00106 while (( opt = getopt_long (argc, argv, "debug:help",
00107 long_options, &option_index)) != EOF ){
00108
00109 switch ( opt ) {
00110 case SLITBIN_OPT:
00111 *slit_bin = atof(optarg);
00112 break;
00113 case CENTER_IFU_OPT:
00114 *ifu_center = atoi(optarg);
00115 break;
00116 case DEBUG_OPT:
00117 if ( strcmp( optarg, "LOW")==0){
00118 xsh_debug_level_set( XSH_DEBUG_LEVEL_LOW);
00119 }
00120 else if ( strcmp( optarg, "HIGH")==0){
00121 xsh_debug_level_set( XSH_DEBUG_LEVEL_HIGH);
00122 }
00123 break;
00124 case HELP_OPT:
00125 Help();
00126 break;
00127 default:
00128 break;
00129 }
00130 }
00131 return;
00132 }
00133
00134 static void create_gaussian_profile( int nslit, double slitmin, double slitcen,
00135 double slit_bin, double height, double sigma, double offset, const char* filename,
00136 cpl_vector **x_vect, cpl_vector **y_vect)
00137 {
00138 int i;
00139 FILE *file = NULL;
00140
00141 XSH_ASSURE_NOT_NULL( x_vect);
00142 XSH_ASSURE_NOT_NULL( y_vect);
00143
00144 *x_vect = cpl_vector_new( nslit);
00145 *y_vect = cpl_vector_new( nslit);
00146
00147
00148 for(i=0; i<nslit; i++){
00149 double s,z,val;
00150 s = slitmin+i*slit_bin;
00151 z = (s-slitcen)/(sigma*XSH_MATH_SQRT_2);
00152 val = height*exp(-(z*z))+offset;
00153 cpl_vector_set( *x_vect, i, s);
00154 cpl_vector_set( *y_vect, i, val);
00155 }
00156
00157 file = fopen( filename, "w+");
00158 fprintf( file, "#i j x y\n");
00159
00160 for( i=0; i<nslit; i++){
00161 double x, y;
00162
00163 x = cpl_vector_get( *x_vect, i);
00164 y = cpl_vector_get( *y_vect, i);
00165 fprintf( file, "%d %d %f %f\n", i,nslit-1-i, x, y);
00166 }
00167 fclose( file);
00168
00169 cleanup:
00170 if (cpl_error_get_code() != CPL_ERROR_NONE){
00171 xsh_free_vector( x_vect);
00172 xsh_free_vector( y_vect);
00173 }
00174 return;
00175 }
00183 int main( int argc, char **argv)
00184 {
00185
00186 int ret = 0 ;
00187
00188 xsh_instrument* instrument = NULL;
00189
00190 const char *sof_name = NULL;
00191 cpl_frameset *set = NULL;
00192 cpl_frame *slitmap_frame = NULL;
00193 cpl_frameset *offsettab_frameset = NULL;
00194 int i, size;
00195 double sdown=0, sup=0, sldown=0, slup=0;
00196 double slit_bin = 0.15;
00197 double slitmin_tab[3];
00198 int nslit_tab[3];
00199 double slitcen_tab[3];
00200 double sigma = 1, height = 1, offset=0;
00201 cpl_vector *downx_vect = NULL;
00202 cpl_vector *downy_vect = NULL;
00203 cpl_vector *cenx_vect = NULL;
00204 cpl_vector *ceny_vect = NULL;
00205 cpl_vector *upx_vect = NULL;
00206 cpl_vector *upy_vect = NULL;
00207 cpl_vector *yvect_tab[3];
00208 double lmin=100, lmax=105, lstep=1;
00209 xsh_spectrum *spectrum = NULL;
00210 double smin, smax, sstep;
00211 double *flux = NULL;
00212 int s,l, k, sizes, sizel;
00213 cpl_frameset *merge2d_frameset = NULL;
00214 cpl_frame *cube_frame = NULL;
00215 int ifu_center = 0;
00216
00217
00218 TESTS_INIT(MODULE_ID);
00219 cpl_msg_set_level(CPL_MSG_DEBUG);
00220 xsh_debug_level_set(XSH_DEBUG_LEVEL_MEDIUM);
00221
00222 HandleOptions( argc, argv, &slit_bin, &ifu_center);
00223
00224 if ( (argc - optind) >=1 ) {
00225 sof_name = argv[optind];
00226 }
00227 else {
00228 Help();
00229 exit(0);
00230 }
00231
00232
00233 check( set = sof_to_frameset( sof_name));
00234
00235 check( instrument = xsh_dfs_set_groups( set));
00236 check( slitmap_frame = xsh_find_slitmap( set, instrument));
00237 check( offsettab_frameset = xsh_find_offset_tab_ifu( set, instrument));
00238
00239 size = cpl_frameset_get_size( offsettab_frameset);
00240
00241 xsh_msg( "Slit binning : %f", slit_bin);
00242 xsh_msg( "Ifu center : %d", ifu_center);
00243 xsh_msg( "Slit map : %s" , cpl_frame_get_filename( slitmap_frame));
00244 for( i=0; i< size; i++){
00245 cpl_frame *offsettab_frame = NULL;
00246
00247 offsettab_frame = cpl_frameset_get_frame( offsettab_frameset, i);
00248 xsh_msg( "Offset tab %s %s", cpl_frame_get_filename( offsettab_frame),
00249 cpl_frame_get_tag( offsettab_frame));
00250 }
00251
00252 xsh_get_slit_edges( slitmap_frame, &sdown, &sup, &sldown, &slup, instrument);
00253
00254 xsh_msg("Estimate by FLAT slitlets");
00255 xsh_msg("DOWN %f --> %f", sdown, sldown);
00256 xsh_msg("CEN %f --> %f", sldown, slup);
00257 xsh_msg("UP %f --> %f", slup, sup);
00258
00259 xsh_compute_slitlet_limits( offsettab_frameset, sdown,
00260 sldown, slup, sup, slit_bin, slitmin_tab, nslit_tab, slitcen_tab);
00261
00262 sigma = (nslit_tab[0]/10)*slit_bin;
00263 height = 10*sigma;
00264 offset = 0;
00265
00266 create_gaussian_profile( nslit_tab[0], slitmin_tab[0], slitcen_tab[0],
00267 slit_bin, height, sigma, offset, "gauss_down.dat", &downx_vect,
00268 &downy_vect);
00269 yvect_tab[0] = downy_vect;
00270 create_gaussian_profile( nslit_tab[1], slitmin_tab[1], slitcen_tab[1],
00271 slit_bin, height, sigma, offset, "gauss_cen.dat", &cenx_vect,
00272 &ceny_vect);
00273 yvect_tab[1] = ceny_vect;
00274 create_gaussian_profile( nslit_tab[2], slitmin_tab[2], slitcen_tab[2],
00275 slit_bin, height, sigma, offset, "gauss_up.dat", &upx_vect,
00276 &upy_vect);
00277 yvect_tab[2] = upy_vect;
00278
00279
00280 merge2d_frameset = cpl_frameset_new();
00281
00282 for( k=0; k<3; k++){
00283 char mergename[256];
00284 cpl_frame *frame = NULL;
00285
00286 smin = slitmin_tab[k];
00287 sstep = slit_bin;
00288 smax = slitmin_tab[k]+(nslit_tab[k]-1)*slit_bin;
00289
00290 check( spectrum = xsh_spectrum_2D_create( lmin, lmax, lstep,
00291 smin, smax, sstep));
00292 check( flux = xsh_spectrum_get_flux( spectrum));
00293 check( sizel = xsh_spectrum_get_size_lambda( spectrum));
00294 check( sizes = xsh_spectrum_get_size_slit( spectrum));
00295 for( s=0; s< sizes; s++){
00296 for( l=0; l<sizel; l++){
00297 flux[l+s*sizel] = cpl_vector_get( yvect_tab[k], s);
00298 }
00299 }
00300 sprintf( mergename, "merge2d_%d.fits", k);
00301
00302 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO DET OUT1 RON", 10));
00303 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO DET OUT1 CONAD", 10));
00304 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO DET OUT1 GAIN", 10));
00305 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO DET CHIP1 PSZX", 10));
00306 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO DET CHIP1 PSZY", 10));
00307
00308 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO PRO RECT LAMBDA MIN", lmin));
00309 check( cpl_propertylist_update_double( spectrum->flux_header, "ESO PRO RECT LAMBDA MAX", lmax));
00310 check( cpl_propertylist_update_double( spectrum->flux_header,"ESO PRO RECT BIN LAMBDA", lstep));
00311
00312
00313 frame = xsh_spectrum_save( spectrum, mergename,
00314 "MERGE_2D");
00315 cpl_frame_set_tag( frame, "MERGE_2D");
00316 xsh_spectrum_free( &spectrum);
00317 cpl_frameset_insert( merge2d_frameset, frame);
00318 }
00319
00320 check( cube_frame = xsh_cube( merge2d_frameset, instrument,
00321 "TEST"));
00322
00323 cleanup:
00324 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00325 xsh_error_dump(CPL_MSG_ERROR);
00326 ret = 1;
00327 }
00328 xsh_free_frame( &cube_frame);
00329 xsh_free_frameset( &merge2d_frameset);
00330 xsh_free_frameset( &set);
00331 xsh_instrument_free( &instrument);
00332 TEST_END();
00333 return ret;
00334 }