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 xsh_parameters_decode_bp(RECIPE_ID,recipe->parameters,-1);
00254 check( xsh_parameters_pre_overscan( RECIPE_ID, recipe->parameters ) ) ;
00255 check(xsh_parameters_stack_create(RECIPE_ID,recipe->parameters,stack_param));
00256
00257
00258 check(xsh_parameters_clipping_crh_create(RECIPE_ID,recipe->parameters,
00259 crh_clip_param));
00260
00261
00262 check(xsh_parameters_background_create(RECIPE_ID,recipe->parameters));
00263
00264
00265 check(p=xsh_parameters_find(recipe->parameters,RECIPE_ID,"background-method"));
00266 cpl_parameter_set_default_string(p,"poly");
00267
00268
00269
00270 check(xsh_parameters_remove_crh_single_create(RECIPE_ID,recipe->parameters,
00271 crh_single )) ;
00272
00273
00274 check(xsh_parameters_rectify_create(RECIPE_ID,recipe->parameters,
00275 rectify )) ;
00276
00277
00278 check(xsh_parameters_localize_obj_create(RECIPE_ID,recipe->parameters,
00279 loc_obj )) ;
00280
00281
00282 check(xsh_parameters_subtract_sky_single_create(RECIPE_ID,recipe->parameters,
00283 sky_single )) ;
00284
00285
00286 check(xsh_parameters_extract_create(RECIPE_ID,
00287 recipe->parameters,
00288 extract_par,LOCALIZATION_METHOD )) ;
00289
00290
00291 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00292 "do-optextract", FALSE,
00293 "TRUE if we do the optimal extraction"));
00294
00295 check( xsh_parameters_opt_extract_create( RECIPE_ID, recipe->parameters,
00296 opt_extract_par));
00297
00298
00299 check( xsh_parameters_new_int( recipe->parameters, RECIPE_ID,
00300 "absorp-filter-hsize", 5,
00301 "Half size of median filter use to detect tellurics"));
00302 check( xsh_parameters_new_double( recipe->parameters, RECIPE_ID,
00303 "absorp-threshold", 0.02,
00304 "Threshold use to detect tellurics"));
00305
00306 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00307 "do-flatfield", TRUE,
00308 "TRUE if we do the flatfielding"));
00309
00310 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00311 "compute-map", TRUE,
00312 "if TRUE recompute (wave and slit) maps from the dispersion solution. If sky-subtract is set to TRUE this must be set to TRUE."));
00313
00314 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00315 "trace-obj", FALSE,
00316 "if TRUE compute object position trace via Gaussian fit."));
00317
00318
00319 cleanup:
00320 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
00321 xsh_error_dump(CPL_MSG_ERROR);
00322 return 1;
00323 }
00324 else {
00325 return 0;
00326 }
00327 }
00328
00329
00335
00336
00337 static int xsh_absorp_exec(cpl_plugin *plugin) {
00338 cpl_recipe *recipe = NULL;
00339
00340
00341
00342 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00343
00344
00345 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00346 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00347
00348 recipe = (cpl_recipe *)plugin;
00349
00350
00351 xsh_absorp(recipe->parameters, recipe->frames);
00352
00353 cleanup:
00354 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00355 xsh_error_dump(CPL_MSG_ERROR);
00356 xsh_error_reset();
00357 return 1;
00358 }
00359 else {
00360 return 0;
00361 }
00362 }
00363
00364
00370
00371 static int xsh_absorp_destroy(cpl_plugin *plugin)
00372 {
00373 cpl_recipe *recipe = NULL;
00374
00375
00376 xsh_error_reset();
00377
00378 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00379
00380
00381 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00382 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00383
00384 recipe = (cpl_recipe *)plugin;
00385
00386 xsh_free_parameterlist(&recipe->parameters);
00387
00388 cleanup:
00389 if (cpl_error_get_code() != CPL_ERROR_NONE)
00390 {
00391 return 1;
00392 }
00393 else
00394 {
00395 return 0;
00396 }
00397 }
00398
00399 static cpl_error_code
00400 xsh_params_set_defaults(cpl_parameterlist* pars,
00401 const char* rec_id,
00402 xsh_instrument* inst,
00403 xsh_rectify_param * rectify_par,
00404 xsh_background_param* backg)
00405 {
00406
00407 cpl_parameter* p=NULL;
00408 check(p=xsh_parameters_find(pars,RECIPE_ID,"background-radius-x"));
00409 if(cpl_parameter_get_int(p) <= 0) {
00410 if (xsh_instrument_get_arm(inst) == XSH_ARM_NIR){
00411 backg->radius_x=1;
00412 } else {
00413 backg->radius_x=2;
00414 }
00415 }
00416
00417 check(xsh_rectify_params_set_defaults(pars,rec_id,inst,rectify_par));
00418
00419 cleanup:
00420
00421 return cpl_error_get_code();
00422
00423 }
00424
00425
00426 static cpl_error_code
00427 xsh_params_monitor(xsh_background_param* backg,
00428 xsh_rectify_param * rectify_par,
00429 xsh_localize_obj_param * loc_obj_par,
00430 xsh_opt_extract_param *opt_extract_par,
00431 int sub_sky_nbkpts1,
00432 int sub_sky_nbkpts2)
00433 {
00434
00435
00436 xsh_msg_dbg_low("bkg params: sampley=%d radius_y=%d smooth_y=%d",
00437 backg->sampley,backg->radius_y,backg->smooth_y);
00438
00439 xsh_msg_dbg_low("bkg params: radius_x=%d smooth_x=%d",
00440 backg->radius_x,backg->smooth_x);
00441
00442 xsh_msg_dbg_low("rectify params: radius=%g bin_lambda=%g bin_space=%g",
00443 rectify_par->rectif_radius,rectify_par->rectif_bin_lambda,
00444 rectify_par->rectif_bin_space);
00445
00446 xsh_msg_dbg_low("localize params: chunk_nb=%d nod_step=%g",
00447 loc_obj_par->loc_chunk_nb,loc_obj_par->nod_step);
00448
00449 xsh_msg_dbg_low("opt extract params: chunk_size=%d lambda_step=%g box_hsize=%d",
00450 opt_extract_par->chunk_size,opt_extract_par->lambda_step,
00451 opt_extract_par->box_hsize);
00452
00453 xsh_msg_dbg_low("sky params: nbkpts1=%d nbkpts2=%d",
00454 sub_sky_nbkpts1,sub_sky_nbkpts2);
00455
00456 return cpl_error_get_code();
00457
00458 }
00459
00467
00468
00469 static cpl_error_code
00470 xsh_params_bin_scale(cpl_frameset* raws,
00471 xsh_background_param* backg,
00472 xsh_opt_extract_param *opt_extract_par,
00473 int* sub_sky_nbkpts1,
00474 int* sub_sky_nbkpts2)
00475 {
00476
00477 cpl_frame* frame=NULL;
00478 const char* name=NULL;
00479 cpl_propertylist *plist=NULL;
00480 int binx=0;
00481 int biny=0;
00482
00483 check(frame=cpl_frameset_get_first(raws));
00484 check(name=cpl_frame_get_filename(frame));
00485 check(plist=cpl_propertylist_load(name,0));
00486 check(binx=xsh_pfits_get_binx(plist));
00487 check(biny=xsh_pfits_get_biny(plist));
00488 xsh_free_propertylist( &plist);
00489
00490 if(biny>1) {
00491
00492
00493
00494
00495
00496
00497 backg->radius_y=backg->radius_y/biny;
00498
00499
00500 *sub_sky_nbkpts1*=0.75*biny;
00501 *sub_sky_nbkpts2*=0.75*biny;
00502
00503
00504
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 if(binx>1) {
00544
00545 backg->radius_x=backg->radius_x/binx;
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567 opt_extract_par->box_hsize=opt_extract_par->box_hsize/binx;
00568
00569 }
00570
00571 cleanup:
00572 xsh_free_propertylist(&plist);
00573 return cpl_error_get_code();
00574
00575 }
00576
00577
00585
00586 static cpl_error_code
00587 xsh_absorp(cpl_parameterlist* parameters,
00588 cpl_frameset* frameset)
00589 {
00590 const char* recipe_tags[1] = {XSH_STD_TELL_SLIT_STARE};
00591 int recipe_tags_size = 1;
00592
00593
00594 cpl_frameset *raws = NULL;
00595 cpl_frameset *calib = NULL;
00596
00597
00598 cpl_frame *bpmap = NULL;
00599 cpl_frame *master_bias = NULL;
00600 cpl_frame *master_dark = NULL;
00601 cpl_frame *master_flat = NULL;
00602 cpl_frame *order_tab_edges = NULL;
00603 cpl_frame *wave_tab = NULL ;
00604 cpl_frame *model_config_frame = NULL ;
00605 cpl_frame *wavemap_frame = NULL ;
00606 cpl_frame *slitmap_frame = NULL ;
00607 cpl_frame *disp_tab_frame = NULL;
00608 cpl_frame *spectralformat_frame = NULL ;
00609 cpl_frame *tell_list_frame = NULL;
00610
00611 xsh_clipping_param* crh_clipping_par = NULL;
00612 xsh_background_param* backg_par = NULL;
00613 xsh_remove_crh_single_param * crh_single_par = NULL ;
00614 xsh_rectify_param * rectify_par = NULL ;
00615 xsh_localize_obj_param * loc_obj_par = NULL ;
00616 int sub_sky_nbkpts1 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00619 int sub_sky_nbkpts2 = SUBTRACT_SKY_SINGLE_NBKPTS ;
00622 int do_sub_sky = FALSE;
00623 int recipe_use_model = 0;
00624 int do_optextract = 0;
00625 int do_flatfield = 0;
00626 int do_compute_map = 0;
00627 int do_trace_obj = 0;
00628
00629 int merge_par = 0;
00630 xsh_extract_param *extract_par = NULL ;
00631 xsh_opt_extract_param *opt_extract_par = NULL;
00632 xsh_subtract_sky_single_param *sky_par = NULL;
00633
00634 xsh_instrument* instrument = NULL;
00635 int nb_raw_frames ;
00636 char rec_name[256];
00637
00638
00639 #if 0
00640 cpl_frameset * on = NULL, * off = NULL ;
00641 #endif
00642 cpl_frame * crhm_frame = NULL ;
00643 cpl_frame * rmbias = NULL;
00644 cpl_frame * rmdark = NULL;
00645 cpl_frame * rmbkg = NULL ;
00646 cpl_frame * div_frame = NULL ;
00647 cpl_frame * sub_sky_frame = NULL ;
00648 cpl_frame * sub_sky2_frame = NULL ;
00650 cpl_frame * rect_frame = NULL ;
00651 cpl_frame * loc_table_frame = NULL ;
00652 cpl_frame * clean_frame = NULL ;
00653 cpl_frame * rect2_frame = NULL ;
00654 cpl_frame * rect2_frame_eso = NULL ;
00655 cpl_frame * rect2_frame_tab = NULL ;
00656
00657
00658 cpl_frame * sky_frame = NULL ;
00659 cpl_frame * sky_frame_eso = NULL ;
00660 cpl_frame * res_1D_frame = NULL ;
00661 cpl_frame * res_2D_frame = NULL ;
00662 cpl_frame * fluxcal_rect_1D_frame = NULL ;
00663 cpl_frame * fluxcal_rect_2D_frame = NULL ;
00664 cpl_frame * fluxcal_1D_frame = NULL ;
00665 cpl_frame * fluxcal_2D_frame = NULL ;
00666
00667 cpl_frame * ext_frame = NULL ;
00668 cpl_frame * ext_frame_eso = NULL ;
00669
00670 cpl_frame *orderoxt1d_eso_frame = NULL;
00671 cpl_frame *orderext1d_frame = NULL;
00672 cpl_frame *orderoxt1d_frame = NULL;
00673 cpl_frame *mergeext1d_frame = NULL;
00674 cpl_frame *mergeoxt1d_frame = NULL;
00675
00676 cpl_frame* grid_backg=NULL;
00677 cpl_frame* frame_backg=NULL;
00678 cpl_frame* sky_frame_ima=NULL;
00679 char prefix[256];
00680 const char* ftag=NULL;
00681
00682 cpl_frame* single_frame_sky_sub_tab_frame=NULL;
00683
00684
00685
00686
00687
00688 cpl_frame* clean_obj=NULL;
00689 char *rec_prefix = NULL;
00690 cpl_frame* sky_list_frame=NULL;
00691 cpl_frame* qc_sky_frame=NULL;
00692 cpl_propertylist* plist=NULL;
00693 cpl_frame* qc_obj_trace_ord=NULL;
00694 cpl_frame* qc_obj_trace_mer=NULL;
00695
00696 const char* name=NULL;
00697 int pre_overscan_corr=0;
00698
00699 cpl_frame *tell_mask_frame = NULL;
00700 int absorp_filter_hsize = 5;
00701 double absorp_thresh = 0.0;
00702 cpl_frame *qc_subex_frame = NULL;
00703 cpl_frame *qc_s2ddiv1d_frame = NULL;
00704 cpl_frame *qc_model_frame = NULL;
00705 cpl_frame *qc_weight_frame = NULL;
00706
00707 xsh_stack_param* stack_par=NULL;
00708
00709
00710
00711
00712 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00713 recipe_tags, recipe_tags_size,
00714 RECIPE_ID, XSH_BINARY_VERSION,
00715 xsh_absorp_description_short ) ) ;
00716
00717
00718
00719
00720
00721 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00722 if(instrument->arm == XSH_ARM_NIR) {
00723 xsh_instrument_nir_corr_if_JH(raws,instrument);
00724 }
00725
00726
00727
00728
00729 check( nb_raw_frames = cpl_frameset_get_size( raws ) ) ;
00730 xsh_msg_dbg_low("nb_raw_frames=%d",nb_raw_frames);
00731 XSH_ASSURE_NOT_ILLEGAL_MSG( nb_raw_frames == 1 || nb_raw_frames >= 3,
00732 "This recipes accepts either one or at least 3 input frames" ) ;
00733 check( pre_overscan_corr = xsh_parameters_get_int( parameters, RECIPE_ID,
00734 "pre-overscan-corr"));
00735 check(xsh_slit_stare_get_calibs(calib,instrument, &spectralformat_frame,
00736 &master_bias,&master_dark,&master_flat,
00737 &order_tab_edges,&model_config_frame,
00738 &wave_tab,&sky_list_frame,&qc_sky_frame,
00739 &bpmap,&single_frame_sky_sub_tab_frame,
00740 &wavemap_frame,&slitmap_frame,RECIPE_ID,
00741 &recipe_use_model,pre_overscan_corr));
00742
00743
00744 check( tell_list_frame = xsh_find_frame_with_tag(calib,XSH_TELL_LINE_LIST,
00745 instrument));
00746 if ( tell_list_frame == NULL){
00747 xsh_msg_error("Provide telluric line list frame");
00748 return CPL_ERROR_DATA_NOT_FOUND;
00749 }
00750
00751
00752
00753
00754
00755 check(xsh_slit_stare_get_params(parameters,RECIPE_ID, &pre_overscan_corr,
00756 &crh_clipping_par,&backg_par,&loc_obj_par,
00757 &rectify_par,&crh_single_par,&sub_sky_nbkpts1,
00758 &do_flatfield,&sub_sky_nbkpts2,&sky_par,
00759 &extract_par,&do_optextract,
00760 &opt_extract_par,&do_trace_obj));
00761
00762 check( absorp_filter_hsize = xsh_parameters_get_int( parameters, RECIPE_ID,
00763 "absorp-filter-hsize"));
00764 check( absorp_thresh = xsh_parameters_get_double( parameters, RECIPE_ID,
00765 "absorp-threshold"));
00766 check(xsh_params_set_defaults(parameters,RECIPE_ID,instrument,rectify_par,
00767 backg_par));
00768
00769 check( xsh_parameters_dosky_get( RECIPE_ID, parameters,&do_sub_sky));
00770
00771
00772 if ( xsh_instrument_get_arm(instrument) != XSH_ARM_NIR) {
00773 check(xsh_params_bin_scale(raws,backg_par,
00774 opt_extract_par,
00775 &sub_sky_nbkpts1,&sub_sky_nbkpts2));
00776 }
00777
00778
00779 check( stack_par = xsh_stack_frames_get( RECIPE_ID, parameters));
00780 if ( rectify_par->conserve_flux){
00781 check_msg(disp_tab_frame = xsh_find_disp_tab( calib, instrument),
00782 "rectify-conserve-flux=TRUE, you must give a DISP_TAB_ARM input");
00783 }
00784 if ( do_compute_map && recipe_use_model==FALSE){
00785 check_msg(disp_tab_frame = xsh_find_disp_tab( calib, instrument),
00786 "compute-map=TRUE, physmodel mode, you must give a DISP_TAB_ARM input");
00787 }
00788 check(xsh_params_monitor(backg_par,rectify_par,loc_obj_par,opt_extract_par,
00789 sub_sky_nbkpts1,sub_sky_nbkpts2));
00790
00791
00792
00793
00794
00795
00796 check(xsh_prepare(raws, bpmap, master_bias, XSH_OBJECT_SLIT_STARE,
00797 instrument,pre_overscan_corr,CPL_TRUE));
00798 check( rec_prefix = xsh_set_recipe_file_prefix( raws,
00799 "xsh_absorp"));
00800
00801
00802 ftag = XSH_GET_TAG_FROM_ARM( XSH_SLIT_STARE_REMOVE_CRH, instrument);
00803 check( crhm_frame = xsh_check_remove_crh_multiple( raws, ftag,stack_par,
00804 crh_clipping_par, instrument, NULL, NULL));
00805
00806
00807 check(xsh_slit_stare_get_maps(calib,
00808 do_compute_map,recipe_use_model,rec_prefix,
00809 instrument,model_config_frame,crhm_frame,
00810 disp_tab_frame,order_tab_edges,
00811 &wavemap_frame, &slitmap_frame));
00812
00813 sprintf(prefix,"%s_",rec_prefix);
00814
00815
00816 check( rmbias = xsh_check_subtract_bias( crhm_frame, master_bias,
00817 instrument, prefix,
00818 pre_overscan_corr,0));
00819
00820
00821 check( rmdark = xsh_check_subtract_dark( rmbias, master_dark,
00822 instrument, rec_prefix));
00823
00824
00825 xsh_msg("Subtract inter-order background");
00826 check(rmbkg = xsh_subtract_background( rmdark,
00827 order_tab_edges,
00828 backg_par, instrument,rec_prefix,
00829 &grid_backg,&frame_backg,0));
00830
00831
00832 xsh_slit_stare_correct_crh_and_sky(loc_obj_par,crh_single_par,rectify_par,
00833 do_sub_sky,rec_prefix,rmbkg,
00834 order_tab_edges, slitmap_frame,
00835 wavemap_frame,model_config_frame,
00836 single_frame_sky_sub_tab_frame,instrument,
00837 sub_sky_nbkpts1, sky_par,
00838 &sky_frame,&sky_frame_eso,&sky_frame_ima,
00839 wave_tab,disp_tab_frame,
00840 spectralformat_frame,nb_raw_frames,
00841 &loc_table_frame,&clean_frame,&clean_obj);
00842
00843
00844
00845
00846 check( div_frame = xsh_check_divide_flat( do_flatfield, clean_obj,
00847 master_flat, instrument, rec_prefix));
00848
00849
00850 check( sub_sky2_frame = xsh_check_subtract_sky_single( do_sub_sky, div_frame,
00851 order_tab_edges, slitmap_frame, wavemap_frame, loc_table_frame, NULL,
00852 single_frame_sky_sub_tab_frame, instrument, sub_sky_nbkpts2, sky_par,
00853 &sky_frame, &sky_frame_eso, &sky_frame_ima, rec_prefix,0));
00854
00855 xsh_msg( "Prepare S2D products" ) ;
00856 xsh_msg( "Rectify") ;
00857 sprintf(rec_name,"%s_%s_%s.fits",rec_prefix,XSH_ORDER2D,
00858 xsh_instrument_arm_tostring( instrument));
00859
00860 check( rect2_frame = xsh_rectify( sub_sky2_frame, order_tab_edges,
00861 wave_tab, model_config_frame, instrument,
00862 rectify_par,spectralformat_frame,
00863 disp_tab_frame,rec_name,
00864 &rect2_frame_eso,&rect2_frame_tab,
00865 rec_prefix));
00866 xsh_msg( "Extract" ) ;
00867 check(ext_frame=xsh_extract(rect2_frame, loc_table_frame,
00868 instrument, extract_par,&ext_frame_eso,
00869 rec_prefix)) ;
00870
00871 xsh_msg( "Merge orders with 1D frame" ) ;
00872 check( res_1D_frame = xsh_merge_ord( ext_frame, instrument,
00873 merge_par,rec_prefix ));
00874 check(xsh_monitor_spectrum1D_flux(res_1D_frame,instrument));
00875
00876 xsh_msg( "Calling xsh_merge_ord with 2D frame" ) ;
00877 check( res_2D_frame = xsh_merge_ord( rect2_frame, instrument,
00878 merge_par,rec_prefix ));
00879
00880 xsh_msg("Prepare S1D products" ) ;
00881
00882 int hsize=0;
00883 int naxis2=0;
00884 if ( do_optextract){
00885 xsh_msg( "Optimal extraction");
00886 check( xsh_opt_extract( sub_sky2_frame, order_tab_edges,
00887 wave_tab, model_config_frame, wavemap_frame,
00888 slitmap_frame, loc_table_frame,
00889 spectralformat_frame, master_flat, instrument,
00890 opt_extract_par, rec_prefix,
00891 &orderext1d_frame, &orderoxt1d_frame,
00892 &orderoxt1d_eso_frame,
00893 &qc_subex_frame,
00894 &qc_s2ddiv1d_frame,
00895 &qc_model_frame,
00896 &qc_weight_frame));
00897
00898 check( mergeext1d_frame = xsh_merge_ord( orderext1d_frame, instrument,
00899 merge_par,rec_prefix));
00900 check( mergeoxt1d_frame = xsh_merge_ord( orderoxt1d_frame, instrument,
00901 merge_par,rec_prefix));
00902 }
00903
00904 if( do_trace_obj) {
00905 name=cpl_frame_get_filename(res_2D_frame);
00906 plist=cpl_propertylist_load(name,0);
00907 naxis2=xsh_pfits_get_naxis2(plist);
00908 xsh_free_propertylist(&plist);
00909 hsize=naxis2/4;
00910 check(qc_obj_trace_ord=xsh_frame_image_ext_qc_trace_window(rect2_frame_eso,
00911 instrument,
00912 rec_prefix,
00913 hsize,0));
00914
00915 check(qc_obj_trace_mer=xsh_frame_image_qc_trace_window(res_2D_frame,
00916 instrument,
00917 rec_prefix,
00918 hsize,0));
00919 }
00920
00921
00922 if ( mergeoxt1d_frame != NULL){
00923 check( tell_mask_frame = xsh_compute_absorp( mergeoxt1d_frame, tell_list_frame,
00924 absorp_filter_hsize, absorp_thresh, instrument));
00925 }
00926 else{
00927 check( tell_mask_frame = xsh_compute_absorp( res_1D_frame, tell_list_frame,
00928 absorp_filter_hsize, absorp_thresh, instrument));
00929 }
00930
00931
00932
00933 xsh_msg( "Saving products" ) ;
00934
00935 check( xsh_add_product_vector( tell_mask_frame, frameset, parameters,
00936 RECIPE_ID, instrument,
00937 cpl_frame_get_tag( tell_mask_frame)));
00938
00939
00940
00941 check( xsh_add_product_image(rect2_frame_eso, frameset, parameters,
00942 RECIPE_ID, instrument,
00943 cpl_frame_get_tag(rect2_frame_eso)));
00944
00945 check( xsh_add_product_image(ext_frame_eso, frameset, parameters,
00946 RECIPE_ID, instrument,
00947 cpl_frame_get_tag(ext_frame_eso)));
00948
00949 check( xsh_add_product_spectrum( res_2D_frame, frameset, parameters,
00950 RECIPE_ID, instrument));
00951
00952
00953 check( xsh_add_product_spectrum( res_1D_frame, frameset, parameters,
00954 RECIPE_ID, instrument));
00955
00956 check( xsh_add_product_pre( rmbias, frameset, parameters,
00957 RECIPE_ID, instrument));
00958
00959 check( xsh_add_product_image( rmbkg, frameset, parameters,
00960 RECIPE_ID, instrument,
00961 cpl_frame_get_tag(rmbkg)));
00962
00963 if ( do_sub_sky == 1 && nb_raw_frames == 1 && crh_single_par->nb_iter > 0){
00964
00965 check( xsh_add_product_image( clean_frame, frameset, parameters,
00966 RECIPE_ID, instrument,
00967 cpl_frame_get_tag(clean_frame)));
00968
00969 }
00970 if (do_compute_map){
00971 sprintf(prefix,"%s_WAVE_MAP_%s",rec_prefix,
00972 xsh_instrument_arm_tostring(instrument));
00973
00974
00975 check(xsh_add_product_image( wavemap_frame, frameset,
00976 parameters, RECIPE_ID, instrument, prefix));
00977
00978 check(sprintf(prefix,"%s_SLIT_MAP_%s",rec_prefix,
00979 xsh_instrument_arm_tostring(instrument)));
00980
00981 check(xsh_add_product_image( slitmap_frame, frameset,
00982 parameters, RECIPE_ID, instrument, prefix));
00983 }
00984 if(do_flatfield) {
00985
00986 check( xsh_add_product_image( div_frame, frameset, parameters,
00987 RECIPE_ID, instrument,
00988 cpl_frame_get_tag(div_frame)));
00989 }
00990
00991 if ( do_optextract){
00992 check( xsh_add_product_table( orderext1d_frame, frameset,
00993 parameters, RECIPE_ID, instrument, NULL));
00994 check( xsh_add_product_table( orderoxt1d_frame, frameset,
00995 parameters, RECIPE_ID, instrument, NULL));
00996 check( xsh_add_product_spectrum( mergeext1d_frame, frameset, parameters,
00997 RECIPE_ID, instrument));
00998 check( xsh_add_product_spectrum( mergeoxt1d_frame, frameset,
00999 parameters, RECIPE_ID, instrument));
01000 check( xsh_add_product_image( qc_subex_frame, frameset, parameters,
01001 RECIPE_ID, instrument,
01002 cpl_frame_get_tag(qc_subex_frame)));
01003 check( xsh_add_product_image( qc_s2ddiv1d_frame, frameset, parameters,
01004 RECIPE_ID, instrument,
01005 cpl_frame_get_tag(qc_s2ddiv1d_frame)));
01006 check( xsh_add_product_image( qc_model_frame, frameset, parameters,
01007 RECIPE_ID, instrument,
01008 cpl_frame_get_tag(qc_model_frame)));
01009 check( xsh_add_product_image( qc_weight_frame, frameset, parameters,
01010 RECIPE_ID, instrument,
01011 cpl_frame_get_tag(qc_weight_frame)));
01012 }
01013 if ( do_sub_sky == 1 ) {
01014 check( xsh_add_product_pre( sub_sky2_frame, frameset, parameters,
01015 RECIPE_ID, instrument));
01016 check( xsh_add_product_image( sky_frame_ima, frameset, parameters,
01017 RECIPE_ID, instrument,
01018 cpl_frame_get_tag(sky_frame_ima)));
01019 check( xsh_add_product_image( sky_frame_eso, frameset,
01020 parameters, RECIPE_ID, instrument,
01021 cpl_frame_get_tag(sky_frame_eso)));
01022 }
01023 check( xsh_add_product_image( frame_backg, frameset, parameters,
01024 RECIPE_ID, instrument,
01025 cpl_frame_get_tag(frame_backg)));
01026
01027 if(crhm_frame != NULL) {
01028 check( xsh_add_product_image( crhm_frame, frameset, parameters,
01029 RECIPE_ID, instrument,
01030 cpl_frame_get_tag(crhm_frame)));
01031
01032 }
01033
01034 if(qc_sky_frame != NULL) {
01035 check( xsh_add_product_table(qc_sky_frame, frameset,
01036 parameters, RECIPE_ID, instrument,NULL));
01037
01038 }
01039
01040 if(do_trace_obj) {
01041 check( xsh_add_product_table(qc_obj_trace_ord, frameset,
01042 parameters, RECIPE_ID, instrument, NULL));
01043
01044 check( xsh_add_product_table(qc_obj_trace_mer, frameset,
01045 parameters, RECIPE_ID, instrument, NULL));
01046 }
01047
01048
01049 cleanup:
01050 xsh_end( RECIPE_ID, frameset, parameters );
01051 XSH_FREE( rec_prefix);
01052 XSH_FREE( crh_clipping_par);
01053 XSH_FREE( backg_par);
01054 XSH_FREE( crh_single_par);
01055 XSH_FREE( rectify_par);
01056 XSH_FREE( sky_par);
01057 XSH_FREE( loc_obj_par);
01058 XSH_FREE( extract_par);
01059 XSH_FREE( opt_extract_par);
01060 xsh_instrument_free(&instrument);
01061
01062 xsh_free_frameset(&raws);
01063 xsh_free_frameset(&calib);
01064 xsh_free_frame( &crhm_frame);
01065 xsh_free_frame( &qc_sky_frame);
01066
01067 xsh_free_frame( &wavemap_frame);
01068 xsh_free_frame( &slitmap_frame);
01069
01070 xsh_free_frame(&rmbias);
01071 xsh_free_frame(&rmdark);
01072 xsh_free_frame(&rmbkg);
01073 xsh_free_frame(&div_frame);
01074 xsh_free_frame(&sub_sky_frame);
01075
01076 xsh_free_frame(&sub_sky2_frame);
01077 xsh_free_frame(&sky_frame);
01078 xsh_free_frame(&sky_frame_eso);
01079 xsh_free_frame(&sky_frame_ima);
01080
01081 xsh_free_frame(&rect_frame) ;
01082 xsh_free_frame(&rect2_frame_eso) ;
01083 xsh_free_frame(&rect2_frame_tab) ;
01084
01085 xsh_free_frame( &orderext1d_frame);
01086 xsh_free_frame( &orderoxt1d_frame);
01087 xsh_free_frame( &mergeext1d_frame);
01088 xsh_free_frame( &mergeoxt1d_frame);
01089
01090 xsh_free_frame(&loc_table_frame) ;
01091 xsh_free_frame( &clean_frame);
01092 xsh_free_frame( &clean_obj);
01093 xsh_free_frame( &ext_frame);
01094 xsh_free_frame( &ext_frame_eso);
01095 xsh_free_frame(&res_1D_frame) ;
01096 xsh_free_frame(&res_2D_frame) ;
01097 xsh_free_frame(&fluxcal_rect_1D_frame) ;
01098 xsh_free_frame(&fluxcal_rect_2D_frame) ;
01099 xsh_free_frame(&fluxcal_1D_frame) ;
01100 xsh_free_frame(&fluxcal_2D_frame) ;
01101
01102 xsh_free_frame(&rect2_frame) ;
01103 xsh_free_frame(&grid_backg) ;
01104 xsh_free_frame(&frame_backg) ;
01105 xsh_free_frame( &tell_mask_frame);
01106 xsh_free_propertylist(&plist);
01107
01108 xsh_free_frame( &single_frame_sky_sub_tab_frame);
01109 xsh_free_frame( &qc_subex_frame);
01110 xsh_free_frame(&qc_s2ddiv1d_frame);
01111 xsh_free_frame(&qc_model_frame);
01112 xsh_free_frame(&qc_weight_frame);
01113
01114 return CPL_ERROR_NONE;
01115 }
01116