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, 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 - [If STD is in catal] Flux calibrated merged 2D spectrum (Tag = PREFIX_FLUXCAL2D_arm)\n\
00124 - [If STD is in catal] Flux calibrated merged 1D spectrum (Tag = PREFIX_FLUXCAL1D_arm)\n\
00125 - [If STD is in catal] The efficiency (Tag = EFFICIENCY_SLIT_arm)\n\
00126 - where PREFIX is SCI, FLUX, TELL if input raw DPR.TYPE contains OBJECT or FLUX or TELLURIC";
00127
00128
00129
00130
00131
00140
00141
00142 int cpl_plugin_get_info(cpl_pluginlist *list) {
00143 cpl_recipe *recipe = NULL;
00144 cpl_plugin *plugin = NULL;
00145
00146 recipe = cpl_calloc(1, sizeof(*recipe));
00147 if ( recipe == NULL ){
00148 return -1;
00149 }
00150
00151 plugin = &recipe->interface ;
00152
00153 cpl_plugin_init(plugin,
00154 CPL_PLUGIN_API,
00155 XSH_BINARY_VERSION,
00156 CPL_PLUGIN_TYPE_RECIPE,
00157 RECIPE_ID,
00158 xsh_respon_slit_stare_description_short,
00159 xsh_respon_slit_stare_description,
00160 RECIPE_AUTHOR,
00161 RECIPE_CONTACT,
00162 xsh_get_license(),
00163 xsh_respon_slit_stare_create,
00164 xsh_respon_slit_stare_exec,
00165 xsh_respon_slit_stare_destroy);
00166
00167 cpl_pluginlist_append(list, plugin);
00168
00169 return (cpl_error_get_code() != CPL_ERROR_NONE);
00170 }
00171
00172
00182
00183
00184 static int xsh_respon_slit_stare_create(cpl_plugin *plugin){
00185 cpl_recipe *recipe = NULL;
00186 cpl_parameter* p=NULL;
00187 xsh_clipping_param crh_clip_param = {5.0, 5, 0.7, 0, 0.3};
00188 xsh_remove_crh_single_param crh_single = {0.1, 5,2.0, 4} ;
00189
00190 xsh_rectify_param rectify = { "default",
00191 CPL_KERNEL_DEFAULT,
00192 4,
00193 -1.0,
00194 -1.0,
00195 1,
00196 0, 0.} ;
00197
00198
00199 xsh_subtract_sky_single_param sky_single = {3000, 3000,7,20, 5., -1, -1,
00200 BSPLINE_METHOD, FINE,7, 1.5,
00201 0.0, 0.0,
00202 0.0, 0.0} ;
00203
00204
00205
00206 xsh_localize_obj_param loc_obj =
00207 {10, 0.1, 0, 0, LOC_MANUAL_METHOD, 0, 2.0,3,3,FALSE};
00208 xsh_extract_param extract_par = { LOCALIZATION_METHOD};
00209
00210 xsh_opt_extract_param opt_extract_par =
00211 { 5, 10, 10, 0.01, 10.0, 1., 2, 2, GAUSS_METHOD };
00212
00213
00214 opt_extract_par.oversample = 5;
00215 opt_extract_par.box_hsize = 10;
00216 opt_extract_par.chunk_size = 50;
00217 opt_extract_par.lambda_step = 0.02;
00218 opt_extract_par.clip_kappa = 3;
00219 opt_extract_par.clip_frac = 0.4;
00220 opt_extract_par.clip_niter = 2;
00221 opt_extract_par.niter = 1;
00222 opt_extract_par.method = GAUSS_METHOD;
00223
00224
00225 xsh_init();
00226
00227
00228 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00229
00230
00231 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00232 CPL_ERROR_TYPE_MISMATCH,
00233 "Plugin is not a recipe");
00234
00235 recipe = (cpl_recipe *)plugin;
00236
00237
00238 recipe->parameters = cpl_parameterlist_new();
00239 assure( recipe->parameters != NULL,
00240 CPL_ERROR_ILLEGAL_OUTPUT,
00241 "Memory allocation failed!");
00242
00243
00244 check( xsh_parameters_generic( RECIPE_ID, recipe->parameters ) ) ;
00245
00246 check( xsh_parameters_pre_overscan( RECIPE_ID, recipe->parameters ) ) ;
00247
00248
00249 check(xsh_parameters_clipping_crh_create(RECIPE_ID,recipe->parameters,
00250 crh_clip_param));
00251
00252
00253 check(xsh_parameters_background_create(RECIPE_ID,recipe->parameters));
00254 check(p=xsh_parameters_find(recipe->parameters,RECIPE_ID,"background-method"));
00255 cpl_parameter_set_default_string(p,"poly");
00256
00257
00258
00259 check(xsh_parameters_remove_crh_single_create(RECIPE_ID,recipe->parameters,
00260 crh_single )) ;
00261
00262
00263 check(xsh_parameters_rectify_create(RECIPE_ID,recipe->parameters,
00264 rectify )) ;
00265
00266
00267 check(xsh_parameters_localize_obj_create(RECIPE_ID,recipe->parameters,
00268 loc_obj )) ;
00269
00270
00271 check(xsh_parameters_subtract_sky_single_create(RECIPE_ID,recipe->parameters,
00272 sky_single )) ;
00273
00274
00275 check(xsh_parameters_extract_create(RECIPE_ID,
00276 recipe->parameters,
00277 extract_par,LOCALIZATION_METHOD )) ;
00278
00279 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00280 "do-optextract", FALSE,
00281 "TRUE if we do the optimal extraction"));
00282
00283 check( xsh_parameters_opt_extract_create( RECIPE_ID, recipe->parameters,
00284 opt_extract_par));
00285
00286 check(xsh_parameters_merge_ord_create(RECIPE_ID,
00287 recipe->parameters,
00288 WEIGHTED_MERGE_METHOD)) ;
00289
00290
00291 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00292 "do-flatfield", TRUE,
00293 "TRUE if we do the flatfielding"));
00294
00295 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00296 "compute-map", TRUE,
00297 "if TRUE recompute (wave and slit) maps from the dispersion solution. Use FALSE only if you are sure to have wave and slit maps better than what this recipe may compute. If sky-subtract is set to TRUE this must be set to TRUE."));
00298
00299 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00300 "trace-obj", FALSE,
00301 "if TRUE compute object position trace via Gaussian fit."));
00302
00303 cleanup:
00304 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
00305 xsh_error_dump(CPL_MSG_ERROR);
00306 return 1;
00307 }
00308 else {
00309 return 0;
00310 }
00311 }
00312
00313
00319
00320
00321 static int xsh_respon_slit_stare_exec(cpl_plugin *plugin) {
00322 cpl_recipe *recipe = NULL;
00323
00324
00325
00326 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00327
00328
00329 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00330 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00331
00332 recipe = (cpl_recipe *)plugin;
00333
00334
00335 xsh_respon_slit_stare(recipe->parameters, recipe->frames);
00336
00337 cleanup:
00338 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00339 xsh_error_dump(CPL_MSG_ERROR);
00340 xsh_error_reset();
00341 return 1;
00342 }
00343 else {
00344 return 0;
00345 }
00346 }
00347
00348
00354
00355 static int xsh_respon_slit_stare_destroy(cpl_plugin *plugin)
00356 {
00357 cpl_recipe *recipe = NULL;
00358
00359
00360 xsh_error_reset();
00361
00362 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00363
00364
00365 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00366 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00367
00368 recipe = (cpl_recipe *)plugin;
00369
00370 xsh_free_parameterlist(&recipe->parameters);
00371
00372 cleanup:
00373 if (cpl_error_get_code() != CPL_ERROR_NONE)
00374 {
00375 return 1;
00376 }
00377 else
00378 {
00379 return 0;
00380 }
00381 }
00382
00383 static cpl_error_code
00384 xsh_params_set_defaults(cpl_parameterlist* pars,
00385 const char* rec_id,
00386 xsh_instrument* inst,
00387 xsh_rectify_param * rectify_par,
00388 xsh_background_param* backg)
00389 {
00390 cpl_parameter* p=NULL;
00391 check(p=xsh_parameters_find(pars,RECIPE_ID,"background-radius-x"));
00392 if(cpl_parameter_get_int(p) <= 0) {
00393 if (xsh_instrument_get_arm(inst) == XSH_ARM_NIR){
00394 backg->radius_x=1;
00395 } else {
00396 backg->radius_x=2;
00397 }
00398 }
00399 check(xsh_rectify_params_set_defaults(pars,rec_id,inst,rectify_par));
00400 cleanup:
00401
00402 return cpl_error_get_code();
00403 }
00404
00405
00406 static cpl_error_code
00407 xsh_params_monitor(xsh_background_param* backg,
00408 xsh_rectify_param * rectify_par,
00409 xsh_localize_obj_param * loc_obj_par,
00410 xsh_opt_extract_param *opt_extract_par,
00411 int sub_sky_nbkpts1,
00412 int sub_sky_nbkpts2)
00413 {
00414
00415
00416 xsh_msg_dbg_low("bkg params: sampley=%d radius_y=%d smooth_y=%d",
00417 backg->sampley,backg->radius_y,backg->smooth_y);
00418
00419 xsh_msg_dbg_low("bkg params: radius_x=%d smooth_x=%d",
00420 backg->radius_x,backg->smooth_x);
00421
00422 xsh_msg_dbg_low("rectify params: radius=%g bin_lambda=%g bin_space=%g",
00423 rectify_par->rectif_radius,rectify_par->rectif_bin_lambda,
00424 rectify_par->rectif_bin_space);
00425
00426 xsh_msg_dbg_low("localize params: chunk_nb=%d nod_step=%g",
00427 loc_obj_par->loc_chunk_nb,loc_obj_par->nod_step);
00428
00429 xsh_msg_dbg_low("opt extract params: chunk_size=%d lambda_step=%g box_hsize=%d",
00430 opt_extract_par->chunk_size,opt_extract_par->lambda_step,
00431 opt_extract_par->box_hsize);
00432
00433 xsh_msg_dbg_low("sky params: nbkpts1=%d nbkpts2=%d",
00434 sub_sky_nbkpts1,sub_sky_nbkpts2);
00435
00436 return cpl_error_get_code();
00437
00438 }
00439
00440
00448
00449 static cpl_error_code
00450 xsh_respon_slit_stare(cpl_parameterlist* parameters,
00451 cpl_frameset* frameset)
00452 {
00453 const char* recipe_tags[2] = {XSH_STD_FLUX_SLIT_STARE,XSH_STD_TELL_SLIT_STARE};
00454 int recipe_tags_size = 2;
00455
00456
00457 cpl_frameset* raws = NULL;
00458 cpl_frameset* calib = NULL;
00459
00460
00461 cpl_frame * bpmap = NULL;
00462 cpl_frame * master_bias = NULL;
00463 cpl_frame * master_dark = NULL;
00464 cpl_frame * master_flat = NULL;
00465 cpl_frame * order_tab_edges = NULL;
00466 cpl_frame * wave_tab = NULL ;
00467 cpl_frame * model_config_frame = NULL ;
00468 cpl_frame * wavemap_frame = NULL ;
00469 cpl_frame * slitmap_frame = NULL ;
00470 cpl_frame * disp_tab_frame = NULL;
00471 cpl_frame * spectralformat_frame = NULL ;
00472 cpl_frame * fluxcal_1D_frame = NULL ;
00473 cpl_frame * fluxcal_2D_frame = NULL ;
00474 cpl_frame * fluxcal_rect_1D_frame = NULL ;
00475 cpl_frame * fluxcal_rect_2D_frame = NULL ;
00476
00477 cpl_frame* sky_list_frame=NULL;
00478 cpl_frame* qc_sky_frame=NULL;
00479
00480
00481 xsh_clipping_param* crh_clipping_par = NULL;
00482 xsh_background_param* backg_par = NULL;
00483 xsh_remove_crh_single_param * crh_single_par = NULL ;
00484 cpl_frame* high_abs_win=NULL;
00485 xsh_rectify_param * rectify_par = NULL ;
00486 xsh_localize_obj_param * loc_obj_par = NULL ;
00487 int sub_sky_nbkpts1 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00490 int sub_sky_nbkpts2 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00494 int do_sub_sky = FALSE;
00495 int recipe_use_model = 0 ;
00496 int do_optextract = 0;
00497 int do_flatfield = 0;
00498 int do_compute_map = 0 ;
00499 int do_trace_obj = 0;
00500
00501
00502 xsh_merge_param * merge_par = NULL;
00503 xsh_extract_param *extract_par = NULL ;
00504 xsh_subtract_sky_single_param *sky_par = NULL;
00505
00506 xsh_instrument* instrument = NULL;
00507 int nb_raw_frames ;
00508 char rec_name[80];
00509
00510
00511 cpl_frame * std_flux_frame = NULL ;
00513 cpl_frame * rmbias = NULL;
00514 cpl_frame * rmdark = NULL;
00515 cpl_frame * rmbkg = NULL ;
00516 cpl_frame * div_frame = NULL ;
00517 cpl_frame * sub_sky_frame = NULL ;
00518 cpl_frame * sub_sky2_frame = NULL ;
00521 cpl_frame * rect_frame = NULL ;
00522 cpl_frame * loc_table_frame = NULL ;
00523 cpl_frame * clean_frame = NULL ;
00524 cpl_frame * rect2_frame = NULL ;
00525 cpl_frame * rect2_frame_eso = NULL ;
00526 cpl_frame * rect2_frame_tab = NULL ;
00527
00528 cpl_frame * rect2_sky_frame = NULL ;
00529 cpl_frame * rect2_sky_frame_eso = NULL ;
00530 cpl_frame * rect2_sky_frame_tab = NULL ;
00531
00532
00533 cpl_frame * rect_eff_frame_eso = NULL ;
00534 cpl_frame * rect_frame_tab = NULL ;
00535 cpl_frame * rect_eff_frame_tab = NULL ;
00537 cpl_frame * div_clean_frame = NULL ;
00538 cpl_frame * tell_frame = NULL ;
00539 cpl_frame * res_1D_frame = NULL ;
00541
00542 cpl_frame * sky_frame = NULL ;
00543 cpl_frame * sky_frame_eso = NULL ;
00545 cpl_frame * response_frame = NULL ;
00546 cpl_frame * mresponse_frame = NULL ;
00547 cpl_frame * response_ord_frame = NULL ;
00548 cpl_frame* sky_frame_ima=NULL;
00549 cpl_frame* clean_obj=NULL;
00550
00551 cpl_frame * ext_frame = NULL ;
00552 cpl_frame * ext_frame_eso = NULL ;
00553
00554 cpl_frame *orderext1d_frame = NULL;
00555 cpl_frame *orderoxt1d_frame = NULL;
00556 cpl_frame *orderoxt1d_eso_frame = NULL;
00557
00558 cpl_frame *mergeext1d_frame = NULL;
00559 cpl_frame *mergeoxt1d_frame = NULL;
00560
00561
00562 char file_name[80];
00563 char file_tag[80];
00564 char arm_str[8] ;
00565
00566 char prefix[80];
00567 double exptime = 1. ;
00568 cpl_frame* grid_backg=NULL;
00569 cpl_frame* frame_backg=NULL;
00570 cpl_frame* res_2D_frame=NULL;
00571 cpl_frame* res_2D_sky_frame=NULL;
00572
00573 char* rec_prefix=NULL;
00574 char sky_prefix[80];
00575
00576 cpl_frame* frm_atmext=NULL;
00577 cpl_frame* frm_std_cat=NULL;
00578 cpl_frame* frm_eff=NULL;
00579
00580
00581 cpl_frame* eff_frame=NULL;
00582 cpl_frame* rect_eff_frame=NULL;
00583 cpl_frame* ext_eff_frame=NULL;
00584 cpl_frame* ext_eff_frame2=NULL;
00585 int pre_overscan_corr=0;
00586 cpl_frame* single_frame_sky_sub_tab_frame=NULL;
00587 xsh_opt_extract_param *opt_extract_par = NULL;
00588 cpl_frame *fluxcal_rect_opt1D_frame = NULL;
00589 cpl_frame *fluxcal_merg_opt1D_frame = NULL;
00590 cpl_frame *qc_subex_frame = NULL;
00591 cpl_frame *qc_s2ddiv1d_frame = NULL;
00592 cpl_frame *qc_model_frame = NULL;
00593 cpl_frame *qc_weight_frame = NULL;
00594
00595
00596
00597
00598 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00599 recipe_tags, recipe_tags_size,
00600 RECIPE_ID, XSH_BINARY_VERSION,
00601 xsh_respon_slit_stare_description_short ) ) ;
00602
00603 XSH_ASSURE_NOT_NULL( instrument);
00604 assure( instrument->mode == XSH_MODE_SLIT, CPL_ERROR_ILLEGAL_INPUT,
00605 "Instrument NOT in Slit Mode" ) ;
00606
00607 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00608 if(instrument->arm == XSH_ARM_NIR) {
00609 xsh_instrument_nir_corr_if_JH(raws,instrument);
00610 }
00611 sprintf( arm_str, "%s", xsh_instrument_arm_tostring(instrument) ) ;
00612
00613
00614
00615
00616
00617 check( nb_raw_frames = cpl_frameset_get_size( raws));
00618 xsh_msg_dbg_low("nb_raw_frames=%d",nb_raw_frames);
00619
00620 XSH_ASSURE_NOT_ILLEGAL_MSG( nb_raw_frames == 1,
00621 "Pls provide a STD FLUX frame in input");
00622
00623 check( pre_overscan_corr = xsh_parameters_get_int( parameters, RECIPE_ID,
00624 "pre-overscan-corr"));
00625
00626 check(xsh_slit_stare_get_calibs(calib,instrument, &spectralformat_frame,
00627 &master_bias,&master_dark,&master_flat,
00628 &order_tab_edges,&model_config_frame,
00629 &wave_tab,&sky_list_frame,&qc_sky_frame,
00630 &bpmap,&single_frame_sky_sub_tab_frame,
00631 &wavemap_frame,&slitmap_frame,RECIPE_ID,
00632 &recipe_use_model,pre_overscan_corr));
00633
00634 if((mresponse_frame=xsh_find_frame_with_tag(calib,XSH_MRESPONSE_MERGE1D_SLIT,
00635 instrument)) != NULL ) {
00636 xsh_msg("Using the master response curve to flux calibrate the spectrum");
00637 }
00638
00639
00640
00641 frm_atmext=xsh_find_frame_with_tag(calib,XSH_ATMOS_EXT,instrument);
00642 if(frm_atmext==NULL) {
00643 xsh_msg_error("Provide atmospheric extinction frame");
00644 return CPL_ERROR_DATA_NOT_FOUND;
00645 }
00646
00647 frm_std_cat=xsh_find_frame_with_tag(calib,XSH_FLUX_STD_CAT,instrument);
00648 if(frm_std_cat==NULL) {
00649 xsh_msg_error("Provide std star catalog frame");
00650 return CPL_ERROR_DATA_NOT_FOUND;
00651 }
00652 high_abs_win=xsh_find_frame_with_tag(calib,XSH_HIGH_ABS_WIN,instrument);
00653
00654
00655 if(NULL == (disp_tab_frame = xsh_find_disp_tab( calib, instrument))) {
00656 xsh_msg("To compute efficiency, you must provide a DISP_TAB_ARM input");
00657 }
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670 check(xsh_slit_stare_get_params(parameters,RECIPE_ID, &pre_overscan_corr,
00671 &crh_clipping_par,&backg_par,&loc_obj_par,
00672 &rectify_par,&crh_single_par,&sub_sky_nbkpts1,
00673 &do_flatfield,&sub_sky_nbkpts2,&sky_par,
00674 &extract_par,&do_optextract,&merge_par,
00675 &opt_extract_par,&do_trace_obj));
00676
00677
00678 check(xsh_params_set_defaults(parameters,RECIPE_ID,instrument,rectify_par,
00679 backg_par));
00680 check( xsh_parameters_dosky_domap_get( RECIPE_ID, parameters,
00681 wavemap_frame, slitmap_frame,
00682 &do_sub_sky,
00683 &do_compute_map));
00684
00685
00686
00687 if ( xsh_instrument_get_arm(instrument) != XSH_ARM_NIR) {
00688 check(xsh_stare_params_bin_scale(raws,backg_par,
00689 opt_extract_par,
00690 &sub_sky_nbkpts1,&sub_sky_nbkpts2));
00691 }
00692
00693
00694 if ( do_compute_map && recipe_use_model == FALSE){
00695 check( disp_tab_frame = xsh_find_disp_tab( calib, instrument));
00696 }
00697
00698 check(xsh_params_monitor(backg_par,rectify_par,loc_obj_par,opt_extract_par,
00699 sub_sky_nbkpts1,sub_sky_nbkpts2));
00700
00701
00702
00703
00704
00705 xsh_msg( "Calling xsh_prepare" ) ;
00706 check( xsh_prepare( raws, bpmap, master_bias, XSH_STD_FLUX_SLIT_STARE,
00707 instrument,pre_overscan_corr));
00708
00709 check(rec_prefix = xsh_set_recipe_file_prefix(raws,
00710 "xsh_respon_slit_stare"));
00711
00712 xsh_msg( "Calling xsh_find_std_flux" ) ;
00713 check_msg( std_flux_frame = xsh_find_std_flux( raws ),
00714 "Pls provide a STD FLUX telluric" ) ;
00715
00716 {
00717 xsh_pre * xpre = NULL ;
00718 check( xpre = xsh_pre_load( std_flux_frame, instrument ) ) ;
00719 exptime = xpre->exptime ;
00720 xsh_msg_dbg_medium( "EXPTIME: %lf", exptime ) ;
00721
00722 xsh_pre_free( &xpre ) ;
00723 }
00724
00725 check(xsh_slit_stare_get_maps(calib,
00726 do_compute_map,recipe_use_model,rec_prefix,
00727 instrument,model_config_frame,std_flux_frame,
00728 disp_tab_frame,order_tab_edges,
00729 &wavemap_frame, &slitmap_frame));
00730 sprintf(prefix,"%s",rec_prefix);
00731
00732
00733
00734 check( rmbias = xsh_check_subtract_bias( std_flux_frame, master_bias,
00735 instrument, "STD_FLUX_",pre_overscan_corr,0));
00736
00737
00738
00739 check( rmdark = xsh_check_subtract_dark( rmbias, master_dark,
00740 instrument, "STD_FLUX_STARE_DARK"));
00741
00742
00743 xsh_msg("Subtract inter-order background");
00744 check( rmbkg = xsh_subtract_background( rmdark,
00745 order_tab_edges,
00746 backg_par,instrument,rec_prefix,
00747 &grid_backg,&frame_backg,0));
00748
00749
00750
00751 check(xsh_slit_stare_correct_crh_and_sky(loc_obj_par,crh_single_par,
00752 rectify_par,
00753 do_sub_sky,rec_prefix,rmbkg,
00754 order_tab_edges, slitmap_frame,
00755 wavemap_frame,model_config_frame,
00756 single_frame_sky_sub_tab_frame,
00757 instrument,sub_sky_nbkpts1, sky_par,
00758 &sky_frame,&sky_frame_eso,
00759 &sky_frame_ima,
00760 wave_tab,disp_tab_frame,
00761 spectralformat_frame,nb_raw_frames,
00762 &loc_table_frame,&clean_frame,
00763 &clean_obj));
00764
00765 xsh_free_frame(&rmbkg);
00766
00767
00768 check( div_frame = xsh_check_divide_flat( do_flatfield, clean_obj,
00769 master_flat, instrument, prefix));
00770
00771 check( sub_sky2_frame = xsh_check_subtract_sky_single( do_sub_sky, div_frame,
00772 order_tab_edges, slitmap_frame, wavemap_frame, loc_table_frame, NULL,
00773 single_frame_sky_sub_tab_frame, instrument, sub_sky_nbkpts2, sky_par,
00774 &sky_frame, &sky_frame_eso, &sky_frame_ima, rec_prefix));
00775
00776
00777 check( div_clean_frame = cpl_frame_duplicate( sub_sky2_frame ) ) ;
00778
00779 xsh_msg( "Prepare S2D products" ) ;
00780 xsh_msg( "Rectify") ;
00781 sprintf(rec_name,"%s_%s_%s.fits",rec_prefix,XSH_ORDER2D,
00782 xsh_instrument_arm_tostring( instrument));
00783
00784 check( rect2_frame = xsh_rectify( sub_sky2_frame, order_tab_edges,
00785 wave_tab, model_config_frame, instrument,
00786 rectify_par,spectralformat_frame,
00787 disp_tab_frame,rec_name,
00788 &rect2_frame_eso,&rect2_frame_tab,rec_prefix));
00789
00790 if(sky_frame_ima) {
00791
00792 sprintf(sky_prefix,xsh_set_recipe_sky_file_prefix(rec_prefix));
00793 sprintf(rec_name,"%s_%s_%s.fits",sky_prefix,XSH_ORDER2D,
00794 xsh_instrument_arm_tostring( instrument));
00795
00796 check( rect2_sky_frame = xsh_rectify( sky_frame_ima, order_tab_edges,
00797 wave_tab, model_config_frame, instrument,
00798 rectify_par,spectralformat_frame,
00799 disp_tab_frame,rec_name,
00800 &rect2_sky_frame_eso,&rect2_sky_frame_tab,
00801 sky_prefix));
00802
00803 }
00804 xsh_msg( "Extract" ) ;
00805 check(ext_frame=xsh_extract(rect2_frame, loc_table_frame,
00806 instrument, extract_par,&ext_frame_eso,
00807 rec_prefix)) ;
00808
00809 xsh_msg( "Merge orders with 1D frame" ) ;
00810 check( res_1D_frame = xsh_merge_ord( ext_frame, instrument,
00811 merge_par,rec_prefix));
00812 check(xsh_monitor_spectrum1D_flux(res_1D_frame,instrument));
00813
00814
00815 xsh_msg( "Calling xsh_merge_ord with 2D frame" ) ;
00816 check( res_2D_frame = xsh_merge_ord( rect2_frame, instrument,
00817 merge_par,rec_prefix));
00818 if(rect2_sky_frame) {
00819 check( res_2D_sky_frame = xsh_merge_ord( rect2_sky_frame, instrument,
00820 merge_par,sky_prefix));
00821 }
00822 xsh_msg("Prepare S1D products" ) ;
00823
00824
00825 if ( do_optextract){
00826 xsh_msg( "Optimal extraction");
00827 check( xsh_opt_extract( sub_sky2_frame, order_tab_edges,
00828 wave_tab, model_config_frame, wavemap_frame,
00829 slitmap_frame, loc_table_frame,
00830 spectralformat_frame, master_flat, instrument,
00831 opt_extract_par, rec_prefix,
00832 &orderext1d_frame, &orderoxt1d_frame,
00833 &orderoxt1d_eso_frame,
00834 &qc_subex_frame,
00835 &qc_s2ddiv1d_frame,
00836 &qc_model_frame,
00837 &qc_weight_frame));
00838
00839 check( mergeext1d_frame = xsh_merge_ord( orderext1d_frame, instrument,
00840 merge_par,rec_prefix));
00841 check( mergeoxt1d_frame = xsh_merge_ord( orderoxt1d_frame, instrument,
00842 merge_par,rec_prefix));
00843 }
00844
00845
00846
00847 xsh_msg( "Calling xsh_mark_tell (TBW)" ) ;
00848
00849 check( tell_frame = cpl_frame_duplicate( ext_frame ) ) ;
00850
00851
00852 if(frm_std_cat!=NULL && frm_atmext!=NULL) {
00853 xsh_msg( "Calling xsh_compute_response" ) ;
00854 cpl_frame* frame_ord_by_ord=NULL;
00855 cpl_frame* frame_merged=NULL;
00856
00857 if ( do_optextract){
00858 frame_ord_by_ord=orderoxt1d_eso_frame;
00859 frame_merged= mergeoxt1d_frame;
00860 } else {
00861 frame_ord_by_ord=ext_frame_eso;
00862 frame_merged=res_1D_frame;
00863 }
00864 if( (response_ord_frame = xsh_compute_response_ord(frame_ord_by_ord,
00865 frm_std_cat,
00866 frm_atmext,
00867 high_abs_win,
00868 instrument,
00869 exptime )) == NULL) {
00870 xsh_msg_warning("Some error occurred computing response frame. Recover from it.");
00871 xsh_print_rec_status(0);
00872 cpl_error_reset();
00873 }
00874
00875 if( (response_frame = xsh_compute_response(frame_merged,
00876 frm_std_cat,
00877 frm_atmext,
00878 high_abs_win,
00879 instrument,
00880 exptime )) == NULL) {
00881 xsh_msg_warning("Some error occurred computing response frame. Recover from it.");
00882 xsh_print_rec_status(0);
00883 cpl_error_reset();
00884 } else {
00885
00886 check(xsh_frame_table_monitor_flux_qc(response_frame,"LAMBDA",
00887 "RESPONSE","RESP",instrument));
00888 }
00889 }
00890 if(mresponse_frame != NULL) {
00891 check(xsh_flux_calibrate(rect2_frame_eso,ext_frame_eso,frm_atmext,
00892 mresponse_frame,merge_par,instrument,rec_prefix,
00893 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00894 &fluxcal_2D_frame,&fluxcal_1D_frame));
00895
00896 if ( do_optextract){
00897
00898 check(xsh_flux_calibrate1D(orderoxt1d_eso_frame,frm_atmext,
00899 mresponse_frame,merge_par,instrument,rec_prefix,
00900 &fluxcal_rect_opt1D_frame,
00901 &fluxcal_merg_opt1D_frame));
00902
00903 }
00904
00905 }
00906 else if(mresponse_frame == NULL && response_frame != NULL) {
00907
00908 check(xsh_flux_calibrate(rect2_frame_eso,ext_frame_eso,frm_atmext,
00909 response_frame,merge_par,instrument,rec_prefix,
00910 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00911 &fluxcal_2D_frame,&fluxcal_1D_frame));
00912
00913 if ( do_optextract){
00914
00915 check(xsh_flux_calibrate1D(orderoxt1d_eso_frame,frm_atmext,
00916 response_frame,merge_par,instrument,rec_prefix,
00917 &fluxcal_rect_opt1D_frame,
00918 &fluxcal_merg_opt1D_frame));
00919
00920 }
00921 }
00922
00923
00924 if(response_ord_frame != NULL && disp_tab_frame != NULL) {
00925 int conserve_flux=rectify_par->conserve_flux;
00926 xsh_msg( "Calling xsh_multiply_flat" ) ;
00927 sprintf(file_tag,"SLIT_STARE_NOCRH_NOT_FF_%s",arm_str) ;
00928 if(do_flatfield) {
00929 check( eff_frame = xsh_multiply_flat( div_clean_frame, master_flat,
00930 file_tag, instrument ) ) ;
00931 } else {
00932 check(eff_frame=cpl_frame_duplicate(div_clean_frame));
00933 }
00934 sprintf(file_name,"%s_EFF_%s_%s.fits",rec_prefix,XSH_ORDER2D,
00935 xsh_instrument_arm_tostring(instrument));
00936 rectify_par->conserve_flux=1;
00937
00938 check( rect_eff_frame = xsh_rectify( eff_frame,
00939 order_tab_edges,
00940 wave_tab,
00941 model_config_frame,
00942 instrument,
00943 rectify_par,
00944 spectralformat_frame,
00945 disp_tab_frame,
00946 file_name,
00947 &rect_eff_frame_eso,
00948 &rect_eff_frame_tab,
00949 rec_prefix));
00950 xsh_msg( "Calling xsh_extract" ) ;
00951 check( ext_eff_frame = xsh_extract(rect_eff_frame,loc_table_frame,
00952 instrument,extract_par,
00953 &ext_eff_frame2,rec_prefix)) ;
00954 xsh_msg("name %s",cpl_frame_get_filename(ext_eff_frame2));
00955
00956 frm_eff=xsh_compute_efficiency(ext_eff_frame2,frm_std_cat,
00957 frm_atmext,high_abs_win,instrument);
00958 rectify_par->conserve_flux=conserve_flux;
00959
00960 }
00961 if(model_config_frame) {
00962 xsh_compute_resampling_accuracy(wavemap_frame,slitmap_frame,order_tab_edges,model_config_frame,res_2D_frame,instrument);
00963 }
00964 xsh_msg( "Save products.");
00965 if(response_ord_frame!=NULL) {
00966 check( xsh_add_product_table(response_ord_frame,frameset,parameters,
00967 RECIPE_ID,instrument,NULL));
00968
00969 check( xsh_add_product_table(response_frame,frameset,parameters,
00970 RECIPE_ID,instrument,NULL));
00971 }
00972
00973 check( xsh_add_product_image(rect2_frame_eso, frameset, parameters,
00974 RECIPE_ID, instrument,NULL));
00975
00976 check( xsh_add_product_image(ext_frame_eso, frameset, parameters,
00977 RECIPE_ID, instrument,NULL));
00978
00979 check( xsh_add_product_spectrum(res_2D_frame, frameset, parameters,
00980 RECIPE_ID, instrument));
00981
00982 check( xsh_add_product_spectrum(res_1D_frame, frameset, parameters,
00983 RECIPE_ID, instrument));
00984
00985 if(res_2D_sky_frame) {
00986 check( xsh_add_product_spectrum( res_2D_sky_frame, frameset, parameters,
00987 RECIPE_ID, instrument));
00988 }
00989 if(fluxcal_2D_frame != NULL) {
00990
00991
00992 check( xsh_add_product_image( fluxcal_rect_2D_frame, frameset, parameters,
00993 RECIPE_ID, instrument,NULL));
00994
00995 check( xsh_add_product_image( fluxcal_rect_1D_frame, frameset, parameters,
00996 RECIPE_ID, instrument,NULL));
00997
00998 check( xsh_add_product_spectrum( fluxcal_2D_frame, frameset, parameters,
00999 RECIPE_ID, instrument));
01000
01001 check( xsh_add_product_spectrum( fluxcal_1D_frame, frameset, parameters,
01002 RECIPE_ID, instrument));
01003
01004 if ( do_optextract){
01005
01006 check( xsh_add_product_image( fluxcal_rect_opt1D_frame, frameset,
01007 parameters, RECIPE_ID, instrument,NULL));
01008
01009 check( xsh_add_product_spectrum( fluxcal_merg_opt1D_frame, frameset,
01010 parameters, RECIPE_ID, instrument));
01011 check( xsh_add_product_image( qc_subex_frame, frameset, parameters,
01012 RECIPE_ID, instrument,
01013 cpl_frame_get_tag(qc_subex_frame)));
01014 check( xsh_add_product_image( qc_s2ddiv1d_frame, frameset, parameters,
01015 RECIPE_ID, instrument,
01016 cpl_frame_get_tag(qc_s2ddiv1d_frame)));
01017 check( xsh_add_product_image( qc_model_frame, frameset, parameters,
01018 RECIPE_ID, instrument,
01019 cpl_frame_get_tag(qc_model_frame)));
01020 check( xsh_add_product_image( qc_weight_frame, frameset, parameters,
01021 RECIPE_ID, instrument,
01022 cpl_frame_get_tag(qc_weight_frame)));
01023
01024 }
01025
01026 }
01027
01028 if(frm_eff!=NULL) {
01029 check(xsh_add_product_table(frm_eff, frameset,parameters,
01030 RECIPE_ID, instrument,NULL));
01031 }
01032
01033 cleanup:
01034
01035 xsh_end( RECIPE_ID, frameset, parameters );
01036 XSH_FREE(crh_clipping_par);
01037 XSH_FREE(rec_prefix);
01038
01039 XSH_FREE( backg_par ) ;
01040 XSH_FREE( crh_single_par ) ;
01041 XSH_FREE( rectify_par ) ;
01042 XSH_FREE( loc_obj_par ) ;
01043 XSH_FREE( sky_par ) ;
01044 XSH_FREE( extract_par ) ;
01045 XSH_FREE( opt_extract_par ) ;
01046 XSH_FREE( merge_par ) ;
01047 xsh_instrument_free(&instrument );
01048
01049 xsh_free_frameset( &raws);
01050 xsh_free_frameset( &calib);
01051 xsh_free_frame( &rmbias);
01052 xsh_free_frame( &rmdark);
01053 xsh_free_frame( &rmbkg);
01054
01055 xsh_free_frame( &div_frame);
01056 xsh_free_frame( &wavemap_frame);
01057 xsh_free_frame( &slitmap_frame);
01058 xsh_free_frame( &sky_frame);
01059 xsh_free_frame( &sky_frame_eso);
01060 xsh_free_frame( &sky_frame_ima);
01061
01062 xsh_free_frame( &sub_sky_frame);
01063 xsh_free_frame( &sub_sky2_frame);
01064 xsh_free_frame( &rect_frame_tab) ;
01065 xsh_free_frame( &rect_frame) ;
01066
01067 xsh_free_frame(&rect2_frame) ;
01068 xsh_free_frame(&rect2_frame_eso) ;
01069 xsh_free_frame(&rect2_frame_tab) ;
01070
01071 xsh_free_frame(&rect2_sky_frame) ;
01072 xsh_free_frame(&rect2_sky_frame_eso) ;
01073 xsh_free_frame(&rect2_sky_frame_tab) ;
01074
01075
01076 xsh_free_frame( &loc_table_frame) ;
01077 xsh_free_frame( &response_frame) ;
01078 xsh_free_frame( &response_ord_frame) ;
01079
01080 xsh_free_frame(& eff_frame);
01081 xsh_free_frame(& rect_eff_frame);
01082 xsh_free_frame(& rect_eff_frame_eso);
01083 xsh_free_frame(& rect_eff_frame_tab);
01084 xsh_free_frame(& ext_eff_frame);
01085 xsh_free_frame(& ext_eff_frame2);
01086 xsh_free_frame(&fluxcal_rect_1D_frame) ;
01087 xsh_free_frame(&fluxcal_rect_2D_frame) ;
01088 xsh_free_frame(&fluxcal_1D_frame) ;
01089 xsh_free_frame(&fluxcal_2D_frame) ;
01090
01091 xsh_free_frame( &ext_frame ) ;
01092 xsh_free_frame( &frm_eff ) ;
01093 xsh_free_frame( &ext_frame_eso ) ;
01094 xsh_free_frame( &clean_frame) ;
01095 xsh_free_frame( &div_clean_frame) ;
01096 xsh_free_frame( &clean_obj) ;
01097 xsh_free_frame( &res_1D_frame) ;
01098 xsh_free_frame( &res_2D_frame) ;
01099 xsh_free_frame(&res_2D_sky_frame) ;
01100
01101 xsh_free_frame( &tell_frame ) ;
01102 xsh_free_frame( &grid_backg ) ;
01103 xsh_free_frame( &frame_backg ) ;
01104 xsh_free_frame( &qc_subex_frame);
01105 xsh_free_frame(&qc_s2ddiv1d_frame);
01106 xsh_free_frame(&qc_model_frame);
01107 xsh_free_frame(&qc_weight_frame);
01108
01109
01110
01111
01112 return CPL_ERROR_NONE;
01113 }
01114