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