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
00037
00040
00041
00042
00043
00044 #include <math.h>
00045 #include <xsh_drl.h>
00046
00047 #include <xsh_utils_table.h>
00048 #include <xsh_badpixelmap.h>
00049 #include <xsh_data_pre.h>
00050 #include <xsh_dfs.h>
00051 #include <xsh_pfits.h>
00052 #include <xsh_error.h>
00053 #include <xsh_msg.h>
00054 #include <xsh_fit.h>
00055 #include <xsh_data_instrument.h>
00056 #include <xsh_data_localization.h>
00057 #include <xsh_data_spectrum.h>
00058 #include <xsh_data_slice_offset.h>
00059 #include <xsh_data_rec.h>
00060 #include <xsh_ifu_defs.h>
00061
00062 #include <cpl.h>
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 cpl_frame* xsh_compute_slice_dist( cpl_frameset *loc_frame_set,
00073 cpl_frame *order_tab_frame, cpl_frame *slitmap_frame,
00074 cpl_frameset *rec_frameset,
00075 double slicedist_lambda,
00076 xsh_instrument *instrument)
00077 {
00078 cpl_frame * result = NULL ;
00079 cpl_frame *loc_frame = NULL;
00080 cpl_frame *rec_frame = NULL;
00081 xsh_slice_offset *slice = NULL ;
00082 xsh_localization *loc_down = NULL, *loc_cen = NULL, *loc_up = NULL;
00083 char fname[256];
00084 double slit_down, slit_cen, slit_up;
00085 double sdown, sldown, slup, sup;
00086 double dist_up, dist_down;
00087 double lambda;
00088
00089 xsh_rec_list *reclist = NULL;
00090
00091 XSH_ASSURE_NOT_NULL( loc_frame_set);
00092 XSH_ASSURE_NOT_NULL( rec_frameset);
00093 XSH_ASSURE_NOT_NULL( instrument);
00094
00095 xsh_msg( "Get Localization table for slitlet %s",
00096 SlitletName[LOWER_IFU_SLITLET] ) ;
00097 check( loc_frame = cpl_frameset_get_frame( loc_frame_set, 0));
00098 xsh_msg( " '%s'", cpl_frame_get_filename( loc_frame ) ) ;
00099 check( loc_down = xsh_localization_load( loc_frame));
00100
00101 xsh_msg( "Get Localization table for slitlet %s",
00102 SlitletName[CENTER_IFU_SLITLET] ) ;
00103 check( loc_frame = cpl_frameset_get_frame( loc_frame_set, 1));
00104 xsh_msg( " '%s'", cpl_frame_get_filename( loc_frame ) ) ;
00105 check( loc_cen = xsh_localization_load( loc_frame));
00106
00107 xsh_msg( "Get Localization table for slitlet %s",
00108 SlitletName[UPPER_IFU_SLITLET] ) ;
00109 check( loc_frame = cpl_frameset_get_frame( loc_frame_set, 2));
00110 xsh_msg( " '%s'", cpl_frame_get_filename( loc_frame ));
00111 check( loc_up = xsh_localization_load( loc_frame));
00112
00113 check( rec_frame = cpl_frameset_get_frame( rec_frameset, 0));
00114 check( reclist = xsh_rec_list_load( rec_frame, instrument));
00115
00116 check( slice = xsh_slice_offset_create());
00117
00118 if ( slicedist_lambda < 0){
00119 check( lambda = xsh_rec_list_get_lambda_max( reclist));
00120 }
00121 else{
00122 lambda = slicedist_lambda;
00123 }
00124 xsh_msg(" Evaluate at lambda %f", lambda);
00125 check( slit_down = cpl_polynomial_eval_1d(loc_down->cenpoly,
00126 lambda, NULL));
00127 check( slit_cen = cpl_polynomial_eval_1d(loc_cen->cenpoly,
00128 lambda, NULL));
00129 check( slit_up = cpl_polynomial_eval_1d(loc_up->cenpoly,
00130 lambda, NULL));
00131
00132 xsh_msg("SLIT center from localization [%f,%f,%f]", slit_down, slit_cen,
00133 slit_up);
00134
00135 check( xsh_get_slit_edges(
00136 slitmap_frame, &sdown, &sldown, &slup, &sup, instrument));
00137
00138 xsh_msg("EDGES form order tab [%f,[%f %f],%f]",sdown, sldown,
00139 slup, sup);
00140
00141 dist_up = 2*slup-slit_cen-slit_up;
00142 dist_down = 2*sldown-slit_cen-slit_down;
00143 xsh_msg("DISTANCES edgU-->Up = %f edgU-->cen %f ==> %f", slup-slit_up,
00144 slup-slit_cen, dist_up);
00145 xsh_msg("DISTANCES edgD-->Down = %f edgD-->cen %f ==> %f", sldown-slit_down,
00146 sldown-slit_cen, dist_down);
00147
00148 slice->cen_up = dist_up;
00149 slice->cen_down = dist_down;
00150
00151 sprintf( fname, "SLICE_OFFSET_%s.fits",
00152 xsh_instrument_arm_tostring( instrument));
00153 check( result = xsh_slice_offset_save( slice, fname, instrument));
00154
00155 cleanup:
00156 xsh_localization_free( &loc_down);
00157 xsh_localization_free( &loc_cen);
00158 xsh_localization_free( &loc_up);
00159 xsh_slice_offset_free( &slice);
00160 xsh_rec_list_free( &reclist);
00161
00162 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00163 xsh_free_frame( &result);
00164 }
00165 return result;
00166 }
00167
00168
00169
00182 cpl_frame* xsh_compute_shift_ifu_slitlet( double lambda_ref, cpl_frame *objpos_frame,
00183 cpl_frame *shiftifu_frame, double lambdaref_hsize, const char* resname)
00184 {
00185 cpl_frame *result = NULL;
00186 const char *objpos_name = NULL;
00187 cpl_table *objpos_tab = NULL;
00188 double *wave_pos_data = NULL;
00189 double *slit_pos_data = NULL;
00190 int pos_size;
00191 double slitref=0;
00192 cpl_table *res_tab = NULL;
00193 int i;
00194 char tablename[256];
00195 cpl_propertylist *header = NULL;
00196
00197 const char *shiftifu_name = NULL;
00198 cpl_table *shiftifu_tab = NULL;
00199
00200 double *slit_shiftifu_data = NULL;
00201 int shiftifu_size;
00202 cpl_vector *median_slitref_vect = NULL;
00203 double lambda=0;
00204 int istart, iend;
00205 int median_slitref_size = 0;
00206
00207 XSH_ASSURE_NOT_NULL( objpos_frame);
00208 XSH_ASSURE_NOT_ILLEGAL( lambdaref_hsize >= 0);
00209
00210
00211 check( objpos_name = cpl_frame_get_filename( objpos_frame));
00212 XSH_TABLE_LOAD( objpos_tab, objpos_name);
00213
00214 check( wave_pos_data = cpl_table_get_data_double( objpos_tab,
00215 XSH_OBJPOS_COLNAME_WAVELENGTH));
00216 check( slit_pos_data = cpl_table_get_data_double( objpos_tab,
00217 XSH_OBJPOS_COLNAME_SLIT));
00218
00219 pos_size = cpl_table_get_nrow( objpos_tab);
00220
00221 istart=0;
00222
00223 while( lambda <= (lambda_ref-lambdaref_hsize) && istart< pos_size){
00224 lambda = wave_pos_data[istart];
00225 istart++;
00226 }
00227 iend = istart;
00228
00229 while( lambda <= (lambda_ref+lambdaref_hsize) && iend< pos_size){
00230 lambda = wave_pos_data[iend];
00231 iend++;
00232 }
00233 median_slitref_size = iend-istart+1;
00234
00235 median_slitref_vect = cpl_vector_new( median_slitref_size);
00236
00237 for(i=istart; i<=iend; i++){
00238 double resslit = slit_pos_data[i];
00239
00240 cpl_vector_set( median_slitref_vect, i-istart, resslit);
00241 }
00242
00243
00244
00245 slitref = xsh_data_interpolate( lambda_ref, pos_size,
00246 wave_pos_data, slit_pos_data);
00247
00248 xsh_msg_dbg_low("Old reference wavelength %f slit %f",
00249 lambda_ref, slitref);
00250
00251 slitref = cpl_vector_get_median( median_slitref_vect);
00252
00253 xsh_msg_dbg_low("New reference wavelength %f slit %f",
00254 lambda_ref, slitref);
00255
00256 check( res_tab = cpl_table_new( pos_size));
00257 XSH_TABLE_NEW_COL( res_tab, XSH_SHIFTIFU_COLNAME_WAVELENGTH,
00258 XSH_SHIFTIFU_UNIT_WAVELENGTH, CPL_TYPE_DOUBLE);
00259 XSH_TABLE_NEW_COL( res_tab, XSH_SHIFTIFU_COLNAME_SHIFTSLIT,
00260 XSH_SHIFTIFU_UNIT_SHIFTSLIT, CPL_TYPE_DOUBLE);
00261
00262
00263 if ( shiftifu_frame != NULL){
00264 check( shiftifu_name = cpl_frame_get_filename( shiftifu_frame));
00265 XSH_TABLE_LOAD( shiftifu_tab, shiftifu_name);
00266
00267
00268
00269
00270 check( slit_shiftifu_data = cpl_table_get_data_double( shiftifu_tab,
00271 XSH_SHIFTIFU_COLNAME_SHIFTSLIT));
00272 shiftifu_size = cpl_table_get_nrow( shiftifu_tab);
00273 XSH_ASSURE_NOT_ILLEGAL( pos_size == shiftifu_size);
00274 for( i=0; i< pos_size; i++){
00275 double reswave, resslit;
00276
00277 reswave = wave_pos_data[i];
00278 resslit = slit_pos_data[i]-slitref+slit_shiftifu_data[i];
00279
00280 check( cpl_table_set_double( res_tab, XSH_SHIFTIFU_COLNAME_WAVELENGTH,
00281 i, reswave));
00282 check( cpl_table_set_double( res_tab, XSH_SHIFTIFU_COLNAME_SHIFTSLIT,
00283 i, resslit));
00284 }
00285 }
00286 else{
00287 for( i=0; i< pos_size; i++){
00288 double reswave, resslit;
00289
00290 reswave = wave_pos_data[i];
00291 resslit = slit_pos_data[i]-slitref;
00292 check( cpl_table_set_double( res_tab, XSH_SHIFTIFU_COLNAME_WAVELENGTH,
00293 i, reswave));
00294 check( cpl_table_set_double( res_tab, XSH_SHIFTIFU_COLNAME_SHIFTSLIT,
00295 i, resslit));
00296 }
00297 }
00298
00299 sprintf( tablename, resname);
00300 header = cpl_propertylist_new();
00301
00302 check( xsh_pfits_set_shiftifu_lambdaref( header, lambda_ref));
00303 check( xsh_pfits_set_shiftifu_slitref( header, slitref));
00304
00305
00306 check( cpl_table_save( res_tab, header, NULL, tablename, CPL_IO_DEFAULT));
00307
00308
00309 check(result=xsh_frame_product( tablename,
00310 "OFFSET_TAB",
00311 CPL_FRAME_TYPE_TABLE,
00312 CPL_FRAME_GROUP_PRODUCT,
00313 CPL_FRAME_LEVEL_TEMPORARY));
00314 check (xsh_add_temporary_file( tablename));
00315
00316 cleanup:
00317 xsh_free_propertylist( &header);
00318 XSH_TABLE_FREE( shiftifu_tab);
00319 XSH_TABLE_FREE( res_tab);
00320 XSH_TABLE_FREE( objpos_tab);
00321 xsh_free_vector( &median_slitref_vect);
00322 return result;
00323 }
00324
00325
00326
00345 cpl_frameset* xsh_compute_shift_ifu( double lambda_ref, double lambdaref_hsize,
00346 cpl_frameset *objpos_frameset,
00347 cpl_frameset *shiftifu_frameset, xsh_instrument* instrument, const char* prefix)
00348 {
00349 int i, slitlet;
00350 cpl_frameset *result_frameset = NULL;
00351 char fname[256];
00352
00353 XSH_ASSURE_NOT_NULL( objpos_frameset);
00354 XSH_ASSURE_NOT_NULL( instrument);
00355
00356 check( result_frameset = cpl_frameset_new());
00357
00358 for( i = 0, slitlet = LOWER_IFU_SLITLET ; i < 3 ; i++, slitlet++ ) {
00359 cpl_frame *comp_shift_frame = NULL;
00360 cpl_frame *objpos_frame = NULL;
00361 cpl_frame *shift_frame = NULL;
00362 char tag[256];
00363
00364 sprintf( fname ,"%s_SHIFTIFU_%s_%s.fits", prefix, SlitletName[slitlet],
00365 xsh_instrument_arm_tostring( instrument));
00366
00367 xsh_msg( "Compute IFU shift for slitlet %s, frame '%s'",
00368 SlitletName[slitlet], fname);
00369
00370 check( objpos_frame = cpl_frameset_get_frame( objpos_frameset, i));
00371
00372 if ( shiftifu_frameset != NULL){
00373 check( shift_frame = cpl_frameset_get_frame( shiftifu_frameset, i));
00374 }
00375 check( comp_shift_frame = xsh_compute_shift_ifu_slitlet( lambda_ref,
00376 objpos_frame, shift_frame, lambdaref_hsize, fname));
00377
00378 sprintf( tag, "OFFSET_TAB_%s_IFU_%s", SlitletName[slitlet],
00379 xsh_instrument_arm_tostring( instrument));
00380 check( cpl_frame_set_tag( comp_shift_frame, tag));
00381 check( cpl_frameset_insert( result_frameset, comp_shift_frame));
00382 }
00383
00384 cleanup:
00385 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00386 xsh_free_frameset( &result_frameset);
00387 }
00388 return result_frameset;
00389 }