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
00027 #ifdef HAVE_CONFIG_H
00028 #include <config.h>
00029 #endif
00030
00031
00037
00038
00039
00040
00041
00042
00043 #include <xsh_drl.h>
00044 #include <xsh_drl_check.h>
00045 #include <xsh_pfits.h>
00046 #include <xsh_parameters.h>
00047 #include <xsh_model_utils.h>
00048
00049 cpl_frame*
00050 xsh_check_load_master_bpmap(cpl_frameset* calib,xsh_instrument* inst)
00051 {
00052 cpl_frame* bpmap=NULL;
00053 cpl_frame* bpmap_nl=NULL;
00054 const char* bp_nl_name;
00055 char tag[80];
00056 char name[80];
00057 cpl_frame* bp_nl_frame=NULL;
00058 int naxis1=0;
00059 xsh_pre* pre_bp_nl=NULL;
00060 XSH_ARM the_arm;
00061 int binx=0;
00062 cpl_propertylist* plist=NULL;
00063 cpl_image* image=NULL;
00064
00065 if((bpmap=xsh_find_frame_with_tag(calib,XSH_MASTER_BP_MAP,inst))==NULL) {
00066 xsh_msg("%s not provided",XSH_MASTER_BP_MAP);
00067 }
00068
00069
00070 if((bpmap_nl=xsh_find_frame_with_tag(calib,XSH_BP_MAP_NL,inst))==NULL) {
00071 xsh_msg("%s not provided",XSH_BP_MAP_NL);
00072 } else {
00073 bp_nl_name=cpl_frame_get_filename(bpmap_nl);
00074 plist=cpl_propertylist_load(bp_nl_name,0);
00075 naxis1=xsh_pfits_get_naxis1(plist);
00076 the_arm=xsh_instrument_get_arm(inst);
00077
00078 if( the_arm != XSH_ARM_NIR ){
00079 binx=xsh_pfits_get_binx(plist);
00080 }
00081 if( the_arm == XSH_ARM_UVB ){
00082 if ( ( naxis1==2144 && binx==1) || ( naxis1==1072 && binx==2) ) {
00083 bp_nl_frame=xsh_bpmap_2pre(bpmap_nl,XSH_BP_MAP_NL,inst);
00084 }
00085 } else if ( the_arm == XSH_ARM_VIS ) {
00086 if ( ( naxis1==2106 && binx==1) || ( naxis1==1053 && binx==2) ) {
00087 bp_nl_frame=xsh_bpmap_2pre(bpmap_nl,XSH_BP_MAP_NL,inst);
00088 }
00089 } else if ( the_arm == XSH_ARM_NIR ) {
00090 if ( naxis1==2048 ) {
00091 bp_nl_frame=xsh_bpmap_2pre(bpmap_nl,XSH_BP_MAP_NL,inst);
00092 }
00093 }
00094
00095 if(bpmap!=NULL) {
00096
00097 if(bp_nl_frame!=NULL) {
00098 xsh_badpixelmap_coadd(bpmap,bp_nl_frame);
00099 }
00100
00101 } else if(bp_nl_frame!=NULL) {
00102
00103 bpmap=cpl_frame_duplicate(bp_nl_frame);
00104 image=cpl_image_load(cpl_frame_get_filename(bp_nl_frame),
00105 CPL_TYPE_FLOAT,0,0);
00106 sprintf(tag,"%s_%s",XSH_MASTER_BP_MAP,xsh_instrument_arm_tostring(inst));
00107 sprintf(name,"%s.fits",tag);
00108 xsh_pfits_set_pcatg(plist,tag);
00109 cpl_image_save(image,name,XSH_PRE_DATA_BPP,plist,CPL_IO_DEFAULT);
00110 cpl_frame_set_tag(bpmap,tag);
00111 cpl_frame_set_filename(bpmap,name);
00112
00113 }
00114
00115 }
00116
00117 xsh_free_image(&image);
00118 xsh_free_propertylist(&plist);
00119 xsh_pre_free(&pre_bp_nl);
00120 xsh_free_frame(&bp_nl_frame);
00121 return bpmap;
00122 }
00123
00139
00140 void xsh_check_get_map( cpl_frame *disp_tab_frame, cpl_frame *order_tab_edges,
00141 cpl_frame *crhm_frame, cpl_frame *model_config_frame, cpl_frameset *calib,
00142 xsh_instrument *instrument, int do_computemap, int recipe_use_model,
00143 const char *rec_prefix,
00144 cpl_frame **wavemap_frame, cpl_frame **slitmap_frame)
00145 {
00146 char wave_map_tag[80];
00147 char slit_map_tag[80];
00148
00149 if ( do_computemap){
00150 if ( recipe_use_model){
00151 int found_temp= CPL_TRUE;
00152
00153 xsh_msg( "Compute with MODEL the wave map and the slit map");
00154 check( xsh_model_temperature_update_frame( &model_config_frame,
00155 crhm_frame, instrument,&found_temp));
00156 sprintf( wave_map_tag, "%s_%s_%s", rec_prefix, XSH_WAVE_MAP_MODEL,
00157 xsh_instrument_arm_tostring( instrument ) );
00158 sprintf( slit_map_tag, "%s_%s_%s", rec_prefix, XSH_SLIT_MAP_MODEL,
00159 xsh_instrument_arm_tostring( instrument ) );
00160 check( xsh_create_model_map( model_config_frame, instrument,
00161 wave_map_tag,slit_map_tag, wavemap_frame, slitmap_frame));
00162 }
00163 else{
00164 xsh_msg("Compute with POLY the wave map and the slit map");
00165 check( xsh_create_map( disp_tab_frame, order_tab_edges,
00166 crhm_frame, instrument,
00167 wavemap_frame, slitmap_frame,rec_prefix));
00168 }
00169 }
00170 else{
00171 cpl_frame *tmp = NULL;
00172
00173 xsh_msg( "Get the wave map and the slit map");
00174 tmp = xsh_find_slitmap( calib, instrument);
00175 check( *slitmap_frame = cpl_frame_duplicate( tmp));
00176 tmp = xsh_find_wavemap( calib, instrument);
00177 check( *wavemap_frame = cpl_frame_duplicate( tmp));
00178 }
00179
00180 cleanup:
00181 return;
00182 }
00183
00184
00185
00196
00197 cpl_frame* xsh_check_remove_crh_multiple( cpl_frameset* raws,
00198 const char *ftag, xsh_clipping_param *crh_clipping_par,
00199 xsh_instrument* instr, cpl_imagelist ** lista, cpl_image** listb)
00200 {
00201 int size_raw_frameset =0;
00202 cpl_frame *result = NULL;
00203
00204 XSH_ASSURE_NOT_NULL( ftag);
00205
00206 check( size_raw_frameset = cpl_frameset_get_size( raws));
00207
00208 if ( size_raw_frameset >= 3 ) {
00209 xsh_msg( "---Remove crh (multiple frames)");
00210 xsh_msg_dbg_low( " CRH parameters: Sigma %f, Niteration %d, Fraction %f",
00211 crh_clipping_par->sigma, crh_clipping_par->niter,
00212 crh_clipping_par->frac);
00213 check_msg( result = xsh_remove_crh_multiple( raws,
00214 ftag, crh_clipping_par, instr, lista, listb),
00215 "Error in xsh_remove_crh");
00216
00217 }
00218 else {
00219 check( result = cpl_frame_duplicate(cpl_frameset_get_first( raws)));
00220 }
00221 cleanup:
00222 return result;
00223 }
00224
00225
00226
00236
00237 cpl_frame* xsh_check_subtract_bias( cpl_frame *crhm_frame,
00238 cpl_frame *master_bias,
00239 xsh_instrument *instrument,
00240 const char* prefix,
00241 const int pre_overscan_corr)
00242 {
00243 cpl_frame *result = NULL;
00244
00245 XSH_ASSURE_NOT_NULL( crhm_frame);
00246 XSH_ASSURE_NOT_NULL( instrument);
00247 XSH_ASSURE_NOT_NULL( prefix);
00248
00249 if ( xsh_instrument_get_arm(instrument) == XSH_ARM_NIR ) {
00250 char rmbias_tag[80];
00251
00252 sprintf( rmbias_tag, "%s_%s_%s", prefix,"ON",
00253 xsh_instrument_arm_tostring(instrument));
00254
00255 check( result = cpl_frame_duplicate( crhm_frame));
00256 cpl_frame_set_tag( result, rmbias_tag);
00257 }
00258 else {
00259
00260 xsh_msg("---Subtract bias");
00261 if( master_bias != NULL) {
00262
00263 check( result = xsh_subtract_bias( crhm_frame, master_bias,
00264 instrument, prefix,
00265 pre_overscan_corr));
00266 }
00267 else {
00268 result = cpl_frame_duplicate( crhm_frame);
00269 }
00270 }
00271 cleanup:
00272 return result;
00273 }
00274
00275
00276
00285
00286 cpl_frame* xsh_check_subtract_dark( cpl_frame *rmbias_frame,
00287 cpl_frame *master_dark, xsh_instrument *instrument, const char* prefix)
00288 {
00289 cpl_frame *result = NULL;
00290 char result_name[256];
00291
00292 XSH_ASSURE_NOT_NULL( rmbias_frame);
00293 XSH_ASSURE_NOT_NULL( instrument);
00294 XSH_ASSURE_NOT_NULL( prefix);
00295
00296 if(master_dark != NULL) {
00297 xsh_msg( "---Subtract dark");
00298 sprintf( result_name, "%s_DARK.fits", prefix);
00299 check( result = xsh_subtract_dark( rmbias_frame, master_dark,
00300 result_name, instrument));
00301 }
00302 else {
00303 result = cpl_frame_duplicate( rmbias_frame);
00304 }
00305
00306 cleanup:
00307 return result;
00308 }
00309
00310
00311
00323
00324 cpl_frame* xsh_check_divide_flat( int do_flatfield, cpl_frame *clean_frame,
00325 cpl_frame *master_flat, xsh_instrument *instrument, const char* prefix)
00326 {
00327 cpl_frame *result = NULL;
00328 char result_tag[256];
00329
00330 XSH_ASSURE_NOT_NULL( clean_frame);
00331 XSH_ASSURE_NOT_NULL( instrument);
00332 XSH_ASSURE_NOT_NULL( prefix);
00333
00334 if( do_flatfield == CPL_TRUE) {
00335 xsh_msg( "---Divide flat");
00336 sprintf( result_tag, "%s_DIVFF_%s", prefix,
00337 xsh_instrument_arm_tostring(instrument)) ;
00338
00339 check( result = xsh_divide_flat( clean_frame, master_flat,
00340 result_tag, instrument));
00341 }
00342 else{
00343 check( result = cpl_frame_duplicate( clean_frame));
00344 }
00345 cleanup:
00346 return result;
00347 }
00348
00349
00350
00351
00362
00363 cpl_frame* xsh_check_remove_crh_single( int nb_raws_frame,
00364 cpl_frame *subsky_frame, xsh_remove_crh_single_param *crh_single_par,
00365 cpl_frame *wavemap_frame,
00366 xsh_instrument *instrument, const char* prefix)
00367 {
00368 char result_tag[256];
00369 cpl_frame *result = NULL;
00370
00371 XSH_ASSURE_NOT_NULL( subsky_frame);
00372 XSH_ASSURE_NOT_NULL( crh_single_par);
00373 XSH_ASSURE_NOT_NULL( instrument);
00374 XSH_ASSURE_NOT_NULL( prefix);
00375
00376 if ( nb_raws_frame == 1 && crh_single_par->nb_iter > 0) {
00377 xsh_msg( "---Remove crh (single frame)");
00378 sprintf( result_tag, "%s_NOCRH_%s", prefix,
00379 xsh_instrument_arm_tostring(instrument));
00380
00381 check( result = xsh_remove_crh_single( subsky_frame, wavemap_frame,
00382 instrument, crh_single_par, result_tag));
00383 }
00384 else {
00385 check( result = cpl_frame_duplicate( subsky_frame));
00386 }
00387
00388 cleanup:
00389 return result;
00390 }
00391
00392
00393
00413
00414
00415 cpl_frame* xsh_check_subtract_sky_single( int do_subsky, cpl_frame *src_frame,
00416 cpl_frame *ordertabedges_frame,
00417 cpl_frame *slitmap_frame, cpl_frame *wavemap_frame,
00418 cpl_frame *loctab_frame, cpl_frame *masterflat_frame,
00419 cpl_frame *definedbreakpoints_frame,
00420 xsh_instrument *instrument, int nbkpts,
00421 xsh_subtract_sky_single_param *sky_par,
00422 cpl_frame **sky_spectrum, cpl_frame **sky_spectrum_eso, cpl_frame **sky_img,
00423 const char *prefix)
00424 {
00425 char result_tag[256];
00426 cpl_frame *result = NULL;
00427
00428 XSH_ASSURE_NOT_NULL( src_frame);
00429
00430 if ( do_subsky == CPL_TRUE){
00431 xsh_msg("---Sky subtraction (single frame)");
00432 check( result = xsh_subtract_sky_single( src_frame, ordertabedges_frame,
00433 slitmap_frame, wavemap_frame, loctab_frame, masterflat_frame,
00434 definedbreakpoints_frame, instrument, nbkpts, sky_par, sky_spectrum,
00435 sky_spectrum_eso, prefix));
00436 sprintf( result_tag,"%s_SKY_%s", prefix,
00437 xsh_instrument_arm_tostring(instrument));
00438 check( *sky_img = xsh_save_sky_model( src_frame, result, result_tag,
00439 instrument));
00440 }
00441 else{
00442 xsh_msg("[No sky subtraction]");
00443 check( result = cpl_frame_duplicate( src_frame));
00444 }
00445
00446 cleanup:
00447 return result;
00448 }
00449
00450
00451 #if 0
00452 void xsh_check_localize_and_nocrh( int nb_frames, loc_obj_par
00453
00454 if (loc_obj_par->method == LOC_MANUAL_METHOD){
00455 check( loc_table_frame = xsh_localize_obj( NULL,
00456 instrument, loc_obj_par, NULL, NULL));
00457 }
00458 if( (loc_obj_par->method != LOC_MANUAL_METHOD) ||
00459 (nb_raw_frames == 1 && crh_single_par->nb_iter > 0)){
00460 xsh_msg("Preliminary sky subtraction for CRH single or localize auto");
00461 xsh_msg("Sky will be put back later");
00462
00463 sprintf(sky_tag,"%s_TMP_SKY_%s",rec_prefix,
00464 xsh_instrument_arm_tostring(instrument));
00465
00466 check( sub_sky_frame = xsh_subtract_sky_single( rmbkg, order_tab_edges,
00467 slitmap_frame, wavemap_frame,
00468 NULL, NULL,
00469 single_frame_sky_sub_tab_frame,
00470 instrument,
00471 sub_sky_nbkpts1, sky_par,
00472 &sky_frame,
00473 &sky_frame_eso,
00474 sky_tag));
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485 sky_frame_ima=xsh_save_sky_model(rmbkg,sub_sky_frame,sky_tag,instrument);
00486
00487
00488
00489 if( loc_obj_par->method != LOC_MANUAL_METHOD){
00490 xsh_msg("Localize auto");
00491 sprintf(rec_name,"%s_%s_%s.fits",
00492 rec_prefix,XSH_ORDER2D,
00493 xsh_instrument_arm_tostring(instrument));
00494
00495
00496
00497 check( rect_frame = xsh_rectify( sub_sky_frame, order_tab_edges,
00498 wave_tab, model_config_frame,
00499 instrument, rectify_par,
00500 spectralformat_frame, disp_tab_frame,
00501 rec_name, NULL, NULL,rec_prefix));
00502
00503
00504 check( loc_table_frame = xsh_localize_obj( rect_frame, instrument,
00505 loc_obj_par, NULL, NULL));
00506 }
00507
00508 check( clean_frame = xsh_check_remove_crh_single( nb_raw_frames, sub_sky_frame,
00509 crh_single_par, wavemap_frame, instrument, rec_prefix));
00510
00511
00512
00513 {
00514 char * obj_nocrh_tag = NULL ;
00515 char * obj_nocrh_name = NULL ;
00516
00517 obj_nocrh_tag = xsh_stringcat_any("OBJ_AND_SKY_NOCRH_",
00518 xsh_instrument_arm_tostring(instrument),
00519 NULL) ;
00520 obj_nocrh_name = xsh_stringcat_any("OBJ_AND_SKY_NOCRH_",
00521 xsh_instrument_arm_tostring(instrument),
00522 ".fits",NULL) ;
00523
00524 check( pre_sci = xsh_pre_load( clean_frame, instrument));
00525
00526 strcpy(sky_name,cpl_frame_get_filename(sky_frame_ima));
00527 check(sky_image=cpl_image_load(sky_name,CPL_TYPE_FLOAT,0,0));
00528 check(cpl_image_add(pre_sci->data,sky_image));
00529
00530 check(clean_obj=xsh_pre_save(pre_sci, obj_nocrh_name, obj_nocrh_tag, 1));
00531
00532 XSH_FREE( obj_nocrh_tag ) ;
00533 XSH_FREE( obj_nocrh_name ) ;
00534 xsh_pre_free( &pre_sci);
00535 }
00536
00537
00538 } else {
00539
00540 check( clean_obj=cpl_frame_duplicate(rmbkg));
00541 }
00542 #endif
00543
00544
00545