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 #include <string.h>
00030 #include <math.h>
00031 #include <cpl.h>
00032
00033 #include <xsh_irplib_utils.h>
00034
00035 #include <xsh_pfits.h>
00036 #include <xsh_msg.h>
00037 #include <xsh_dfs.h>
00038 #include <xsh_error.h>
00039 #include <xsh_utils_table.h>
00040 #include <xsh_utils_wrappers.h>
00041 #include "xsh_utils_efficiency.h"
00042 #include <xsh_star_index.h>
00043 #include <xsh_irplib_utils.h>
00044
00045 #define PRO_STD_STAR_SPECTRA "STD_STAR_SPECTRA"
00046 static const char COL_NAME_WAVELENGTH[] = "WAVELENGTH";
00047 static const char COL_NAME_WAVELENGTH_C[] = "WAVELENGTH";
00048 static const char COL_NAME_WAVE_ATMDISP[] = "LAMBDA";
00049 static const char COL_NAME_ABS_ATMDISP[] = "LA_SILLA";
00050
00051 static const char COL_NAME_REF[] = "REF";
00052 static const char COL_NAME_COR[] = "COR";
00053 static const char COL_NAME_SRC_COR[] = "SRC_COR";
00054
00055 static const char COL_NAME_WAVE_OBJ[] = "WAVELENGTH";
00056 static const char COL_NAME_INT_OBJ[] = "INT_OBJ";
00057 static const char COL_NAME_ORD_OBJ[] = "ORD";
00058 static const char COL_NAME_WAVE_REF[] = "LAMBDA";
00059 static const char COL_NAME_FLUX_REF[] = "FLUX";
00060 static const char COL_NAME_BINWIDTH_REF[] = "BIN_WIDTH";
00061 static const char COL_NAME_EPHOT[] = "EPHOT";
00062 static const char COL_NAME_EXT[] = "EXT";
00063 static const char COL_NAME_SRC_EFF[] = "EFF";
00064 static const char PAR_NAME_DIT[] = "ESO DET DIT";
00065 static const double UVES_flux_factor =1.e16;
00066
00067 static char FRM_EXTCOEFF_TAB[] = XSH_EXTCOEFF_TAB;
00068
00069
00070 static int
00071 xsh_column_to_double(cpl_table* ptable, const char* column);
00072
00073
00074 static double*
00075 xsh_create_column_double(cpl_table* tbl, const char* col_name, int nrow);
00076
00077
00078
00079 static cpl_error_code
00080 xsh_get_std_obs_values(cpl_propertylist* plist,
00081 double* exptime,
00082 double* airmass,
00083 double* dRA,
00084 double* dDEC);
00085
00086
00089
00101
00102
00103 void
00104 xsh_load_ref_table(cpl_frameset* frames,
00105 double dRA,
00106 double dDEC,
00107 double EPSILON,
00108 xsh_instrument* instrument,
00109 cpl_table** pptable)
00110 {
00111 const char* name = NULL;
00112 cpl_frame* frm_ref = NULL;
00113
00114
00115 check(frm_ref=xsh_find_frame_with_tag(frames,XSH_FLUX_STD_TAB,instrument));
00116 if (!frm_ref)
00117 {
00118 xsh_msg("REF frame is not found, trying to get REF from the catalog");
00119
00120
00121 check(frm_ref=xsh_find_frame_with_tag(frames,XSH_FLUX_STD_CAT,instrument));
00122 if (frm_ref)
00123 {
00124 check(name=cpl_frame_get_filename(frm_ref));
00125 if (name)
00126 {
00127 star_index* pstarindex = star_index_load(name);
00128 if (pstarindex)
00129 {
00130 const char* star_name = 0;
00131 xsh_msg("Searching std RA[%f] DEC[%f] with tolerance[%f] in star catalog", dRA, dDEC, EPSILON);
00132 *pptable = star_index_get(pstarindex, dRA, dDEC, EPSILON, EPSILON, &star_name);
00133 if (*pptable && star_name)
00134 {
00135 xsh_msg("Found STD star: %s", star_name);
00136 }
00137 else
00138 {
00139 xsh_msg("ERROR - REF table could not be found in the catalog");
00140 }
00141 }
00142 else
00143 {
00144 xsh_msg("ERROR - could not load the catalog");
00145 }
00146 }
00147 }
00148 }
00149 else
00150 {
00151 xsh_msg("REF frame is found");
00152 check(name=cpl_frame_get_filename(frm_ref));
00153 check(*pptable=cpl_table_load(name,1,0));
00154 }
00155 return;
00156 cleanup:
00157 return;
00158 }
00159
00160
00161
00162
00163
00174
00175
00176 cpl_error_code
00177 xsh_parse_catalog_std_stars(cpl_frame* cat,
00178 double dRA,
00179 double dDEC,
00180 double EPSILON,
00181 cpl_table** pptable)
00182 {
00183 const char* name = NULL;
00184 XSH_ASSURE_NOT_NULL_MSG(cat,"Provide input catalog");
00185 if (cat) {
00186 check(name=cpl_frame_get_filename(cat));
00187 if (name) {
00188 star_index* pstarindex = star_index_load(name);
00189 if (pstarindex) {
00190 const char* star_name = 0;
00191 xsh_msg("Searching std RA[%f] DEC[%f] with tolerance[%f] in star catalog", dRA, dDEC, EPSILON);
00192 *pptable = star_index_get(pstarindex, dRA, dDEC, EPSILON, EPSILON, &star_name);
00193 if (*pptable && star_name) {
00194 xsh_msg("Found STD star: %s", star_name);
00195 }
00196 else {
00197 xsh_msg("ERROR - REF table could not be found in the catalog");
00198 }
00199 }
00200 else {
00201 xsh_msg("ERROR - could not load the catalog");
00202 }
00203 star_index_delete(pstarindex);
00204 }
00205 }
00206
00207 cleanup:
00208 return cpl_error_get_code();
00209 }
00210
00211
00212
00213
00214
00215 static double*
00216 xsh_create_column_double(cpl_table* tbl, const char* col_name, int nrow)
00217 {
00218 double* retval = 0;
00219 check(cpl_table_new_column(tbl, col_name, CPL_TYPE_DOUBLE));
00220 check(cpl_table_fill_column_window_double(tbl, col_name, 0, nrow, -1));
00221 check(retval = cpl_table_get_data_double(tbl,col_name));
00222 return retval;
00223 cleanup:
00224 return retval;
00225 }
00226
00227
00228
00238
00239
00240 cpl_error_code
00241 xsh_get_std_obs_values(cpl_propertylist* plist,
00242 double* exptime,
00243 double* airmass,
00244 double* dRA,
00245 double* dDEC)
00246 {
00247
00248 *airmass=xsh_pfits_get_airm_mean(plist) ;
00249 *dDEC=xsh_pfits_get_dec(plist);
00250 *dRA=xsh_pfits_get_ra(plist);
00251 *exptime=xsh_pfits_get_exptime(plist);
00252
00253 return cpl_error_get_code();
00254
00255 }
00256
00257
00275
00276
00277 cpl_frame*
00278 xsh_utils_efficiency(
00279 cpl_frameset * frames,
00280 double dGain,
00281 double dEpsilon,
00282 double aimprim,
00283 xsh_instrument* inst,
00284 const char* col_name_atm_wave,
00285 const char* col_name_atm_abs,
00286 const char* col_name_ref_wave,
00287 const char* col_name_ref_flux,
00288 const char* col_name_ref_bin,
00289 const char* col_name_obj_wave,
00290 const char* col_name_obj_flux
00291 )
00292 {
00293 cpl_frame* frm_sci = NULL;
00294 cpl_frame* frm_atmext = NULL;
00295 cpl_table* tbl_obj_spectrum = NULL;
00296 cpl_table* tbl_atmext = NULL;
00297 double exptime = 600;
00298
00299 cpl_propertylist* plist = NULL;
00300 cpl_table* tbl_ref = NULL;
00301 cpl_frame* result=NULL;
00302
00303 const char* name=NULL;
00304 double dRA = 0;
00305 double dDEC = 0;
00306 char prod_name[80];
00307 char prod_tag[80];
00308 double airmass=0;
00309 const double mk2AA=1E4;
00310 int nclip=0;
00311 int ntot=0;
00312
00313
00314
00315
00316
00317 check(frm_sci=xsh_find_frame_with_tag(frames,XSH_STD_FLUX_SLIT_STARE_ORDER1D, inst));
00318 check(name=cpl_frame_get_filename(frm_sci));
00319
00320 check(tbl_obj_spectrum=cpl_table_load(name,1,0));
00321 check(plist=cpl_propertylist_load(name,0));
00322
00323 xsh_get_std_obs_values(plist,&exptime,&airmass,&dRA,&dDEC);
00324
00325
00326 xsh_load_ref_table(frames, dRA, dDEC, dEpsilon, inst, &tbl_ref);
00327 if (tbl_ref)
00328 {
00329 cpl_table* tbl_result = NULL;
00330
00331 check(frm_atmext=cpl_frameset_find(frames,FRM_EXTCOEFF_TAB));
00332 check(name=cpl_frame_get_filename(frm_atmext));
00333 check(tbl_atmext=cpl_table_load(name,1,0));
00334
00335 tbl_result = xsh_utils_efficiency_internal(
00336 tbl_obj_spectrum,
00337 tbl_atmext,
00338 tbl_ref,
00339 exptime,
00340 airmass,
00341 aimprim,
00342 dGain,
00343 1,
00344 mk2AA,
00345 col_name_atm_wave,
00346 col_name_atm_abs,
00347 col_name_ref_wave,
00348 col_name_ref_flux,
00349 col_name_ref_bin,
00350 col_name_obj_wave,
00351 col_name_obj_flux,
00352 &ntot,&nclip);
00353 if (tbl_result)
00354 {
00355 sprintf(prod_tag,"EFFICIENCY_%s",xsh_instrument_arm_tostring(inst));
00356 sprintf(prod_name,"%s.fits",prod_tag);
00357
00358 result=xsh_frame_product(prod_name,prod_tag,CPL_FRAME_TYPE_TABLE,
00359 CPL_FRAME_GROUP_CALIB,CPL_FRAME_LEVEL_FINAL);
00360 cpl_table_save(tbl_result, plist, NULL,prod_name, CPL_IO_DEFAULT);
00361
00362 xsh_free_table(&tbl_result);
00363 }
00364 }
00365 cleanup:
00366 xsh_free_propertylist(&plist);
00367 xsh_free_table(&tbl_atmext);
00368 xsh_free_table(&tbl_obj_spectrum);
00369 xsh_free_table(&tbl_ref);
00370 return result;
00371 }
00372
00373 static int
00374 xsh_column_to_double(cpl_table* ptable, const char* column)
00375 {
00376 const char* TEMP = "_temp_";
00377 check(cpl_table_duplicate_column(ptable, TEMP, ptable, column));
00378 check(cpl_table_erase_column(ptable, column));
00379 check(cpl_table_cast_column(ptable, TEMP, column, CPL_TYPE_DOUBLE));
00380 check(cpl_table_erase_column(ptable, TEMP ));
00381 return 0;
00382 cleanup:
00383 xsh_msg(" error column to double [%s]", column);
00384 return -1;
00385 }
00386
00387
00388
00410
00411
00412 cpl_table*
00413 xsh_utils_efficiency_internal(cpl_table* tbl_obj_spectrum,
00414 cpl_table* tbl_atmext,
00415 cpl_table* tbl_ref,
00416 double exptime,
00417 double airmass,
00418 double aimprim,
00419 double gain,
00420 int biny,
00421 double src2ref_wave_sampling,
00422 const char* col_name_atm_wave,
00423 const char* col_name_atm_abs,
00424 const char* col_name_ref_wave,
00425 const char* col_name_ref_flux,
00426 const char* col_name_ref_bin,
00427 const char* col_name_obj_wave,
00428 const char* col_name_obj_flux,
00429 int* ntot,
00430 int* nclip
00431 )
00432 {
00433
00434 const double TEL_AREA = 51.2e4;
00435 double cdelta1 = 0;
00436 int i = 0;
00437 cpl_table* tbl_sel = NULL;
00438
00439
00440
00441
00442
00443
00444 cpl_table* tbl_result = NULL;
00445
00446
00447
00448
00449
00450
00451
00452
00453 double* pref = NULL;
00454 double* pext = NULL;
00455 double* pcor = NULL;
00456 double* peph = NULL;
00457
00458 double* pw = NULL;
00459 int nrow = 0;
00460 double ref_bin_size=0;
00461 double um2nm=0.001;
00462 double eff_med=0.;
00463 double eff_rms=0.;
00464 double eff_thresh=0.;
00465
00466 double kappa=5;
00467 double nm2AA=10.;
00468 int nsel=0;
00469 nrow = cpl_table_get_nrow(tbl_obj_spectrum);
00470 xsh_msg_dbg_medium("Starting efficiency calculation: exptime[%f] airmass[%f] nrow[%d]",
00471 exptime, airmass, nrow);
00472
00473
00474
00475
00476
00477 xsh_column_to_double(tbl_obj_spectrum,col_name_obj_wave);
00478 xsh_column_to_double(tbl_obj_spectrum,col_name_obj_flux);
00479
00480 check(xsh_column_to_double(tbl_atmext,col_name_atm_wave ));
00481 check(xsh_column_to_double(tbl_atmext,col_name_atm_abs ));
00482 check(xsh_column_to_double(tbl_ref,col_name_ref_wave ));
00483 check(xsh_column_to_double(tbl_ref,col_name_ref_flux ));
00484 check(xsh_column_to_double(tbl_ref,col_name_ref_bin ));
00485
00486
00487
00488
00489
00490
00491
00492 ref_bin_size=cpl_table_get_double(tbl_ref,col_name_ref_bin,0,NULL);
00493 xsh_msg_dbg_medium("ref_bin_size[nm]=%g",ref_bin_size);
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506 check(cpl_table_multiply_scalar(tbl_obj_spectrum,col_name_obj_wave,
00507 src2ref_wave_sampling));
00508
00509
00510
00511
00512
00513
00514
00515
00516 xsh_msg_dbg_medium("object 2 src std wave factor %g",src2ref_wave_sampling);
00517 check(pw=cpl_table_get_data_double(tbl_obj_spectrum,col_name_obj_wave));
00518
00519
00520 check(tbl_result=cpl_table_new(nrow));
00521 check(pref=xsh_create_column_double(tbl_result, COL_NAME_REF, nrow));
00522 check(pext=xsh_create_column_double(tbl_result, COL_NAME_EXT, nrow));
00523 check(pcor=xsh_create_column_double(tbl_result, COL_NAME_COR, nrow));
00524 check(peph=xsh_create_column_double(tbl_result, COL_NAME_EPHOT, nrow));
00525 xsh_msg_dbg_medium("wave range: [%g,%g] nm",pw[0],pw[nrow-1]);
00526 xsh_msg_dbg_medium("src_bin_size[nm]=%g",pw[1] - pw[0]);
00527
00528 cdelta1 = (pw[1] - pw[0]) / src2ref_wave_sampling ;
00529 xsh_msg_dbg_medium("nrow=%d cdelta1=%g",nrow,cdelta1);
00530 for (i = 0; i < nrow; i++)
00531 {
00532 check(pext[i] = xsh_table_interpolate(tbl_atmext, pw[i],col_name_atm_wave, col_name_atm_abs));
00533 check(pref[i] = xsh_table_interpolate(tbl_ref, pw[i], col_name_ref_wave,col_name_ref_flux));
00534 pcor[i] = pow(10,(0.4*pext[i] * (aimprim - airmass)));
00535 peph[i] = 1.e7*1.986e-19/(pw[i]*um2nm);
00536
00537
00538
00539
00540
00541
00542
00543
00544 }
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554 check(cpl_table_duplicate_column(tbl_result,"ORDER",
00555 tbl_obj_spectrum,COL_NAME_ORD_OBJ ));
00556 check(cpl_table_duplicate_column(tbl_result,COL_NAME_SRC_COR,
00557 tbl_obj_spectrum, col_name_obj_flux));
00558 check(cpl_table_duplicate_column(tbl_result,col_name_obj_wave,
00559 tbl_obj_spectrum,col_name_obj_wave));
00560
00561
00562
00563 check(cpl_table_multiply_columns(tbl_result,COL_NAME_SRC_COR,COL_NAME_COR));
00564
00565
00566
00567
00568
00569
00570 cpl_table_divide_scalar(tbl_result, COL_NAME_SRC_COR, src2ref_wave_sampling);
00571 cpl_table_divide_scalar(tbl_result, COL_NAME_SRC_COR, cdelta1);
00572 cpl_table_divide_scalar(tbl_result, COL_NAME_SRC_COR, nm2AA);
00573
00574 cpl_table_divide_scalar(tbl_result,COL_NAME_SRC_COR,biny);
00575
00576
00577
00578
00579 check(cpl_table_divide_scalar(tbl_result,COL_NAME_REF,ref_bin_size));
00580
00581
00582
00583 check(cpl_table_duplicate_column(tbl_result,COL_NAME_SRC_EFF,
00584 tbl_result,COL_NAME_SRC_COR));
00585
00586
00587
00588
00589 check(cpl_table_multiply_scalar(tbl_result,COL_NAME_SRC_EFF,
00590 gain / (exptime * TEL_AREA)));
00591
00592
00593 check(cpl_table_multiply_columns(tbl_result,COL_NAME_SRC_EFF,
00594 COL_NAME_EPHOT));
00595
00596
00597
00598
00599
00600 check(cpl_table_divide_columns(tbl_result,COL_NAME_SRC_EFF,COL_NAME_REF));
00601
00602
00603
00604
00605
00606 eff_med=cpl_table_get_column_median(tbl_result,COL_NAME_SRC_EFF);
00607 eff_rms=cpl_table_get_column_stdev(tbl_result,COL_NAME_SRC_EFF);
00608
00609 eff_thresh=(eff_med+kappa*eff_rms<10.) ? eff_med+kappa*eff_rms:10.;
00610 if(irplib_isinf(eff_thresh)) eff_thresh=10.;
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620 *ntot=cpl_table_get_nrow(tbl_result);
00621 cpl_table_and_selected_double(tbl_result,COL_NAME_SRC_EFF,
00622 CPL_GREATER_THAN,1.e-5);
00623
00624 cpl_table_and_selected_double(tbl_result,COL_NAME_SRC_EFF,
00625 CPL_LESS_THAN,eff_thresh);
00626
00627 eff_med=cpl_table_get_column_median(tbl_result,COL_NAME_SRC_EFF);
00628 eff_rms=cpl_table_get_column_stdev(tbl_result,COL_NAME_SRC_EFF);
00629
00630 eff_thresh=(eff_med+kappa*eff_rms<10.) ? eff_med+kappa*eff_rms:10.;
00631 if(irplib_isinf(eff_thresh)) eff_thresh=10.;
00632
00633
00634
00635
00636 cpl_table_and_selected_double(tbl_result,COL_NAME_SRC_EFF,
00637 CPL_LESS_THAN,eff_thresh);
00638
00639 nsel=cpl_table_and_selected_double(tbl_result,COL_NAME_SRC_EFF,
00640 CPL_LESS_THAN,1);
00641
00642 *nclip=(*ntot)-nsel;
00643 tbl_sel=cpl_table_extract_selected(tbl_result);
00644
00645
00646 cleanup:
00647 xsh_free_table(&tbl_result);
00648 return tbl_sel;
00649 }
00650
00659 void
00660 xsh_frame_sci_get_ra_dec_airmass(cpl_frame* frm_sci,
00661 double* ra,
00662 double* dec,
00663 double* airmass)
00664 {
00665
00666 const char* name_sci=NULL;
00667 cpl_propertylist* plist=NULL;
00668
00669 name_sci=cpl_frame_get_filename(frm_sci);
00670 check(plist=cpl_propertylist_load(name_sci,0));
00671 *ra=xsh_pfits_get_ra(plist);
00672 *dec=xsh_pfits_get_dec(plist);
00673 *airmass=xsh_pfits_get_airm_mean(plist);
00674
00675 cleanup:
00676
00677 xsh_free_propertylist(&plist);
00678 return;
00679 }
00680
00681
00682
00683 static void
00684 xsh_frame_sci_get_gain_airmass_exptime_naxis1_biny(cpl_frame* frm_sci,
00685 xsh_instrument* instrument,
00686 double* gain,
00687 double* airmass,
00688 double* exptime,
00689 int* naxis1,
00690 int* biny)
00691 {
00692
00693 const char* name_sci=NULL;
00694 cpl_propertylist* plist=NULL;
00695
00696 name_sci=cpl_frame_get_filename(frm_sci);
00697 check(plist=cpl_propertylist_load(name_sci,0));
00698 check(*naxis1=xsh_pfits_get_naxis1(plist));
00699 *airmass=xsh_pfits_get_airm_mean(plist);
00700
00701 if( xsh_instrument_get_arm(instrument) == XSH_ARM_NIR){
00702 *gain=2.12;
00703 *biny=1;
00704 check(*exptime=xsh_pfits_get_dit(plist));
00705 } else {
00706 check(*gain=xsh_pfits_get_conad(plist));
00707 check(*biny=xsh_pfits_get_biny(plist));
00708 check(*exptime=xsh_pfits_get_win1_dit1(plist));
00709 }
00710
00711 cleanup:
00712 xsh_free_propertylist(&plist);
00713
00714 return;
00715 }
00716
00722 cpl_frame*
00723 xsh_catalog_extract_spectrum_frame(cpl_frame* frm_cat,
00724 cpl_frame* frm_sci)
00725 {
00726 cpl_frame* result=NULL;
00727 double dRA=0;
00728 double dDEC=0;
00729
00730 double nm2nm=1.;
00731 cpl_table* tbl_ref=NULL;
00732 char fname[80];
00733 char ftag[80];
00734 double airmass=0;
00735
00736 XSH_ASSURE_NOT_NULL_MSG(frm_sci,"Null input sci frame set!Exit");
00737 XSH_ASSURE_NOT_NULL_MSG(frm_cat,"Null input std star cat frame set!Exit");
00738 xsh_frame_sci_get_ra_dec_airmass(frm_sci,&dRA,&dDEC,&airmass);
00739 check(xsh_parse_catalog_std_stars(frm_cat,dRA,dDEC,STAR_MATCH_DEPSILON,&tbl_ref));
00740
00741
00742 cpl_table_divide_scalar(tbl_ref,COL_NAME_WAVE_REF,nm2nm);
00743 cpl_table_multiply_scalar(tbl_ref,COL_NAME_FLUX_REF,nm2nm);
00744 check(cpl_table_divide_columns(tbl_ref,COL_NAME_FLUX_REF,COL_NAME_BINWIDTH_REF));
00745
00746 sprintf(fname,"ref_std_star_spectrum.fits");
00747 sprintf(ftag,"STD_STAR_FLUX");
00748
00749 check(cpl_table_save(tbl_ref,NULL,NULL,fname,CPL_IO_DEFAULT));
00750 result=xsh_frame_product(fname,ftag,CPL_FRAME_TYPE_TABLE,
00751 CPL_FRAME_GROUP_CALIB,CPL_FRAME_LEVEL_INTERMEDIATE);
00752 cleanup:
00753 return result;
00754 }
00755
00763 cpl_frame*
00764 xsh_efficiency_compute(cpl_frame* frm_sci,
00765 cpl_frame* frm_cat,
00766 cpl_frame* frm_atmext,
00767 xsh_instrument* instrument)
00768
00769 {
00770
00771 cpl_image* ima_sci=NULL;
00772 cpl_image* ima_ord=NULL;
00773 cpl_image* ima_obj=NULL;
00774 cpl_table* obj_tab=NULL;
00775
00776 const char* name_sci=NULL;
00777 const char* name_atm=NULL;
00778 cpl_propertylist* plist=NULL;
00779 cpl_propertylist* x_plist=NULL;
00780
00781
00782 cpl_table* tbl_ord=NULL;
00783 cpl_table* tot_eff=NULL;
00784 cpl_table* tbl_eff=NULL;
00785 cpl_table* tbl_ref=NULL;
00786 cpl_table* tbl_atmext=NULL;
00787
00788 double * pobj=NULL;
00789 double * pw=NULL;
00790 double * pf=NULL;
00791 int * po=NULL;
00792
00793 cpl_frame* frm_eff=NULL;
00794
00795 char name_eff[80];
00796
00797 double crval1=0;
00798 double cdelt1=0;
00799 int naxis1=0;
00800 int nrow=0;
00801
00802
00803 double exptime=600;
00804 cpl_vector* rec_profile=NULL;
00805 int i=0;
00806 double airmass=0;
00807 double dRA=0;
00808 double dDEC=0;
00809 char key_name[40];
00810 int next=0;
00811 int nord=0;
00812
00813
00814
00815 int j=0;
00816 double wav=0;
00817 double gain=0;
00818 int biny=1;
00819 double aimprim=0;
00820 int ord=0;
00821
00822 double nm2nm=1.;
00823
00824 char fname[80];
00825 char tag[80];
00826 double emax=0;
00827 double emed=0;
00828 int nclip=0;
00829 int ntot=0;
00830
00831 int nclip_tot=0;
00832 int neff_tot=0;
00833 double fclip=0;
00834
00835 XSH_ASSURE_NOT_NULL_MSG(frm_sci,"Null input sci frame set!Exit");
00836 XSH_ASSURE_NOT_NULL_MSG(frm_cat,"Null input std star cat frame set!Exit");
00837 XSH_ASSURE_NOT_NULL_MSG(frm_atmext,"Null input atmospheric ext frame set!Exit");
00838
00839 check(next = cpl_frame_get_nextensions(frm_sci));
00840
00841 nord=(next+1)/3;
00842
00843 xsh_frame_sci_get_ra_dec_airmass(frm_sci,&dRA,&dDEC,&airmass);
00844 name_sci=cpl_frame_get_filename(frm_sci);
00845 plist=cpl_propertylist_load(name_sci,0);
00846 xsh_frame_sci_get_gain_airmass_exptime_naxis1_biny(frm_sci,instrument,
00847 &gain,&airmass,&exptime,
00848 &naxis1,&biny);
00849
00850 check(xsh_parse_catalog_std_stars(frm_cat,dRA,dDEC,STAR_MATCH_DEPSILON,
00851 &tbl_ref));
00852
00853
00854 xsh_msg_dbg_medium("gain=%g airm=%g exptime=%g airmass=%g ra=%g dec=%g",
00855 gain,airmass,exptime,airmass,dRA,dDEC);
00856
00857 xsh_msg_dbg_medium("name_sci=%s",name_sci);
00858 nrow=naxis1*nord;
00859
00860
00861
00862
00863 obj_tab=cpl_table_new(nrow);
00864
00865 cpl_table_new_column(obj_tab,COL_NAME_ORD_OBJ,CPL_TYPE_INT);
00866 cpl_table_new_column(obj_tab,COL_NAME_WAVE_OBJ,CPL_TYPE_DOUBLE);
00867 cpl_table_new_column(obj_tab,COL_NAME_INT_OBJ,CPL_TYPE_DOUBLE);
00868
00869 check(cpl_table_fill_column_window_int(obj_tab,COL_NAME_ORD_OBJ,0,nrow,-1));
00870 check(cpl_table_fill_column_window_double(obj_tab,COL_NAME_WAVE_OBJ,0,nrow,-1));
00871 check(cpl_table_fill_column_window_double(obj_tab,COL_NAME_INT_OBJ,0,nrow,-1));
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882 check(name_atm=cpl_frame_get_filename(frm_atmext));
00883 xsh_msg_dbg_medium("name_atm=%s",name_atm);
00884 check(tbl_atmext=cpl_table_load(name_atm,1,0));
00885
00886
00887 if(tbl_ref == NULL) {
00888 xsh_msg_error("Provide std sar catalog frame");
00889 return NULL;
00890
00891 }
00892
00893 for(i=0;i<next;i+=3) {
00894
00895
00896
00897 xsh_free_image(&ima_ord);
00898 pobj=NULL;
00899 xsh_free_propertylist(&x_plist);
00900 check(ima_ord=cpl_image_load(name_sci,CPL_TYPE_DOUBLE,0,i));
00901 check(x_plist=cpl_propertylist_load(name_sci,i));
00902
00903 check(pobj=cpl_image_get_data_double(ima_ord));
00904 check(crval1=xsh_pfits_get_crval1(x_plist));
00905 check(cdelt1=xsh_pfits_get_cdelt1(x_plist));
00906 xsh_free_table(&tbl_ord);
00907 tbl_ord=cpl_table_new(naxis1);
00908 check(cpl_table_copy_structure(tbl_ord,obj_tab));
00909 check(cpl_table_fill_column_window_int(tbl_ord,COL_NAME_ORD_OBJ,0,naxis1,-1));
00910 check(cpl_table_fill_column_window_double(tbl_ord,COL_NAME_WAVE_OBJ,0,naxis1,-1));
00911 check(cpl_table_fill_column_window_double(tbl_ord,COL_NAME_INT_OBJ,0,naxis1,-1));
00912
00913 check(po=cpl_table_get_data_int(tbl_ord,COL_NAME_ORD_OBJ));
00914 check(pw=cpl_table_get_data_double(tbl_ord,COL_NAME_WAVE_OBJ));
00915 check(pf=cpl_table_get_data_double(tbl_ord,COL_NAME_INT_OBJ));
00916
00917
00918
00919 ord=i/3;
00920 for(j=0;j<naxis1;j++) {
00921 po[j]=ord;
00922 wav=crval1+cdelt1*j;
00923 pw[j]=wav;
00924 pf[j]=pobj[j];
00925
00926 }
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937 xsh_free_table(&tbl_eff);
00938 check(tbl_eff=xsh_utils_efficiency_internal(tbl_ord,tbl_atmext,tbl_ref,
00939 exptime,airmass,aimprim,gain,
00940 biny,nm2nm,
00941 COL_NAME_WAVE_ATMDISP,
00942 COL_NAME_ABS_ATMDISP,
00943 COL_NAME_WAVE_REF,
00944 COL_NAME_FLUX_REF,
00945 COL_NAME_BINWIDTH_REF,
00946 COL_NAME_WAVE_OBJ,
00947 COL_NAME_INT_OBJ,
00948 &ntot,&nclip));
00949 xsh_free_table(&tbl_ord);
00950
00951 check(emax=cpl_table_get_column_max(tbl_eff,"EFF"));
00952 sprintf(key_name,"%s%2d", XSH_QC_EFF_PEAK_ORD,ord);
00953 cpl_propertylist_append_double(plist,key_name,emax);
00954 cpl_propertylist_set_comment(plist,key_name,"Peak efficiency");
00955
00956 check(emed=cpl_table_get_column_median(tbl_eff,"EFF"));
00957 sprintf(key_name,"%s%2d", XSH_QC_EFF_MED_ORD,ord);
00958 cpl_propertylist_append_double(plist,key_name,emed);
00959 cpl_propertylist_set_comment(plist,key_name,"Median efficiency");
00960
00961
00962 if(ord==0) {
00963 tot_eff=cpl_table_duplicate(tbl_eff);
00964 } else {
00965 cpl_table_insert(tot_eff,tbl_eff,naxis1*i);
00966 }
00967 neff_tot+=ntot;
00968 nclip_tot+=nclip;
00969 sprintf(name_eff,"eff_ord%d.fits",ord);
00970
00971 }
00972 xsh_msg("nclip_tot=%d",nclip_tot);
00973
00974 sprintf(tag,"EFFICIENCY_%s_%s",xsh_instrument_mode_tostring(instrument),
00975 xsh_instrument_arm_tostring(instrument));
00976 sprintf(fname,"%s.fits",tag);
00977 nrow=cpl_table_get_nrow(tot_eff);
00978 fclip=nclip_tot;
00979 fclip/=neff_tot;
00980 xsh_pfits_set_qc_eff_fclip(plist,fclip);
00981 xsh_pfits_set_qc_eff_nclip(plist,nclip_tot);
00982
00983 check(cpl_table_save(tot_eff,plist, x_plist,fname, CPL_IO_DEFAULT));
00984 xsh_free_table(&obj_tab);
00985 check(frm_eff=xsh_frame_product(fname,tag,CPL_FRAME_TYPE_TABLE,
00986 CPL_FRAME_GROUP_CALIB,
00987 CPL_FRAME_LEVEL_FINAL));
00988
00989 cleanup:
00990
00991 xsh_free_table(&tot_eff);
00992 xsh_free_table(&tbl_ref);
00993 xsh_free_table(&tbl_atmext);
00994 xsh_free_table(&obj_tab);
00995 xsh_free_table(&tbl_ord);
00996 xsh_free_table(&tbl_eff);
00997
00998 xsh_free_image(&ima_sci);
00999 xsh_free_vector(&rec_profile);
01000 xsh_free_image(&ima_ord);
01001 xsh_free_image(&ima_obj);
01002 xsh_free_propertylist(&plist);
01003 xsh_free_propertylist(&x_plist);
01004
01005 return frm_eff;
01006
01007 }