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_rec.h>
00058 #include <xsh_ifu_defs.h>
00059
00060 #include <cpl.h>
00061
00062
00063
00064
00065
00066
00067
00068
00088 static cpl_frame *
00089 xsh_extract_with_tag( cpl_frame * rec_frame,
00090 cpl_frame* loc_frame,
00091 xsh_instrument* instrument,
00092 xsh_extract_param* extract_par ,
00093 const char * tag,
00094 cpl_frame** res_frame_ext )
00095 {
00096 cpl_frame *res_frame = NULL;
00097 xsh_localization *loc_list = NULL;
00098 xsh_rec_list *rec_list = NULL, *result_list = NULL;
00099 int i = 0;
00100 double slit_step = 0.0;
00101 char * fname = NULL ;
00102 char * fname_drl = NULL ;
00103 char * tag_drl = NULL ;
00104 double slit_ext_min=0;
00105 double slit_ext_max=0;
00106 cpl_propertylist* plist=NULL;
00107 const char* name=NULL;
00108
00109 XSH_ASSURE_NOT_NULL( rec_frame);
00110
00111 xsh_msg_dbg_medium( "Entering xsh_extract_with_tag(%s)", tag ) ;
00112 xsh_msg_dbg_medium( "Parameters");
00113 xsh_msg_dbg_medium( " method %s", EXTRACT_METHOD_PRINT(extract_par->method));
00114
00115 if(extract_par->method == NOD_METHOD) {
00116 name=cpl_frame_get_filename(rec_frame);
00117 plist=cpl_propertylist_load(name,0);
00118 slit_ext_min=xsh_pfits_get_extract_slit_min(plist);
00119 slit_ext_max=xsh_pfits_get_extract_slit_max(plist)-2;
00120 xsh_free_propertylist(&plist);
00121 }
00122
00123 check( rec_list = xsh_rec_list_load( rec_frame, instrument));
00124 check( slit_step = xsh_pfits_get_rectify_bin_space( rec_list->header));
00125
00126
00127 if ((extract_par->method != FULL_METHOD) &&
00128 (extract_par->method != NOD_METHOD) ){
00129 XSH_ASSURE_NOT_NULL( loc_frame);
00130 check( loc_list = xsh_localization_load( loc_frame));
00131 }
00132 check (result_list = xsh_rec_list_create_with_size( rec_list->size,
00133 instrument));
00134
00135 for ( i=0; i< rec_list->size; i++) {
00136 int order = xsh_rec_list_get_order( rec_list, i);
00137 int nslit = xsh_rec_list_get_nslit( rec_list, i);
00138 int nlambda = xsh_rec_list_get_nlambda( rec_list, i);
00139 float* slit = xsh_rec_list_get_slit( rec_list, i);
00140 double* lambda = xsh_rec_list_get_lambda( rec_list, i);
00141 float slitmin = slit[0];
00142 float slitmax = slit[nslit-1];
00143 double lambdamin = lambda[0];
00144 double lambdamax = lambda[nlambda-1];
00145 float *flux = xsh_rec_list_get_data1( rec_list, i);
00146 float *errs = xsh_rec_list_get_errs1( rec_list, i);
00147 int *qual = xsh_rec_list_get_qual1( rec_list, i);
00148 int ilambda, islit;
00149
00150 double *res_lambda = NULL;
00151 float *res_flux = NULL, *res_errs = NULL;
00152 int *res_qual = NULL;
00153
00154
00155 xsh_msg_dbg_medium("order %d nslit %d (%f,%f) nlambda %d (%f %f)",order, nslit,
00156 slitmin, slitmax, nlambda, lambdamin, lambdamax);
00157
00158 check( xsh_rec_list_set_data_size( result_list, i, order, nlambda,
00159 1));
00160
00161 check( res_lambda = xsh_rec_list_get_lambda( result_list, i));
00162 check( res_flux = xsh_rec_list_get_data1( result_list, i));
00163 check( res_errs = xsh_rec_list_get_errs1( result_list, i));
00164 check( res_qual = xsh_rec_list_get_qual1( result_list, i));
00165
00166 for( ilambda=0; ilambda< nlambda; ilambda++){
00167 double slit_lo = 0.0, slit_up = 0.0;
00168 double ypix_low, ypix_up;
00169
00170 int ylow = 0,yup = 0;
00171 double y_frac_low, y_frac_up;
00172 double fluxval=0.0;
00173 double errval=0.0;
00174 int qualval = QFLAG_GOOD_PIXEL;
00175 int idx;
00176
00177 if ( extract_par->method == LOCALIZATION_METHOD){
00178 check( slit_lo = cpl_polynomial_eval_1d( loc_list->edglopoly,
00179 lambda[ilambda], NULL));
00180 check( slit_up = cpl_polynomial_eval_1d( loc_list->edguppoly,
00181 lambda[ilambda], NULL));
00182
00183 xsh_msg_dbg_medium("LOCALIZATION_METHOD get poly ok lambda %f slit_lo %f slit_up %f",lambda[ilambda], slit_lo, slit_up);
00184
00185 ypix_low = (slit_lo-slit[0])/slit_step;
00186 ypix_up = (slit_up-slit[0])/slit_step;
00187
00188 if (ypix_low < 0.0){
00189 xsh_msg("WARNING : localization give low pixel \
00190 outside of image : fix it to zero");
00191 ypix_low = 0.0;
00192 }
00193 if (ypix_up >= nslit){
00194 xsh_msg("WARNING : localization give up pixel \
00195 outside of image : fix it to %d", nslit-1);
00196 ypix_up = nslit-1;
00197 }
00198 xsh_msg_dbg_medium("ypix_low %f ypix_up %f",ypix_low, ypix_up);
00199 ylow = (int) (ypix_low);
00200 yup = (int) (ypix_up);
00201
00202 y_frac_up = ypix_up-yup;
00203 y_frac_low = 1-(ypix_low-ylow);
00204
00205 xsh_msg_dbg_medium("ylow %d yup %d", ylow,yup);
00206
00207 for(islit = ylow+1; islit < yup; islit++){
00208 idx = islit*nlambda+ilambda;
00209 fluxval += flux[idx];
00210 errval += pow(errs[idx],2);
00211 qualval |= qual[idx];
00212 }
00213
00214 idx = ylow*nlambda+ilambda;
00215 if ( idx >= (nlambda*nslit) ) {
00216 xsh_msg_dbg_high( "Index Out of Image: %d >= %d (ylow: %d, ilambda: %d)",
00217 idx, nlambda*nslit, ylow, ilambda ) ;
00218 continue ;
00219 }
00220 fluxval+=y_frac_low*flux[idx];
00221 errval += y_frac_low*pow(errs[idx],2);
00222 qualval |= qual[idx];
00223
00224
00225 if (yup < nslit){
00226 idx = yup*nlambda+ilambda;
00227 fluxval+=y_frac_up*flux[idx];
00228 errval += y_frac_up*pow(errs[idx],2);
00229 qualval |= qual[idx];
00230 }
00231 }
00232 else if ( extract_par->method == FULL_METHOD){
00233
00234 for(islit = 0; islit < nslit; islit++){
00235 idx = islit*nlambda+ilambda;
00236 fluxval += flux[idx];
00237 errval += pow(errs[idx],2);
00238 qualval |= qual[idx];
00239 }
00240 }
00241 else if ( extract_par->method == NOD_METHOD){
00242
00243
00244
00245
00246 ylow = (slit_ext_min-slit[0])/slit_step;
00247 yup = (slit_ext_max-slit[0])/slit_step;
00248
00249 ylow = slit_ext_min;
00250 yup = slit_ext_max;
00251
00252
00253
00254 for(islit = ylow; islit <= yup; islit++){
00255 idx = islit*nlambda+ilambda;
00256 fluxval += flux[idx];
00257 errval += pow(errs[idx],2);
00258 qualval |= qual[idx];
00259 }
00260
00261 }
00262 res_lambda[ilambda] = lambda[ilambda];
00263 res_flux[ilambda] = fluxval;
00264 res_errs[ilambda] = sqrt(errval);
00265 res_qual[ilambda] = qualval;
00266 }
00267 }
00268
00269 check( cpl_propertylist_append ( result_list->header, rec_list->header));
00270 check( xsh_pfits_set_pcatg( result_list->header, tag));
00271 fname = xsh_stringcat_any( tag, ".fits", NULL ) ;
00272 tag_drl = xsh_stringcat_any( tag, "_DRL", NULL ) ;
00273 fname_drl = xsh_stringcat_any( tag_drl, ".fits", NULL ) ;
00274
00275
00276 check( *res_frame_ext= xsh_rec_list_save2( result_list,fname, tag));
00277 check( res_frame = xsh_rec_list_save( result_list, fname_drl, tag_drl,0));
00278
00279 xsh_msg_dbg_medium("%s created", fname );
00280
00281 cleanup:
00282 xsh_rec_list_free( &result_list);
00283 xsh_rec_list_free( &rec_list ) ;
00284 xsh_localization_free( &loc_list ) ;
00285
00286 XSH_FREE( tag_drl);
00287 XSH_FREE( fname_drl);
00288 XSH_FREE( fname);
00289
00290 return res_frame ;
00291 }
00292
00304 cpl_frame*
00305 xsh_extract (cpl_frame * rec_frame,
00306 cpl_frame* loc_frame,
00307 xsh_instrument* instrument,
00308 xsh_extract_param* extract_par,
00309 cpl_frame** res_frame_ext,
00310 const char* rec_prefix )
00311 {
00312 cpl_frame *res_frame = NULL;
00313 char tag[80];
00314
00315
00316 sprintf(tag,"%s_%s", rec_prefix,
00317 XSH_GET_TAG_FROM_ARM( XSH_ORDER1D, instrument));
00318
00319 check( res_frame = xsh_extract_with_tag( rec_frame, loc_frame, instrument,
00320 extract_par, tag,res_frame_ext ) ) ;
00321
00322 cleanup:
00323 return res_frame ;
00324 }
00325
00336 cpl_frameset * xsh_extract_ifu( cpl_frameset * rec_frameset,
00337 cpl_frameset * loc_frameset,
00338 xsh_instrument* instrument,
00339 xsh_extract_param * extract_par,
00340 const char* rec_prefix)
00341 {
00342 cpl_frameset * result_set = NULL ;
00343 int slitlet ;
00344 int i ;
00345
00346 xsh_msg( " Entering xsh_extract_ifu" ) ;
00347 XSH_ASSURE_NOT_NULL( rec_frameset ) ;
00348
00349 XSH_ASSURE_NOT_NULL( instrument ) ;
00350 XSH_ASSURE_NOT_NULL( extract_par ) ;
00351
00352 check( result_set = cpl_frameset_new() ) ;
00353
00354
00355 for( i = 0, slitlet = LOWER_IFU_SLITLET ; slitlet <= UPPER_IFU_SLITLET ;
00356 slitlet++, i++ ) {
00357 cpl_frame * loc_frame = NULL ;
00358 cpl_frame * rec_frame = NULL ;
00359 cpl_frame * ext_frame = NULL ;
00360 cpl_frame * ext_frame_eso = NULL ;
00361 char tag[80];
00362 const char * tag_suf = NULL ;
00363
00364 switch ( slitlet ) {
00365 case LOWER_IFU_SLITLET:
00366 tag_suf = XSH_GET_TAG_FROM_ARM( XSH_ORDER1D_DOWN_IFU,
00367 instrument);
00368 break ;
00369 case CENTER_IFU_SLITLET:
00370 tag_suf = XSH_GET_TAG_FROM_ARM( XSH_ORDER1D_CEN_IFU,
00371 instrument);
00372 break ;
00373 case UPPER_IFU_SLITLET:
00374 tag_suf = XSH_GET_TAG_FROM_ARM( XSH_ORDER1D_UP_IFU,
00375 instrument);
00376 break ;
00377 }
00378 sprintf(tag,"%s_%s",rec_prefix,tag_suf);
00379 xsh_msg( " Slitlet %s", SlitletName[slitlet] ) ;
00380 check( rec_frame = cpl_frameset_get_frame( rec_frameset, i ) ) ;
00381 xsh_msg( " REC Frame '%s' Got", cpl_frame_get_filename( rec_frame ) ) ;
00382
00383 if( loc_frameset != NULL ) {
00384 check( loc_frame = cpl_frameset_get_frame( loc_frameset, i ) ) ;
00385 xsh_msg( " LOC Frame '%s' Got", cpl_frame_get_filename( loc_frame ) ) ;
00386 }
00387 else xsh_msg_dbg_medium( "No localization table" ) ;
00388
00389
00390 xsh_msg( "Calling xsh_extract" ) ;
00391 check( ext_frame = xsh_extract_with_tag( rec_frame, loc_frame, instrument,
00392 extract_par, tag,&ext_frame_eso));
00393 xsh_msg( "Extracted frame '%s'", cpl_frame_get_filename( ext_frame ) ) ;
00394 check( cpl_frameset_insert( result_set, ext_frame_eso ) ) ;
00395 check( cpl_frameset_insert( result_set, ext_frame ) ) ;
00396 }
00397
00398 cleanup:
00399 xsh_msg( "Exit xsh_extract_ifu" ) ;
00400 return result_set ;
00401 }
00402
00403
00404