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
00038
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <xsh_error.h>
00050
00051 #include <xsh_utils_scired_slit.h>
00052 #include <xsh_model_utils.h>
00053 #include <xsh_utils.h>
00054 #include <xsh_utils_table.h>
00055 #include <xsh_msg.h>
00056
00057 #include <xsh_dfs.h>
00058
00059 #include <xsh_drl.h>
00060 #include <xsh_drl_check.h>
00061 #include <xsh_pfits.h>
00062 #include <xsh_data_spectrum1D.h>
00063 #include <xsh_model_arm_constants.h>
00064 #include <xsh_parameters.h>
00065
00066
00067 #include <cpl.h>
00068
00069
00070
00071
00072
00073
00074
00075 #define RECIPE_ID "xsh_respon_slit_stare"
00076 #define RECIPE_AUTHOR "P.Goldoni, L.Guglielmi, R. Haigron, F. Royer, D. Bramich, A. Modigliani"
00077 #define RECIPE_CONTACT "amodigli@eso.org "
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 static int xsh_respon_slit_stare_create(cpl_plugin *);
00088 static int xsh_respon_slit_stare_exec(cpl_plugin *);
00089 static int xsh_respon_slit_stare_destroy(cpl_plugin *);
00090
00091
00092 static cpl_error_code xsh_respon_slit_stare(cpl_parameterlist *, cpl_frameset *);
00093
00094
00095
00096
00097 static char xsh_respon_slit_stare_description_short[] =
00098 "Compute the response function in SLIT stare mode";
00099
00100 static char xsh_respon_slit_stare_description[] =
00101 "This recipe computes the response function for arm\n\
00102 Input Frames : \n\
00103 - A RAW frame (Tag = STD_FLUX_SLIT_STARE_arm, Type = RAW)\n\
00104 - [UVB,VIS] A master bias frame (Tag = MASTER_BIAS_arm, Type = PRE)\n\
00105 - A master dark frame (Tag = MASTER_DARK_arm Type = PRE)\n\
00106 - A master flat frame (Tag = MASTER_FLAT_SLIT_arm Type = PRE)\n\
00107 - An order table frame(Tag = ORDER_TAB_EDGES_arm Type = ORD)\n\
00108 - A wave solution frame(Tag = WAVE_TAB_2D_arm, Type = WAV)\n\
00109 - [OPTIONAL] Table with dispersion coefficients (Tag = DISP_TAB_arm)\n\
00110 - [OPTIONAL] A badpixel map (Tag = BADPIXEL_MAP_arm, Type = QUP)\n\
00111 - [OPTIONAL] A telluric mask (Tag = TELL_MASK_arm Type = LIN)\n\
00112 - A standard star fluxes catalog (Tag = STD_STAR_CATALOG_arm Type = FLX)\n\
00113 - An atmospheric extinction table (Tag = ATMOS_EXT_arm)\n\
00114 - [OPTIONAL] An master response curve table (Tag = MRESPONSE_MERGE1D_SLIT_arm)\n\
00115 if provided this is the one used to flux calibrate the spectra\n\
00116 Products : \n\
00117 - [If STD is in catal] The response ord-by-ord function (Tag = PREFIX_RESPONSE_ORDER1D_SLIT_arm)\n\
00118 - [If STD is in catal] The response merged function (Tag = PREFIX_RESPONSE_MERGE1D_SLIT_arm)\n\
00119 - The extracted 2D specturm (Tag = PREFIX_ORDER2D_arm)\n\
00120 - The extracted 1D specturm (Tag = PREFIX_ORDER1D_arm)\n\
00121 - The merged 2D specturm (Tag = PREFIX_MERGE2D_arm)\n\
00122 - The merged 1D specturm (Tag = PREFIX_MERGE1D_arm)\n\
00123 - The merged 2D sky frame (Tag = SLY_SLIT_MERGED2D)\n\
00124 - [If STD is in catal] Flux calibrated merged 2D spectrum (Tag = PREFIX_FLUX_ORDER2D_arm)\n\
00125 - [If STD is in catal] Flux calibrated merged 1D spectrum (Tag = PREFIX_FLUX_ORDER1D_arm)\n\
00126 - [If STD is in catal] Flux calibrated merged 2D spectrum (Tag = PREFIX_FLUX_MERGE2D_arm)\n\
00127 - [If STD is in catal] Flux calibrated merged 1D spectrum (Tag = PREFIX_FLUX_MERGE1D_arm)\n\
00128 - [If STD is in catal] The efficiency (Tag = EFFICIENCY_SLIT_arm)\n\
00129 - where PREFIX is SCI, FLUX, TELL if input raw DPR.TYPE contains OBJECT or FLUX or TELLURIC";
00130
00131
00132
00133
00134
00143
00144
00145 int cpl_plugin_get_info(cpl_pluginlist *list) {
00146 cpl_recipe *recipe = NULL;
00147 cpl_plugin *plugin = NULL;
00148
00149 recipe = cpl_calloc(1, sizeof(*recipe));
00150 if ( recipe == NULL ){
00151 return -1;
00152 }
00153
00154 plugin = &recipe->interface ;
00155
00156 cpl_plugin_init(plugin,
00157 CPL_PLUGIN_API,
00158 XSH_BINARY_VERSION,
00159 CPL_PLUGIN_TYPE_RECIPE,
00160 RECIPE_ID,
00161 xsh_respon_slit_stare_description_short,
00162 xsh_respon_slit_stare_description,
00163 RECIPE_AUTHOR,
00164 RECIPE_CONTACT,
00165 xsh_get_license(),
00166 xsh_respon_slit_stare_create,
00167 xsh_respon_slit_stare_exec,
00168 xsh_respon_slit_stare_destroy);
00169
00170 cpl_pluginlist_append(list, plugin);
00171
00172 return (cpl_error_get_code() != CPL_ERROR_NONE);
00173 }
00174
00175
00185
00186
00187 static int xsh_respon_slit_stare_create(cpl_plugin *plugin){
00188 cpl_recipe *recipe = NULL;
00189
00190 xsh_remove_crh_single_param crh_single = {0.1, 20,2.0, 4} ;
00191
00192 xsh_rectify_param rectify = { "tanh",
00193 CPL_KERNEL_DEFAULT,
00194 2,
00195 -1.0,
00196 -1.0,
00197 1,
00198 0, 0.} ;
00199
00200
00201 xsh_subtract_sky_single_param sky_single = {3000, 3000,7,20, 5., -1, -1,
00202 MEDIAN_METHOD, FINE,7, 1.5,
00203 0.0, 0.0,
00204 0.0, 0.0} ;
00205
00206
00207
00208 xsh_localize_obj_param loc_obj =
00209 {10, 0.1, 0, 0, LOC_MANUAL_METHOD, 0, 2.0,3,3,FALSE};
00210
00211 xsh_opt_extract_param opt_extract_par =
00212 { 5, 10, 10, 0.01, 10.0, 1., 2, 2, GAUSS_METHOD };
00213
00214 xsh_interpolate_bp_param ipol_par = {30 };
00215
00216 opt_extract_par.oversample = 5;
00217 opt_extract_par.box_hsize = 10;
00218 opt_extract_par.chunk_size = 50;
00219 opt_extract_par.lambda_step = 0.02;
00220 opt_extract_par.clip_kappa = 3;
00221 opt_extract_par.clip_frac = 0.4;
00222 opt_extract_par.clip_niter = 2;
00223 opt_extract_par.niter = 1;
00224 opt_extract_par.method = GAUSS_METHOD;
00225
00226
00227 xsh_init();
00228
00229
00230 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00231
00232
00233 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00234 CPL_ERROR_TYPE_MISMATCH,
00235 "Plugin is not a recipe");
00236
00237 recipe = (cpl_recipe *)plugin;
00238
00239
00240 recipe->parameters = cpl_parameterlist_new();
00241 assure( recipe->parameters != NULL,
00242 CPL_ERROR_ILLEGAL_OUTPUT,
00243 "Memory allocation failed!");
00244
00245
00246 check( xsh_parameters_generic( RECIPE_ID, recipe->parameters ) ) ;
00247 xsh_parameters_decode_bp(RECIPE_ID,recipe->parameters,-1);
00248 check( xsh_parameters_pre_overscan( RECIPE_ID, recipe->parameters ) ) ;
00249
00250
00251
00252 check(xsh_parameters_background_create(RECIPE_ID,recipe->parameters));
00253
00254
00255 check(xsh_parameters_remove_crh_single_create(RECIPE_ID,recipe->parameters,
00256 crh_single )) ;
00257
00258
00259 check(xsh_parameters_rectify_create(RECIPE_ID,recipe->parameters,
00260 rectify )) ;
00261
00262
00263 check(xsh_parameters_localize_obj_create(RECIPE_ID,recipe->parameters,
00264 loc_obj )) ;
00265
00266
00267 check(xsh_parameters_subtract_sky_single_create(RECIPE_ID,recipe->parameters,
00268 sky_single )) ;
00269
00270
00271 check(xsh_parameters_interpolate_bp_create(RECIPE_ID,
00272 recipe->parameters,ipol_par)) ;
00273
00274 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00275 "do-optextract", FALSE,
00276 "TRUE if we do the optimal extraction"));
00277
00278 check( xsh_parameters_opt_extract_create( RECIPE_ID, recipe->parameters,
00279 opt_extract_par));
00280
00281
00282
00283
00284
00285
00286 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00287 "correct-tellurics", TRUE,
00288 "TRUE if during response computation we apply telluric correction"));
00289
00290 cleanup:
00291 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
00292 xsh_error_dump(CPL_MSG_ERROR);
00293 return 1;
00294 }
00295 else {
00296 return 0;
00297 }
00298 }
00299
00300
00306
00307
00308 static int xsh_respon_slit_stare_exec(cpl_plugin *plugin) {
00309 cpl_recipe *recipe = NULL;
00310
00311
00312
00313 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00314
00315
00316 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00317 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00318
00319 recipe = (cpl_recipe *)plugin;
00320
00321
00322 xsh_respon_slit_stare(recipe->parameters, recipe->frames);
00323
00324 cleanup:
00325 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00326 xsh_error_dump(CPL_MSG_ERROR);
00327 xsh_error_reset();
00328 return 1;
00329 }
00330 else {
00331 return 0;
00332 }
00333 }
00334
00335
00341
00342 static int xsh_respon_slit_stare_destroy(cpl_plugin *plugin)
00343 {
00344 cpl_recipe *recipe = NULL;
00345
00346
00347 xsh_error_reset();
00348
00349 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00350
00351
00352 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00353 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00354
00355 recipe = (cpl_recipe *)plugin;
00356
00357 xsh_free_parameterlist(&recipe->parameters);
00358
00359 cleanup:
00360 if (cpl_error_get_code() != CPL_ERROR_NONE)
00361 {
00362 return 1;
00363 }
00364 else
00365 {
00366 return 0;
00367 }
00368 }
00369
00370
00371 static cpl_error_code
00372 xsh_params_monitor(xsh_background_param* backg,
00373 xsh_rectify_param * rectify_par,
00374 xsh_localize_obj_param * loc_obj_par,
00375 xsh_opt_extract_param *opt_extract_par,
00376 int sub_sky_nbkpts1,
00377 int sub_sky_nbkpts2)
00378 {
00379
00380
00381
00382 xsh_msg_dbg_low("rectify params: radius=%g bin_lambda=%g bin_space=%g",
00383 rectify_par->rectif_radius,rectify_par->rectif_bin_lambda,
00384 rectify_par->rectif_bin_space);
00385
00386 xsh_msg_dbg_low("localize params: chunk_nb=%d nod_step=%g",
00387 loc_obj_par->loc_chunk_nb,loc_obj_par->nod_step);
00388
00389 xsh_msg_dbg_low("opt extract params: chunk_size=%d lambda_step=%g box_hsize=%d",
00390 opt_extract_par->chunk_size,opt_extract_par->lambda_step,
00391 opt_extract_par->box_hsize);
00392
00393 xsh_msg_dbg_low("sky params: nbkpts1=%d nbkpts2=%d",
00394 sub_sky_nbkpts1,sub_sky_nbkpts2);
00395
00396 return cpl_error_get_code();
00397
00398 }
00399
00400
00408
00409 static cpl_error_code
00410 xsh_respon_slit_stare(cpl_parameterlist* parameters,
00411 cpl_frameset* frameset)
00412 {
00413 const char* recipe_tags[2] = {XSH_STD_FLUX_SLIT_STARE,XSH_STD_TELL_SLIT_STARE};
00414 int recipe_tags_size = 2;
00415
00416
00417 cpl_frameset* raws = NULL;
00418 cpl_frameset* calib = NULL;
00419
00420
00421 cpl_frame * bpmap = NULL;
00422 cpl_frame * master_bias = NULL;
00423 cpl_frame * master_dark = NULL;
00424 cpl_frame * master_flat = NULL;
00425 cpl_frame * order_tab_edges = NULL;
00426 cpl_frame * wave_tab = NULL ;
00427 cpl_frame * model_config_frame = NULL ;
00428 cpl_frame * wavemap_frame = NULL ;
00429 cpl_frame * slitmap_frame = NULL ;
00430 cpl_frame * disp_tab_frame = NULL;
00431 cpl_frame * spectralformat_frame = NULL ;
00432 cpl_frame * fluxcal_1D_frame = NULL ;
00433 cpl_frame * fluxcal_2D_frame = NULL ;
00434 cpl_frame * fluxcal_rect_1D_frame = NULL ;
00435 cpl_frame * fluxcal_rect_2D_frame = NULL ;
00436
00437 cpl_frame* sky_list_frame=NULL;
00438 cpl_frame* qc_sky_frame=NULL;
00439
00440
00441 xsh_background_param* backg_par = NULL;
00442 xsh_remove_crh_single_param * crh_single_par = NULL ;
00443 cpl_frame* high_abs_win=NULL;
00444 xsh_rectify_param * rectify_par = NULL ;
00445 xsh_localize_obj_param * loc_obj_par = NULL ;
00446 int sub_sky_nbkpts1 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00449 int sub_sky_nbkpts2 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00453 int do_sub_sky = FALSE;
00454 int recipe_use_model = 0 ;
00455 int do_optextract = 0;
00456 int do_flatfield = 1;
00457 int do_compute_map = 0 ;
00458
00459 xsh_extract_param extract_par = { LOCALIZATION_METHOD};
00460
00461
00462 xsh_subtract_sky_single_param *sky_par = NULL;
00463
00464 xsh_instrument* instrument = NULL;
00465 int nb_raw_frames ;
00466 char rec_name[256];
00467
00468
00469 cpl_frame * std_flux_frame = NULL ;
00471 cpl_frame * rmbias = NULL;
00472 cpl_frame * rmdark = NULL;
00473 cpl_frame * rmbkg = NULL ;
00474 cpl_frame * div_frame = NULL ;
00475 cpl_frame * sub_sky_frame = NULL ;
00476 cpl_frame * sub_sky2_frame = NULL ;
00479 cpl_frame * rect_frame = NULL ;
00480 cpl_frame * loc_table_frame = NULL ;
00481 cpl_frame * clean_frame = NULL ;
00482 cpl_frame * rect2_frame = NULL ;
00483 cpl_frame * rect2_frame_eso = NULL ;
00484 cpl_frame * rect2_frame_tab = NULL ;
00485
00486 cpl_frame * rect2_sky_frame = NULL ;
00487 cpl_frame * rect2_sky_frame_eso = NULL ;
00488 cpl_frame * rect2_sky_frame_tab = NULL ;
00489
00490
00491 cpl_frame * rect_eff_frame_eso = NULL ;
00492 cpl_frame * rect_frame_tab = NULL ;
00493 cpl_frame * rect_eff_frame_tab = NULL ;
00495 cpl_frame * div_clean_frame = NULL ;
00496 cpl_frame * tell_frame = NULL ;
00497 cpl_frame * res_1D_frame = NULL ;
00499
00500 cpl_frame * sky_frame = NULL ;
00501 cpl_frame * sky_frame_eso = NULL ;
00503 cpl_frame * response_frame = NULL ;
00504 cpl_frame * mresponse_frame = NULL ;
00505 cpl_frame * response_ord_frame = NULL ;
00506 cpl_frame* sky_frame_ima=NULL;
00507 cpl_frame* clean_obj=NULL;
00508
00509 cpl_frame * ext_frame = NULL ;
00510 cpl_frame * ext_frame_eso = NULL ;
00511
00512 cpl_frame *orderext1d_frame = NULL;
00513 cpl_frame *orderoxt1d_frame = NULL;
00514 cpl_frame *orderoxt1d_eso_frame = NULL;
00515
00516 cpl_frame *mergeoxt1d_frame = NULL;
00517
00518
00519
00520 char file_name[256];
00521 char file_tag[256];
00522 char arm_str[8] ;
00523
00524 char prefix[256];
00525 double exptime = 1. ;
00526 cpl_frame* grid_backg=NULL;
00527 cpl_frame* frame_backg=NULL;
00528 cpl_frame* res_2D_frame=NULL;
00529 cpl_frame* res_2D_sky_frame=NULL;
00530
00531 char* rec_prefix=NULL;
00532 char sky_prefix[256];
00533
00534 cpl_frame* frm_atmext=NULL;
00535 cpl_frame* frm_std_cat=NULL;
00536 cpl_frame* frm_eff=NULL;
00537
00538
00539 cpl_frame* eff_frame=NULL;
00540 cpl_frame* rect_eff_frame=NULL;
00541 cpl_frame* ext_eff_frame=NULL;
00542 cpl_frame* ext_eff_frame2=NULL;
00543 int pre_overscan_corr=0;
00544 cpl_frame* single_frame_sky_sub_tab_frame=NULL;
00545 xsh_opt_extract_param *opt_extract_par = NULL;
00546 cpl_frame *fluxcal_rect_opt1D_frame = NULL;
00547 cpl_frame *fluxcal_merg_opt1D_frame = NULL;
00548 cpl_frame *qc_subex_frame = NULL;
00549 cpl_frame *qc_s2ddiv1d_frame = NULL;
00550 cpl_frame *qc_model_frame = NULL;
00551 cpl_frame *qc_weight_frame = NULL;
00552 cpl_frame* tell_mod_cat=NULL;
00553 cpl_frame* rm_crh = NULL;
00554 cpl_frame* frame_ord_by_ord=NULL;
00555 cpl_frame* frame_merged=NULL;
00556
00557 char ftag[256];
00558 char fname[256];
00559
00560 int merge_par=0;
00561 xsh_interpolate_bp_param *ipol_bp=NULL;
00562 int corr_tell=0;
00563
00564
00565
00566
00567 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00568 recipe_tags, recipe_tags_size,
00569 RECIPE_ID, XSH_BINARY_VERSION,
00570 xsh_respon_slit_stare_description_short ) ) ;
00571
00572
00573
00574 XSH_ASSURE_NOT_NULL( instrument);
00575 assure( instrument->mode == XSH_MODE_SLIT, CPL_ERROR_ILLEGAL_INPUT,
00576 "Instrument NOT in Slit Mode" ) ;
00577
00578 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00579 if(instrument->arm == XSH_ARM_NIR) {
00580 xsh_calib_nir_corr_if_JH(calib,instrument,RECIPE_ID);
00581 xsh_instrument_nir_corr_if_JH(raws,instrument);
00582 xsh_calib_nir_respon_corr_if_JH(calib,instrument);
00583 }
00584 sprintf( arm_str, "%s", xsh_instrument_arm_tostring(instrument) ) ;
00585
00586
00587
00588
00589
00590
00591 check(xsh_slit_stare_get_params(parameters,RECIPE_ID, &pre_overscan_corr,
00592 &backg_par,&loc_obj_par,
00593 &rectify_par,&crh_single_par,&sub_sky_nbkpts1,
00594 &do_flatfield,&sub_sky_nbkpts2,&sky_par,
00595 &do_optextract,
00596 &opt_extract_par));
00597
00598 rectify_par->conserve_flux=FALSE;
00599 check(ipol_bp = xsh_parameters_interpolate_bp_get(RECIPE_ID,parameters));
00600
00601 check(xsh_rectify_params_set_defaults(parameters,RECIPE_ID,instrument,rectify_par));
00602
00603 check( do_sub_sky = xsh_parameters_subtract_sky_single_get_true( RECIPE_ID,
00604 parameters));
00605 if ( (do_sub_sky && !do_compute_map) &&
00606 (wavemap_frame == NULL || slitmap_frame == NULL) ) {
00607 xsh_msg_warning( "sky-subtract is true but wave,slits maps missing create them");
00608 do_compute_map = TRUE;
00609
00610 }
00611
00612
00613
00614 if ( xsh_instrument_get_arm(instrument) != XSH_ARM_NIR) {
00615 check(xsh_stare_params_bin_scale(raws,backg_par,
00616 opt_extract_par,
00617 &sub_sky_nbkpts1,&sub_sky_nbkpts2));
00618 }
00619
00620
00621 check(xsh_params_monitor(backg_par,rectify_par,loc_obj_par,opt_extract_par,
00622 sub_sky_nbkpts1,sub_sky_nbkpts2));
00623
00624 check( pre_overscan_corr = xsh_parameters_get_int( parameters, RECIPE_ID,
00625 "pre-overscan-corr"));
00626
00627
00628 check( corr_tell = xsh_parameters_get_boolean( parameters, RECIPE_ID,
00629 "correct-tellurics"));
00630
00631
00632
00633
00634
00635
00636 check( nb_raw_frames = cpl_frameset_get_size( raws));
00637 xsh_msg_dbg_low("nb_raw_frames=%d",nb_raw_frames);
00638
00639 XSH_ASSURE_NOT_ILLEGAL_MSG( nb_raw_frames == 1,
00640 "Pls provide a STD FLUX frame in input");
00641
00642
00643
00644
00645
00646
00647
00648 xsh_msg( "Calling xsh_prepare" ) ;
00649 check( xsh_prepare( raws, bpmap, master_bias, XSH_STD_FLUX_SLIT_STARE,
00650 instrument,pre_overscan_corr,CPL_TRUE));
00651
00652 check(rec_prefix = xsh_set_recipe_file_prefix(raws,
00653 "xsh_respon_slit_stare"));
00654
00655
00656
00657
00658
00659
00660
00661 check(xsh_frameset_uniform_bin(&raws, &calib,instrument));
00662
00663
00664 check(xsh_slit_stare_get_calibs(calib,instrument, &spectralformat_frame,
00665 &master_bias,&master_dark,&master_flat,
00666 &order_tab_edges,&model_config_frame,
00667 &wave_tab,&sky_list_frame,&qc_sky_frame,
00668 &bpmap,&single_frame_sky_sub_tab_frame,
00669 &wavemap_frame,&slitmap_frame,RECIPE_ID,
00670 &recipe_use_model,pre_overscan_corr));
00671
00672 if((mresponse_frame=xsh_find_frame_with_tag(calib,XSH_MRESPONSE_MERGE1D_SLIT,
00673 instrument)) != NULL ) {
00674 xsh_msg("Using the master response curve to flux calibrate the spectrum");
00675 }
00676
00677
00678
00679 frm_atmext=xsh_find_frame_with_tag(calib,XSH_ATMOS_EXT,instrument);
00680 if(frm_atmext==NULL) {
00681 xsh_msg_error("Provide atmospheric extinction frame");
00682 return CPL_ERROR_DATA_NOT_FOUND;
00683 }
00684
00685 frm_std_cat=xsh_find_frame_with_tag(calib,XSH_FLUX_STD_CAT,instrument);
00686 if(frm_std_cat==NULL) {
00687 xsh_msg_error("Provide std star catalog frame");
00688 return CPL_ERROR_DATA_NOT_FOUND;
00689 }
00690 high_abs_win=xsh_find_frame_with_tag(calib,XSH_HIGH_ABS_WIN,instrument);
00691 tell_mod_cat=xsh_find_frame_with_tag(calib,XSH_TELL_MOD_CAT,instrument);
00692
00693
00694 if(NULL == (disp_tab_frame = xsh_find_disp_tab( calib, instrument))) {
00695 xsh_msg("To compute efficiency, you must provide a DISP_TAB_ARM input");
00696 }
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709 if ( do_compute_map && recipe_use_model == FALSE){
00710 check( disp_tab_frame = xsh_find_disp_tab( calib, instrument));
00711 }
00712
00713
00714
00715
00716
00717
00718
00719
00720 xsh_msg( "Calling xsh_find_std_flux" ) ;
00721 check_msg( std_flux_frame = xsh_find_std_flux( raws ),
00722 "Pls provide a STD FLUX telluric" ) ;
00723
00724 {
00725 xsh_pre * xpre = NULL ;
00726 check( xpre = xsh_pre_load( std_flux_frame, instrument ) ) ;
00727 exptime = xpre->exptime ;
00728 xsh_msg_dbg_medium( "EXPTIME: %lf", exptime ) ;
00729
00730 xsh_pre_free( &xpre ) ;
00731 }
00732
00733 check(xsh_slit_stare_get_maps(calib,
00734 do_compute_map,recipe_use_model,rec_prefix,
00735 instrument,model_config_frame,std_flux_frame,
00736 disp_tab_frame,order_tab_edges,
00737 &wavemap_frame, &slitmap_frame));
00738 sprintf(prefix,"%s",rec_prefix);
00739
00740 check( rmbias = xsh_check_subtract_bias( std_flux_frame, master_bias,
00741 instrument, "STD_FLUX_",pre_overscan_corr,1));
00742
00743
00744
00745 check( rmdark = xsh_check_subtract_dark( rmbias, master_dark,
00746 instrument, "STD_FLUX_STARE_DARK"));
00747
00748
00749
00750 sprintf(ftag,"%s_STD_NO_CRH_%s",rec_prefix,xsh_instrument_arm_tostring(instrument));
00751 sprintf(fname,"%s.fits",ftag) ;
00752 rm_crh = xsh_remove_crh_single(rmdark,instrument,crh_single_par,ftag) ;
00753 xsh_add_temporary_file(fname);
00754
00755
00756
00757 xsh_msg("Subtract inter-order background");
00758 check( rmbkg = xsh_subtract_background( rm_crh,
00759 order_tab_edges,
00760 backg_par,instrument,rec_prefix,
00761 &grid_backg,&frame_backg,0,0,0));
00762
00763
00764
00765 check(xsh_slit_stare_correct_crh_and_sky(loc_obj_par,crh_single_par,
00766 rectify_par,
00767 do_sub_sky,rec_prefix,rmbkg,
00768 order_tab_edges, slitmap_frame,
00769 wavemap_frame,model_config_frame,
00770 single_frame_sky_sub_tab_frame,
00771 instrument,sub_sky_nbkpts1, sky_par,
00772 &sky_frame,&sky_frame_eso,
00773 &sky_frame_ima,
00774 wave_tab,disp_tab_frame,
00775 spectralformat_frame,nb_raw_frames,
00776 &loc_table_frame,&clean_frame,
00777 &clean_obj,1
00778 ));
00779 xsh_free_frame(&rmbkg);
00780
00781
00782 check( div_frame = xsh_check_divide_flat( do_flatfield, clean_obj,
00783 master_flat, instrument, prefix));
00784 xsh_add_temporary_file(cpl_frame_get_filename(div_frame));
00785 check( sub_sky2_frame = xsh_check_subtract_sky_single( do_sub_sky, div_frame,
00786 order_tab_edges, slitmap_frame, wavemap_frame, loc_table_frame, NULL,
00787 single_frame_sky_sub_tab_frame, instrument, sub_sky_nbkpts2, sky_par,
00788 &sky_frame, &sky_frame_eso, &sky_frame_ima, rec_prefix,1));
00789
00790 xsh_add_temporary_file(cpl_frame_get_filename(slitmap_frame));
00791 xsh_add_temporary_file(cpl_frame_get_filename(wavemap_frame));
00792 xsh_add_temporary_file(cpl_frame_get_filename(sub_sky2_frame));
00793
00794 if(do_sub_sky) {
00795 xsh_add_temporary_file(cpl_frame_get_filename(sky_frame_ima));
00796 }
00797
00798
00799 check( div_clean_frame = cpl_frame_duplicate( sub_sky2_frame ) ) ;
00800
00801 xsh_msg( "Prepare S2D products" ) ;
00802 xsh_msg( "Rectify") ;
00803 sprintf(rec_name,"%s_%s_%s.fits",rec_prefix,XSH_ORDER2D,
00804 xsh_instrument_arm_tostring( instrument));
00805
00806 check( rect2_frame = xsh_rectify( sub_sky2_frame, order_tab_edges,
00807 wave_tab, model_config_frame, instrument,
00808 rectify_par,spectralformat_frame,
00809 disp_tab_frame,rec_name,
00810 &rect2_frame_eso,&rect2_frame_tab,rec_prefix));
00811
00812 if(sky_frame_ima) {
00813
00814 sprintf(sky_prefix,xsh_set_recipe_sky_file_prefix(rec_prefix));
00815 sprintf(rec_name,"%s_%s_%s.fits",sky_prefix,XSH_ORDER2D,
00816 xsh_instrument_arm_tostring( instrument));
00817
00818 check( rect2_sky_frame = xsh_rectify( sky_frame_ima, order_tab_edges,
00819 wave_tab, model_config_frame, instrument,
00820 rectify_par,spectralformat_frame,
00821 disp_tab_frame,rec_name,
00822 &rect2_sky_frame_eso,&rect2_sky_frame_tab,
00823 sky_prefix));
00824 xsh_add_temporary_file(cpl_frame_get_filename(rect2_sky_frame_eso));
00825 }
00826 xsh_msg( "Extract" ) ;
00827 check(ext_frame=xsh_extract_clean(rect2_frame, loc_table_frame,
00828 instrument, &extract_par,ipol_bp,&ext_frame_eso,
00829 rec_prefix)) ;
00830
00831 xsh_msg( "Merge orders with 1D frame" ) ;
00832 check( res_1D_frame = xsh_merge_ord( ext_frame, instrument,
00833 merge_par,rec_prefix));
00834 check(xsh_monitor_spectrum1D_flux(res_1D_frame,instrument));
00835
00836
00837 xsh_msg( "Calling xsh_merge_ord with 2D frame" ) ;
00838 check( res_2D_frame = xsh_merge_ord( rect2_frame, instrument,
00839 merge_par,rec_prefix));
00840 if(rect2_sky_frame) {
00841 check( res_2D_sky_frame = xsh_merge_ord( rect2_sky_frame, instrument,
00842 merge_par,sky_prefix));
00843 }
00844 xsh_msg("Prepare S1D products" ) ;
00845
00846
00847 if ( do_optextract){
00848 xsh_msg( "Optimal extraction");
00849 check( xsh_opt_extract( sub_sky2_frame, order_tab_edges,
00850 wave_tab, model_config_frame, wavemap_frame,
00851 slitmap_frame, loc_table_frame,
00852 spectralformat_frame, master_flat, instrument,
00853 opt_extract_par, rec_prefix,
00854 &orderext1d_frame, &orderoxt1d_frame,
00855 &orderoxt1d_eso_frame,
00856 &qc_subex_frame,
00857 &qc_s2ddiv1d_frame,
00858 &qc_model_frame,
00859 &qc_weight_frame));
00860
00861
00862
00863
00864 check( mergeoxt1d_frame = xsh_merge_ord( orderoxt1d_frame, instrument,
00865 merge_par,rec_prefix));
00866 }
00867
00868
00869
00870 xsh_msg( "Calling xsh_mark_tell (TBW)" ) ;
00871
00872 check( tell_frame = cpl_frame_duplicate( ext_frame ) ) ;
00873
00874
00875 if(frm_std_cat!=NULL && frm_atmext!=NULL) {
00876 xsh_msg( "Calling xsh_compute_response" ) ;
00877
00878
00879 if ( do_optextract){
00880 frame_ord_by_ord=orderoxt1d_eso_frame;
00881 frame_merged= mergeoxt1d_frame;
00882 } else {
00883 frame_ord_by_ord=ext_frame_eso;
00884 frame_merged=res_1D_frame;
00885 }
00886 if( (response_ord_frame = xsh_compute_response_ord(frame_ord_by_ord,
00887 frm_std_cat,
00888 frm_atmext,
00889 high_abs_win,
00890 instrument,
00891 exptime )) == NULL) {
00892 xsh_msg_warning("Some error occurred computing response frame. Recover from it.");
00893 xsh_print_rec_status(0);
00894 cpl_error_reset();
00895 }
00896
00897 if( (response_frame = xsh_compute_response2(frame_merged,
00898 frm_std_cat,
00899 frm_atmext,
00900 high_abs_win,
00901 tell_mod_cat,
00902 instrument,
00903 exptime,corr_tell )) == NULL) {
00904 xsh_msg_warning("Some error occurred computing response frame. Recover from it.");
00905 xsh_print_rec_status(0);
00906 cpl_error_reset();
00907 } else {
00908
00909 check(xsh_frame_table_monitor_flux_qc(response_frame,"LAMBDA",
00910 "RESPONSE","RESP",instrument));
00911 }
00912 }
00913 if(mresponse_frame != NULL) {
00914 check(xsh_flux_calibrate(rect2_frame_eso,ext_frame_eso,frm_atmext,
00915 mresponse_frame,merge_par,instrument,rec_prefix,
00916 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00917 &fluxcal_2D_frame,&fluxcal_1D_frame));
00918
00919 if ( do_optextract){
00920
00921 check(xsh_flux_calibrate1D(orderoxt1d_eso_frame,frm_atmext,
00922 mresponse_frame,merge_par,instrument,rec_prefix,
00923 &fluxcal_rect_opt1D_frame,
00924 &fluxcal_merg_opt1D_frame));
00925
00926 }
00927
00928 }
00929 else if(mresponse_frame == NULL && response_frame != NULL) {
00930
00931 check(xsh_flux_calibrate(rect2_frame_eso,ext_frame_eso,frm_atmext,
00932 response_frame,merge_par,instrument,rec_prefix,
00933 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00934 &fluxcal_2D_frame,&fluxcal_1D_frame));
00935
00936 if ( do_optextract){
00937
00938 check(xsh_flux_calibrate1D(orderoxt1d_eso_frame,frm_atmext,
00939 response_frame,merge_par,instrument,rec_prefix,
00940 &fluxcal_rect_opt1D_frame,
00941 &fluxcal_merg_opt1D_frame));
00942
00943 }
00944 }
00945
00946
00947 if(response_ord_frame != NULL && disp_tab_frame != NULL) {
00948 int conserve_flux=rectify_par->conserve_flux;
00949 xsh_msg( "Calling xsh_multiply_flat" ) ;
00950 sprintf(file_tag,"SLIT_STARE_NOCRH_NOT_FF_%s",arm_str) ;
00951 if(do_flatfield) {
00952 check( eff_frame = xsh_multiply_flat( div_clean_frame, master_flat,
00953 file_tag, instrument ) ) ;
00954 } else {
00955 check(eff_frame=cpl_frame_duplicate(div_clean_frame));
00956 }
00957 sprintf(file_name,"%s_EFF_%s_%s.fits",rec_prefix,XSH_ORDER2D,
00958 xsh_instrument_arm_tostring(instrument));
00959 rectify_par->conserve_flux=1;
00960 xsh_add_temporary_file(file_name);
00961 check( rect_eff_frame = xsh_rectify( eff_frame,
00962 order_tab_edges,
00963 wave_tab,
00964 model_config_frame,
00965 instrument,
00966 rectify_par,
00967 spectralformat_frame,
00968 disp_tab_frame,
00969 file_name,
00970 &rect_eff_frame_eso,
00971 &rect_eff_frame_tab,
00972 rec_prefix));
00973 xsh_msg( "Calling xsh_extract" ) ;
00974 check( ext_eff_frame = xsh_extract_clean(rect_eff_frame,loc_table_frame,
00975 instrument,&extract_par, ipol_bp,
00976 &ext_eff_frame2,rec_prefix)) ;
00977 xsh_msg("name %s",cpl_frame_get_filename(ext_eff_frame2));
00978
00979 frm_eff=xsh_compute_efficiency(ext_eff_frame2,frm_std_cat,
00980 frm_atmext,high_abs_win,instrument);
00981 rectify_par->conserve_flux=conserve_flux;
00982
00983 }
00984
00985 if(model_config_frame!=NULL && wavemap_frame != NULL&& slitmap_frame != NULL) {
00986
00987 check(xsh_compute_resampling_accuracy(wavemap_frame,slitmap_frame,order_tab_edges,model_config_frame,res_2D_frame,instrument));
00988 check(xsh_compute_resampling_accuracy(wavemap_frame,slitmap_frame,order_tab_edges,model_config_frame,rect2_frame_eso,instrument));
00989
00990 check(xsh_compute_wavelength_resampling_accuracy(wavemap_frame,order_tab_edges,model_config_frame,res_1D_frame,instrument));
00991 check(xsh_compute_wavelength_resampling_accuracy(wavemap_frame,order_tab_edges,model_config_frame,ext_frame_eso,instrument));
00992
00993 xsh_add_afc_info(model_config_frame,wavemap_frame);
00994 xsh_add_afc_info(model_config_frame,slitmap_frame);
00995
00996 if(fluxcal_rect_2D_frame != NULL) {
00997
00998 check(xsh_compute_resampling_accuracy(wavemap_frame,slitmap_frame,order_tab_edges,model_config_frame,fluxcal_rect_2D_frame,instrument));
00999 check(xsh_compute_resampling_accuracy(wavemap_frame,slitmap_frame,order_tab_edges,model_config_frame,fluxcal_2D_frame,instrument));
01000
01001 check(xsh_compute_wavelength_resampling_accuracy(wavemap_frame,order_tab_edges,model_config_frame,fluxcal_rect_1D_frame,instrument));
01002 check(xsh_compute_wavelength_resampling_accuracy(wavemap_frame,order_tab_edges,model_config_frame,fluxcal_1D_frame,instrument));
01003
01004 }
01005
01006 if(res_2D_sky_frame) {
01007 check(xsh_compute_resampling_accuracy(wavemap_frame,slitmap_frame,order_tab_edges,model_config_frame,res_2D_sky_frame,instrument));
01008 }
01009
01010 if ( do_sub_sky == 1 ) {
01011 check(xsh_compute_wavelength_resampling_accuracy(wavemap_frame,order_tab_edges,model_config_frame,sky_frame_eso,instrument));
01012 }
01013 }
01014
01015
01016
01017 xsh_msg( "Save products.");
01018 if(response_ord_frame!=NULL) {
01019 check( xsh_add_product_table(response_ord_frame,frameset,parameters,
01020 RECIPE_ID,instrument,NULL));
01021 }
01022
01023 if(response_frame!=NULL) {
01024 check( xsh_add_product_table(response_frame,frameset,parameters,
01025 RECIPE_ID,instrument,NULL));
01026 }
01027
01028 check( xsh_add_product_image(rect2_frame_eso, frameset, parameters,
01029 RECIPE_ID, instrument,NULL));
01030
01031 check( xsh_add_product_image(ext_frame_eso, frameset, parameters,
01032 RECIPE_ID, instrument,NULL));
01033
01034 check( xsh_add_product_spectrum(res_2D_frame, frameset, parameters,
01035 RECIPE_ID, instrument));
01036
01037 check( xsh_add_product_spectrum(res_1D_frame, frameset, parameters,
01038 RECIPE_ID, instrument));
01039
01040 if(res_2D_sky_frame) {
01041 check( xsh_add_product_spectrum( res_2D_sky_frame, frameset, parameters,
01042 RECIPE_ID, instrument));
01043 }
01044 if(fluxcal_2D_frame != NULL) {
01045
01046
01047 check( xsh_add_product_image( fluxcal_rect_2D_frame, frameset, parameters,
01048 RECIPE_ID, instrument,NULL));
01049
01050 check( xsh_add_product_image( fluxcal_rect_1D_frame, frameset, parameters,
01051 RECIPE_ID, instrument,NULL));
01052
01053 check( xsh_add_product_spectrum( fluxcal_2D_frame, frameset, parameters,
01054 RECIPE_ID, instrument));
01055
01056 check( xsh_add_product_spectrum( fluxcal_1D_frame, frameset, parameters,
01057 RECIPE_ID, instrument));
01058
01059 if ( do_optextract){
01060
01061 check( xsh_add_product_image( fluxcal_rect_opt1D_frame, frameset,
01062 parameters, RECIPE_ID, instrument,NULL));
01063
01064 check( xsh_add_product_spectrum( fluxcal_merg_opt1D_frame, frameset,
01065 parameters, RECIPE_ID, instrument));
01066 check( xsh_add_product_image( qc_subex_frame, frameset, parameters,
01067 RECIPE_ID, instrument,
01068 cpl_frame_get_tag(qc_subex_frame)));
01069 check( xsh_add_product_image( qc_s2ddiv1d_frame, frameset, parameters,
01070 RECIPE_ID, instrument,
01071 cpl_frame_get_tag(qc_s2ddiv1d_frame)));
01072 check( xsh_add_product_image( qc_model_frame, frameset, parameters,
01073 RECIPE_ID, instrument,
01074 cpl_frame_get_tag(qc_model_frame)));
01075 check( xsh_add_product_image( qc_weight_frame, frameset, parameters,
01076 RECIPE_ID, instrument,
01077 cpl_frame_get_tag(qc_weight_frame)));
01078
01079 }
01080
01081 }
01082
01083 if(frm_eff!=NULL) {
01084 check(xsh_add_product_table(frm_eff, frameset,parameters,
01085 RECIPE_ID, instrument,NULL));
01086 }
01087
01088 cleanup:
01089
01090 xsh_end( RECIPE_ID, frameset, parameters );
01091 XSH_FREE(rec_prefix);
01092 XSH_FREE(ipol_bp);
01093 XSH_FREE( backg_par ) ;
01094 XSH_FREE( crh_single_par ) ;
01095 XSH_FREE( rectify_par ) ;
01096 XSH_FREE( loc_obj_par ) ;
01097 XSH_FREE( sky_par ) ;
01098 XSH_FREE( opt_extract_par ) ;
01099 xsh_instrument_free(&instrument );
01100
01101 xsh_free_frameset( &raws);
01102 xsh_free_frameset( &calib);
01103 xsh_free_frame( &rmbias);
01104 xsh_free_frame( &rmdark);
01105 xsh_free_frame( &rmbkg);
01106
01107 xsh_free_frame( &rm_crh);
01108 xsh_free_frame( &bpmap);
01109 xsh_free_frame( &div_frame);
01110 xsh_free_frame( &wavemap_frame);
01111 xsh_free_frame( &slitmap_frame);
01112 xsh_free_frame( &sky_frame);
01113 xsh_free_frame( &sky_frame_eso);
01114 xsh_free_frame( &sky_frame_ima);
01115
01116 xsh_free_frame( &sub_sky_frame);
01117 xsh_free_frame( &sub_sky2_frame);
01118 xsh_free_frame( &rect_frame_tab) ;
01119 xsh_free_frame( &rect_frame) ;
01120
01121 xsh_free_frame(&rect2_frame) ;
01122 xsh_free_frame(&rect2_frame_eso) ;
01123 xsh_free_frame(&rect2_frame_tab) ;
01124
01125 xsh_free_frame(&rect2_sky_frame) ;
01126 xsh_free_frame(&rect2_sky_frame_eso) ;
01127 xsh_free_frame(&rect2_sky_frame_tab) ;
01128
01129
01130 xsh_free_frame( &loc_table_frame) ;
01131 xsh_free_frame( &response_frame) ;
01132 xsh_free_frame( &response_ord_frame) ;
01133
01134 xsh_free_frame(& eff_frame);
01135 xsh_free_frame(& rect_eff_frame);
01136 xsh_free_frame(& rect_eff_frame_eso);
01137 xsh_free_frame(& rect_eff_frame_tab);
01138 xsh_free_frame(& ext_eff_frame);
01139 xsh_free_frame(& ext_eff_frame2);
01140 xsh_free_frame(&fluxcal_rect_1D_frame) ;
01141 xsh_free_frame(&fluxcal_rect_2D_frame) ;
01142 xsh_free_frame(&fluxcal_1D_frame) ;
01143 xsh_free_frame(&fluxcal_2D_frame) ;
01144
01145 xsh_free_frame( &ext_frame ) ;
01146 xsh_free_frame( &frm_eff ) ;
01147 xsh_free_frame( &ext_frame_eso ) ;
01148 xsh_free_frame( &clean_frame) ;
01149 xsh_free_frame( &div_clean_frame) ;
01150 xsh_free_frame( &clean_obj) ;
01151 xsh_free_frame( &res_1D_frame) ;
01152 xsh_free_frame( &res_2D_frame) ;
01153 xsh_free_frame(&res_2D_sky_frame) ;
01154
01155 xsh_free_frame( &tell_frame ) ;
01156 xsh_free_frame( &grid_backg ) ;
01157 xsh_free_frame( &frame_backg ) ;
01158 xsh_free_frame( &qc_subex_frame);
01159 xsh_free_frame(&qc_s2ddiv1d_frame);
01160 xsh_free_frame(&qc_model_frame);
01161 xsh_free_frame(&qc_weight_frame);
01162
01163
01164
01165
01166 return CPL_ERROR_NONE;
01167 }
01168