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