33 #include <irplib_utils.h>
35 #include <sinfo_pfits.h>
36 #include <sinfo_msg.h>
37 #include <sinfo_dfs.h>
38 #include <sinfo_error.h>
39 #include <sinfo_utils_wrappers.h>
40 #include "sinfo_utl_efficiency.h"
41 #include <sinfo_star_index.h>
43 #define PRO_STD_STAR_SPECTRA "STD_STAR_SPECTRA"
44 static const char COL_NAME_WAVELENGTH[] =
"WAVELENGTH";
45 static const char COL_NAME_WAVELENGTH_C[] =
"WAVELENGTH";
46 static const char COL_NAME_LAMBDA[] =
"LAMBDA";
47 static const char COL_NAME_LA_SILLA[] =
"LA_SILLA";
48 static const char COL_NAME_REF[] =
"REF";
49 static const char COL_NAME_COR[] =
"COR";
50 static const char COL_NAME_SRC_COR[] =
"SRC_COR";
51 static const char COL_NAME_COUNTS_BKG[] =
"INT_OBJ";
52 static const char COL_NAME_FLUX[] =
"FLUX";
53 static const char COL_NAME_EPHOT[] =
"EPHOT";
54 static const char COL_NAME_EXT[] =
"EXT";
55 static const char COL_NAME_SRC_EFF[] =
"EFF";
56 static const char PAR_NAME_DIT[] =
"ESO DET DIT";
58 static char FRM_RAW_IMA_SLIT[] = PRO_STD_STAR_SPECTRA;
59 static char FRM_FLUX_STD_TAB[] = FLUX_STD_TABLE;
60 static char FRM_FLUX_STD_CAT[] = FLUX_STD_CATALOG;
61 static char FRM_EXTCOEFF_TAB[] = EXTCOEFF_TABLE;
64 sinfo_column_to_double(cpl_table* ptable,
const char* column);
67 sinfo_table_interpolate(cpl_table* tbl,
72 sinfo_create_column_double(cpl_table* tbl,
const char* col_name,
int nrow);
77 sinfo_get_std_obs_values(cpl_propertylist* plist,
100 sinfo_load_ref_table(cpl_frameset* frames,
106 const char* name = NULL;
107 cpl_frame* frm_ref = NULL;
110 frm_ref=cpl_frameset_find(frames,FRM_FLUX_STD_TAB);
113 sinfo_msg(
"REF frame is not found, trying to get REF from the catalog");
116 check_nomsg(frm_ref=cpl_frameset_find(frames,FRM_FLUX_STD_CAT));
119 check_nomsg(name=cpl_frame_get_filename(frm_ref));
122 star_index* pstarindex = star_index_load(name);
125 const char* star_name = 0;
126 sinfo_msg(
"The catalog is loaded, looking for star in RA[%f] DEC[%f] tolerance[%f]", dRA, dDEC, EPSILON);
127 *pptable = star_index_get(pstarindex, dRA, dDEC, EPSILON, EPSILON, &star_name);
128 if (*pptable && star_name)
130 sinfo_msg(
"REF table is found in the catalog, star name is [%s]", star_name);
134 sinfo_msg(
"ERROR - REF table could not be found in the catalog");
139 sinfo_msg(
"ERROR - could not load the catalog");
146 sinfo_msg(
"REF frame is found");
147 check_nomsg(name=cpl_frame_get_filename(frm_ref));
148 check_nomsg(*pptable=cpl_table_load(name,1,0));
172 sinfo_parse_catalog_std_stars(cpl_frame* cat,
178 const char* name = NULL;
181 check_nomsg(name=cpl_frame_get_filename(cat));
183 star_index* pstarindex = star_index_load(name);
185 const char* star_name = 0;
186 sinfo_msg(
"The catalog is loaded, looking for star in RA[%f] DEC[%f] tolerance[%f]", dRA, dDEC, EPSILON);
187 *pptable = star_index_get(pstarindex, dRA, dDEC, EPSILON, EPSILON, &star_name);
188 if (*pptable && star_name) {
189 sinfo_msg(
"REF table is found in the catalog, star name is [%s]", star_name);
192 sinfo_msg(
"ERROR - REF table could not be found in the catalog");
196 sinfo_msg(
"ERROR - could not load the catalog");
222 sinfo_data_interpolate(
231 double w2=pw[nrow-1];
233 double y2=pe[nrow-1];
241 else if (wav > pw[nrow - 1])
253 curr_row = (h-l) / 2;
256 if(wav < pw[curr_row])
264 curr_row = (h-l) / 2 + l;
271 y=y1_+(y2-y1_)/(w2-w1)*(wav-w1);
275 sinfo_table_interpolate(cpl_table* tbl,
286 check_nomsg(pw=cpl_table_get_data_double(tbl,colx));
287 check_nomsg(pe=cpl_table_get_data_double(tbl,coly));
288 check_nomsg(nrow=cpl_table_get_nrow(tbl));
290 y = sinfo_data_interpolate(wav, nrow, pw, pe);
297 sinfo_create_column_double(cpl_table* tbl,
const char* col_name,
int nrow)
300 check_nomsg(cpl_table_new_column(tbl, col_name, CPL_TYPE_DOUBLE));
301 check_nomsg(cpl_table_fill_column_window_double(tbl, col_name, 0, nrow, -1));
302 check_nomsg(retval = cpl_table_get_data_double(tbl,col_name));
322 sinfo_get_std_obs_values(cpl_propertylist* plist,
328 double airmass_start=0;
329 double airmass_end=0;
331 check_nomsg(*exptime=sinfo_pfits_get_exp_time(plist));
332 airmass_start=sinfo_pfits_get_airmass_start(plist);
333 airmass_end=sinfo_pfits_get_airmass_end(plist);
334 *dRA=sinfo_pfits_get_ra(plist);
335 *dDEC=sinfo_pfits_get_dec(plist);
336 *airmass=0.5*(airmass_start+airmass_end);
339 return cpl_error_get_code();
363 sinfo_utl_efficiency(
364 cpl_frameset * frames,
368 const char* col_name_atm_wave,
369 const char* col_name_atm_abs,
370 const char* col_name_ref_wave,
371 const char* col_name_ref_flux,
372 const char* col_name_ref_bin,
373 const char* col_name_obj_wave,
374 const char* col_name_obj_flux
377 cpl_frame* frm_sci = NULL;
378 cpl_frame* frm_atmext = NULL;
379 cpl_table* tbl_obj_spectrum = NULL;
380 cpl_table* tbl_atmext = NULL;
381 double exptime = 600;
383 cpl_propertylist* plist = NULL;
384 cpl_table* tbl_ref = NULL;
385 cpl_table* tbl_result=NULL;
387 const char* name=NULL;
392 const double mk2AA=1E4;
398 check_nomsg(frm_sci=cpl_frameset_find(frames, FRM_RAW_IMA_SLIT));
399 check_nomsg(name=cpl_frame_get_filename(frm_sci));
400 sinfo_msg(
"name=%s",name);
401 check_nomsg(tbl_obj_spectrum=cpl_table_load(name,1,0));
402 check_nomsg(plist=cpl_propertylist_load(name,0));
404 sinfo_get_std_obs_values(plist,&exptime,&airmass,&dRA,&dDEC);
407 sinfo_load_ref_table(frames, dRA, dDEC, dEpsilon, &tbl_ref);
411 check_nomsg(frm_atmext=cpl_frameset_find(frames,FRM_EXTCOEFF_TAB));
412 check_nomsg(name=cpl_frame_get_filename(frm_atmext));
413 check_nomsg(tbl_atmext=cpl_table_load(name,1,0));
415 tbl_result = sinfo_utl_efficiency_internal(
436 sinfo_free_propertylist(&plist);
437 sinfo_free_table(&tbl_atmext);
438 sinfo_free_table(&tbl_obj_spectrum);
439 sinfo_free_table(&tbl_ref);
443 sinfo_column_to_double(cpl_table* ptable,
const char* column)
445 const char* TEMP =
"_temp_";
446 check_nomsg(cpl_table_duplicate_column(ptable, TEMP, ptable, column));
447 check_nomsg(cpl_table_erase_column(ptable, column));
448 check_nomsg(cpl_table_cast_column(ptable, TEMP, column, CPL_TYPE_DOUBLE));
449 check_nomsg(cpl_table_erase_column(ptable, TEMP ));
452 sinfo_msg(
" error column to double [%s]", column);
481 sinfo_utl_efficiency_internal(
482 cpl_table* tbl_obj_spectrum,
483 cpl_table* tbl_atmext,
490 double src2ref_wave_sampling,
491 const char* col_name_atm_wave,
492 const char* col_name_atm_abs,
493 const char* col_name_ref_wave,
494 const char* col_name_ref_flux,
495 const char* col_name_ref_bin,
496 const char* col_name_obj_wave,
497 const char* col_name_obj_flux
501 const double TEL_AREA = 51.2e4;
504 cpl_table* tbl_sel = NULL;
511 cpl_table* tbl_result = NULL;
528 double ref_bin_size=0;
530 nrow = cpl_table_get_nrow(tbl_obj_spectrum);
531 sinfo_msg(
"Starting efficiency calculation: exptime[%f] airmass[%f] nrow[%d]",
532 exptime, airmass, nrow);
538 sinfo_column_to_double(tbl_obj_spectrum,col_name_obj_wave);
539 sinfo_column_to_double(tbl_obj_spectrum,col_name_obj_flux);
541 check_nomsg(sinfo_column_to_double(tbl_atmext,col_name_atm_wave ));
542 check_nomsg(sinfo_column_to_double(tbl_atmext,col_name_atm_abs ));
543 check_nomsg(sinfo_column_to_double(tbl_ref,col_name_ref_wave ));
544 check_nomsg(sinfo_column_to_double(tbl_ref,col_name_ref_flux ));
545 check_nomsg(sinfo_column_to_double(tbl_ref,col_name_ref_bin ));
548 ref_bin_size=cpl_table_get_double(tbl_ref,col_name_ref_bin,0,NULL);
549 sinfo_msg(
"ref_bin_size[AA]=%g",ref_bin_size);
556 check_nomsg(cpl_table_multiply_scalar(tbl_obj_spectrum,col_name_obj_wave,
557 src2ref_wave_sampling));
559 check_nomsg(cpl_table_save(tbl_ref,NULL,NULL,
"ref2.fits",CPL_IO_DEFAULT));
560 check_nomsg(cpl_table_save(tbl_atmext,NULL,NULL,
"atm2.fits",CPL_IO_DEFAULT));
561 check_nomsg(cpl_table_save(tbl_obj_spectrum,NULL,NULL,
"sci2.fits",CPL_IO_DEFAULT));
562 sinfo_msg(
"object 2 src std %g",src2ref_wave_sampling);
563 check_nomsg(pw=cpl_table_get_data_double(tbl_obj_spectrum,col_name_obj_wave));
567 check_nomsg(tbl_result=cpl_table_new(nrow));
568 check_nomsg(pref=sinfo_create_column_double(tbl_result, COL_NAME_REF, nrow));
569 check_nomsg(pext=sinfo_create_column_double(tbl_result, COL_NAME_EXT, nrow));
570 check_nomsg(pcor=sinfo_create_column_double(tbl_result, COL_NAME_COR, nrow));
571 check_nomsg(peph=sinfo_create_column_double(tbl_result, COL_NAME_EPHOT, nrow));
572 sinfo_msg(
"wave range: [%g,%g]",pw[0],pw[nrow-1]);
573 sinfo_msg(
"src_bin_size[AA]=%g",pw[1] - pw[0]);
575 cdelta1 = (pw[1] - pw[0]) / src2ref_wave_sampling ;
577 for (i = 0; i < nrow; i++)
579 check_nomsg(pext[i] = sinfo_table_interpolate(tbl_atmext, pw[i],col_name_atm_wave, col_name_atm_abs));
580 check_nomsg(pref[i] = sinfo_table_interpolate(tbl_ref, pw[i], col_name_ref_wave,col_name_ref_flux));
581 pcor[i] = pow(10,(0.4*pext[i] * (aimprim - airmass)));
582 peph[i] = 1.e7*1.986e-19/(pw[i]*1e-4);
600 check_nomsg(cpl_table_duplicate_column(tbl_result,COL_NAME_SRC_COR,
601 tbl_obj_spectrum, col_name_obj_flux));
602 check_nomsg(cpl_table_duplicate_column(tbl_result,col_name_obj_wave,
603 tbl_obj_spectrum,col_name_obj_wave));
605 check_nomsg(cpl_table_multiply_columns(tbl_result,COL_NAME_SRC_COR,COL_NAME_COR));
610 cpl_table_divide_scalar(tbl_result, COL_NAME_SRC_COR, src2ref_wave_sampling);
612 cpl_table_divide_scalar(tbl_result, COL_NAME_SRC_COR, cdelta1);
615 cpl_table_divide_scalar(tbl_result,COL_NAME_SRC_COR,biny);
620 check_nomsg(cpl_table_divide_scalar(tbl_result,COL_NAME_REF,ref_bin_size));
622 check_nomsg(cpl_table_duplicate_column(tbl_result,COL_NAME_SRC_EFF,
623 tbl_result,COL_NAME_SRC_COR));
627 check_nomsg(cpl_table_multiply_scalar(tbl_result,COL_NAME_SRC_EFF,
628 gain / (exptime * TEL_AREA)));
631 check_nomsg(cpl_table_multiply_columns(tbl_result,COL_NAME_SRC_EFF,
635 check_nomsg(cpl_table_divide_columns(tbl_result,COL_NAME_SRC_EFF,COL_NAME_REF));
637 check_nomsg(cpl_table_multiply_scalar(tbl_result,COL_NAME_SRC_EFF,1.e16));
640 cpl_table_and_selected_double(tbl_result,COL_NAME_SRC_EFF,
641 CPL_GREATER_THAN,1.e-5);
642 cpl_table_and_selected_double(tbl_result,COL_NAME_SRC_EFF,
644 tbl_sel=cpl_table_extract_selected(tbl_result);
645 check_nomsg(cpl_table_save(tbl_result,NULL,NULL,
"result9.fits",CPL_IO_DEFAULT));
648 sinfo_free_table(&tbl_result);
654 sinfo_efficiency_compute(cpl_frame* frm_sci,
656 cpl_frame* frm_atmext)
660 cpl_propertylist* plist=NULL;
662 cpl_table* tbl_eff=NULL;
663 cpl_table* tbl_ref=NULL;
664 cpl_table* tbl_atmext=NULL;
665 cpl_table* tbl_sci=NULL;
669 double airmass_start=0;
670 double airmass_end=0;
681 const char* name_sci=NULL;
682 const char* name_atm=NULL;
684 name_sci=cpl_frame_get_filename(frm_sci);
685 sinfo_msg(
"name_sci=%s",name_sci);
686 check_nomsg(plist=cpl_propertylist_load(name_sci,0));
687 check_nomsg(tbl_sci=cpl_table_load(name_sci,1,0));
688 check_nomsg(dRA=sinfo_pfits_get_ra(plist));
689 dDEC=sinfo_pfits_get_dec(plist);
690 airmass_start=sinfo_pfits_get_airmass_end(plist);
691 airmass_end=sinfo_pfits_get_airmass_end(plist);
692 airmass=0.5*(airmass_start+airmass_end);
695 check_nomsg(exptime=sinfo_pfits_get_dit(plist));
696 sinfo_free_propertylist(&plist);
697 sinfo_msg(
"gain=%g airm=%g exptime=%g airmass=%g ra=%g dec=%g",
698 gain,airmass,exptime,airmass,dRA,dDEC);
700 sinfo_msg(
"table sci spectra=%s",name_sci);
703 check_nomsg(name_atm=cpl_frame_get_filename(frm_atmext));
704 check_nomsg(tbl_atmext=cpl_table_load(name_atm,1,0));
706 check_nomsg(sinfo_parse_catalog_std_stars(frm_cat,dRA,dDEC,dEpsilon,&tbl_ref));
708 if(tbl_ref == NULL) {
714 check_nomsg(cpl_table_save(tbl_sci,NULL,NULL,
"sci.fits",CPL_IO_DEFAULT));
715 check_nomsg(tbl_eff=sinfo_utl_efficiency_internal(tbl_sci,tbl_atmext,tbl_ref,
716 exptime,airmass,aimprim,gain,
727 sinfo_free_table(&tbl_ref);
728 sinfo_free_table(&tbl_atmext);
729 sinfo_free_propertylist(&plist);