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[80];
00064 char name[80];
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
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);
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[80];
00211 char slit_map_tag[80];
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 >= 3 ) {
00273 xsh_msg( "---Remove crh (multiple frames)");
00274 xsh_msg_dbg_low( " CRH parameters: Sigma %f, Niteration %d, Fraction %f",
00275 crh_clipping_par->sigma, crh_clipping_par->niter,
00276 crh_clipping_par->frac);
00277 check_msg( result = xsh_remove_crh_multiple( raws,
00278 ftag, stack_par, crh_clipping_par, instr, lista, listb,0),
00279 "Error in xsh_remove_crh");
00280
00281 }
00282 else {
00283 check( result = cpl_frame_duplicate(cpl_frameset_get_first( raws)));
00284 }
00285 cleanup:
00286 return result;
00287 }
00288
00289
00290
00300
00301 cpl_frame* xsh_check_subtract_bias( cpl_frame *crhm_frame,
00302 cpl_frame *master_bias,
00303 xsh_instrument *instrument,
00304 const char* prefix,
00305 const int pre_overscan_corr,const int save_tmp)
00306 {
00307 cpl_frame *result = NULL;
00308
00309 XSH_ASSURE_NOT_NULL( crhm_frame);
00310 XSH_ASSURE_NOT_NULL( instrument);
00311 XSH_ASSURE_NOT_NULL( prefix);
00312
00313 if ( xsh_instrument_get_arm(instrument) == XSH_ARM_NIR ) {
00314 char rmbias_tag[80];
00315
00316 sprintf( rmbias_tag, "%s_%s_%s", prefix,"ON",
00317 xsh_instrument_arm_tostring(instrument));
00318
00319 check( result = cpl_frame_duplicate( crhm_frame));
00320 cpl_frame_set_tag( result, rmbias_tag);
00321 }
00322 else {
00323
00324 xsh_msg("---Subtract bias");
00325 if( master_bias != NULL) {
00326
00327 check( result = xsh_subtract_bias( crhm_frame, master_bias,
00328 instrument, prefix,
00329 pre_overscan_corr,save_tmp));
00330 }
00331 else {
00332 result = cpl_frame_duplicate( crhm_frame);
00333 }
00334 }
00335 cleanup:
00336 return result;
00337 }
00338
00339
00340
00349
00350 cpl_frame* xsh_check_subtract_dark( cpl_frame *rmbias_frame,
00351 cpl_frame *master_dark, xsh_instrument *instrument, const char* prefix)
00352 {
00353 cpl_frame *result = NULL;
00354 char result_name[256];
00355
00356 XSH_ASSURE_NOT_NULL( rmbias_frame);
00357 XSH_ASSURE_NOT_NULL( instrument);
00358 XSH_ASSURE_NOT_NULL( prefix);
00359
00360 if(master_dark != NULL) {
00361 xsh_msg( "---Subtract dark");
00362 sprintf( result_name, "%s_DARK.fits", prefix);
00363 check( result = xsh_subtract_dark( rmbias_frame, master_dark,
00364 result_name, instrument));
00365 }
00366 else {
00367 result = cpl_frame_duplicate( rmbias_frame);
00368 }
00369
00370 cleanup:
00371 return result;
00372 }
00373
00374
00375
00387
00388 cpl_frame* xsh_check_divide_flat( int do_flatfield, cpl_frame *clean_frame,
00389 cpl_frame *master_flat, xsh_instrument *instrument, const char* prefix)
00390 {
00391 cpl_frame *result = NULL;
00392 char result_tag[256];
00393
00394 XSH_ASSURE_NOT_NULL( clean_frame);
00395 XSH_ASSURE_NOT_NULL( instrument);
00396 XSH_ASSURE_NOT_NULL( prefix);
00397
00398 if( do_flatfield == CPL_TRUE) {
00399 xsh_msg( "---Divide flat");
00400 sprintf( result_tag, "%s_DIVFF_%s", prefix,
00401 xsh_instrument_arm_tostring(instrument)) ;
00402
00403 check( result = xsh_divide_flat( clean_frame, master_flat,
00404 result_tag, instrument));
00405 }
00406 else{
00407 check( result = cpl_frame_duplicate( clean_frame));
00408 }
00409 cleanup:
00410 return result;
00411 }
00412
00413
00414
00415
00426
00427 cpl_frame* xsh_check_remove_crh_single( int nb_raws_frame,
00428 cpl_frame *subsky_frame, xsh_remove_crh_single_param *crh_single_par,
00429 cpl_frame *wavemap_frame,
00430 xsh_instrument *instrument, const char* prefix)
00431 {
00432 char result_tag[80];
00433 char result_name[80];
00434 cpl_frame *result = NULL;
00435
00436 XSH_ASSURE_NOT_NULL( subsky_frame);
00437 XSH_ASSURE_NOT_NULL( crh_single_par);
00438 XSH_ASSURE_NOT_NULL( instrument);
00439 XSH_ASSURE_NOT_NULL( prefix);
00440
00441 if ( nb_raws_frame == 1 && crh_single_par->nb_iter > 0) {
00442 xsh_msg( "---Remove crh (single frame)");
00443 sprintf( result_tag, "%s_NOCRH_%s", prefix,
00444 xsh_instrument_arm_tostring(instrument));
00445 sprintf( result_name, "%s.fits",result_tag);
00446
00447
00448 check( result = xsh_remove_crh_single( subsky_frame, wavemap_frame,
00449 instrument, crh_single_par, result_tag));
00450 }
00451 else {
00452 check( result = cpl_frame_duplicate( subsky_frame));
00453 }
00454
00455 cleanup:
00456 return result;
00457 }
00458
00459
00460
00480
00481
00482 cpl_frame* xsh_check_subtract_sky_single( int do_subsky, cpl_frame *src_frame,
00483 cpl_frame *ordertabedges_frame,
00484 cpl_frame *slitmap_frame, cpl_frame *wavemap_frame,
00485 cpl_frame *loctab_frame, cpl_frame *masterflat_frame,
00486 cpl_frame *definedbreakpoints_frame,
00487 xsh_instrument *instrument, int nbkpts,
00488 xsh_subtract_sky_single_param *sky_par,
00489 cpl_frame **sky_spectrum, cpl_frame **sky_spectrum_eso, cpl_frame **sky_img,
00490 const char *prefix)
00491 {
00492 char result_tag[80];
00493 char result_name[80];
00494 cpl_frame *result = NULL;
00495
00496 XSH_ASSURE_NOT_NULL( src_frame);
00497
00498 if ( do_subsky == CPL_TRUE){
00499 xsh_msg("---Sky subtraction (single frame)");
00500 check( result = xsh_subtract_sky_single( src_frame, ordertabedges_frame,
00501 slitmap_frame, wavemap_frame, loctab_frame, masterflat_frame,
00502 definedbreakpoints_frame, instrument, nbkpts, sky_par, sky_spectrum,
00503 sky_spectrum_eso, prefix));
00504 sprintf( result_tag,"%s_SKY_%s", prefix,
00505 xsh_instrument_arm_tostring(instrument));
00506 sprintf( result_name,"%s.fits", result_tag);
00507 check( *sky_img = xsh_save_sky_model( src_frame, result, result_tag,
00508 instrument));
00509 if(strstr(result_name,"TMPSKY")!=NULL) {
00510 xsh_add_temporary_file(result_name);
00511 }
00512 }
00513 else{
00514 xsh_msg("[No sky subtraction]");
00515 check( result = cpl_frame_duplicate( src_frame));
00516 }
00517
00518 cleanup:
00519 return result;
00520 }
00521
00522
00523
00524
00535
00536 void xsh_check_afc( int check_flag, cpl_frame *model_frame,
00537 cpl_frame *sci_frame, cpl_frameset *wave_frameset,
00538 cpl_frame *order_tab_frame, cpl_frame *disp_tab_frame,
00539 xsh_instrument *instrument)
00540 {
00541 int i;
00542
00543 if (check_flag) {
00544 if( model_frame!=NULL) {
00545 check(xsh_frame_check_model_cfg_is_afc_corrected(model_frame));
00546 check(xsh_frame_check_model_cfg_is_proper_for_sci(model_frame,
00547 sci_frame,instrument));
00548 }
00549 else {
00550 for(i=0; i< 3; i++){
00551 cpl_frame *wavesol_frame = NULL;
00552
00553 wavesol_frame = cpl_frameset_get_frame( wave_frameset, i);
00554 check(xsh_frame_check_model_cfg_is_afc_corrected(wavesol_frame));
00555 check(xsh_frame_check_model_cfg_is_proper_for_sci(wavesol_frame,
00556 sci_frame,instrument));
00557 }
00558 check(xsh_frame_check_model_cfg_is_afc_corrected( order_tab_frame));
00559 check(xsh_frame_check_model_cfg_is_proper_for_sci( order_tab_frame,
00560 sci_frame,instrument));
00561 if ( disp_tab_frame != NULL){
00562 check(xsh_frame_check_model_cfg_is_afc_corrected( disp_tab_frame));
00563 check(xsh_frame_check_model_cfg_is_proper_for_sci( disp_tab_frame,
00564 sci_frame,instrument));
00565 }
00566 }
00567 }
00568 cleanup:
00569 return;
00570 }
00571
00572
00573 #if 0
00574 void xsh_check_localize_and_nocrh( int nb_frames, loc_obj_par
00575
00576 if (loc_obj_par->method == LOC_MANUAL_METHOD){
00577 check( loc_table_frame = xsh_localize_obj( NULL,
00578 instrument, loc_obj_par, NULL, NULL));
00579 }
00580 if( (loc_obj_par->method != LOC_MANUAL_METHOD) ||
00581 (nb_raw_frames == 1 && crh_single_par->nb_iter > 0)){
00582 xsh_msg("Preliminary sky subtraction for CRH single or localize auto");
00583 xsh_msg("Sky will be put back later");
00584
00585 sprintf(sky_tag,"%s_TMP_SKY_%s",rec_prefix,
00586 xsh_instrument_arm_tostring(instrument));
00587
00588 check( sub_sky_frame = xsh_subtract_sky_single( rmbkg, order_tab_edges,
00589 slitmap_frame, wavemap_frame,
00590 NULL, NULL,
00591 single_frame_sky_sub_tab_frame,
00592 instrument,
00593 sub_sky_nbkpts1, sky_par,
00594 &sky_frame,
00595 &sky_frame_eso,
00596 sky_tag));
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607 sky_frame_ima=xsh_save_sky_model(rmbkg,sub_sky_frame,sky_tag,instrument,decode_bp);
00608
00609
00610
00611 if( loc_obj_par->method != LOC_MANUAL_METHOD){
00612 xsh_msg("Localize auto");
00613 sprintf(rec_name,"%s_%s_%s.fits",
00614 rec_prefix,XSH_ORDER2D,
00615 xsh_instrument_arm_tostring(instrument));
00616
00617
00618
00619 check( rect_frame = xsh_rectify( sub_sky_frame, order_tab_edges,
00620 wave_tab, model_config_frame,
00621 instrument, rectify_par,
00622 spectralformat_frame, disp_tab_frame,
00623 rec_name, NULL, NULL,rec_prefix));
00624
00625
00626 check( loc_table_frame = xsh_localize_obj( rect_frame, instrument,
00627 loc_obj_par, NULL, NULL));
00628 }
00629
00630 check( clean_frame = xsh_check_remove_crh_single( nb_raw_frames, sub_sky_frame,
00631 crh_single_par, wavemap_frame, instrument, rec_prefix));
00632
00633
00634
00635 {
00636 char * obj_nocrh_tag = NULL ;
00637 char * obj_nocrh_name = NULL ;
00638
00639 obj_nocrh_tag = xsh_stringcat_any("OBJ_AND_SKY_NOCRH_",
00640 xsh_instrument_arm_tostring(instrument),
00641 NULL) ;
00642 obj_nocrh_name = xsh_stringcat_any("OBJ_AND_SKY_NOCRH_",
00643 xsh_instrument_arm_tostring(instrument),
00644 ".fits",NULL) ;
00645
00646 check( pre_sci = xsh_pre_load( clean_frame, instrument));
00647
00648 strcpy(sky_name,cpl_frame_get_filename(sky_frame_ima));
00649 check(sky_image=cpl_image_load(sky_name,CPL_TYPE_FLOAT,0,0));
00650 check(cpl_image_add(pre_sci->data,sky_image));
00651
00652 check(clean_obj=xsh_pre_save(pre_sci, obj_nocrh_name, obj_nocrh_tag, 1));
00653
00654 XSH_FREE( obj_nocrh_tag ) ;
00655 XSH_FREE( obj_nocrh_name ) ;
00656 xsh_pre_free( &pre_sci);
00657 }
00658
00659
00660 } else {
00661
00662 check( clean_obj=cpl_frame_duplicate(rmbkg));
00663 }
00664 #endif
00665
00666
00667