33#include <irplib_utils.h>
48#define PRO_STD_STAR_SPECTRA "STD_STAR_SPECTRA"
114 const char* name = NULL;
115 cpl_frame* frm_ref = NULL;
121 xsh_msg(
"REF frame is not found, trying to get REF from the catalog");
127 check(name=cpl_frame_get_filename(frm_ref));
133 const char* star_name = NULL;
134 xsh_msg(
"Searching std RA[%f] DEC[%f] with tolerance[%f] in star catalog", dRA, dDEC, EPSILON);
135 *pptable =
star_index_get(pstarindex, dRA, dDEC, EPSILON, EPSILON, &star_name);
137 if (*pptable && star_name)
139 xsh_msg(
"Found STD star: %s", star_name);
143 xsh_msg(
"ERROR - REF star %s could not be found in the catalog",star_name);
148 xsh_msg(
"ERROR - could not load the catalog");
156 check(name=cpl_frame_get_filename(frm_ref));
157 check(*pptable=cpl_table_load(name,1,0));
208 return cpl_error_get_code();
244 double dDEC,
double EPSILON, cpl_table** pptable,
xsh_std_star_id* std_star_id) {
245 const char* name = NULL;
248 check(name=cpl_frame_get_filename(cat));
252 const char* star_name = NULL;
254 "Searching std RA[%f] DEC[%f] with tolerance[%f] in star catalog", dRA, dDEC, EPSILON);
255 *pptable =
star_index_get(pstarindex, dRA, dDEC, EPSILON, EPSILON,
257 if(star_name != NULL) {
258 if ( strcmp(star_name,
"GD71") == 0 ) *std_star_id =
XSH_GD71;
259 else if ( strcmp(star_name,
"Feige110") == 0 ) *std_star_id =
XSH_Feige110;
260 else if ( strcmp(star_name,
"GD153") == 0 ) *std_star_id =
XSH_GD153;
261 else if ( strcmp(star_name,
"LTT3218") == 0 ) *std_star_id =
XSH_LTT3218;
262 else if ( strcmp(star_name,
"LTT7987") == 0 ) *std_star_id =
XSH_LTT7987;
263 else if ( strcmp(star_name,
"BD17") == 0 ) *std_star_id =
XSH_BD17;
264 else if ( strcmp(star_name,
"EG274") == 0 ) *std_star_id =
XSH_EG274;
266 xsh_msg(
"star index=%d",*std_star_id);
267 if (*pptable && star_name != NULL) {
268 xsh_msg(
"Found STD star: %s", star_name);
272 "ERROR - REF star %s could not be found in the catalog", star_name);
275 xsh_msg(
"ERROR - could not load the catalog");
280 cleanup:
return cpl_error_get_code();
291 check(cpl_table_new_column(tbl, col_name, CPL_TYPE_DOUBLE));
292 check(cpl_table_fill_column_window_double(tbl, col_name, 0, nrow, -1));
293 check(retval = cpl_table_get_data_double(tbl,col_name));
325 return cpl_error_get_code();
332 int nrow=cpl_table_get_nrow(*eff);
341 if ( phigh != NULL ) {
342 for( k = 0 ; phigh->
lambda_min != 0. ; k++, phigh++ ) {
343 for(i=0;i<nrow;i++) {
351 return cpl_error_get_code();
377 cpl_frameset * frames,
382 const char* col_name_atm_wave,
383 const char* col_name_atm_abs,
384 const char* col_name_ref_wave,
385 const char* col_name_ref_flux,
386 const char* col_name_ref_bin,
387 const char* col_name_obj_wave,
388 const char* col_name_obj_flux
391 cpl_frame* frm_sci = NULL;
392 cpl_frame* frm_atmext = NULL;
393 cpl_table* tbl_obj_spectrum = NULL;
394 cpl_table* tbl_atmext = NULL;
397 cpl_propertylist* plist = NULL;
398 cpl_table* tbl_ref = NULL;
399 cpl_frame* result=NULL;
401 const char* name=NULL;
407 const double mk2AA=1E4;
410 cpl_table* tbl_result = NULL;
417 check(name=cpl_frame_get_filename(frm_sci));
419 check(tbl_obj_spectrum=cpl_table_load(name,1,0));
420 check(plist=cpl_propertylist_load(name,0));
430 check(name=cpl_frame_get_filename(frm_atmext));
431 check(tbl_atmext=cpl_table_load(name,1,0));
456 sprintf(prod_name,
"%s.fits",prod_tag);
459 CPL_FRAME_GROUP_CALIB,CPL_FRAME_LEVEL_FINAL);
460 cpl_table_save(tbl_result, plist, NULL,prod_name, CPL_IO_DEFAULT);
478 const char* TEMP =
"_temp_";
479 check(cpl_table_duplicate_column(ptable, TEMP, ptable, column));
480 check(cpl_table_erase_column(ptable, column));
481 check(cpl_table_cast_column(ptable, TEMP, column, CPL_TYPE_DOUBLE));
482 check(cpl_table_erase_column(ptable, TEMP ));
485 xsh_msg(
" error column to double [%s]", column);
516 cpl_table* tbl_atmext,
523 double src2ref_wave_sampling,
524 const char* col_name_atm_wave,
525 const char* col_name_atm_abs,
526 const char* col_name_ref_wave,
527 const char* col_name_ref_flux,
528 const char* col_name_ref_bin,
529 const char* col_name_obj_wave,
530 const char* col_name_obj_flux,
539 cpl_table* tbl_sel = NULL;
546 cpl_table* tbl_result = NULL;
562 double ref_bin_size=0;
566 double eff_thresh=0.;
572 nrow = cpl_table_get_nrow(tbl_obj_spectrum);
573 xsh_msg_dbg_medium(
"Starting efficiency calculation: exptime[%f] airmass[%f] nrow[%d]",
595 ref_bin_size=cpl_table_get_double(tbl_ref,col_name_ref_bin,0,NULL);
609 check(cpl_table_multiply_scalar(tbl_obj_spectrum,col_name_obj_wave,
610 src2ref_wave_sampling));
620 check(pw=cpl_table_get_data_double(tbl_obj_spectrum,col_name_obj_wave));
623 check(tbl_result=cpl_table_new(nrow));
631 cdelta1 = (pw[1] - pw[0]) / src2ref_wave_sampling ;
633 for (i = 0; i < nrow; i++)
637 pcor[i] = pow(10,(-0.4*pext[i] * (aimprim - airmass)));
638 eff = 1.e7*1.986e-19/(pw[i]*um2nm);
657 cpl_table_erase_invalid(tbl_result);
666 check(cpl_table_duplicate_column(tbl_result,
"ORDER",
669 tbl_obj_spectrum, col_name_obj_flux));
670 check(cpl_table_duplicate_column(tbl_result,col_name_obj_wave,
671 tbl_obj_spectrum,col_name_obj_wave));
682 cpl_table_divide_scalar(tbl_result,
COL_NAME_SRC_COR, src2ref_wave_sampling);
721 eff_thresh=(eff_med+
kappa*eff_rms<10.) ? eff_med+
kappa*eff_rms:10.;
722 if(irplib_isinf(eff_thresh)) eff_thresh=10.;
732 *ntot=cpl_table_get_nrow(tbl_result);
734 CPL_GREATER_THAN,1.e-5);
737 CPL_LESS_THAN,eff_thresh);
742 eff_thresh=(eff_med+
kappa*eff_rms<10.) ? eff_med+
kappa*eff_rms:10.;
743 if(irplib_isinf(eff_thresh)) eff_thresh=10.;
749 CPL_LESS_THAN,eff_thresh);
755 tbl_sel=cpl_table_extract_selected(tbl_result);
778 const char* name_sci=NULL;
779 cpl_propertylist* plist=NULL;
781 name_sci=cpl_frame_get_filename(frm_sci);
782 check(plist=cpl_propertylist_load(name_sci,0));
805 const char* name_sci=NULL;
806 cpl_propertylist* plist=NULL;
808 name_sci=cpl_frame_get_filename(frm_sci);
809 check(plist=cpl_propertylist_load(name_sci,0));
838 cpl_frame* result=NULL;
843 cpl_table* tbl_ref=NULL;
859 sprintf(fname,
"ref_std_star_spectrum.fits");
860 sprintf(ftag,
"STD_STAR_FLUX");
862 check(cpl_table_save(tbl_ref,NULL,NULL,fname,CPL_IO_DEFAULT));
864 CPL_FRAME_GROUP_CALIB,CPL_FRAME_LEVEL_INTERMEDIATE);
879 cpl_frame* frm_atmext,
880 cpl_frame* high_abs_win,
885 cpl_image* ima_sci=NULL;
886 cpl_vector* vec_ord=NULL;
887 cpl_image* ima_obj=NULL;
888 cpl_table* obj_tab=NULL;
890 const char* name_sci=NULL;
891 const char* name_atm=NULL;
892 cpl_propertylist* plist=NULL;
893 cpl_propertylist* x_plist=NULL;
896 cpl_table* tbl_ord=NULL;
897 cpl_table* tot_eff=NULL;
898 cpl_table* tbl_eff=NULL;
899 cpl_table* tbl_ref=NULL;
900 cpl_table* tbl_atmext=NULL;
907 cpl_frame* frm_eff=NULL;
955 check(next = cpl_frame_get_nextensions(frm_sci));
960 name_sci=cpl_frame_get_filename(frm_sci);
961 plist=cpl_propertylist_load(name_sci,0);
969 &tbl_ref,&std_star_id));
974 gain,airmass,
exptime,airmass,dRA,dDEC);
982 obj_tab=cpl_table_new(nrow);
1003 check(name_atm=cpl_frame_get_filename(frm_atmext));
1005 check(tbl_atmext=cpl_table_load(name_atm,1,0));
1008 xsh_msg_warning(
"You are using an obsolete atm extinction line table");
1015 if(tbl_ref == NULL) {
1021 for(i=0;i<next;i+=3) {
1028 check(vec_ord=cpl_vector_load(name_sci,i));
1029 check(x_plist=cpl_propertylist_load(name_sci,i));
1030 vec_size=cpl_vector_get_size(vec_ord);
1033 check(pobj=cpl_vector_get_data(vec_ord));
1037 tbl_ord=cpl_table_new(vec_size);
1038 check(cpl_table_copy_structure(tbl_ord,obj_tab));
1050 for(j=0;j<vec_size;j++) {
1052 wav=crval1+cdelt1*j;
1083 nrow=cpl_table_get_nrow(tbl_eff);
1085 check(emax=cpl_table_get_column_max(tbl_eff,
"EFF"));
1090 cpl_propertylist_append_double(plist,key_name,emax);
1091 cpl_propertylist_set_comment(plist,key_name,
"Peak efficiency");
1093 check(emed=cpl_table_get_column_median(tbl_eff,
"EFF"));
1098 cpl_propertylist_append_double(plist,key_name,emed);
1099 cpl_propertylist_set_comment(plist,key_name,
"Median efficiency");
1105 tot_eff=cpl_table_duplicate(tbl_eff);
1107 cpl_table_insert(tot_eff,tbl_eff,neff_tot);
1117 xsh_msg(
"nclip_tot=%d",nclip_tot);
1125 sprintf(fname,
"%s.fits",tag);
1127 nrow=cpl_table_get_nrow(tot_eff);
1136 xsh_msg(
"nclip_tot =%d neff_tot=%d fclip=%g",nclip_tot,neff_tot,fclip);
1141 check(cpl_table_save(tot_eff,plist, x_plist,fname, CPL_IO_DEFAULT));
1146 CPL_FRAME_GROUP_CALIB,
1147 CPL_FRAME_LEVEL_FINAL));
1176static double slaAirmas (
double zd )
1234 w = (1.52 > w) ? w : 1.52;
1235 seczm1 = 1.0 / ( cos ( w ) ) - 1.0;
1236 return 1.0 + seczm1 * ( 0.9981833
1237 - seczm1 * ( 0.002875 + 0.0008083 * seczm1 ) );
1304 double declination=0;
1307 double hour_angle=0;
1310 const char* telescope_id=NULL;
1346 len=strlen(telescope_id);
1348 tel_id=telescope_id[len-1]-48;
1353 case 1: lat_sec=33.117;
1355 case 2: lat_sec=31.465;
1357 case 3: lat_sec=30.300;
1359 case 4: lat_sec=31.000;
1364 latitude=lat_sig*(lat_deg+lat_min/60+lat_sec/3600);
1371 c1=sin(latitude)*sin(declination)+cos(latitude)*cos(declination)*cos(hour_angle);
1372 c2=cos(latitude)*sin(declination)-sin(latitude)*cos(declination)*cos(hour_angle);
1373 c3=-cos(latitude)*sin(hour_angle);
1375 azimuth=atan(c3/c2);
1376 altitude=atan(c1/c2*cos(azimuth));
1378 xsh_msg(
"altitude=%g",altitude);
1384 airmass=1/sin(altitude+244/(165+47*pow(altitude,1.1)));
1399 cpl_frame* frm=NULL;
1400 cpl_propertylist* plist=NULL;
1401 const char* name=NULL;
1402 double airm_start=0;
1414 size=cpl_frameset_get_size(raws);
1415 for(i=0;i<
size;i++){
1417 frm=cpl_frameset_get_frame(raws,i);
1418 name=cpl_frame_get_filename(frm);
1419 plist=cpl_propertylist_load(name,0);
1426 area=(
exptime/6)*(airm_start+4*airm_med+airm_end);
1436 airm_eff=sum_area/sum_time;
1440 xsh_msg(
"airmass eff=%g",airm_eff);
1450 cpl_frame* frm=NULL;
1451 cpl_propertylist* plist=NULL;
1452 const char* name=NULL;
1463 cpl_array* time_array=NULL;
1464 cpl_array* airm_array=NULL;
1469 size=cpl_frameset_get_size(raws);
1470 airm_array=cpl_array_new(
size,CPL_TYPE_DOUBLE);
1471 time_array=cpl_array_new(
size,CPL_TYPE_DOUBLE);
1473 pairm=cpl_array_get_data_double(airm_array);
1474 ptime=cpl_array_get_data_double(time_array);
1475 pprod=cpl_array_get_data_double(time_array);
1478 for(i=0;i<
size;i++){
1480 frm=cpl_frameset_get_frame(raws,i);
1481 name=cpl_frame_get_filename(frm);
1482 plist=cpl_propertylist_load(name,0);
1490 airm_eff=(pprod[0]+pprod[
size-1])/(ptime[0]+ptime[
size-1]);
1492 }
else if (
size == 2) {
1493 frm=cpl_frameset_get_frame(raws,0);
1494 name=cpl_frame_get_filename(frm);
1495 plist=cpl_propertylist_load(name,0);
1503 frm=cpl_frameset_get_frame(raws,1);
1504 name=cpl_frame_get_filename(frm);
1505 plist=cpl_propertylist_load(name,0);
1514 frm=cpl_frameset_get_frame(raws,0);
1515 name=cpl_frame_get_filename(frm);
1516 plist=cpl_propertylist_load(name,0);
static xsh_instrument * instrument
#define XSH_ASSURE_NOT_NULL_MSG(pointer, msg)
const char * xsh_instrument_mode_tostring(xsh_instrument *i)
Get the string associated with a mode.
const char * xsh_instrument_arm_tostring(xsh_instrument *i)
Get the string associated with an arm.
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm on instrument structure.
#define xsh_msg_warning(...)
Print an warning message.
#define xsh_msg_dbg_medium(...)
#define xsh_msg_error(...)
Print an error message.
#define xsh_msg(...)
Print a message on info level.
double xsh_pfits_get_lst(const cpl_propertylist *plist)
find out the LST value
double xsh_pfits_get_conad(const cpl_propertylist *plist)
find out the CONAD value
double xsh_pfits_get_airm_end(const cpl_propertylist *plist)
find out the TEL AIRM END value
double xsh_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
double xsh_pfits_get_win1_dit1(const cpl_propertylist *plist)
find out the DET WIN1 DIT1 value
double xsh_pfits_get_dec(const cpl_propertylist *plist)
Get the Right Ascension.
const char * xsh_pfits_get_telescop(const cpl_propertylist *plist)
find out the TELESCOP value (telescope ID)
double xsh_pfits_get_cdelt1(const cpl_propertylist *plist)
find out the cdelt1
int xsh_pfits_get_biny(const cpl_propertylist *plist)
find out the BINY value
double xsh_pfits_get_exptime(const cpl_propertylist *plist)
find out the exposure time
double xsh_pfits_get_ra(const cpl_propertylist *plist)
Get the Right Ascension.
double xsh_pfits_get_airm_mean(const cpl_propertylist *plist)
find out the mean airmass value
int xsh_pfits_get_naxis1(const cpl_propertylist *plist)
find out the NAXIS1 value
double xsh_pfits_get_crval1(const cpl_propertylist *plist)
find out the crval1
double xsh_pfits_get_airm_start(const cpl_propertylist *plist)
find out the TEL AIRM START value
void xsh_pfits_set_qc_eff_fclip(cpl_propertylist *plist, double value)
void xsh_pfits_set_qc_eff_nclip(cpl_propertylist *plist, int value)
static cpl_vector * rec_profile
void xsh_free_vector(cpl_vector **v)
Deallocate a vector and set the pointer to NULL.
void xsh_free_image(cpl_image **i)
Deallocate an image and set the pointer to NULL.
double xsh_table_interpolate(cpl_table *tbl, double wav, const char *colx, const char *coly)
Interpolate table columns.
void xsh_free_table(cpl_table **t)
Deallocate a table and set the pointer to NULL.
void xsh_free_propertylist(cpl_propertylist **p)
Deallocate a property list and set the pointer to NULL.
#define XSH_ATMOS_EXT_LIST_COLNAME_OLD
#define XSH_ATMOS_EXT_LIST_COLNAME_K
cpl_frame * xsh_frame_product(const char *fname, const char *tag, cpl_frame_type type, cpl_frame_group group, cpl_frame_level level)
Creates a frame with given characteristics.
cpl_frame * xsh_find_frame_with_tag(cpl_frameset *frames, const char *tag, xsh_instrument *instr)
Find frame with a given tag.
#define XSH_STD_FLUX_SLIT_STARE_ORDER1D
HIGH_ABS_REGION * xsh_fill_high_abs_regions(xsh_instrument *instrument, cpl_frame *high_abs_frame)
static const double STAR_MATCH_DEPSILON
#define XSH_QC_EFF_MED_ORD
#define XSH_QC_EFF_PEAK_ORD
void star_index_delete(star_index *pindex)
star_index * star_index_load(const char *fits_file)
cpl_table * star_index_get(star_index *pindex, double RA, double DEC, double RA_EPS, double DEC_EPS, const char **pstar_name)
double xsh_utils_compute_airm(cpl_frameset *raws)
static const char COL_NAME_COR[]
void xsh_load_ref_table(cpl_frameset *frames, double dRA, double dDEC, double EPSILON, xsh_instrument *instrument, cpl_table **pptable)
load reference table
static const char COL_NAME_EXT[]
double xsh_utils_compute_airm_eff(cpl_frameset *raws)
static void xsh_frame_sci_get_gain_airmass_exptime_naxis1_biny(cpl_frame *frm_sci, xsh_instrument *instrument, double *gain, double *airmass, double *exptime, int *naxis1, int *biny)
static char FRM_EXTCOEFF_TAB[]
static const char COL_NAME_ABS_ATMDISP[]
static cpl_error_code xsh_get_std_obs_values(cpl_propertylist *plist, double *exptime, double *airmass, double *dRA, double *dDEC)
get STD star observation exptime, airmass, RA, DEC
cpl_error_code xsh_efficiency_add_high_abs_regions(cpl_table **eff, HIGH_ABS_REGION *phigh)
static const char COL_NAME_WAVELENGTH[]
cpl_error_code xsh_rv_ref_wave_init(xsh_std_star_id std_star_id, XSH_ARM arm, xsh_rv_ref_wave_param *w)
static const char COL_NAME_BINWIDTH_REF[]
cpl_frame * xsh_utils_efficiency(cpl_frameset *frames, double dGain, double dEpsilon, double aimprim, xsh_instrument *inst, const char *col_name_atm_wave, const char *col_name_atm_abs, const char *col_name_ref_wave, const char *col_name_ref_flux, const char *col_name_ref_bin, const char *col_name_obj_wave, const char *col_name_obj_flux)
Compute efficiency.
static const char COL_NAME_ORD_OBJ[]
static const char COL_NAME_WAVE_ATMDISP[]
static const char COL_NAME_EPHOT[]
static double xsh_utils_get_airm(cpl_propertylist *plist)
static const char COL_NAME_FLUX_REF[]
static const char COL_NAME_WAVE_REF[]
void slaAoppat(double date, double aoprms[14])
void xsh_rv_ref_wave_param_destroy(xsh_rv_ref_wave_param *p)
cpl_table * xsh_utils_efficiency_internal(cpl_table *tbl_obj_spectrum, cpl_table *tbl_atmext, cpl_table *tbl_ref, double exptime, double airmass, double aimprim, double gain, int biny, double src2ref_wave_sampling, const char *col_name_atm_wave, const char *col_name_atm_abs, const char *col_name_ref_wave, const char *col_name_ref_flux, const char *col_name_ref_bin, const char *col_name_obj_wave, const char *col_name_obj_flux, int *ntot, int *nclip)
Compute efficiency.
void xsh_frame_sci_get_ra_dec_airmass(cpl_frame *frm_sci, double *ra, double *dec, double *airmass)
get RA, DEC, airmass (mean) of a frame
static double * xsh_create_column_double(cpl_table *tbl, const char *col_name, int nrow)
static const char COL_NAME_WAVE_OBJ[]
static const char COL_NAME_INT_OBJ[]
cpl_frame * xsh_efficiency_compute(cpl_frame *frm_sci, cpl_frame *frm_cat, cpl_frame *frm_atmext, cpl_frame *high_abs_win, xsh_instrument *instrument)
computes efficiency
cpl_frame * xsh_catalog_extract_spectrum_frame(cpl_frame *frm_cat, cpl_frame *frm_sci)
extract spectrum
static const char COL_NAME_SRC_COR[]
xsh_rv_ref_wave_param * xsh_rv_ref_wave_param_create(void)
static int xsh_column_to_double(cpl_table *ptable, const char *column)
cpl_error_code xsh_parse_catalog_std_stars(cpl_frame *cat, double dRA, double dDEC, double EPSILON, cpl_table **pptable, xsh_std_star_id *std_star_id)
parse referece std stars catalog
static const char COL_NAME_REF[]
static const char COL_NAME_HIGH_ABS[]
static const char COL_NAME_SRC_EFF[]