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
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00040
00043
00044
00045
00046
00047
00048
00049
00050
00051 #include <xsh_error.h>
00052
00053 #include <xsh_utils.h>
00054 #include <xsh_utils_table.h>
00055 #include <xsh_utils_image.h>
00056 #include <xsh_utils_scired_slit.h>
00057
00058 #include <xsh_msg.h>
00059 #include <xsh_model_utils.h>
00060 #include <xsh_data_instrument.h>
00061 #include <xsh_data_spectrum1D.h>
00062
00063 #include <xsh_dfs.h>
00064 #include <xsh_pfits.h>
00065
00066 #include <xsh_drl.h>
00067 #include <xsh_drl_check.h>
00068 #include <xsh_model_arm_constants.h>
00069 #include <xsh_utils_efficiency.h>
00070
00071
00072 #include <cpl.h>
00073
00074
00075
00076
00077
00078
00079 #define RECIPE_ID "xsh_respon_slit_nod"
00080 #define RECIPE_AUTHOR "P.Goldoni, L.Guglielmi, R. Haigron, F. Royer, D. Bramich A. Modigliani"
00081 #define RECIPE_CONTACT "amodigli@eso.org"
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 static int xsh_respon_slit_nod_create(cpl_plugin *);
00092 static int xsh_respon_slit_nod_exec(cpl_plugin *);
00093 static int xsh_respon_slit_nod_destroy(cpl_plugin *);
00094
00095
00096 static cpl_error_code xsh_respon_slit_nod(cpl_parameterlist *, cpl_frameset *);
00097
00098
00099
00100
00101 static char xsh_respon_slit_nod_description_short[] =
00102 "Reduce STD star frames in SLIT configuration and nod mode";
00103
00104 static char xsh_respon_slit_nod_description[] =
00105 "This recipe reduces science exposure in SLIT configuration and NOD mode\n\
00106 Input Frames : \n\
00107 - A set of n Science frames ( n even ), \
00108 Tag = OBJECT_SLIT_NOD_arm\n\
00109 - Spectral format table (Tag = SPECTRAL_FORMAT_TAB_arm)\n\
00110 - [UVB,VIS] A master bias frame (Tag = MASTER_BIAS_arm)\n\
00111 - A master flat frame (Tag = MASTER_FLAT_SLIT_arm)\n\
00112 - An order table frame(Tag = ORDER_TABLE_EDGES_SLIT_arm)\n\
00113 - [poly mode] A wave solution frame(Tag = WAVE_TAB_2D_arm)\n\
00114 - [poly mode] A wave map frame(Tag = WAVE_MAP_arm)\n\
00115 - [poly mode] A disp table frame(Tag = DISP_TAB_arm)\n\
00116 - [physical model mode]A model cfg table (Format = TABLE, Tag = XSH_MOD_CFG_TAB_arm)\n\
00117 - [OPTIONAL] A badpixel map (Tag = MASTER_BP_MAP_arm)\n\
00118 - [OPTIONAL] An atmospheric extinction table (Tag = ATMOS_EXT_arm)\n\
00119 - [OPTIONAL] An master response curve table (Tag = MRESPONSE_MERGE1D_SLIT_arm)\n\
00120 if provided this is the one used to flux calibrate the spectra\n\
00121 Products : \n\
00122 - [If STD is in catal] The response function (Tag = PREFIX_RESPONSE_ORDER1D_SLIT_arm)\n\
00123 - [If STD is in catal] The response function (Tag = PREFIX_RESPONSE_MERGE1D_SLIT_arm)\n\
00124 - PREFIX_ORDER2D_arm (2 dimension)\n\
00125 - PREFIX_ORDER1D_arm (1 dimension)\n\
00126 - PREFIX_MERGE2D_arm (2 dimension)\n\
00127 - PREFIX_MERGE1D_arm (1 dimension)\n\
00128 - PREFIX_WAVE_MAP_arm, wave map image\n\
00129 - PREFIX_SLIT_MAP_arm, slit map image\n\
00130 - [If STD is in catal] Flux calibrated order-by-order 2D spectrum (Tag = PREFIX_FLUX_ORDER2D_arm)\n\
00131 - [If STD is in catal] Flux calibrated order-by-order 1D spectrum (Tag = PREFIX_FLUX_ORDER1D_arm)\n\
00132 - [If STD is in catal] Flux calibrated merged 2D spectrum (Tag = PREFIX_FLUX_MERGE2D_arm)\n\
00133 - [If STD is in catal] Flux calibrated merged 1D spectrum (Tag = PREFIX_FLUX_MERGE1D_arm)\n\
00134 - [If STD is in catal] The efficiency (Tag = EFFICIENCY_SLIT_arm)\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_respon_slit_nod_description_short,
00168 xsh_respon_slit_nod_description,
00169 RECIPE_AUTHOR,
00170 RECIPE_CONTACT,
00171 xsh_get_license(),
00172 xsh_respon_slit_nod_create,
00173 xsh_respon_slit_nod_exec,
00174 xsh_respon_slit_nod_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_respon_slit_nod_create(cpl_plugin *plugin){
00194
00195 cpl_recipe *recipe = NULL;
00196 xsh_remove_crh_single_param crh_single = { 0.1, 20.0, 2.0, 4} ;
00197 xsh_rectify_param rectify = { "tanh",
00198 CPL_KERNEL_DEFAULT,
00199 2,
00200 -1.0,
00201 -1.0,
00202 1,
00203 0,0. };
00204 xsh_localize_obj_param loc_obj =
00205 {10, 0.1, 0, 0, LOC_GAUSSIAN_METHOD, 0, 0.5,3,3, FALSE};
00206 xsh_extract_param extract_par =
00207 { NOD_METHOD};
00208 xsh_combine_nod_param nod_param = { 5, TRUE, 5, 2, 0.1, "throwlist.asc", COMBINE_MEAN_METHOD} ;
00209 xsh_slit_limit_param slit_limit_param = { MIN_SLIT, MAX_SLIT, 0, 0 } ;
00210
00211 xsh_stack_param stack_param = {"median",5.,5.};
00212 xsh_interpolate_bp_param ipol_par = {30 };
00213
00214 xsh_init();
00215
00216
00217 nod_param.nod_min = 5;
00218 nod_param.nod_clip = TRUE;
00219 nod_param.nod_clip_sigma = 5.;
00220 nod_param.nod_clip_niter = 2;
00221 nod_param.nod_clip_diff = 0.1;
00222 nod_param.throwname = "throwlist.asc";
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 xsh_parameters_decode_bp(RECIPE_ID,recipe->parameters,-1);
00243 check( xsh_parameters_pre_overscan( RECIPE_ID, recipe->parameters ) ) ;
00244 check(xsh_parameters_stack_create(RECIPE_ID,recipe->parameters,stack_param));
00245
00246
00247 check( xsh_parameters_remove_crh_single_create( RECIPE_ID,
00248 recipe->parameters, crh_single));
00249
00250
00251 check(xsh_parameters_rectify_create(RECIPE_ID,recipe->parameters,
00252 rectify )) ;
00253 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00254 "rectify-fast", TRUE,
00255 "Fast if TRUE (Rect[B-A] = -Rect[A-B]), in that case only entire pixel shifts are applied. "));
00256
00257
00258
00259 check(xsh_parameters_localize_obj_create(RECIPE_ID,recipe->parameters,
00260 loc_obj )) ;
00261
00262 check( xsh_parameters_new_double( recipe->parameters, RECIPE_ID,
00263 "localize-nod-throw", loc_obj.nod_step,
00264 "Step (arcsec) between A and B images in nodding mode."));
00265
00266
00267
00268 check(xsh_parameters_extract_create(RECIPE_ID,
00269 recipe->parameters,
00270 extract_par,NOD_METHOD )) ;
00271
00272 check(xsh_parameters_interpolate_bp_create(RECIPE_ID,
00273 recipe->parameters,ipol_par)) ;
00274
00275 check(xsh_parameters_combine_nod_create(RECIPE_ID,
00276 recipe->parameters,
00277 nod_param )) ;
00278
00279 check(xsh_parameters_slit_limit_create(RECIPE_ID,
00280 recipe->parameters,
00281 slit_limit_param )) ;
00282
00283
00284
00285
00286
00287 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00288 "correct-tellurics", TRUE,
00289 "TRUE if during response computation we apply telluric correction"));
00290
00291 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00292 "correct-sky-by-median", TRUE,
00293 "TRUE if the resampled spectrum at each wavelength is median subtracted to remove sky lines"));
00294
00295 cleanup:
00296 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
00297 xsh_error_dump(CPL_MSG_ERROR);
00298 return 1;
00299 }
00300 else {
00301 return 0;
00302 }
00303 }
00304
00305
00311
00312
00313 static int xsh_respon_slit_nod_exec(cpl_plugin *plugin) {
00314 cpl_recipe *recipe = NULL;
00315
00316
00317
00318 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00319
00320
00321 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00322 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00323
00324 recipe = (cpl_recipe *)plugin;
00325
00326
00327 xsh_respon_slit_nod(recipe->parameters, recipe->frames);
00328
00329 cleanup:
00330 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00331 xsh_error_dump(CPL_MSG_ERROR);
00332 xsh_error_reset();
00333 return 1;
00334 }
00335 else {
00336 return 0;
00337 }
00338 }
00339
00340
00346
00347 static int xsh_respon_slit_nod_destroy(cpl_plugin *plugin)
00348 {
00349 cpl_recipe *recipe = NULL;
00350
00351
00352 xsh_error_reset();
00353
00354 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00355
00356
00357 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00358 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00359
00360 recipe = (cpl_recipe *)plugin;
00361
00362 xsh_free_parameterlist(&recipe->parameters);
00363
00364 cleanup:
00365 if (cpl_error_get_code() != CPL_ERROR_NONE)
00366 {
00367 return 1;
00368 }
00369 else
00370 {
00371 return 0;
00372 }
00373 }
00374
00375
00383
00384 static cpl_error_code
00385 xsh_respon_slit_nod( cpl_parameterlist* parameters,
00386 cpl_frameset* frameset)
00387 {
00388 const char* recipe_tags[3] = {XSH_OBJECT_SLIT_NOD,XSH_STD_TELL_SLIT_NOD,XSH_STD_FLUX_SLIT_NOD};
00389 int recipe_tags_size = 3;
00390
00391
00392 cpl_frameset *raws = NULL;
00393 cpl_frameset *raws_ord_set = NULL;
00394 cpl_frameset *calib = NULL;
00395
00396
00397 cpl_frame* bpmap = NULL;
00398 cpl_frame *master_bias = NULL;
00399 cpl_frame* master_flat = NULL;
00400 cpl_frame* order_tab_edges = NULL;
00401 cpl_frame * wave_tab = NULL ;
00402 cpl_frame * model_config_frame = NULL;
00403 cpl_frame * wavemap = NULL;
00404 cpl_frame * spectral_format = NULL;
00405
00406
00407 int rectify_fast = 0 ;
00408 xsh_instrument* instrument = NULL;
00409 xsh_remove_crh_single_param * crh_single_par = NULL;
00410 xsh_rectify_param * rectify_par = NULL;
00411 xsh_localize_obj_param * loc_obj_par = NULL;
00412 xsh_extract_param * extract_par = NULL;
00413 xsh_combine_nod_param * combine_nod_par = NULL;
00414 xsh_slit_limit_param * slit_limit_par = NULL;
00415 xsh_stack_param* stack_par=NULL;
00416
00417 char comb_tag[256];
00418
00419
00420
00421 int nb_raw_frames;
00422
00423
00424 cpl_frameset* raws_avg=NULL;
00425 cpl_frame* disp_tab_frame=NULL;
00426 cpl_frame* slitmap=NULL;
00427 cpl_frame *skymask_frame = NULL;
00428
00429 int do_computemap=1;
00430 int do_flatfield = CPL_TRUE;
00431
00432 char *rec_prefix = NULL;
00433
00434
00435 cpl_frameset *nod_set = NULL;
00436 cpl_frameset *comb_set = NULL;
00437 cpl_frameset *comb_eff_set = NULL;
00438 cpl_frame *comb_frame = NULL;
00439 cpl_frame *comb_eff_frame = NULL;
00440 cpl_frame *combeso_frame = NULL;
00441 cpl_frame *combeffeso_frame = NULL;
00442 cpl_frame *res2D_frame = NULL;
00443 cpl_frame *loc_table_frame = NULL;
00444 cpl_frame *res1D_frame = NULL;
00445 cpl_frame *res1D_eff_frame = NULL;
00446 cpl_frame *res1Deso_frame = NULL;
00447 cpl_frame *res1Deso_eff_frame = NULL;
00448 cpl_frame *s1D_frame = NULL;
00449 cpl_frame *frm_eff = NULL;
00450 cpl_frame* response_ord_frame=NULL;
00451 cpl_frame* response_frame=NULL;
00452 cpl_frame* mresponse_frame=NULL;
00453 cpl_frame * fluxcal_1D_frame = NULL ;
00454 cpl_frame * fluxcal_2D_frame = NULL ;
00455 cpl_frame * fluxcal_rect_1D_frame = NULL ;
00456 cpl_frame * fluxcal_rect_2D_frame = NULL ;
00457 cpl_frame* frm_atmext=NULL;
00458 cpl_frame * nrm_1D_frame = NULL ;
00459 cpl_frame * nrm_2D_frame = NULL ;
00460 int pre_overscan_corr=0;
00461 cpl_frame* frm_std_cat=NULL;
00462 cpl_frame* high_abs_win=NULL;
00463 cpl_frame* tell_mod_cat=NULL;
00464 cpl_frameset* crh_clean = NULL;
00465
00466
00467 double exptime = 1. ;
00468 int merge_par=0;
00469 xsh_interpolate_bp_param *ipol_bp=NULL;
00470 int corr_tell=0;
00471 int corr_sky=0;
00472
00473
00474
00475
00476 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00477 recipe_tags, recipe_tags_size, RECIPE_ID,
00478 XSH_BINARY_VERSION,
00479 xsh_respon_slit_nod_description_short));
00480
00481 if(instrument->arm == XSH_ARM_NIR) {
00482 xsh_instrument_nir_corr_if_JH(raws,instrument);
00483 xsh_calib_nir_respon_corr_if_JH(calib,instrument);
00484 }
00485
00486 assure( instrument->mode == XSH_MODE_SLIT, CPL_ERROR_ILLEGAL_INPUT,
00487 "Instrument NOT in Slit Mode");
00488
00489 check(xsh_ensure_raws_number_is_even(raws));
00490 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00491
00492
00493
00494
00495
00496
00497
00498 check( rec_prefix = xsh_set_recipe_file_prefix(raws,"xsh_respon_slit_nod"));
00499
00500
00501 check( nb_raw_frames = cpl_frameset_get_size( raws));
00502 check( raws_ord_set = xsh_order_frameset_by_date( raws));
00503
00504 xsh_msg_dbg_low( "Nb of Raw frames: %d", nb_raw_frames);
00505
00506
00507
00508
00509
00510
00511 check( xsh_prepare( raws_ord_set, bpmap, master_bias, XSH_OBJECT_SLIT_NOD,
00512 instrument,pre_overscan_corr,CPL_TRUE));
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530 check( stack_par = xsh_stack_frames_get( RECIPE_ID, parameters));
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 check( xsh_scired_nod_get_parameters( parameters,instrument,
00541 &crh_single_par, &rectify_par,
00542 &extract_par, &combine_nod_par,
00543 &slit_limit_par, &loc_obj_par,
00544 &rectify_fast, &pre_overscan_corr,
00545 RECIPE_ID));
00546
00547 check(ipol_bp = xsh_parameters_interpolate_bp_get(RECIPE_ID,parameters));
00548 check( corr_tell = xsh_parameters_get_boolean( parameters, RECIPE_ID,
00549 "correct-tellurics"));
00550 check( corr_sky = xsh_parameters_get_boolean( parameters, RECIPE_ID,
00551 "correct-sky-by-median"));
00552
00553 check( xsh_scired_slit_nod_get_calibs(raws,calib,instrument,
00554 &bpmap,&master_bias,&master_flat,
00555 &order_tab_edges,&wave_tab,
00556 &model_config_frame,&wavemap,&slitmap,
00557 &disp_tab_frame,
00558 &spectral_format,
00559 &skymask_frame,
00560 &response_ord_frame,
00561 &frm_atmext,
00562 do_computemap,
00563 loc_obj_par->use_skymask,
00564 pre_overscan_corr,
00565 rec_prefix,RECIPE_ID));
00566
00567 rectify_par->conserve_flux=FALSE;
00568 if ( rectify_fast == CPL_FALSE && loc_obj_par->method == LOC_MANUAL_METHOD){
00569 xsh_error_msg( "Mode accurate can not be use with localize-method MANUAL");
00570 }
00571
00572
00573 if((mresponse_frame=xsh_find_frame_with_tag(calib,XSH_MRESPONSE_MERGE1D_SLIT,
00574 instrument)) != NULL ) {
00575 xsh_msg("Using the master response curve to flux calibrate the spectrum");
00576 }
00577
00578
00579
00580 frm_atmext=xsh_find_frame_with_tag(calib,XSH_ATMOS_EXT,instrument);
00581 if(frm_atmext==NULL) {
00582 xsh_msg_error("Provide atmospheric extinction frame");
00583 return CPL_ERROR_DATA_NOT_FOUND;
00584 }
00585
00586 frm_std_cat=xsh_find_frame_with_tag(calib,XSH_FLUX_STD_CAT,instrument);
00587 if(frm_std_cat==NULL) {
00588 xsh_msg_error("Provide std star catalog frame");
00589 return CPL_ERROR_DATA_NOT_FOUND;
00590 }
00591
00592 high_abs_win=xsh_find_frame_with_tag(calib,XSH_HIGH_ABS_WIN,instrument);
00593
00594 tell_mod_cat=xsh_find_frame_with_tag(calib,XSH_TELL_MOD_CAT,instrument);
00595
00596
00597
00598
00599
00600
00601
00602 check(xsh_frameset_uniform_bin(&raws_ord_set, &calib,instrument));
00603
00604
00605 check(xsh_frameset_check_uniform_exptime(raws_ord_set,instrument));
00606
00607
00608 crh_clean = xsh_frameset_crh_single(raws_ord_set, crh_single_par,instrument,rec_prefix,"NOD");
00609
00610
00611 check( raws_avg = xsh_nod_group_by_reloff(crh_clean,instrument,stack_par));
00612
00613
00614 check( nod_set = xsh_subtract_sky_nod( raws_avg, instrument, rectify_fast));
00615
00616 if ( rectify_fast ){
00617
00618
00619 check(comb_set=xsh_scired_slit_nod_fast(
00620 nod_set,
00621 spectral_format,
00622 master_flat,
00623 order_tab_edges,
00624 wave_tab,
00625 model_config_frame,
00626 disp_tab_frame,
00627 wavemap,
00628 instrument,
00629 crh_single_par,
00630 rectify_par,
00631 do_flatfield,corr_sky,1,
00632 rec_prefix,
00633 &comb_eff_set));
00634
00635 }
00636 else {
00637 check( comb_set = xsh_scired_slit_nod_accurate(
00638 nod_set,
00639 spectral_format,
00640 master_flat,
00641 order_tab_edges,
00642 wave_tab,
00643 model_config_frame,
00644 disp_tab_frame,
00645 wavemap,
00646 skymask_frame,
00647 instrument,
00648 crh_single_par,
00649 rectify_par,
00650 loc_obj_par,
00651 combine_nod_par->throwname,
00652 do_flatfield,
00653 rec_prefix
00654 ));
00655 comb_eff_set=cpl_frameset_duplicate(comb_set);
00656
00657 }
00658
00659
00660
00661
00662 sprintf( comb_tag,"%s_%s",
00663 rec_prefix, XSH_GET_TAG_FROM_ARM( XSH_ORDER2D, instrument));
00664 check( comb_frame = xsh_combine_nod( comb_set, combine_nod_par,
00665 comb_tag, instrument,&combeso_frame));
00666
00667
00668
00669 check( res2D_frame = xsh_merge_ord( comb_frame, instrument,
00670 merge_par,rec_prefix));
00671
00672
00673 if ( extract_par->method == LOCALIZATION_METHOD ||
00674 extract_par->method == CLEAN_METHOD ) {
00675 xsh_msg( "Re-Localize before extraction" ) ;
00676 check( loc_table_frame = xsh_localize_obj( comb_frame, skymask_frame,instrument,
00677 loc_obj_par, slit_limit_par, "LOCALIZE.fits"));
00678 }
00679 xsh_msg( "Extract 1D order-by-order spectrum" ) ;
00680 check( res1D_frame = xsh_extract_clean( comb_frame, loc_table_frame,
00681 instrument, extract_par, ipol_bp,&res1Deso_frame, rec_prefix));
00682 xsh_msg( "Merge orders with 1D frame" ) ;
00683 check( s1D_frame = xsh_merge_ord( res1D_frame, instrument,
00684 merge_par,rec_prefix));
00685
00686
00687
00688 {
00689 cpl_propertylist * plist = NULL ;
00690 plist=cpl_propertylist_load(cpl_frame_get_filename(comb_frame),0) ;
00691 exptime = xsh_pfits_get_exptime(plist); ;
00692 xsh_msg_dbg_medium( "EXPTIME: %lf", exptime ) ;
00693
00694 xsh_free_propertylist( &plist ) ;
00695 }
00696
00697
00698
00699 if(frm_std_cat!=NULL && frm_atmext!=NULL) {
00700 xsh_msg( "Calling xsh_compute_response" ) ;
00701 if( (response_ord_frame = xsh_compute_response_ord( res1Deso_frame,
00702 frm_std_cat,
00703 frm_atmext,
00704 high_abs_win,
00705 instrument,
00706 exptime )) == NULL) {
00707 xsh_msg_warning("Some error occurred during response computation");
00708 xsh_print_rec_status(0);
00709 cpl_error_reset();
00710 }
00711
00712 if( (response_frame = xsh_compute_response2( s1D_frame,
00713 frm_std_cat,
00714 frm_atmext,
00715 high_abs_win,
00716 tell_mod_cat,
00717 instrument,
00718 exptime,
00719 corr_tell )) == NULL) {
00720 xsh_msg_warning("Some error occurred during response computation");
00721 xsh_print_rec_status(0);
00722 cpl_error_reset();
00723 } else {
00724
00725 check(xsh_frame_table_monitor_flux_qc(response_frame,"LAMBDA",
00726 "RESPONSE","RESP",instrument));
00727 }
00728 }
00729
00730 if(mresponse_frame != NULL) {
00731 check(xsh_flux_calibrate(combeso_frame,res1Deso_frame,frm_atmext,
00732 mresponse_frame,merge_par,instrument,rec_prefix,
00733 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00734 &fluxcal_2D_frame,&fluxcal_1D_frame));
00735
00736 } else if(mresponse_frame == NULL &&
00737 (response_frame != NULL && frm_atmext != NULL)) {
00738 check(xsh_flux_calibrate(combeso_frame,res1Deso_frame,frm_atmext,
00739 response_frame,merge_par,instrument,rec_prefix,
00740 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00741 &fluxcal_2D_frame,&fluxcal_1D_frame));
00742 }
00743
00744
00745
00746 if(response_frame != NULL && frm_atmext != NULL &&
00747 disp_tab_frame != NULL && comb_eff_set != NULL) {
00748 check( comb_eff_frame = xsh_combine_nod( comb_eff_set, combine_nod_par,
00749 comb_tag, instrument,
00750 &combeffeso_frame));
00751
00752 xsh_msg( "Extract 1D order-by-order spectrum" ) ;
00753 check( res1D_eff_frame = xsh_extract_clean( comb_eff_frame, loc_table_frame,
00754 instrument, extract_par, ipol_bp,
00755 &res1Deso_eff_frame, rec_prefix));
00756
00757 frm_eff=xsh_compute_efficiency(res1Deso_eff_frame,frm_std_cat,
00758 frm_atmext,high_abs_win,
00759 instrument);
00760 }
00761
00762
00763 if(model_config_frame!=NULL && wavemap != NULL&& slitmap != NULL) {
00764
00765 check(xsh_compute_resampling_accuracy(wavemap,slitmap,order_tab_edges,model_config_frame,res2D_frame,instrument));
00766
00767 check(xsh_compute_resampling_accuracy(wavemap,slitmap,order_tab_edges,model_config_frame,combeso_frame,instrument));
00768
00769 check(xsh_compute_wavelength_resampling_accuracy(wavemap,order_tab_edges,model_config_frame,res1Deso_frame,instrument));
00770
00771 check(xsh_compute_wavelength_resampling_accuracy(wavemap,order_tab_edges,model_config_frame,s1D_frame,instrument));
00772
00773 xsh_add_afc_info(model_config_frame,wavemap);
00774 xsh_add_afc_info(model_config_frame,slitmap);
00775
00776 if(fluxcal_rect_2D_frame != NULL) {
00777
00778 check(xsh_compute_resampling_accuracy(wavemap,slitmap,order_tab_edges,model_config_frame,fluxcal_rect_2D_frame,instrument));
00779 check(xsh_compute_resampling_accuracy(wavemap,slitmap,order_tab_edges,model_config_frame,fluxcal_2D_frame,instrument));
00780
00781 check(xsh_compute_wavelength_resampling_accuracy(wavemap,order_tab_edges,model_config_frame,fluxcal_rect_1D_frame,instrument));
00782 check(xsh_compute_wavelength_resampling_accuracy(wavemap,order_tab_edges,model_config_frame,fluxcal_1D_frame,instrument));
00783
00784 }
00785
00786 }
00787
00788
00789
00790 if(response_ord_frame!=NULL) {
00791 check( xsh_add_product_table(response_ord_frame, frameset, parameters,
00792 RECIPE_ID, instrument,NULL));
00793 }
00794 if(response_frame!=NULL) {
00795 check( xsh_add_product_table( response_frame, frameset, parameters,
00796 RECIPE_ID, instrument,NULL));
00797
00798 }
00799
00800
00801 check( xsh_add_product_image( combeso_frame, frameset,
00802 parameters, RECIPE_ID, instrument,NULL));
00803
00804 check( xsh_add_product_image( res1Deso_frame, frameset, parameters,
00805 RECIPE_ID, instrument,NULL));
00806
00807 check( xsh_add_product_pre( res2D_frame, frameset, parameters,
00808 RECIPE_ID, instrument));
00809 check(xsh_monitor_spectrum1D_flux(s1D_frame,instrument));
00810
00811 check( xsh_add_product_spectrum( s1D_frame, frameset, parameters,
00812 RECIPE_ID, instrument));
00813
00814 if ( do_computemap){
00815
00816 check( xsh_add_product_image( wavemap, frameset,
00817 parameters, RECIPE_ID, instrument,NULL));
00818
00819
00820 check( xsh_add_product_image( slitmap, frameset,
00821 parameters, RECIPE_ID, instrument,NULL));
00822 }
00823
00824 if(fluxcal_2D_frame != NULL) {
00825 check( xsh_add_product_image(fluxcal_rect_2D_frame,frameset,parameters,
00826 RECIPE_ID, instrument,NULL));
00827 check( xsh_add_product_image(fluxcal_rect_1D_frame,frameset,parameters,
00828 RECIPE_ID, instrument,NULL));
00829
00830 check( xsh_add_product_spectrum( fluxcal_2D_frame, frameset, parameters,
00831 RECIPE_ID, instrument));
00832 check( xsh_add_product_spectrum( fluxcal_1D_frame, frameset, parameters,
00833 RECIPE_ID, instrument));
00834 }
00835
00836 if(frm_eff!=NULL) {
00837 check(xsh_add_product_table(frm_eff, frameset,parameters,
00838 RECIPE_ID, instrument,NULL));
00839 }
00840
00841 cleanup:
00842
00843 xsh_end( RECIPE_ID, frameset, parameters);
00844
00845 xsh_instrument_free( &instrument);
00846 xsh_free_frameset( &raws);
00847 xsh_free_frameset( &calib);
00848 XSH_FREE( rec_prefix);
00849 XSH_FREE(ipol_bp);
00850
00851 xsh_free_frameset( &raws_ord_set);
00852 xsh_free_frameset( &raws_avg);
00853 xsh_free_frame( &wavemap);
00854 xsh_free_frame( &slitmap);
00855 xsh_free_frame( &comb_frame);
00856 xsh_free_frameset(&crh_clean);
00857
00858 XSH_FREE( rectify_par);
00859 XSH_FREE( crh_single_par);
00860 XSH_FREE( loc_obj_par);
00861 XSH_FREE( slit_limit_par);
00862 XSH_FREE( combine_nod_par);
00863 XSH_FREE( extract_par);
00864 XSH_FREE( stack_par);
00865
00866 xsh_free_frameset( &nod_set);
00867 xsh_free_frameset( &comb_set);
00868 xsh_free_frameset( &comb_eff_set);
00869 xsh_free_frame( &comb_eff_frame);
00870
00871 xsh_free_frame( &response_ord_frame);
00872 xsh_free_frame( &response_frame);
00873 xsh_free_frame( &combeso_frame);
00874 xsh_free_frame( &combeffeso_frame);
00875 xsh_free_frame( &res2D_frame);
00876 xsh_free_frame( &loc_table_frame);
00877 xsh_free_frame( &res1D_frame);
00878 xsh_free_frame( &res1D_eff_frame);
00879
00880 xsh_free_frame( &res1Deso_eff_frame);
00881 xsh_free_frame( &res1Deso_frame);
00882 xsh_free_frame( &s1D_frame);
00883 xsh_free_frame(&fluxcal_rect_1D_frame) ;
00884 xsh_free_frame(&fluxcal_rect_2D_frame) ;
00885 xsh_free_frame(&fluxcal_1D_frame) ;
00886 xsh_free_frame(&fluxcal_2D_frame) ;
00887 xsh_free_frame(&nrm_1D_frame) ;
00888 xsh_free_frame(&nrm_2D_frame) ;
00889 xsh_free_frame(&frm_eff) ;
00890
00891 return cpl_error_get_code();
00892 }
00893