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
00050 cpl_frame*
00051 xsh_check_load_master_bpmap(cpl_frameset* calib, xsh_instrument* inst,
00052 const char* rec_id) {
00053 cpl_frame* bpmap = NULL;
00054 cpl_frame* bpmap_nl = NULL;
00055 cpl_frame* bpmap_rp = NULL;
00056 cpl_frame* bp_nl_frame = NULL;
00057 cpl_frame* frm = NULL;
00058
00059 cpl_propertylist* plist = NULL;
00060 cpl_image* image = NULL;
00061 cpl_frameset* set=NULL;
00062
00063 char tag_ou[256];
00064 char name[256];
00065 const char* bp_nl_name;
00066
00067 int naxis1 = 0;
00068 int binx = 0;
00069 int i=0;
00070 int sz=0;
00071 int is_pre=0;
00072 int mode_or=1;
00073 XSH_ARM the_arm = XSH_ARM_NIR;
00074
00075
00076 sprintf(tag_ou, "%s_%s", XSH_BP_MAP, xsh_instrument_arm_tostring(inst));
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 set=cpl_frameset_new();
00097
00098 if ((bpmap_rp = xsh_find_frame_with_tag(calib, XSH_BP_MAP_RP, inst))
00099 != NULL) {
00100 xsh_msg("%s provided", XSH_BP_MAP_RP);
00101 cpl_frameset_insert(set,cpl_frame_duplicate(bpmap_rp));
00102 }
00103
00104
00105 if (NULL == (bp_nl_frame = xsh_find_frame_with_tag(calib, XSH_BP_MAP_NL, inst))) {
00106 xsh_msg("%s not provided", XSH_BP_MAP_NL);
00107 } else {
00108
00109 bp_nl_name = cpl_frame_get_filename(bp_nl_frame);
00110 plist = cpl_propertylist_load(bp_nl_name, 0);
00111 naxis1 = xsh_pfits_get_naxis1(plist);
00112 the_arm = xsh_instrument_get_arm(inst);
00113
00114 if (the_arm != XSH_ARM_NIR) {
00115 binx = xsh_pfits_get_binx(plist);
00116 }
00117 if (the_arm == XSH_ARM_UVB) {
00118 if ((naxis1 == 2144 && binx == 1) || (naxis1 == 1072 && binx == 2)) {
00119 bpmap_nl = xsh_bpmap_2pre(bp_nl_frame, XSH_BP_MAP_NL, inst);
00120 is_pre=1;
00121 }
00122 } else if (the_arm == XSH_ARM_VIS) {
00123 if ((naxis1 == 2106 && binx == 1) || (naxis1 == 1053 && binx == 2)) {
00124 bpmap_nl = xsh_bpmap_2pre(bp_nl_frame, XSH_BP_MAP_NL, inst);
00125 is_pre=1;
00126 }
00127 } else if (the_arm == XSH_ARM_NIR) {
00128 if (naxis1 == 2048) {
00129 bpmap_nl = xsh_bpmap_2pre(bp_nl_frame, XSH_BP_MAP_NL, inst);
00130 is_pre=1;
00131 }
00132 }
00133 if(!is_pre){
00134 bpmap_nl=cpl_frame_duplicate(bp_nl_frame);
00135 }
00136 cpl_frameset_insert(set,cpl_frame_duplicate(bpmap_nl));
00137 xsh_free_frame(&bpmap_nl);
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 sz=cpl_frameset_get_size(set);
00160 if (sz > 0) {
00161 bpmap = cpl_frame_duplicate(cpl_frameset_get_frame(set, 0));
00162 for(i=1;i<sz;i++) {
00163 frm=cpl_frameset_get_frame(set,i);
00164 xsh_badpixelmap_coadd(bpmap, frm,mode_or);
00165 }
00166 }
00167
00168
00169 if (bpmap != NULL) {
00170 image = cpl_image_load(cpl_frame_get_filename(bpmap), CPL_TYPE_INT, 0, 0);
00171 xsh_free_propertylist(&plist);
00172 plist = cpl_propertylist_load(cpl_frame_get_filename(bpmap), 0);
00173 sprintf(name, "%s.fits", tag_ou);
00174 xsh_pfits_set_pcatg(plist, tag_ou);
00175 cpl_image_save(image, name, XSH_PRE_DATA_BPP, plist, CPL_IO_DEFAULT);
00176 cpl_frame_set_tag(bpmap, tag_ou);
00177 cpl_frame_set_filename(bpmap, name);
00178 xsh_add_temporary_file(name);
00179 }
00180
00181 xsh_free_image(&image);
00182 xsh_free_propertylist(&plist);
00183 xsh_free_frameset(&set);
00184
00185 return bpmap;
00186 }
00187
00203
00204 void xsh_check_get_map( cpl_frame *disp_tab_frame, cpl_frame *order_tab_edges,
00205 cpl_frame *crhm_frame, cpl_frame *model_config_frame, cpl_frameset *calib,
00206 xsh_instrument *instrument, int do_computemap, int recipe_use_model,
00207 const char *rec_prefix,
00208 cpl_frame **wavemap_frame, cpl_frame **slitmap_frame)
00209 {
00210 char wave_map_tag[256];
00211 char slit_map_tag[256];
00212
00213 if ( do_computemap){
00214 if ( recipe_use_model){
00215 int found_temp= CPL_TRUE;
00216
00217 xsh_msg( "Compute with MODEL the wave map and the slit map");
00218 check( xsh_model_temperature_update_frame( &model_config_frame,
00219 crhm_frame, instrument,&found_temp));
00220 sprintf( wave_map_tag, "%s_%s_%s", rec_prefix, XSH_WAVE_MAP_MODEL,
00221 xsh_instrument_arm_tostring( instrument ) );
00222 sprintf( slit_map_tag, "%s_%s_%s", rec_prefix, XSH_SLIT_MAP_MODEL,
00223 xsh_instrument_arm_tostring( instrument ) );
00224 check( xsh_create_model_map( model_config_frame, instrument,
00225 wave_map_tag,slit_map_tag, wavemap_frame, slitmap_frame,0));
00226 }
00227 else{
00228 xsh_msg("Compute with POLY the wave map and the slit map");
00229 check( xsh_create_map( disp_tab_frame, order_tab_edges,
00230 crhm_frame, instrument,
00231 wavemap_frame, slitmap_frame,rec_prefix));
00232 }
00233 }
00234 else{
00235 cpl_frame *tmp = NULL;
00236
00237 xsh_msg( "Get the wave map and the slit map");
00238 tmp = xsh_find_slitmap( calib, instrument);
00239 check_msg( *slitmap_frame = cpl_frame_duplicate( tmp),"If compute-map is set to FALSE you must provide a SLIT_MAP_ARM frame in input");
00240 tmp = xsh_find_wavemap( calib, instrument);
00241 check_msg( *wavemap_frame = cpl_frame_duplicate( tmp),"If compute-map is set to FALSE you must provide a SLIT_MAP_ARM frame in input");
00242 }
00243
00244 cleanup:
00245 return;
00246 }
00247
00248
00249
00260
00261 cpl_frame* xsh_check_remove_crh_multiple( cpl_frameset* raws,
00262 const char *ftag, xsh_stack_param* stack_par,xsh_clipping_param *crh_clipping_par,
00263 xsh_instrument* instr,cpl_imagelist ** lista, cpl_image** listb)
00264 {
00265 int size_raw_frameset =0;
00266 cpl_frame *result = NULL;
00267
00268 XSH_ASSURE_NOT_NULL( ftag);
00269
00270 check( size_raw_frameset = cpl_frameset_get_size( raws));
00271
00272 if ( size_raw_frameset >= 2 ) {
00273 xsh_msg( "---Remove crh (multiple frames)");
00274 check_msg( result = xsh_remove_crh_multiple( raws,ftag, stack_par, crh_clipping_par,instr, lista, listb,1),
00275 "Error in xsh_remove_crh");
00276
00277 }
00278 else {
00279 check( result = cpl_frame_duplicate(cpl_frameset_get_first( raws)));
00280 }
00281 cleanup:
00282 return result;
00283 }
00284
00285
00286
00296
00297 cpl_frame* xsh_check_subtract_bias( cpl_frame *crhm_frame,
00298 cpl_frame *master_bias,
00299 xsh_instrument *instrument,
00300 const char* prefix,
00301 const int pre_overscan_corr,const int save_tmp)
00302 {
00303 cpl_frame *result = NULL;
00304
00305 XSH_ASSURE_NOT_NULL( crhm_frame);
00306 XSH_ASSURE_NOT_NULL( instrument);
00307 XSH_ASSURE_NOT_NULL( prefix);
00308
00309 if ( xsh_instrument_get_arm(instrument) == XSH_ARM_NIR ) {
00310 char rmbias_tag[256];
00311
00312 sprintf( rmbias_tag, "%s_%s_%s", prefix,"ON",
00313 xsh_instrument_arm_tostring(instrument));
00314
00315 check( result = cpl_frame_duplicate( crhm_frame));
00316 cpl_frame_set_tag( result, rmbias_tag);
00317 }
00318 else {
00319
00320 xsh_msg("---Subtract bias");
00321 if( master_bias != NULL) {
00322
00323 check( result = xsh_subtract_bias( crhm_frame, master_bias,
00324 instrument, prefix,
00325 pre_overscan_corr,save_tmp));
00326 }
00327 else {
00328 result = cpl_frame_duplicate( crhm_frame);
00329 }
00330 }
00331 cleanup:
00332 return result;
00333 }
00334
00335
00336
00345
00346 cpl_frame* xsh_check_subtract_dark( cpl_frame *rmbias_frame,
00347 cpl_frame *master_dark, xsh_instrument *instrument, const char* prefix)
00348 {
00349 cpl_frame *result = NULL;
00350 char result_name[256];
00351
00352 XSH_ASSURE_NOT_NULL( rmbias_frame);
00353 XSH_ASSURE_NOT_NULL( instrument);
00354 XSH_ASSURE_NOT_NULL( prefix);
00355
00356 if(master_dark != NULL) {
00357 xsh_msg( "---Subtract dark");
00358 sprintf( result_name, "%s_DARK.fits", prefix);
00359 check( result = xsh_subtract_dark( rmbias_frame, master_dark,
00360 result_name, instrument));
00361 xsh_add_temporary_file(result_name);
00362 }
00363 else {
00364 result = cpl_frame_duplicate( rmbias_frame);
00365 }
00366
00367 cleanup:
00368 return result;
00369 }
00370
00371
00372
00384
00385 cpl_frame* xsh_check_divide_flat( int do_flatfield, cpl_frame *clean_frame,
00386 cpl_frame *master_flat, xsh_instrument *instrument, const char* prefix)
00387 {
00388 cpl_frame *result = NULL;
00389 char result_tag[256];
00390
00391 XSH_ASSURE_NOT_NULL( clean_frame);
00392 XSH_ASSURE_NOT_NULL( instrument);
00393 XSH_ASSURE_NOT_NULL( prefix);
00394
00395 if( do_flatfield == CPL_TRUE) {
00396 xsh_msg( "---Divide flat");
00397 sprintf( result_tag, "%s_DIVFF_%s", prefix,
00398 xsh_instrument_arm_tostring(instrument)) ;
00399
00400 check( result = xsh_divide_flat( clean_frame, master_flat,
00401 result_tag, instrument));
00402 }
00403 else{
00404 check( result = cpl_frame_duplicate( clean_frame));
00405 }
00406 cleanup:
00407 return result;
00408 }
00409
00410
00411
00412
00422
00423 cpl_frame* xsh_check_remove_crh_single( int nb_raws_frame,
00424 cpl_frame *subsky_frame, xsh_remove_crh_single_param *crh_single_par,
00425 xsh_instrument *instrument, const char* prefix)
00426 {
00427 char result_tag[256];
00428 char result_name[256];
00429 cpl_frame *result = NULL;
00430
00431 XSH_ASSURE_NOT_NULL( subsky_frame);
00432 XSH_ASSURE_NOT_NULL( crh_single_par);
00433 XSH_ASSURE_NOT_NULL( instrument);
00434 XSH_ASSURE_NOT_NULL( prefix);
00435
00436 if ( nb_raws_frame == 1 && crh_single_par->nb_iter > 0) {
00437 xsh_msg( "---Remove crh (single frame)");
00438 sprintf( result_tag, "%s_NOCRH_%s", prefix,
00439 xsh_instrument_arm_tostring(instrument));
00440 sprintf( result_name, "%s.fits",result_tag);
00441 xsh_add_temporary_file(result_name);
00442
00443 check( result = xsh_remove_crh_single( subsky_frame,
00444 instrument, crh_single_par, result_tag));
00445 }
00446 else {
00447 check( result = cpl_frame_duplicate( subsky_frame));
00448 }
00449
00450 cleanup:
00451 return result;
00452 }
00453
00454
00455
00475
00476
00477 cpl_frame* xsh_check_subtract_sky_single( int do_subsky, cpl_frame *src_frame,
00478 cpl_frame *ordertabedges_frame,
00479 cpl_frame *slitmap_frame, cpl_frame *wavemap_frame,
00480 cpl_frame *loctab_frame, cpl_frame *masterflat_frame,
00481 cpl_frame *definedbreakpoints_frame,
00482 xsh_instrument *instrument, int nbkpts,
00483 xsh_subtract_sky_single_param *sky_par,
00484 cpl_frame **sky_spectrum, cpl_frame **sky_spectrum_eso, cpl_frame **sky_img,
00485 const char *prefix,const int clean_tmp)
00486 {
00487 char result_tag[256];
00488 char result_name[256];
00489 cpl_frame *result = NULL;
00490
00491 XSH_ASSURE_NOT_NULL( src_frame);
00492
00493 if ( do_subsky == CPL_TRUE){
00494 xsh_msg("---Sky subtraction (single frame)");
00495 check( result = xsh_subtract_sky_single( src_frame, ordertabedges_frame,
00496 slitmap_frame, wavemap_frame, loctab_frame, masterflat_frame,
00497 definedbreakpoints_frame, instrument, nbkpts, sky_par, sky_spectrum,
00498 sky_spectrum_eso, prefix,clean_tmp));
00499 sprintf( result_tag,"%s_SKY_%s", prefix,
00500 xsh_instrument_arm_tostring(instrument));
00501 sprintf( result_name,"%s.fits", result_tag);
00502 check( *sky_img = xsh_save_sky_model( src_frame, result, result_tag,
00503 instrument));
00504 if(strstr(result_name,"TMPSKY")!=NULL) {
00505 xsh_add_temporary_file(result_name);
00506 }
00507 }
00508 else{
00509 xsh_msg("[No sky subtraction]");
00510 check( result = cpl_frame_duplicate( src_frame));
00511 }
00512
00513 cleanup:
00514 return result;
00515 }
00516
00517
00518
00519
00530
00531 void xsh_check_afc( int check_flag, cpl_frame *model_frame,
00532 cpl_frame *sci_frame, cpl_frameset *wave_frameset,
00533 cpl_frame *order_tab_frame, cpl_frame *disp_tab_frame,
00534 xsh_instrument *instrument)
00535 {
00536 int i;
00537
00538 if (check_flag) {
00539 if( model_frame!=NULL) {
00540 check(xsh_frame_check_model_cfg_is_afc_corrected(model_frame));
00541 check(xsh_frame_check_model_cfg_is_proper_for_sci(model_frame,
00542 sci_frame,instrument));
00543 }
00544 else {
00545 for(i=0; i< 3; i++){
00546 cpl_frame *wavesol_frame = NULL;
00547
00548 wavesol_frame = cpl_frameset_get_frame( wave_frameset, i);
00549 check(xsh_frame_check_model_cfg_is_afc_corrected(wavesol_frame));
00550 check(xsh_frame_check_model_cfg_is_proper_for_sci(wavesol_frame,
00551 sci_frame,instrument));
00552 }
00553 check(xsh_frame_check_model_cfg_is_afc_corrected( order_tab_frame));
00554 check(xsh_frame_check_model_cfg_is_proper_for_sci( order_tab_frame,
00555 sci_frame,instrument));
00556 if ( disp_tab_frame != NULL){
00557 check(xsh_frame_check_model_cfg_is_afc_corrected( disp_tab_frame));
00558 check(xsh_frame_check_model_cfg_is_proper_for_sci( disp_tab_frame,
00559 sci_frame,instrument));
00560 }
00561 }
00562 }
00563 cleanup:
00564 return;
00565 }
00566
00567
00568 #if 0
00569 void xsh_check_localize_and_nocrh( int nb_frames, loc_obj_par
00570
00571 if (loc_obj_par->method == LOC_MANUAL_METHOD){
00572 check( loc_table_frame = xsh_localize_obj( NULL,
00573 instrument, loc_obj_par, NULL, NULL));
00574 }
00575 if( (loc_obj_par->method != LOC_MANUAL_METHOD) ||
00576 (nb_raw_frames == 1 && crh_single_par->nb_iter > 0)){
00577 xsh_msg("Preliminary sky subtraction for CRH single or localize auto");
00578 xsh_msg("Sky will be put back later");
00579
00580 sprintf(sky_tag,"%s_TMP_SKY_%s",rec_prefix,
00581 xsh_instrument_arm_tostring(instrument));
00582
00583 check( sub_sky_frame = xsh_subtract_sky_single( rmbkg, order_tab_edges,
00584 slitmap_frame, wavemap_frame,
00585 NULL, NULL,
00586 single_frame_sky_sub_tab_frame,
00587 instrument,
00588 sub_sky_nbkpts1, sky_par,
00589 &sky_frame,
00590 &sky_frame_eso,
00591 sky_tag));
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 sky_frame_ima=xsh_save_sky_model(rmbkg,sub_sky_frame,sky_tag,instrument,decode_bp);
00603
00604
00605
00606 if( loc_obj_par->method != LOC_MANUAL_METHOD){
00607 xsh_msg("Localize auto");
00608 sprintf(rec_name,"%s_%s_%s.fits",
00609 rec_prefix,XSH_ORDER2D,
00610 xsh_instrument_arm_tostring(instrument));
00611
00612
00613
00614 check( rect_frame = xsh_rectify( sub_sky_frame, order_tab_edges,
00615 wave_tab, model_config_frame,
00616 instrument, rectify_par,
00617 spectralformat_frame, disp_tab_frame,
00618 rec_name, NULL, NULL,rec_prefix));
00619
00620
00621 check( loc_table_frame = xsh_localize_obj( rect_frame, instrument,
00622 loc_obj_par, NULL, NULL));
00623 }
00624
00625 check( clean_frame = xsh_check_remove_crh_single( nb_raw_frames, sub_sky_frame,
00626 crh_single_par, wavemap_frame, instrument, rec_prefix));
00627
00628
00629
00630 {
00631 char * obj_nocrh_tag = NULL ;
00632 char * obj_nocrh_name = NULL ;
00633
00634 obj_nocrh_tag = xsh_stringcat_any("OBJ_AND_SKY_NOCRH_",
00635 xsh_instrument_arm_tostring(instrument),
00636 NULL) ;
00637 obj_nocrh_name = xsh_stringcat_any("OBJ_AND_SKY_NOCRH_",
00638 xsh_instrument_arm_tostring(instrument),
00639 ".fits",NULL) ;
00640
00641 check( pre_sci = xsh_pre_load( clean_frame, instrument));
00642
00643 strcpy(sky_name,cpl_frame_get_filename(sky_frame_ima));
00644 check(sky_image=cpl_image_load(sky_name,CPL_TYPE_FLOAT,0,0));
00645 check(cpl_image_add(pre_sci->data,sky_image));
00646
00647 check(clean_obj=xsh_pre_save(pre_sci, obj_nocrh_name, obj_nocrh_tag, 1));
00648
00649 XSH_FREE( obj_nocrh_tag ) ;
00650 XSH_FREE( obj_nocrh_name ) ;
00651 xsh_pre_free( &pre_sci);
00652 }
00653
00654
00655 } else {
00656
00657 check( clean_obj=cpl_frame_duplicate(rmbkg));
00658 }
00659 #endif
00660
00661
00662