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"
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 - [If STD is in catal] Flux calibrated merged 2D spectrum (Tag = PREFIX_FLUXCAL2D_arm)\n\
00129 - [If STD is in catal] Flux calibrated merged 1D spectrum (Tag = PREFIX_FLUXCAL1D_arm)\n\
00130 - [If STD is in catal] The efficiency (Tag = EFFICIENCY_SLIT_arm)\n\
00131 - where PREFIX is SCI, FLUX, TELL if input raw DPR.TYPE contains OBJECT or FLUX or TELLURIC";
00132
00133
00134
00135
00136
00145
00146
00147 int cpl_plugin_get_info(cpl_pluginlist *list) {
00148 cpl_recipe *recipe = NULL;
00149 cpl_plugin *plugin = NULL;
00150
00151 recipe = cpl_calloc(1, sizeof(*recipe));
00152 if ( recipe == NULL ){
00153 return -1;
00154 }
00155
00156 plugin = &recipe->interface ;
00157
00158 cpl_plugin_init(plugin,
00159 CPL_PLUGIN_API,
00160 XSH_BINARY_VERSION,
00161 CPL_PLUGIN_TYPE_RECIPE,
00162 RECIPE_ID,
00163 xsh_respon_slit_nod_description_short,
00164 xsh_respon_slit_nod_description,
00165 RECIPE_AUTHOR,
00166 RECIPE_CONTACT,
00167 xsh_get_license(),
00168 xsh_respon_slit_nod_create,
00169 xsh_respon_slit_nod_exec,
00170 xsh_respon_slit_nod_destroy);
00171
00172 cpl_pluginlist_append(list, plugin);
00173
00174 return (cpl_error_get_code() != CPL_ERROR_NONE);
00175 }
00176
00177
00187
00188
00189 static int xsh_respon_slit_nod_create(cpl_plugin *plugin){
00190 cpl_parameter* p=NULL;
00191 cpl_recipe *recipe = NULL;
00192 xsh_remove_crh_single_param crh_single = { 0.1, 5.0, 2.0, 4} ;
00193 xsh_rectify_param rectify = { "default",
00194 CPL_KERNEL_DEFAULT,
00195 4,
00196 -1.0,
00197 -1.0,
00198 1,
00199 0,0. };
00200 xsh_localize_obj_param loc_obj =
00201 {10, 0.1, 0, 0, LOC_GAUSSIAN_METHOD, 0, 0.5,3,3, FALSE};
00202 xsh_extract_param extract_par =
00203 { NOD_METHOD};
00204 xsh_combine_nod_param nod_param = { 5, TRUE, 5, 2, 0.1, "throwlist.asc", COMBINE_MEAN_METHOD} ;
00205 xsh_slit_limit_param slit_limit_param = { MIN_SLIT, MAX_SLIT, 0, 0 } ;
00206 xsh_clipping_param crh_clip_param = {5.0, 5, 0.7, 0, 0.3};
00207 xsh_stack_param stack_param = {"median",5.,5.,5};
00208
00209 xsh_init();
00210
00211
00212 nod_param.nod_min = 5;
00213 nod_param.nod_clip = TRUE;
00214 nod_param.nod_clip_sigma = 5.;
00215 nod_param.nod_clip_niter = 2;
00216 nod_param.nod_clip_diff = 0.1;
00217 nod_param.throwname = "throwlist.asc";
00218
00219
00220 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin");
00221
00222
00223 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00224 CPL_ERROR_TYPE_MISMATCH,
00225 "Plugin is not a recipe");
00226
00227 recipe = (cpl_recipe *)plugin;
00228
00229
00230 recipe->parameters = cpl_parameterlist_new();
00231 assure( recipe->parameters != NULL,
00232 CPL_ERROR_ILLEGAL_OUTPUT,
00233 "Memory allocation failed!");
00234
00235
00236 check( xsh_parameters_generic( RECIPE_ID, recipe->parameters ) ) ;
00237 check( xsh_parameters_pre_overscan( RECIPE_ID, recipe->parameters ) ) ;
00238 check(xsh_parameters_stack_create(RECIPE_ID,recipe->parameters,stack_param));
00239
00240 check(xsh_parameters_background_create(RECIPE_ID,recipe->parameters));
00241 check(p=xsh_parameters_find(recipe->parameters,RECIPE_ID,"background-method"));
00242 cpl_parameter_set_default_string(p,"poly");
00243
00244
00245 check( xsh_parameters_remove_crh_single_create( RECIPE_ID,
00246 recipe->parameters, crh_single));
00247
00248
00249 check(xsh_parameters_rectify_create(RECIPE_ID,recipe->parameters,
00250 rectify )) ;
00251 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00252 "rectify-fast", TRUE,
00253 "Fast if TRUE (Rect[B-A] = -Rect[A-B]), in that case only entire pixel shifts are applied. "));
00254
00255
00256
00257 check(xsh_parameters_localize_obj_create(RECIPE_ID,recipe->parameters,
00258 loc_obj )) ;
00259
00260 check( xsh_parameters_new_double( recipe->parameters, RECIPE_ID,
00261 "localize-nod-throw", loc_obj.nod_step,
00262 "Step (arcsec) between A and B images in nodding mode."));
00263
00264
00265
00266 check(xsh_parameters_extract_create(RECIPE_ID,
00267 recipe->parameters,
00268 extract_par,NOD_METHOD )) ;
00269
00270 check(xsh_parameters_merge_ord_create(RECIPE_ID,
00271 recipe->parameters,
00272 WEIGHTED_MERGE_METHOD)) ;
00273
00274 check(xsh_parameters_combine_nod_create(RECIPE_ID,
00275 recipe->parameters,
00276 nod_param )) ;
00277
00278 check(xsh_parameters_slit_limit_create(RECIPE_ID,
00279 recipe->parameters,
00280 slit_limit_param )) ;
00281
00282 check(xsh_parameters_clipping_crh_create(RECIPE_ID,recipe->parameters,
00283 crh_clip_param));
00284
00285 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00286 "compute-map", TRUE,
00287 "if TRUE recompute (wave and slit) maps from the dispersion solution. Use FALSE only if you are sure to have wave and slit maps better than what this recipe may compute."));
00288 check( xsh_parameters_new_boolean( recipe->parameters, RECIPE_ID,
00289 "do-flatfield", TRUE,
00290 "TRUE if we do the flatfielding"));
00291
00292 cleanup:
00293 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
00294 xsh_error_dump(CPL_MSG_ERROR);
00295 return 1;
00296 }
00297 else {
00298 return 0;
00299 }
00300 }
00301
00302
00308
00309
00310 static int xsh_respon_slit_nod_exec(cpl_plugin *plugin) {
00311 cpl_recipe *recipe = NULL;
00312
00313
00314
00315 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00316
00317
00318 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00319 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00320
00321 recipe = (cpl_recipe *)plugin;
00322
00323
00324 xsh_respon_slit_nod(recipe->parameters, recipe->frames);
00325
00326 cleanup:
00327 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
00328 xsh_error_dump(CPL_MSG_ERROR);
00329 xsh_error_reset();
00330 return 1;
00331 }
00332 else {
00333 return 0;
00334 }
00335 }
00336
00337
00343
00344 static int xsh_respon_slit_nod_destroy(cpl_plugin *plugin)
00345 {
00346 cpl_recipe *recipe = NULL;
00347
00348
00349 xsh_error_reset();
00350
00351 assure( plugin != NULL, CPL_ERROR_NULL_INPUT, "Null plugin" );
00352
00353
00354 assure( cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE,
00355 CPL_ERROR_TYPE_MISMATCH, "Plugin is not a recipe");
00356
00357 recipe = (cpl_recipe *)plugin;
00358
00359 xsh_free_parameterlist(&recipe->parameters);
00360
00361 cleanup:
00362 if (cpl_error_get_code() != CPL_ERROR_NONE)
00363 {
00364 return 1;
00365 }
00366 else
00367 {
00368 return 0;
00369 }
00370 }
00371 #if 0
00372 static void change_file_name( cpl_frame * frame, const char * name )
00373 {
00374 const char * old_name ;
00375 char * cmd ;
00376
00377 old_name = cpl_frame_get_filename( frame ) ;
00378 cmd = xsh_stringcat_any( "mv ", old_name, " ", name, NULL ) ;
00379 cpl_frame_set_filename( frame, name ) ;
00380
00381 system( cmd ) ;
00382 XSH_FREE( cmd ) ;
00383 }
00384 #endif
00385
00386
00387
00395
00396 static cpl_error_code
00397 xsh_respon_slit_nod( cpl_parameterlist* parameters,
00398 cpl_frameset* frameset)
00399 {
00400 const char* recipe_tags[3] = {XSH_OBJECT_SLIT_NOD,XSH_STD_TELL_SLIT_NOD,XSH_STD_FLUX_SLIT_NOD};
00401 int recipe_tags_size = 3;
00402
00403
00404 cpl_frameset *raws = NULL;
00405 cpl_frameset *raws_ord_set = NULL;
00406 cpl_frameset *calib = NULL;
00407
00408
00409 cpl_frame* bpmap = NULL;
00410 cpl_frame *master_bias = NULL;
00411 cpl_frame* master_flat = NULL;
00412 cpl_frame* order_tab_edges = NULL;
00413 cpl_frame * wave_tab = NULL ;
00414 cpl_frame * model_config_frame = NULL;
00415 cpl_frame * wavemap = NULL;
00416 cpl_frame * spectral_format = NULL;
00417
00418
00419 int rectify_fast = 0 ;
00420 xsh_clipping_param* crh_clipping_par = NULL;
00421 xsh_instrument* instrument = NULL;
00422 xsh_remove_crh_single_param * crh_single_par = NULL;
00423 xsh_rectify_param * rectify_par = NULL;
00424 xsh_localize_obj_param * loc_obj_par = NULL;
00425 xsh_merge_param* merge_par = NULL;
00426 xsh_extract_param * extract_par = NULL;
00427 xsh_combine_nod_param * combine_nod_par = NULL;
00428 xsh_slit_limit_param * slit_limit_par = NULL;
00429 xsh_stack_param* stack_par=NULL;
00430
00431 char comb_tag[80];
00432 int binx=0;
00433 int biny=0;
00434
00435 int nb_raw_frames;
00436 int nb_pairs ;
00437
00438
00439
00440
00441
00442
00443 cpl_frameset* raws_avg=NULL;
00444 cpl_frame* disp_tab_frame=NULL;
00445 cpl_frame* slitmap=NULL;
00446 cpl_frame *skymask_frame = NULL;
00447
00448 int do_computemap=0;
00449 int do_flatfield = CPL_TRUE;
00450 int even_nb ;
00451
00452 char *rec_prefix = NULL;
00453
00454
00455 cpl_frameset *nod_set = NULL;
00456 cpl_frameset *comb_set = NULL;
00457 cpl_frameset *comb_eff_set = NULL;
00458 cpl_frame *comb_frame = NULL;
00459 cpl_frame *comb_eff_frame = NULL;
00460 cpl_frame *combeso_frame = NULL;
00461 cpl_frame *combeffeso_frame = NULL;
00462 cpl_frame *res2D_frame = NULL;
00463 cpl_frame *loc_table_frame = NULL;
00464 cpl_frame *res1D_frame = NULL;
00465 cpl_frame *res1D_eff_frame = NULL;
00466 cpl_frame *res1Deso_frame = NULL;
00467 cpl_frame *res1Deso_eff_frame = NULL;
00468 cpl_frame *s1D_frame = NULL;
00469 cpl_frame *frm_eff = NULL;
00470 cpl_frame* response_ord_frame=NULL;
00471 cpl_frame* response_frame=NULL;
00472 cpl_frame* mresponse_frame=NULL;
00473 cpl_frame * fluxcal_1D_frame = NULL ;
00474 cpl_frame * fluxcal_2D_frame = NULL ;
00475 cpl_frame * fluxcal_rect_1D_frame = NULL ;
00476 cpl_frame * fluxcal_rect_2D_frame = NULL ;
00477 cpl_frame* frm_atmext=NULL;
00478 cpl_frame * nrm_1D_frame = NULL ;
00479 cpl_frame * nrm_2D_frame = NULL ;
00480 int pre_overscan_corr=0;
00481 cpl_frame* frm_std_cat=NULL;
00482 cpl_frame* high_abs_win=NULL;
00483 double airm=0;
00484 double exptime = 1. ;
00485
00486
00487
00488 check( xsh_begin( frameset, parameters, &instrument, &raws, &calib,
00489 recipe_tags, recipe_tags_size, RECIPE_ID,
00490 XSH_BINARY_VERSION,
00491 xsh_respon_slit_nod_description_short));
00492
00493 if(instrument->arm == XSH_ARM_NIR) {
00494 xsh_instrument_nir_corr_if_JH(raws,instrument);
00495 }
00496 assure( instrument->mode == XSH_MODE_SLIT, CPL_ERROR_ILLEGAL_INPUT,
00497 "Instrument NOT in Slit Mode");
00498
00499 check(xsh_ensure_raws_number_is_even(raws));
00500 xsh_recipe_params_check(parameters,instrument,RECIPE_ID);
00501 check(airm=xsh_utils_compute_airm_eff(raws));
00502
00503
00504
00505
00506 check( rec_prefix = xsh_set_recipe_file_prefix(raws,"xsh_respon_slit_nod"));
00507
00508
00509 check( nb_raw_frames = cpl_frameset_get_size( raws));
00510 check( raws_ord_set = xsh_order_frameset_by_date( raws));
00511
00512 xsh_msg_dbg_low( "Nb of Raw frames: %d", nb_raw_frames);
00513
00514 even_nb = nb_raw_frames % 2 ;
00515 XSH_ASSURE_NOT_ILLEGAL( even_nb == 0);
00516
00517 nb_pairs = nb_raw_frames/2 ;
00518 XSH_ASSURE_NOT_ILLEGAL( nb_pairs != 0 );
00519
00520
00521
00522
00523 check( crh_clipping_par = xsh_parameters_clipping_crh_get(RECIPE_ID,
00524 parameters));
00525 check( do_computemap = xsh_parameters_get_boolean( parameters, RECIPE_ID,
00526 "compute-map"));
00527 check( do_flatfield = xsh_parameters_get_boolean( parameters, RECIPE_ID,
00528 "do-flatfield"));
00529 check( stack_par = xsh_stack_frames_get( RECIPE_ID, parameters));
00530 if ( xsh_instrument_get_arm(instrument) != XSH_ARM_NIR){
00531 binx=instrument->binx;
00532 biny=instrument->biny;
00533 } else {
00534 binx=1;
00535 biny=1;
00536 }
00537
00538 check( xsh_scired_nod_get_parameters( parameters,instrument,
00539 &crh_single_par, &rectify_par,
00540 &merge_par,
00541 &extract_par, &combine_nod_par,
00542 &slit_limit_par, &loc_obj_par,
00543 &rectify_fast, &pre_overscan_corr,
00544 RECIPE_ID));
00545
00546 check( xsh_scired_slit_nod_get_calibs(raws,calib,instrument,
00547 &bpmap,&master_bias,&master_flat,
00548 &order_tab_edges,&wave_tab,
00549 &model_config_frame,&wavemap,&slitmap,
00550 &disp_tab_frame,
00551 &spectral_format,
00552 &skymask_frame,
00553 &response_ord_frame,
00554 &frm_atmext,
00555 do_computemap,
00556 loc_obj_par->use_skymask,
00557 pre_overscan_corr,
00558 rec_prefix,RECIPE_ID));
00559
00560 if ( rectify_fast == CPL_FALSE && loc_obj_par->method == LOC_MANUAL_METHOD){
00561 xsh_error_msg( "Mode accurate can not be use with localize-method MANUAL");
00562 }
00563
00564
00565 if((mresponse_frame=xsh_find_frame_with_tag(calib,XSH_MRESPONSE_MERGE1D_SLIT,
00566 instrument)) != NULL ) {
00567 xsh_msg("Using the master response curve to flux calibrate the spectrum");
00568 }
00569
00570
00571
00572 frm_atmext=xsh_find_frame_with_tag(calib,XSH_ATMOS_EXT,instrument);
00573 if(frm_atmext==NULL) {
00574 xsh_msg_error("Provide atmospheric extinction frame");
00575 return CPL_ERROR_DATA_NOT_FOUND;
00576 }
00577
00578 frm_std_cat=xsh_find_frame_with_tag(calib,XSH_FLUX_STD_CAT,instrument);
00579 if(frm_std_cat==NULL) {
00580 xsh_msg_error("Provide std star catalog frame");
00581 return CPL_ERROR_DATA_NOT_FOUND;
00582 }
00583
00584 high_abs_win=xsh_find_frame_with_tag(calib,XSH_HIGH_ABS_WIN,instrument);
00585
00586
00587
00588
00589
00590
00591 check( xsh_prepare( raws_ord_set, bpmap, master_bias, XSH_OBJECT_SLIT_NOD,
00592 instrument,pre_overscan_corr));
00593
00594
00595 #if 0
00596 check(offsets=xsh_get_offsets(raws_ord_set));
00597 check(offsets_dif=xsh_get_noffsets(offsets));
00598
00599
00600
00601
00602 ngroups=cpl_vector_get_size(offsets_dif);
00603 xsh_msg("ngroups=%d",ngroups);
00604 #endif
00605
00606 check( raws_avg = xsh_nod_group_by_reloff( raws_ord_set,
00607 instrument,stack_par,crh_clipping_par));
00608 #if 0
00609 check( raws_avg = xsh_nod_prepare_set( raws_ord_set,
00610 instrument,crh_clipping_par));
00611
00612 noffs=cpl_frameset_get_size(raws_avg);
00613 even_nb = noffs % 2;
00614 xsh_msg("even_nb=%d nb_raw_frames=%d",even_nb,nb_raw_frames);
00615 xsh_msg("nb raws avg=%d",cpl_frameset_get_size(raws_avg));
00616 xsh_frameset_dump_nod_info(raws_avg);
00617 if (even_nb!=0 && nb_raw_frames ==4) {
00618 xsh_msg("special case even_nb!=0 && nb_raw_frames ==4");
00619
00620 xsh_free_frameset(&raws_avg);
00621 check(raws_avg=cpl_frameset_duplicate(raws_ord_set));
00622 } else {
00623 xsh_msg("ensure input nod positions number is even");
00624 check(xsh_ensure_raws_number_is_even(raws_avg));
00625 }
00626 #endif
00627
00628 #if 0
00629 check(raws_avg=xsh_avg_raws_same_off(raws_ord_set,offsets_dif,crh_clipping_par,instrument));
00630 xsh_classif(offsets,&ngroups);
00631 #endif
00632
00633 check( nod_set = xsh_subtract_sky_nod( raws_avg, instrument, rectify_fast));
00634
00635 if ( rectify_fast ){
00636 comb_eff_set=cpl_frameset_new();
00637
00638
00639 check(comb_set=xsh_scired_slit_nod_fast(
00640 nod_set,
00641 spectral_format,
00642 master_flat,
00643 order_tab_edges,
00644 wave_tab,
00645 model_config_frame,
00646 disp_tab_frame,
00647 wavemap,
00648 instrument,
00649 crh_single_par,
00650 rectify_par,
00651 do_flatfield,1,
00652 rec_prefix,
00653 &comb_eff_set));
00654
00655 }
00656 else {
00657 check( comb_set = xsh_scired_slit_nod_accurate(
00658 nod_set,
00659 spectral_format,
00660 master_flat,
00661 order_tab_edges,
00662 wave_tab,
00663 model_config_frame,
00664 disp_tab_frame,
00665 wavemap,
00666 skymask_frame,
00667 instrument,
00668 crh_single_par,
00669 rectify_par,
00670 loc_obj_par,
00671 combine_nod_par->throwname,
00672 do_flatfield,
00673 rec_prefix
00674 ));
00675
00676 check( comb_eff_set = xsh_scired_slit_nod_accurate(
00677 nod_set,
00678 spectral_format,
00679 master_flat,
00680 order_tab_edges,
00681 wave_tab,
00682 model_config_frame,
00683 disp_tab_frame,
00684 wavemap,
00685 skymask_frame,
00686 instrument,
00687 crh_single_par,
00688 rectify_par,
00689 loc_obj_par,
00690 combine_nod_par->throwname,
00691 do_flatfield,
00692 rec_prefix
00693 ));
00694
00695
00696 }
00697
00698
00699
00700
00701 sprintf( comb_tag,"%s_%s",
00702 rec_prefix, XSH_GET_TAG_FROM_ARM( XSH_ORDER2D, instrument));
00703 check( comb_frame = xsh_combine_nod( comb_set, combine_nod_par,
00704 comb_tag, instrument,&combeso_frame));
00705
00706
00707
00708 check( res2D_frame = xsh_merge_ord( comb_frame, instrument,
00709 merge_par,rec_prefix));
00710
00711
00712 if ( extract_par->method == LOCALIZATION_METHOD ) {
00713 xsh_msg( "Re-Localize before extraction" ) ;
00714 check( loc_table_frame = xsh_localize_obj( comb_frame, skymask_frame,instrument,
00715 loc_obj_par, slit_limit_par, "LOCALIZE.fits"));
00716 }
00717 xsh_msg( "Extract 1D order-by-order spectrum" ) ;
00718 check( res1D_frame = xsh_extract( comb_frame, loc_table_frame,
00719 instrument, extract_par, &res1Deso_frame, rec_prefix));
00720 xsh_msg( "Merge orders with 1D frame" ) ;
00721 check( s1D_frame = xsh_merge_ord( res1D_frame, instrument,
00722 merge_par,rec_prefix));
00723
00724
00725
00726 {
00727 cpl_propertylist * plist = NULL ;
00728 plist=cpl_propertylist_load(cpl_frame_get_filename(comb_frame),0) ;
00729 exptime = xsh_pfits_get_exptime(plist); ;
00730 xsh_msg_dbg_medium( "EXPTIME: %lf", exptime ) ;
00731
00732 xsh_free_propertylist( &plist ) ;
00733 }
00734
00735
00736
00737 if(frm_std_cat!=NULL && frm_atmext!=NULL) {
00738 xsh_msg( "Calling xsh_compute_response" ) ;
00739 if( (response_ord_frame = xsh_compute_response_ord( res1Deso_frame,
00740 frm_std_cat,
00741 frm_atmext,
00742 high_abs_win,
00743 instrument,
00744 exptime )) == NULL) {
00745 xsh_msg_warning("Some error occurred during response computation");
00746 xsh_print_rec_status(0);
00747 cpl_error_reset();
00748 }
00749 if( (response_frame = xsh_compute_response( s1D_frame,
00750 frm_std_cat,
00751 frm_atmext,
00752 high_abs_win,
00753 instrument,
00754 exptime )) == NULL) {
00755 xsh_msg_warning("Some error occurred during response computation");
00756 xsh_print_rec_status(0);
00757 cpl_error_reset();
00758 } else {
00759
00760 check(xsh_frame_table_monitor_flux_qc(response_frame,"LAMBDA",
00761 "RESPONSE","RESP",instrument));
00762 }
00763 }
00764
00765 if(mresponse_frame != NULL) {
00766 check(xsh_flux_calibrate(combeso_frame,res1Deso_frame,frm_atmext,
00767 mresponse_frame,merge_par,instrument,rec_prefix,
00768 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00769 &fluxcal_2D_frame,&fluxcal_1D_frame));
00770
00771 } else if(mresponse_frame == NULL &&
00772 (response_frame != NULL && frm_atmext != NULL)) {
00773 check(xsh_flux_calibrate(combeso_frame,res1Deso_frame,frm_atmext,
00774 response_frame,merge_par,instrument,rec_prefix,
00775 &fluxcal_rect_2D_frame,&fluxcal_rect_1D_frame,
00776 &fluxcal_2D_frame,&fluxcal_1D_frame));
00777 }
00778
00779
00780
00781 if(response_frame != NULL && frm_atmext != NULL &&
00782 disp_tab_frame != NULL && comb_eff_set != NULL) {
00783 check( comb_eff_frame = xsh_combine_nod( comb_eff_set, combine_nod_par,
00784 comb_tag, instrument,
00785 &combeffeso_frame));
00786
00787 xsh_msg( "Extract 1D order-by-order spectrum" ) ;
00788 check( res1D_eff_frame = xsh_extract( comb_eff_frame, loc_table_frame,
00789 instrument, extract_par,
00790 &res1Deso_eff_frame, rec_prefix));
00791
00792 frm_eff=xsh_compute_efficiency(res1Deso_eff_frame,frm_std_cat,
00793 frm_atmext,high_abs_win,
00794 instrument);
00795 }
00796 if(model_config_frame) {
00797 xsh_compute_resampling_accuracy(wavemap,slitmap,order_tab_edges,model_config_frame,res2D_frame,instrument);
00798 }
00799
00800
00801 if(response_frame!=NULL) {
00802 check( xsh_add_product_table(response_ord_frame, frameset, parameters,
00803 RECIPE_ID, instrument,NULL));
00804 check( xsh_add_product_table( response_frame, frameset, parameters,
00805 RECIPE_ID, instrument,NULL));
00806
00807 }
00808
00809
00810 check( xsh_add_product_image( combeso_frame, frameset,
00811 parameters, RECIPE_ID, instrument,NULL));
00812
00813 check( xsh_add_product_image( res1Deso_frame, frameset, parameters,
00814 RECIPE_ID, instrument,NULL));
00815
00816 check( xsh_add_product_pre( res2D_frame, frameset, parameters,
00817 RECIPE_ID, instrument));
00818 check(xsh_monitor_spectrum1D_flux(s1D_frame,instrument));
00819
00820 check( xsh_add_product_spectrum( s1D_frame, frameset, parameters,
00821 RECIPE_ID, instrument));
00822
00823 if ( do_computemap){
00824
00825 check( xsh_add_product_image( wavemap, frameset,
00826 parameters, RECIPE_ID, instrument,NULL));
00827
00828
00829 check( xsh_add_product_image( slitmap, frameset,
00830 parameters, RECIPE_ID, instrument,NULL));
00831 }
00832
00833 if(fluxcal_2D_frame != NULL) {
00834 check( xsh_add_product_image(fluxcal_rect_2D_frame,frameset,parameters,
00835 RECIPE_ID, instrument,NULL));
00836 check( xsh_add_product_image(fluxcal_rect_1D_frame,frameset,parameters,
00837 RECIPE_ID, instrument,NULL));
00838
00839 check( xsh_add_product_spectrum( fluxcal_2D_frame, frameset, parameters,
00840 RECIPE_ID, instrument));
00841 check( xsh_add_product_spectrum( fluxcal_1D_frame, frameset, parameters,
00842 RECIPE_ID, instrument));
00843 }
00844
00845 if(frm_eff!=NULL) {
00846 check(xsh_add_product_table(frm_eff, frameset,parameters,
00847 RECIPE_ID, instrument,NULL));
00848 }
00849
00850 cleanup:
00851
00852 xsh_end( RECIPE_ID, frameset, parameters);
00853 xsh_instrument_free( &instrument);
00854 xsh_free_frameset( &raws);
00855 xsh_free_frameset( &calib);
00856 XSH_FREE( rec_prefix);
00857 xsh_free_frameset( &raws_ord_set);
00858 xsh_free_frameset( &raws_avg);
00859 xsh_free_frame( &wavemap);
00860 xsh_free_frame( &slitmap);
00861
00862
00863 XSH_FREE( rectify_par);
00864 XSH_FREE( crh_clipping_par);
00865 XSH_FREE( crh_single_par);
00866 XSH_FREE( loc_obj_par);
00867 XSH_FREE( slit_limit_par);
00868 XSH_FREE( combine_nod_par);
00869 XSH_FREE( extract_par);
00870 XSH_FREE( merge_par);
00871
00872
00873 xsh_free_frameset( &nod_set);
00874 xsh_free_frameset( &comb_set);
00875 xsh_free_frameset( &comb_eff_set);
00876 xsh_free_frame( &comb_eff_frame);
00877
00878 xsh_free_frame( &combeso_frame);
00879 xsh_free_frame( &combeffeso_frame);
00880 xsh_free_frame( &res2D_frame);
00881 xsh_free_frame( &loc_table_frame);
00882 xsh_free_frame( &res1D_frame);
00883
00884 xsh_free_frame( &res1Deso_frame);
00885 xsh_free_frame( &s1D_frame);
00886 xsh_free_frame(&fluxcal_rect_1D_frame) ;
00887 xsh_free_frame(&fluxcal_rect_2D_frame) ;
00888 xsh_free_frame(&fluxcal_1D_frame) ;
00889 xsh_free_frame(&fluxcal_2D_frame) ;
00890 xsh_free_frame(&nrm_1D_frame) ;
00891 xsh_free_frame(&nrm_2D_frame) ;
00892 xsh_free_frame(&frm_eff) ;
00893
00894 return cpl_error_get_code();
00895 }
00896