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.h>
00052 #include <xsh_utils_scired_slit.h>
00053 #include <xsh_msg.h>
00054
00055 #include <xsh_dfs.h>
00056 #include <xsh_pfits.h>
00057
00058 #include <xsh_utils_image.h>
00059 #include <xsh_utils_scired_slit.h>
00060 #include <xsh_data_instrument.h>
00061 #include <xsh_data_spectrum1D.h>
00062 #include <xsh_drl_check.h>
00063 #include <xsh_drl.h>
00064 #include <xsh_model_utils.h>
00065
00066 #include <cpl.h>
00067
00068
00069
00070
00071
00072
00073 #define RECIPE_ID "xsh_absorp"
00074 #define RECIPE_AUTHOR "P.Goldoni, L.Guglielmi, R. Haigron, F. Royer, A. Modigliani"
00075 #define RECIPE_CONTACT "regis.haigron@obspm.fr,amodigli@eso.org"
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 static int xsh_absorp_create(cpl_plugin *);
00087 static int xsh_absorp_exec(cpl_plugin *);
00088 static int xsh_absorp_destroy(cpl_plugin *);
00089
00090
00091 static cpl_error_code xsh_absorp(cpl_parameterlist *, cpl_frameset *);
00092
00093
00094
00095
00096 static char xsh_absorp_description_short[] =
00097 "Create a telluric absorption mask";
00098
00099 static char xsh_absorp_description[] =
00100 "This recipe creates a mask corresponding to the positions of telluric absorption\n\
00101 Input Frames : \n\
00102 - A set of n Science frames ( n == 1 or >=3, Tag = STD_TELL_SLIT_STARE_arm)\n\
00103 - A spectral format table (Tag = SPECTRAL_FORMAT_TAB_arm)\n\
00104 - [UVB,VIS] A master bias frame (Tag = MASTER_BIAS_arm)\n\
00105 - [OPTIONAL]A master dark frame (Tag = MASTER_DARK_arm)\n\
00106 - A master flat frame (Tag = MASTER_FLAT_SLIT_arm)\n\
00107 - An order table frame(Tag = ORDER_TAB_EDGES_SLIT_arm)\n\
00108 - [OPTIONAL] A table with dispersion coefficients (Tag = DISP_TAB_arm,\n\
00109 required if rectify-conserve-flux=TRUE or do_wavemap=TRUE and poly mode\n\
00110 - [poly mode] A wave solution frame(Tag = WAVE_TAB_2D_arm)\n\
00111 - [physical model mode] A model cfg table (Format = TABLE, Tag = XSH_MOD_CFG_TAB_arm)\n\
00112 - [OPTIONAL] A table specifying multiplying factor for break points \n\
00113 (Tag = SKY_SUB_BKPTS_arm) to generate\n\
00114 - [OPTIONAL] A badpixel map (Tag = BADPIXEL_MAP_arm)\n\
00115 - [OPTIONAL,physmod mode] A table listing sky line positions (Tag = SKY_LINE_LIST_arm)\n\
00116 this is used to be able to control quality of sky subtraction, for example\n\
00117 projecting guess positions on the product SCI_SLIT_STARE_SUB_SKY_arm\n\
00118 Products : \n\
00119 - TELL_MASK_arm telluric mask\n\
00120 - PREFIX_ORDER2D_arm extracted spectrum, order-by-order, 2D\n\
00121 - PREFIX_ORDER1D_arm extracted spectrum, order-by-order, 1D\n\
00122 - PREFIX_MERGE2D_arm merged spectrum, 2D\n\
00123 - PREFIX_MERGE1D_arm merged spectrum, 1D\n\
00124 - PREFIX_ON_arm bias (dark) subtracted sci frame\n\
00125 - PREFIX_SUB_BACK_SLIT_arm sci frame bias, (dark), inter-order bkg subtracted\n\
00126 - PREFIX_NOCRH_arm sci frame corrected from cosmic ray hits\n\
00127 - [OPTIONAL,-compute-map=TRUE] PREFIX_WAVE_MAP_arm, wave map image\n\
00128 - [OPTIONAL,-compute-map=TRUE] PREFIX_SLIT_MAP_arm, slit map image\n\
00129 - PREFIX_DIVFF_arm as PREFIX_SUB_BACK_SLIT_arm, flat fielded\n\
00130 - PREFIX_SUB_SKY_arm, as PREFIX_DIVFF_arm, sky subtracted\n\
00131 - PREFIX_SKY_arm, 2D sky frame\n\
00132 - PREFIX_SKY_ORD1D_arm, 1D sky image (order-by-order)\n\
00133 - PREFIX_SCI_SLIT_STARE_BACK_SLIT_arm, inter-order background image\n\
00134 - OBJECT_SLIT_STARE_arm, sci frame in PRE format\n\
00135 - where PREFIX is SCI, FLUX, TELL if input raw DPR.TYPE contains OBJECT or FLUX or TELLURIC";
00136
00137
00138
00139
00140
00149
00150
00151 int cpl_plugin_get_info(cpl_pluginlist *list) {
00152 cpl_recipe *recipe = NULL;
00153 cpl_plugin *plugin = NULL;
00154
00155 recipe = cpl_calloc(1, sizeof(*recipe));
00156 if ( recipe == NULL ){
00157 return -1;
00158 }
00159
00160 plugin = &recipe->interface ;
00161
00162 cpl_plugin_init(plugin,
00163 CPL_PLUGIN_API,
00164 XSH_BINARY_VERSION,
00165 CPL_PLUGIN_TYPE_RECIPE,
00166 RECIPE_ID,
00167 xsh_absorp_description_short,
00168 xsh_absorp_description,
00169 RECIPE_AUTHOR,
00170 RECIPE_CONTACT,
00171 xsh_get_license(),
00172 xsh_absorp_create,
00173 xsh_absorp_exec,
00174 xsh_absorp_destroy);
00175
00176 cpl_pluginlist_append(list, plugin);
00177
00178 return (cpl_error_get_code() != CPL_ERROR_NONE);
00179 }
00180
00181
00191
00192
00193 static int xsh_absorp_create(cpl_plugin *plugin){
00194 cpl_recipe *recipe = NULL;
00195 cpl_parameter* p=NULL;
00196
00197 xsh_clipping_param crh_clip_param = {5.0, 5, 0.7, 0, 0.3};
00198
00199 xsh_remove_crh_single_param crh_single = { 0.1, 5, 2.0, 4} ;
00200 xsh_rectify_param rectify = { "default",
00201 CPL_KERNEL_DEFAULT,
00202 4,
00203 XSH_WAVE_BIN_SIZE_PIPE_NIR,
00204 XSH_SLIT_BIN_SIZE_PIPE_NIR,
00205 1,
00206 0, 0. };
00207
00208 xsh_subtract_sky_single_param sky_single = {3000, 3000,7,20, 5., -1, -1,
00209 BSPLINE_METHOD, FINE,7, 1.5,
00210 0.0, 0.0,
00211 0.0, 0.0} ;
00212 xsh_stack_param stack_param = {"median",5.,5.,5};
00213
00214 xsh_localize_obj_param loc_obj =
00215 {10, 0.1, 0, 0, LOC_MANUAL_METHOD, 0, 2.0,3,3, FALSE};
00216 xsh_extract_param extract_par =
00217 { LOCALIZATION_METHOD };
00218
00219 xsh_opt_extract_param opt_extract_par =
00220 { 5, 10, 10, 0.01, 10.0, 1., 2, 2, GAUSS_METHOD };
00221
00222
00223 opt_extract_par.oversample = 5;
00224 opt_extract_par.box_hsize = 10;
00225 opt_extract_par.chunk_size = 50;
00226 opt_extract_par.lambda_step = 0.02;
00227 opt_extract_par.clip_kappa = 3;
00228 opt_extract_par.clip_frac = 0.4;
00229 opt_extract_par.clip_niter = 2;
00230 opt_extract_par.niter = 1;
00231 opt_extract_par.method = GAUSS_METHOD;
00232
00233 xsh_init();
00234
00235
00236 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00237
00238
00239 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00240 CPL_ERROR_TYPE_MISMATCH,
00241 "Plugin is not a recipe");
00242
00243 recipe = (cpl_recipe *)plugin;
00244
00245
00246 recipe->parameters = cpl_parameterlist_new();
00247 assure( recipe->parameters != NULL,
00248 CPL_ERROR_ILLEGAL_OUTPUT,
00249 "Memory allocation failed!");
00250
00251
00252 check( xsh_parameters_generic( RECIPE_ID, recipe->parameters ) ) ;
00253 check( xsh_parameters_pre_overscan( RECIPE_ID, recipe->parameters ) ) ;
00254 check(xsh_parameters_stack_create(RECIPE_ID,recipe->parameters,stack_param));
00255
00256
00257 check(xsh_parameters_clipping_crh_create(RECIPE_ID,recipe->parameters,
00258 crh_clip_param));
00259
00260
00261 check(xsh_parameters_background_create(RECIPE_ID,recipe->parameters));
00262
00263
00264 check(p=xsh_parameters_find(recipe->parameters,RECIPE_ID,"background-method"));
00265 cpl_parameter_set_default_string(p,"poly");
00266
00267
00268
00269 check(xsh_parameters_remove_crh_single_create(RECIPE_ID,recipe->parameters,
00270 crh_single )) ;
00271
00272
00273 check(xsh_parameters_rectify_create(RECIPE_ID,recipe->parameters,
00274 rectify )) ;
00275
00276
00277 check(xsh_parameters_localize_obj_create(RECIPE_ID,recipe->parameters,
00278 loc_obj )) ;
00279
00280
00281 check(xsh_parameters_subtract_sky_single_create(RECIPE_ID,recipe->parameters,
00282 sky_single )) ;
00283
00284
00285 check(xsh_parameters_extract_create(RECIPE_ID,
00286 recipe->parameters,
00287 extract_par,LOCALIZATION_METHOD )) ;
00288
00289
00290 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00291 "do-optextract", FALSE,
00292 "TRUE if we do the optimal extraction"));
00293
00294 check( xsh_parameters_opt_extract_create( RECIPE_ID, recipe->parameters,
00295 opt_extract_par));
00296
00297 check(xsh_parameters_merge_ord_create(RECIPE_ID,
00298 recipe->parameters,
00299 WEIGHTED_MERGE_METHOD)) ;
00300
00301
00302 check( xsh_parameters_new_int( recipe->parameters, RECIPE_ID,
00303 "absorp-filter-hsize", 5,
00304 "Half size of median filter use to detect tellurics"));
00305 check( xsh_parameters_new_double( recipe->parameters, RECIPE_ID,
00306 "absorp-threshold", 0.02,
00307 "Threshold use to detect tellurics"));
00308
00309 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00310 "do-flatfield", TRUE,
00311 "TRUE if we do the flatfielding"));
00312
00313 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00314 "compute-map", TRUE,
00315 "if TRUE recompute (wave and slit) maps from the dispersion solution. If sky-subtract is set to TRUE this must be set to TRUE."));
00316
00317 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00318 "trace-obj", FALSE,
00319 "if TRUE compute object position trace via Gaussian fit."));
00320
00321
00322 cleanup:
00323 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
00324 xsh_error_dump(CPL_MSG_ERROR);
00325 return 1;
00326 }
00327 else {
00328 return 0;
00329 }
00330 }
00331
00332
00338
00339
00340 static int xsh_absorp_exec(cpl_plugin *plugin) {
00341 cpl_recipe *recipe = NULL;
00342
00343
00344
00345 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00346
00347
00348 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00349 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00350
00351 recipe = (cpl_recipe *)plugin;
00352
00353
00354 xsh_absorp(recipe->parameters, recipe->frames);
00355
00356 cleanup:
00357 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00358 xsh_error_dump(CPL_MSG_ERROR);
00359 xsh_error_reset();
00360 return 1;
00361 }
00362 else {
00363 return 0;
00364 }
00365 }
00366
00367
00373
00374 static int xsh_absorp_destroy(cpl_plugin *plugin)
00375 {
00376 cpl_recipe *recipe = NULL;
00377
00378
00379 xsh_error_reset();
00380
00381 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00382
00383
00384 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00385 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00386
00387 recipe = (cpl_recipe *)plugin;
00388
00389 xsh_free_parameterlist(&recipe->parameters);
00390
00391 cleanup:
00392 if (cpl_error_get_code() != CPL_ERROR_NONE)
00393 {
00394 return 1;
00395 }
00396 else
00397 {
00398 return 0;
00399 }
00400 }
00401
00402 static cpl_error_code
00403 xsh_params_set_defaults(cpl_parameterlist* pars,
00404 const char* rec_id,
00405 xsh_instrument* inst,
00406 xsh_rectify_param * rectify_par,
00407 xsh_background_param* backg)
00408 {
00409
00410 cpl_parameter* p=NULL;
00411 check(p=xsh_parameters_find(pars,RECIPE_ID,"background-radius-x"));
00412 if(cpl_parameter_get_int(p) <= 0) {
00413 if (xsh_instrument_get_arm(inst) == XSH_ARM_NIR){
00414 backg->radius_x=1;
00415 } else {
00416 backg->radius_x=2;
00417 }
00418 }
00419
00420 check(xsh_rectify_params_set_defaults(pars,rec_id,inst,rectify_par));
00421
00422 cleanup:
00423
00424 return cpl_error_get_code();
00425
00426 }
00427
00428
00429 static cpl_error_code
00430 xsh_params_monitor(xsh_background_param* backg,
00431 xsh_rectify_param * rectify_par,
00432 xsh_localize_obj_param * loc_obj_par,
00433 xsh_opt_extract_param *opt_extract_par,
00434 int sub_sky_nbkpts1,
00435 int sub_sky_nbkpts2)
00436 {
00437
00438
00439 xsh_msg_dbg_low("bkg params: sampley=%d radius_y=%d smooth_y=%d",
00440 backg->sampley,backg->radius_y,backg->smooth_y);
00441
00442 xsh_msg_dbg_low("bkg params: radius_x=%d smooth_x=%d",
00443 backg->radius_x,backg->smooth_x);
00444
00445 xsh_msg_dbg_low("rectify params: radius=%g bin_lambda=%g bin_space=%g",
00446 rectify_par->rectif_radius,rectify_par->rectif_bin_lambda,
00447 rectify_par->rectif_bin_space);
00448
00449 xsh_msg_dbg_low("localize params: chunk_nb=%d nod_step=%g",
00450 loc_obj_par->loc_chunk_nb,loc_obj_par->nod_step);
00451
00452 xsh_msg_dbg_low("opt extract params: chunk_size=%d lambda_step=%g box_hsize=%d",
00453 opt_extract_par->chunk_size,opt_extract_par->lambda_step,
00454 opt_extract_par->box_hsize);
00455
00456 xsh_msg_dbg_low("sky params: nbkpts1=%d nbkpts2=%d",
00457 sub_sky_nbkpts1,sub_sky_nbkpts2);
00458
00459 return cpl_error_get_code();
00460
00461 }
00462
00470
00471
00472 static cpl_error_code
00473 xsh_params_bin_scale(cpl_frameset* raws,
00474 xsh_background_param* backg,
00475 xsh_opt_extract_param *opt_extract_par,
00476 int* sub_sky_nbkpts1,
00477 int* sub_sky_nbkpts2)
00478 {
00479
00480 cpl_frame* frame=NULL;
00481 const char* name=NULL;
00482 cpl_propertylist *plist=NULL;
00483 int binx=0;
00484 int biny=0;
00485
00486 check(frame=cpl_frameset_get_first(raws));
00487 check(name=cpl_frame_get_filename(frame));
00488 check(plist=cpl_propertylist_load(name,0));
00489 check(binx=xsh_pfits_get_binx(plist));
00490 check(biny=xsh_pfits_get_biny(plist));
00491 xsh_free_propertylist( &plist);
00492
00493 if(biny>1) {
00494
00495
00496
00497
00498
00499
00500 backg->radius_y=backg->radius_y/biny;
00501
00502
00503 *sub_sky_nbkpts1*=0.75*biny;
00504 *sub_sky_nbkpts2*=0.75*biny;
00505
00506
00507
00508
00509
00510
00511
00512
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 if(binx>1) {
00547
00548 backg->radius_x=backg->radius_x/binx;
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570 opt_extract_par->box_hsize=opt_extract_par->box_hsize/binx;
00571
00572 }
00573
00574 cleanup:
00575 xsh_free_propertylist(&plist);
00576 return cpl_error_get_code();
00577
00578 }
00579
00580
00588
00589 static cpl_error_code
00590 xsh_absorp(cpl_parameterlist* parameters,
00591 cpl_frameset* frameset)
00592 {
00593 const char* recipe_tags[1] = {XSH_STD_TELL_SLIT_STARE};
00594 int recipe_tags_size = 1;
00595
00596
00597 cpl_frameset *raws = NULL;
00598 cpl_frameset *calib = NULL;
00599
00600
00601 cpl_frame *bpmap = NULL;
00602 cpl_frame *master_bias = NULL;
00603 cpl_frame *master_dark = NULL;
00604 cpl_frame *master_flat = NULL;
00605 cpl_frame *order_tab_edges = NULL;
00606 cpl_frame *wave_tab = NULL ;
00607 cpl_frame *model_config_frame = NULL ;
00608 cpl_frame *wavemap_frame = NULL ;
00609 cpl_frame *slitmap_frame = NULL ;
00610 cpl_frame *disp_tab_frame = NULL;
00611 cpl_frame *spectralformat_frame = NULL ;
00612 cpl_frame *tell_list_frame = NULL;
00613
00614 xsh_clipping_param* crh_clipping_par = NULL;
00615 xsh_background_param* backg_par = NULL;
00616 xsh_remove_crh_single_param * crh_single_par = NULL ;
00617 xsh_rectify_param * rectify_par = NULL ;
00618 xsh_localize_obj_param * loc_obj_par = NULL ;
00619 int sub_sky_nbkpts1 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00622 int sub_sky_nbkpts2 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00625 int do_sub_sky = FALSE;
00626 int recipe_use_model = 0;
00627 int do_optextract = 0;
00628 int do_flatfield = 0;
00629 int do_compute_map = 0;
00630 int do_trace_obj = 0;
00631
00632 xsh_merge_param *merge_par = NULL;
00633 xsh_extract_param *extract_par = NULL ;
00634 xsh_opt_extract_param *opt_extract_par = NULL;
00635 xsh_subtract_sky_single_param *sky_par = NULL;
00636
00637 xsh_instrument* instrument = NULL;
00638 int nb_raw_frames ;
00639 char rec_name[80];
00640
00641
00642 #if 0
00643 cpl_frameset * on = NULL, * off = NULL ;
00644 #endif
00645 cpl_frame * crhm_frame = NULL ;
00646 cpl_frame * rmbias = NULL;
00647 cpl_frame * rmdark = NULL;
00648 cpl_frame * rmbkg = NULL ;
00649 cpl_frame * div_frame = NULL ;
00650 cpl_frame * sub_sky_frame = NULL ;
00651 cpl_frame * sub_sky2_frame = NULL ;
00653 cpl_frame * rect_frame = NULL ;
00654 cpl_frame * loc_table_frame = NULL ;
00655 cpl_frame * clean_frame = NULL ;
00656 cpl_frame * rect2_frame = NULL ;
00657 cpl_frame * rect2_frame_eso = NULL ;
00658 cpl_frame * rect2_frame_tab = NULL ;
00659
00660
00661 cpl_frame * sky_frame = NULL ;
00662 cpl_frame * sky_frame_eso = NULL ;
00663 cpl_frame * res_1D_frame = NULL ;
00664 cpl_frame * res_2D_frame = NULL ;
00665 cpl_frame * fluxcal_rect_1D_frame = NULL ;
00666 cpl_frame * fluxcal_rect_2D_frame = NULL ;
00667 cpl_frame * fluxcal_1D_frame = NULL ;
00668 cpl_frame * fluxcal_2D_frame = NULL ;
00669
00670 cpl_frame * ext_frame = NULL ;
00671 cpl_frame * ext_frame_eso = NULL ;
00672
00673 cpl_frame *orderoxt1d_eso_frame = NULL;
00674 cpl_frame *orderext1d_frame = NULL;
00675 cpl_frame *orderoxt1d_frame = NULL;
00676 cpl_frame *mergeext1d_frame = NULL;
00677 cpl_frame *mergeoxt1d_frame = NULL;
00678
00679 cpl_frame* grid_backg=NULL;
00680 cpl_frame* frame_backg=NULL;
00681 cpl_frame* sky_frame_ima=NULL;
00682 char prefix[80];
00683 const char* ftag=NULL;
00684
00685 cpl_frame* single_frame_sky_sub_tab_frame=NULL;
00686
00687
00688
00689
00690
00691 cpl_frame* clean_obj=NULL;
00692 char *rec_prefix = NULL;
00693 cpl_frame* sky_list_frame=NULL;
00694 cpl_frame* qc_sky_frame=NULL;
00695 cpl_propertylist* plist=NULL;
00696 cpl_frame* qc_obj_trace_ord=NULL;
00697 cpl_frame* qc_obj_trace_mer=NULL;
00698 int hsize=0;
00699 int naxis2=0;
00700 const char* name=NULL;
00701 int pre_overscan_corr=0;
00702
00703 cpl_frame *tell_mask_frame = NULL;
00704 int absorp_filter_hsize = 5;
00705 double absorp_thresh = 0.0;
00706 cpl_frame *qc_subex_frame = NULL;
00707 cpl_frame *qc_s2ddiv1d_frame = NULL;
00708 cpl_frame *qc_model_frame = NULL;
00709 cpl_frame *qc_weight_frame = NULL;
00710
00711 xsh_stack_param* stack_par=NULL;
00712
00713
00714
00715
00716 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00717 recipe_tags, recipe_tags_size,
00718 RECIPE_ID, XSH_BINARY_VERSION,
00719 xsh_absorp_description_short ) ) ;
00720
00721
00722
00723
00724
00725 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00726 if(instrument->arm == XSH_ARM_NIR) {
00727 xsh_instrument_nir_corr_if_JH(raws,instrument);
00728 }
00729
00730
00731
00732
00733 check( nb_raw_frames = cpl_frameset_get_size( raws ) ) ;
00734 xsh_msg_dbg_low("nb_raw_frames=%d",nb_raw_frames);
00735 XSH_ASSURE_NOT_ILLEGAL_MSG( nb_raw_frames == 1 || nb_raw_frames >= 3,
00736 "This recipes accepts either one or at least 3 input frames" ) ;
00737 check( pre_overscan_corr = xsh_parameters_get_int( parameters, RECIPE_ID,
00738 "pre-overscan-corr"));
00739 check(xsh_slit_stare_get_calibs(calib,instrument, &spectralformat_frame,
00740 &master_bias,&master_dark,&master_flat,
00741 &order_tab_edges,&model_config_frame,
00742 &wave_tab,&sky_list_frame,&qc_sky_frame,
00743 &bpmap,&single_frame_sky_sub_tab_frame,
00744 &wavemap_frame,&slitmap_frame,RECIPE_ID,
00745 &recipe_use_model,pre_overscan_corr));
00746
00747
00748 check( tell_list_frame = xsh_find_frame_with_tag(calib,XSH_TELL_LINE_LIST,
00749 instrument));
00750 if ( tell_list_frame == NULL){
00751 xsh_msg_error("Provide telluric line list frame");
00752 return CPL_ERROR_DATA_NOT_FOUND;
00753 }
00754
00755
00756
00757
00758
00759 check(xsh_slit_stare_get_params(parameters,RECIPE_ID, &pre_overscan_corr,
00760 &crh_clipping_par,&backg_par,&loc_obj_par,
00761 &rectify_par,&crh_single_par,&sub_sky_nbkpts1,
00762 &do_flatfield,&sub_sky_nbkpts2,&sky_par,
00763 &extract_par,&do_optextract,&merge_par,
00764 &opt_extract_par,&do_trace_obj));
00765
00766 check( absorp_filter_hsize = xsh_parameters_get_int( parameters, RECIPE_ID,
00767 "absorp-filter-hsize"));
00768 check( absorp_thresh = xsh_parameters_get_double( parameters, RECIPE_ID,
00769 "absorp-threshold"));
00770 check(xsh_params_set_defaults(parameters,RECIPE_ID,instrument,rectify_par,
00771 backg_par));
00772
00773 check( xsh_parameters_dosky_domap_get( RECIPE_ID, parameters,
00774 wavemap_frame,slitmap_frame,
00775 &do_sub_sky,&do_compute_map));
00776
00777
00778 if ( xsh_instrument_get_arm(instrument) != XSH_ARM_NIR) {
00779 check(xsh_params_bin_scale(raws,backg_par,
00780 opt_extract_par,
00781 &sub_sky_nbkpts1,&sub_sky_nbkpts2));
00782 }
00783
00784
00785 check( stack_par = xsh_stack_frames_get( RECIPE_ID, parameters));
00786 if ( rectify_par->conserve_flux){
00787 check_msg(disp_tab_frame = xsh_find_disp_tab( calib, instrument),
00788 "rectify-conserve-flux=TRUE, you must give a DISP_TAB_ARM input");
00789 }
00790 if ( do_compute_map && recipe_use_model==FALSE){
00791 check_msg(disp_tab_frame = xsh_find_disp_tab( calib, instrument),
00792 "compute-map=TRUE, physmodel mode, you must give a DISP_TAB_ARM input");
00793 }
00794 check(xsh_params_monitor(backg_par,rectify_par,loc_obj_par,opt_extract_par,
00795 sub_sky_nbkpts1,sub_sky_nbkpts2));
00796
00797
00798
00799
00800
00801
00802 check(xsh_prepare(raws, bpmap, master_bias, XSH_OBJECT_SLIT_STARE,
00803 instrument,pre_overscan_corr));
00804 check( rec_prefix = xsh_set_recipe_file_prefix( raws,
00805 "xsh_absorp"));
00806
00807
00808 ftag = XSH_GET_TAG_FROM_ARM( XSH_SLIT_STARE_REMOVE_CRH, instrument);
00809 check( crhm_frame = xsh_check_remove_crh_multiple( raws, ftag,stack_par,
00810 crh_clipping_par, instrument, NULL, NULL));
00811
00812
00813 check(xsh_slit_stare_get_maps(calib,
00814 do_compute_map,recipe_use_model,rec_prefix,
00815 instrument,model_config_frame,crhm_frame,
00816 disp_tab_frame,order_tab_edges,
00817 &wavemap_frame, &slitmap_frame));
00818
00819 sprintf(prefix,"%s_",rec_prefix);
00820
00821
00822 check( rmbias = xsh_check_subtract_bias( crhm_frame, master_bias,
00823 instrument, prefix,
00824 pre_overscan_corr,0));
00825
00826
00827 check( rmdark = xsh_check_subtract_dark( rmbias, master_dark,
00828 instrument, rec_prefix));
00829
00830
00831 xsh_msg("Subtract inter-order background");
00832 check(rmbkg = xsh_subtract_background( rmdark,
00833 order_tab_edges,
00834 backg_par, instrument,rec_prefix,
00835 &grid_backg,&frame_backg,0));
00836
00837
00838 xsh_slit_stare_correct_crh_and_sky(loc_obj_par,crh_single_par,rectify_par,
00839 do_sub_sky,rec_prefix,rmbkg,
00840 order_tab_edges, slitmap_frame,
00841 wavemap_frame,model_config_frame,
00842 single_frame_sky_sub_tab_frame,instrument,
00843 sub_sky_nbkpts1, sky_par,
00844 &sky_frame,&sky_frame_eso,&sky_frame_ima,
00845 wave_tab,disp_tab_frame,
00846 spectralformat_frame,nb_raw_frames,
00847 &loc_table_frame,&clean_frame,&clean_obj);
00848
00849
00850
00851
00852 check( div_frame = xsh_check_divide_flat( do_flatfield, clean_obj,
00853 master_flat, instrument, rec_prefix));
00854
00855
00856 check( sub_sky2_frame = xsh_check_subtract_sky_single( do_sub_sky, div_frame,
00857 order_tab_edges, slitmap_frame, wavemap_frame, loc_table_frame, NULL,
00858 single_frame_sky_sub_tab_frame, instrument, sub_sky_nbkpts2, sky_par,
00859 &sky_frame, &sky_frame_eso, &sky_frame_ima, rec_prefix));
00860
00861 xsh_msg( "Prepare S2D products" ) ;
00862 xsh_msg( "Rectify") ;
00863 sprintf(rec_name,"%s_%s_%s.fits",rec_prefix,XSH_ORDER2D,
00864 xsh_instrument_arm_tostring( instrument));
00865
00866 check( rect2_frame = xsh_rectify( sub_sky2_frame, order_tab_edges,
00867 wave_tab, model_config_frame, instrument,
00868 rectify_par,spectralformat_frame,
00869 disp_tab_frame,rec_name,
00870 &rect2_frame_eso,&rect2_frame_tab,
00871 rec_prefix));
00872 xsh_msg( "Extract" ) ;
00873 check(ext_frame=xsh_extract(rect2_frame, loc_table_frame,
00874 instrument, extract_par,&ext_frame_eso,
00875 rec_prefix)) ;
00876
00877 xsh_msg( "Merge orders with 1D frame" ) ;
00878 check( res_1D_frame = xsh_merge_ord( ext_frame, instrument,
00879 merge_par,rec_prefix ));
00880 check(xsh_monitor_spectrum1D_flux(res_1D_frame,instrument));
00881
00882 xsh_msg( "Calling xsh_merge_ord with 2D frame" ) ;
00883 check( res_2D_frame = xsh_merge_ord( rect2_frame, instrument,
00884 merge_par,rec_prefix ));
00885
00886 xsh_msg("Prepare S1D products" ) ;
00887
00888 if ( do_optextract){
00889 xsh_msg( "Optimal extraction");
00890 check( xsh_opt_extract( sub_sky2_frame, order_tab_edges,
00891 wave_tab, model_config_frame, wavemap_frame,
00892 slitmap_frame, loc_table_frame,
00893 spectralformat_frame, master_flat, instrument,
00894 opt_extract_par, rec_prefix,
00895 &orderext1d_frame, &orderoxt1d_frame,
00896 &orderoxt1d_eso_frame,
00897 &qc_subex_frame,
00898 &qc_s2ddiv1d_frame,
00899 &qc_model_frame,
00900 &qc_weight_frame));
00901
00902 check( mergeext1d_frame = xsh_merge_ord( orderext1d_frame, instrument,
00903 merge_par,rec_prefix));
00904 check( mergeoxt1d_frame = xsh_merge_ord( orderoxt1d_frame, instrument,
00905 merge_par,rec_prefix));
00906 }
00907
00908 if( do_trace_obj) {
00909 name=cpl_frame_get_filename(res_2D_frame);
00910 plist=cpl_propertylist_load(name,0);
00911 naxis2=xsh_pfits_get_naxis2(plist);
00912 xsh_free_propertylist(&plist);
00913 hsize=naxis2/4;
00914 check(qc_obj_trace_ord=xsh_frame_image_ext_qc_trace_window(rect2_frame_eso,
00915 instrument,
00916 rec_prefix,
00917 hsize,0));
00918
00919 check(qc_obj_trace_mer=xsh_frame_image_qc_trace_window(res_2D_frame,
00920 instrument,
00921 rec_prefix,
00922 hsize,0));
00923 }
00924
00925
00926 if ( mergeoxt1d_frame != NULL){
00927 check( tell_mask_frame = xsh_compute_absorp( mergeoxt1d_frame, tell_list_frame,
00928 absorp_filter_hsize, absorp_thresh, instrument));
00929 }
00930 else{
00931 check( tell_mask_frame = xsh_compute_absorp( res_1D_frame, tell_list_frame,
00932 absorp_filter_hsize, absorp_thresh, instrument));
00933 }
00934
00935
00936
00937 xsh_msg( "Saving products" ) ;
00938
00939 check( xsh_add_product_vector( tell_mask_frame, frameset, parameters,
00940 RECIPE_ID, instrument,
00941 cpl_frame_get_tag( tell_mask_frame)));
00942
00943
00944
00945 check( xsh_add_product_image(rect2_frame_eso, frameset, parameters,
00946 RECIPE_ID, instrument,
00947 cpl_frame_get_tag(rect2_frame_eso)));
00948
00949 check( xsh_add_product_image(ext_frame_eso, frameset, parameters,
00950 RECIPE_ID, instrument,
00951 cpl_frame_get_tag(ext_frame_eso)));
00952
00953 check( xsh_add_product_spectrum( res_2D_frame, frameset, parameters,
00954 RECIPE_ID, instrument));
00955
00956
00957 check( xsh_add_product_spectrum( res_1D_frame, frameset, parameters,
00958 RECIPE_ID, instrument));
00959
00960 check( xsh_add_product_pre( rmbias, frameset, parameters,
00961 RECIPE_ID, instrument));
00962
00963 check( xsh_add_product_image( rmbkg, frameset, parameters,
00964 RECIPE_ID, instrument,
00965 cpl_frame_get_tag(rmbkg)));
00966
00967 if ( do_sub_sky == 1 && nb_raw_frames == 1 && crh_single_par->nb_iter > 0){
00968
00969 check( xsh_add_product_image( clean_frame, frameset, parameters,
00970 RECIPE_ID, instrument,
00971 cpl_frame_get_tag(clean_frame)));
00972
00973 }
00974 if (do_compute_map){
00975 sprintf(prefix,"%s_WAVE_MAP_%s",rec_prefix,
00976 xsh_instrument_arm_tostring(instrument));
00977
00978
00979 check(xsh_add_product_image( wavemap_frame, frameset,
00980 parameters, RECIPE_ID, instrument, prefix));
00981
00982 check(sprintf(prefix,"%s_SLIT_MAP_%s",rec_prefix,
00983 xsh_instrument_arm_tostring(instrument)));
00984
00985 check(xsh_add_product_image( slitmap_frame, frameset,
00986 parameters, RECIPE_ID, instrument, prefix));
00987 }
00988 if(do_flatfield) {
00989
00990 check( xsh_add_product_image( div_frame, frameset, parameters,
00991 RECIPE_ID, instrument,
00992 cpl_frame_get_tag(div_frame)));
00993 }
00994
00995 if ( do_optextract){
00996 check( xsh_add_product_table( orderext1d_frame, frameset,
00997 parameters, RECIPE_ID, instrument, NULL));
00998 check( xsh_add_product_table( orderoxt1d_frame, frameset,
00999 parameters, RECIPE_ID, instrument, NULL));
01000 check( xsh_add_product_spectrum( mergeext1d_frame, frameset, parameters,
01001 RECIPE_ID, instrument));
01002 check( xsh_add_product_spectrum( mergeoxt1d_frame, frameset,
01003 parameters, RECIPE_ID, instrument));
01004 check( xsh_add_product_image( qc_subex_frame, frameset, parameters,
01005 RECIPE_ID, instrument,
01006 cpl_frame_get_tag(qc_subex_frame)));
01007 check( xsh_add_product_image( qc_s2ddiv1d_frame, frameset, parameters,
01008 RECIPE_ID, instrument,
01009 cpl_frame_get_tag(qc_s2ddiv1d_frame)));
01010 check( xsh_add_product_image( qc_model_frame, frameset, parameters,
01011 RECIPE_ID, instrument,
01012 cpl_frame_get_tag(qc_model_frame)));
01013 check( xsh_add_product_image( qc_weight_frame, frameset, parameters,
01014 RECIPE_ID, instrument,
01015 cpl_frame_get_tag(qc_weight_frame)));
01016 }
01017 if ( do_sub_sky == 1 ) {
01018 check( xsh_add_product_pre( sub_sky2_frame, frameset, parameters,
01019 RECIPE_ID, instrument));
01020 check( xsh_add_product_image( sky_frame_ima, frameset, parameters,
01021 RECIPE_ID, instrument,
01022 cpl_frame_get_tag(sky_frame_ima)));
01023 check( xsh_add_product_image( sky_frame_eso, frameset,
01024 parameters, RECIPE_ID, instrument,
01025 cpl_frame_get_tag(sky_frame_eso)));
01026 }
01027 check( xsh_add_product_image( frame_backg, frameset, parameters,
01028 RECIPE_ID, instrument,
01029 cpl_frame_get_tag(frame_backg)));
01030
01031 if(crhm_frame != NULL) {
01032 check( xsh_add_product_image( crhm_frame, frameset, parameters,
01033 RECIPE_ID, instrument,
01034 cpl_frame_get_tag(crhm_frame)));
01035
01036 }
01037
01038 if(qc_sky_frame != NULL) {
01039 check( xsh_add_product_table(qc_sky_frame, frameset,
01040 parameters, RECIPE_ID, instrument,NULL));
01041
01042 }
01043
01044 if(do_trace_obj) {
01045 check( xsh_add_product_table(qc_obj_trace_ord, frameset,
01046 parameters, RECIPE_ID, instrument, NULL));
01047
01048 check( xsh_add_product_table(qc_obj_trace_mer, frameset,
01049 parameters, RECIPE_ID, instrument, NULL));
01050 }
01051
01052
01053 cleanup:
01054 xsh_end( RECIPE_ID, frameset, parameters );
01055 XSH_FREE( rec_prefix);
01056 XSH_FREE( crh_clipping_par);
01057 XSH_FREE( backg_par);
01058 XSH_FREE( crh_single_par);
01059 XSH_FREE( rectify_par);
01060 XSH_FREE( sky_par);
01061 XSH_FREE( loc_obj_par);
01062 XSH_FREE( merge_par);
01063 XSH_FREE( extract_par);
01064 XSH_FREE( opt_extract_par);
01065 xsh_instrument_free(&instrument);
01066
01067 xsh_free_frameset(&raws);
01068 xsh_free_frameset(&calib);
01069 xsh_free_frame( &crhm_frame);
01070 xsh_free_frame( &qc_sky_frame);
01071
01072 xsh_free_frame( &wavemap_frame);
01073 xsh_free_frame( &slitmap_frame);
01074
01075 xsh_free_frame(&rmbias);
01076 xsh_free_frame(&rmdark);
01077 xsh_free_frame(&rmbkg);
01078 xsh_free_frame(&div_frame);
01079 xsh_free_frame(&sub_sky_frame);
01080
01081 xsh_free_frame(&sub_sky2_frame);
01082 xsh_free_frame(&sky_frame);
01083 xsh_free_frame(&sky_frame_eso);
01084 xsh_free_frame(&sky_frame_ima);
01085
01086 xsh_free_frame(&rect_frame) ;
01087 xsh_free_frame(&rect2_frame_eso) ;
01088 xsh_free_frame(&rect2_frame_tab) ;
01089
01090 xsh_free_frame( &orderext1d_frame);
01091 xsh_free_frame( &orderoxt1d_frame);
01092 xsh_free_frame( &mergeext1d_frame);
01093 xsh_free_frame( &mergeoxt1d_frame);
01094
01095 xsh_free_frame(&loc_table_frame) ;
01096 xsh_free_frame( &clean_frame);
01097 xsh_free_frame( &clean_obj);
01098 xsh_free_frame( &ext_frame);
01099 xsh_free_frame( &ext_frame_eso);
01100 xsh_free_frame(&res_1D_frame) ;
01101 xsh_free_frame(&res_2D_frame) ;
01102 xsh_free_frame(&fluxcal_rect_1D_frame) ;
01103 xsh_free_frame(&fluxcal_rect_2D_frame) ;
01104 xsh_free_frame(&fluxcal_1D_frame) ;
01105 xsh_free_frame(&fluxcal_2D_frame) ;
01106
01107 xsh_free_frame(&rect2_frame) ;
01108 xsh_free_frame(&grid_backg) ;
01109 xsh_free_frame(&frame_backg) ;
01110 xsh_free_frame( &tell_mask_frame);
01111 xsh_free_propertylist(&plist);
01112
01113 xsh_free_frame( &single_frame_sky_sub_tab_frame);
01114 xsh_free_frame( &qc_subex_frame);
01115 xsh_free_frame(&qc_s2ddiv1d_frame);
01116 xsh_free_frame(&qc_model_frame);
01117 xsh_free_frame(&qc_weight_frame);
01118
01119 return CPL_ERROR_NONE;
01120 }
01121