30#include <eris_pfits.h>
31#include "eris_ifu_sdp.h"
32#include "eris_ifu_dfs.h"
35#include <eris_utils.h>
36#include <eris_ifu_utils.h>
37#include <eris_ifu_wavecal_static.h>
53#define KEY_ASSON "ASSON"
54#define KEY_ASSON_COMMENT "Associated file name"
55#define KEY_ASSOC "ASSON"
56#define KEY_ASSOC_COMMENT "Associated file category"
57#define KEY_ASSOM "ASSOM"
58#define KEY_ASSOM_COMMENT "Associated file datamd5"
61#define KEY_DEC_COMMENT "[deg] Image center (J2000)"
62#define KEY_EXPTIME "EXPTIME"
63#define KEY_EXPTIME_COMMENT "[s] Total integration time per pixel"
64#define KEY_FLUXCAL "FLUXCAL"
65#define KEY_FLUXCAL_COMMENT "Type of flux calibration (ABSOLUTE or UNCALIBRATED)"
66#define KEY_FLUXCAL_VALUE_FALSE "UNCALIBRATED"
67#define KEY_FLUXCAL_VALUE_TRUE "ABSOLUTE"
68#define KEY_MJDOBS "MJD-OBS"
69#define KEY_MJDOBS_COMMENT "[d] Start of observations (days)"
70#define KEY_MJDEND "MJD-END"
71#define KEY_MJDEND_COMMENT "[d] End of observations (days)"
72#define KEY_OBID "OBID"
73#define KEY_OBID1 "OBID1"
74#define KEY_OBID_COMMENT "Observation block ID"
75#define KEY_OBSTECH "OBSTECH"
76#define KEY_OBSTECH_COMMENT "Technique for observation"
77#define KEY_PROCSOFT "PROCSOFT"
78#define KEY_PROCSOFT_COMMENT "ESO pipeline version"
79#define KEY_PRODCATG "PRODCATG"
80#define KEY_PRODCATG_COMMENT "Data product category"
81#define KEY_PRODCATG_VALUE_IFS_CUBE "SCIENCE.CUBE.IFS"
82#define KEY_PRODCATG_VALUE_FOV_IMAGE "ANCILLARY.IMAGE"
83#define KEY_PROG_ID "PROG_ID"
84#define KEY_PROG_ID_COMMENT "ESO programme identification"
85#define KEY_PROG_ID_VALUE_MULTIPLE "MULTI"
86#define KEY_PROGID "PROGID"
87#define KEY_PROGID_COMMENT KEY_PROG_ID_COMMENT
88#define KEY_PROV "PROV"
89#define KEY_PROV_COMMENT "Originating raw science file"
91#define KEY_RA_COMMENT "[deg] Image center (J2000)"
92#define KEY_REFERENC "REFERENC"
93#define KEY_REFERENC_COMMENT "Reference publication"
94#define KEY_TEXPTIME "TEXPTIME"
95#define KEY_TEXPTIME_COMMENT "[s] Total integration time of all exposures"
96#define KEY_WAVELMIN "WAVELMIN"
97#define KEY_WAVELMIN_COMMENT "[nm] Minimum wavelength"
98#define KEY_WAVELMAX "WAVELMAX"
99#define KEY_WAVELMAX_COMMENT "[nm] Maximum wavelength"
100#define KEY_SKY_RES "SKY_RES"
101#define KEY_SKY_RES_COMMENT "[arcsec] FWHM effective spatial resolution"
102#define KEY_SKY_RERR "SKY_RERR"
103#define KEY_SKY_RERR_COMMENT "[arcsec] Error of SKY_RES"
104#define KEY_SPEC_RES "SPEC_RES"
105#define KEY_SPEC_RES_COMMENT "Spectral resolving power at central wavelength"
106#define KEY_SPEC_ERR "CRDER3"
107#define KEY_SPEC_ERR_COMMENT "[angstrom] Random error in spectral coordinate"
108#define KEY_SPECSYS "SPECSYS"
109#define KEY_SPECSYS_COMMENT "Frame of reference for spectral coordinates."
110#define KEY_PIXNOISE "PIXNOISE"
111#define KEY_PIXNOISE_COMMENT "[erg.s**(-1).cm**(-2).angstrom**(-1)] pixel-to-pixel noise"
112#define KEY_ABMAGLIM "ABMAGLIM"
113#define KEY_ABMAGLIM_COMMENT "5-sigma magnitude limit for point sources"
114#define KEY_NCOMBINE "NCOMBINE"
115#define KEY_NCOMBINE_COMMENT "No. of combined raw science data files"
118#define CLEAN_KEYS_REGEXP \
119 "^(" KEY_MJDEND "|" \
123 KEY_PROGID "[0-9]+|" \
138 KEY_ASSON "[0-9]+" ")$"
155} eris_ifu_specres_lut_entry;
237static const double day2sec = 86400.0;
393eris_ifu_sdp_compute_fwhm(cpl_frameset* set)
395 cpl_ensure(set != NULL, CPL_ERROR_NULL_INPUT, 0);
397 cpl_frame* frm = NULL;
399 cpl_size kexposure = 0;
401 cpl_propertylist* phead;
404 frm = cpl_frameset_get_position(set, kexposure);
405 next = cpl_frame_get_nextensions(frm);
406 fname = cpl_frame_get_filename(frm);
407 phead = cpl_propertylist_load(fname, 0);
408 cpl_msg_info(cpl_func,
"fname: %s next: %lld",fname, next);
410 double IA_fwhm_corr = 0;
411 double IA_fwhm_corr_pix = 0;
416 asm_data = cpl_table_load(fname, 1, 0);
417 if(cpl_table_has_column(asm_data,
"IA_FWHM")) {
418 IA_fwhm = cpl_table_get_column_mean(asm_data,
"IA_FWHM");
419 }
else if (cpl_propertylist_has(phead,
"ESO TEL IA FWHM")) {
420 IA_fwhm = cpl_propertylist_get_double(phead,
"ESO TEL IA FWHM");
422 if(cpl_table_has_column(asm_data,
"DIMM_SEEING")) {
423 dimm = cpl_table_get_column_mean(asm_data,
"DIMM_SEEING");
425 double airm_start = 0;
428 if (cpl_propertylist_has(phead,
"ESO TEL AMBI FWHM START")) {
432 if (cpl_propertylist_has(phead,
"ESO TEL AMBI FWHM END")) {
436 if(airm_start > 0 && airm_end > 0) {
437 dimm = 0.5 * (airm_start + airm_end);
438 }
else if (airm_start > 0 && airm_end == 0) {
440 }
else if (airm_start > 0 && airm_end == 0) {
445 cpl_table_delete(asm_data);
448 eris_ifu_get_central_lambda(bandId, &lambda_c);
450 double pix_scale = 1;
452 case S25MAS: pix_scale = 0.025;
break;
453 case S100MAS:pix_scale = 0.100;
break;
454 case S250MAS:pix_scale = 0.250;
break;
456 cpl_msg_error(cpl_func,
"scale not found");
461 IA_fwhm_corr = IA_fwhm * pow((0.500/lambda_c), 0.2 );
462 IA_fwhm_corr_pix = IA_fwhm_corr / pix_scale;
463 cpl_msg_info(cpl_func,
"IA_fwhm_corr: %g",IA_fwhm_corr);
464 cpl_msg_info(cpl_func,
"IA_fwhm_corr_pix: %g",IA_fwhm_corr_pix);
465 double airmass = eris_pfits_get_airmass(phead);
467 double dimm_corr = dimm *
468 pow((0.500/lambda_c),0.2) *
469 pow(airmass,(3./5.)) *
471 (pow( (lambda_c / 1.e6), 0.4) *
472 (pow(airmass, -0.2) / pow(dimm, (1./3.)))
474 cpl_msg_info(cpl_func,
"dimm_corr: %g",dimm_corr);
475 double dimm_corr_pix = dimm_corr/pix_scale;
476 cpl_msg_info(cpl_func,
"dimm_corr_pix: %g",dimm_corr_pix);
479 cpl_propertylist_delete(phead);
488eris_ifu_sdp_compute_pixnoise(cpl_frameset* set) {
490 cpl_ensure(set != NULL, CPL_ERROR_NULL_INPUT, 0);
491 cpl_frame* frm = NULL;
493 cpl_error_code error_code = cpl_error_get_code();
494 cpl_error_set(cpl_func, error_code);
496 if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN)) {
497 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN);
498 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_MEAN_FLUXCAL)) {
499 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_MEAN_FLUXCAL);
500 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_DAR_CUBE_FLUXCAL_MEAN)) {
501 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_DAR_CUBE_FLUXCAL_MEAN);
502 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_FLUX_CUBE_COADD_FLUXCAL_MEAN)) {
503 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_FLUX_CUBE_COADD_FLUXCAL_MEAN);
504 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_FLUX_STD_CUBE_COADD_FLUXCAL_MEAN)) {
505 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_FLUX_STD_CUBE_COADD_FLUXCAL_MEAN);
506 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_TWK_OBJ_CUBE_COADD_FLUXCAL_MEAN)) {
507 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_TWK_OBJ_CUBE_COADD_FLUXCAL_MEAN);
510 const char* fname = cpl_frame_get_filename(frm);
511 cpl_msg_warning(cpl_func,
"fname: %s",fname);
512 cpl_image* data = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 1);
513 cpl_image* errs = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 2);
514 cpl_image* qual = cpl_image_load(fname, CPL_TYPE_INT, 0, 3);
516 cpl_mask* bpm = cpl_mask_threshold_image_create(qual, DBL_MIN, 0.9);
517 cpl_image_reject_from_mask(data, bpm);
518 cpl_mask_delete(bpm);
523 cpl_image_delete(data);
524 cpl_image_delete(errs);
525 cpl_image_delete(qual);
539 cpl_mask_delete(obj_mask);
545eris_ifu_sdp_get_obj_mean(cpl_frameset* set) {
547 cpl_ensure(set != NULL, CPL_ERROR_NULL_INPUT, NULL);
548 cpl_frame* frm = NULL;
550 cpl_error_code error_code = cpl_error_get_code();
551 cpl_error_set(cpl_func, error_code);
552 cpl_msg_warning(cpl_func,
"search input frame");
554 if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_DAR_CUBE_FLUXCAL_MEAN)) {
555 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_DAR_CUBE_FLUXCAL_MEAN);
556 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN)) {
557 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN);
558 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_CUBE_COADD_FLUXCAL_MEAN)) {
559 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_CUBE_COADD_FLUXCAL_MEAN);
560 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_FLUX_STD_CUBE_COADD_FLUXCAL_MEAN)) {
561 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_FLUX_STD_CUBE_COADD_FLUXCAL_MEAN);
562 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_FLUX_CUBE_COADD_FLUXCAL_MEAN)) {
563 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_FLUX_CUBE_COADD_FLUXCAL_MEAN);
564 }
else if(NULL != cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_TWK_OBJ_CUBE_COADD_FLUXCAL_MEAN)) {
565 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_TWK_OBJ_CUBE_COADD_FLUXCAL_MEAN);
568 const char* fname = cpl_frame_get_filename(frm);
570 cpl_image* data = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 1);
571 cpl_image* errs = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 2);
572 cpl_image* qual = cpl_image_load(fname, CPL_TYPE_INT, 0, 3);
573 cpl_mask* bpm = cpl_mask_threshold_image_create(qual, DBL_MIN, 0.9);
575 cpl_image_set_bpm(data, bpm);
587 cpl_image_delete(data);
588 cpl_image_delete(errs);
589 cpl_image_delete(qual);
590 cpl_mask_delete(obj_mask);
597eris_ifu_sdp_compute_zp(ifsBand band)
617 case J_LOW: ZP = -23.564080671;
break;
618 case J_SHORT: ZP = -23.370149709;
break;
619 case J_MIDDLE: ZP = -23.575634864;
break;
620 case J_LONG: ZP = -23.746457445;
break;
621 case H_LOW: ZP = -23.764826331;
break;
622 case H_SHORT: ZP = -23.961968187;
break;
623 case H_MIDDLE: ZP = -24.238252577;
break;
624 case H_LONG: ZP = -24.396966217;
break;
625 case K_LOW: ZP = -24.89135131;
break;
626 case K_SHORT: ZP = -24.730943402;
break;
627 case K_MIDDLE: ZP = -24.8542167693;
break;
628 case K_LONG: ZP = -25.24818993;
break;
629 default: ZP = 2;
break;
636eris_ifu_sdp_compute_abmaglimit(
const double sky_rms,
const double fwhm,
641 double ZP = eris_ifu_sdp_compute_zp(band);
642 abmaglim = -2.5*log10(5. * fwhm * sky_rms * sqrt(CPL_MATH_PI) /
643 (2. * sqrt(log(4)))) - 2.5 * log10(2.) + ZP;
648eris_ifu_sdp_properties *
649eris_ifu_sdp_properties_new(
void) {
650 eris_ifu_sdp_properties *properties = cpl_calloc(1,
sizeof *properties);
655eris_ifu_sdp_properties_delete(eris_ifu_sdp_properties *aProperties)
658 cpl_array_delete(aProperties->obid);
659 cpl_array_delete(aProperties->progid);
660 cpl_propertylist_delete(aProperties->prov);
661 cpl_array_delete(aProperties->asson);
665 cpl_array_delete(aProperties->assoc);
666 cpl_free((
char *)aProperties->prodcatg);
668 cpl_free((
char *)aProperties->specsys);
669 cpl_free((
char *)aProperties->obstech);
670 cpl_free((
char *)aProperties->referenc);
672 cpl_free(aProperties);
688 const char *value = cpl_propertylist_get_string(aHeaders,
"ORIGFILE");
689 cpl_ensure(value, cpl_error_get_code(), NULL);
739eris_ifu_get_sdp_frames(cpl_frameset* set,
const cpl_parameterlist* parlist,
740 const char* recipe_name, eris_ifu_sdp_properties *properties,
741 cpl_frameset** raws_obj, cpl_frameset** raws_sky, cpl_frameset** pros_obj)
744 cpl_ensure(set != NULL, CPL_ERROR_NULL_INPUT, CPL_ERROR_NULL_INPUT);
745 cpl_ensure(parlist != NULL, CPL_ERROR_NULL_INPUT, CPL_ERROR_NULL_INPUT);
746 cpl_ensure(recipe_name != NULL, CPL_ERROR_NULL_INPUT, CPL_ERROR_NULL_INPUT);
747 cpl_ensure(properties != NULL, CPL_ERROR_NULL_INPUT, CPL_ERROR_NULL_INPUT);
749 char* param_name = cpl_sprintf(
"eris.%s.dar-corr", recipe_name);
750 cpl_boolean is_dar_cor =
751 cpl_parameter_get_bool(cpl_parameterlist_find_const(parlist, param_name));
752 cpl_free(param_name);
755 param_name = cpl_sprintf(
"eris.%s.sky_tweak", recipe_name);
757 cpl_parameter_get_int(cpl_parameterlist_find_const(parlist, param_name));
758 cpl_free(param_name);
760 cpl_size nexposures = 0;
761 cpl_frame* frm = NULL;
764 if (strstr(recipe_name,
"jitter") != NULL) {
773 if(is_sky_tweak > 0) {
778 if(*pros_obj != NULL) {
781 if(NULL == (frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_DAR_CUBE_FLUXCAL_MEAN))) {
782 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN);
785 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN);
788 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
792 if(is_sky_tweak > 0) {
793 if(NULL == (frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_DAR_CUBE_FLUXCAL_MEAN))) {
794 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN);
797 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_OBJ_CUBE_COADD_FLUXCAL_MEAN);
800 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
807 if(*pros_obj != NULL) {
809 if(is_sky_tweak > 0) {
810 if(NULL == (frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_TWK_OBJ_CUBE_COADD_FLUXCAL_MEAN))) {
811 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_TWK_OBJ_CUBE_COADD_FLUXCAL_MEAN);
815 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
820 if(*pros_obj == NULL) {
824 nexposures = cpl_frameset_count_tags(*raws_obj, ERIS_IFU_RAW_OBJ);
825 }
else if (strstr(recipe_name,
"stdstar") != NULL) {
834 if(*pros_obj != NULL) {
836 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_FLUX_CUBE_COADD_FLUXCAL_MEAN);
838 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_FLUX_CUBE_COADD_FLUXCAL_MEAN);
841 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
845 if(pros_obj != NULL) {
847 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_FLUX_STD_CUBE_COADD_FLUXCAL_MEAN);
849 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_FLUX_STD_CUBE_COADD_FLUXCAL_MEAN);
852 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
856 if(*pros_obj != NULL) {
858 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_CUBE_COADD_FLUXCAL_MEAN);
860 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_STD_CUBE_COADD_FLUXCAL_MEAN);
863 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
866 nexposures = cpl_frameset_count_tags(*raws_obj, ERIS_IFU_RAW_STD_FLUX);
872 properties->ncombine = nexposures;
876 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_EXPOSURE_MAP);
878 cpl_frameset_insert(*pros_obj, cpl_frame_duplicate(frm));
883 return cpl_error_get_code();
886eris_ifu_sdp_properties *
887eris_ifu_sdp_properties_collect(hdrl_resample_result *aCube, cpl_frameset* set,
888 const cpl_parameterlist* parlist,
const char* recipe_name)
891 cpl_ensure(aCube != NULL, CPL_ERROR_NULL_INPUT, NULL);
892 cpl_ensure(set != NULL, CPL_ERROR_NULL_INPUT, NULL);
893 cpl_ensure(parlist != NULL, CPL_ERROR_NULL_INPUT, NULL);
894 cpl_ensure(recipe_name != NULL, CPL_ERROR_NULL_INPUT, NULL);
897 cpl_frameset* raws_obj = NULL;
898 cpl_frameset* raws_sky = NULL;
899 cpl_frameset* pros_obj = NULL;
900 cpl_propertylist* header = aCube->header;
903 eris_ifu_sdp_properties *properties = eris_ifu_sdp_properties_new();
905 properties->wlerror = 0.026;
907 eris_ifu_get_sdp_frames(set, parlist, recipe_name, properties, &raws_obj,
908 &raws_sky, &pros_obj);
910 if(raws_sky != NULL) {
911 cpl_frameset_join(pros_obj, raws_sky);
913cpl_frameset_delete(raws_sky);
914 cpl_size nexposures = properties->ncombine;
917 properties->obid = cpl_array_new(nexposures, CPL_TYPE_LONG);
918 properties->progid = cpl_array_new(nexposures, CPL_TYPE_STRING);
920 cpl_msg_info(cpl_func,
"obid array size: %lld",
921 cpl_array_get_size(properties->obid));
923 cpl_msg_info(cpl_func,
"progid array size: %lld",
924 cpl_array_get_size(properties->progid));
926 properties->prov = cpl_propertylist_new();
928 const char* fname = NULL;
929 cpl_propertylist* phead = NULL;
930 cpl_propertylist* pchead = NULL;
935 properties->texptime = 0;
936 double ia_fwhm_corr = 0;
937 for(cpl_size kexposure = 0; kexposure < properties->ncombine; kexposure++) {
939 frm = cpl_frameset_get_position(raws_obj, kexposure);
940 fname = cpl_frame_get_filename(frm);
941 phead = cpl_propertylist_load(fname, 0);
946 cpl_msg_info(cpl_func,
"obid: %ld",obid);
949 exptime = dit * ndit;
953 double endtime = mjd + exptime / day2sec;
955 properties->texptime += exptime;
956 properties->mjd_end = CPL_MAX(endtime, properties->mjd_end);
962 cpl_msg_info(cpl_func,
"compute FWHM");
963 if (strstr(recipe_name,
"jitter") != NULL) {
964 ia_fwhm_corr = eris_ifu_sdp_compute_fwhm(raws_obj);
970 properties->skyres += ia_fwhm_corr;
971 cpl_msg_info(cpl_func,
"compute exposure time");
972 frm = cpl_frameset_find(set, ERIS_IFU_PRO_JITTER_EXPOSURE_MAP);
973 cpl_image* expt = cpl_image_load(cpl_frame_get_filename(frm),
974 CPL_TYPE_DOUBLE, 0, 0);
975 cpl_mask* bpm = cpl_image_get_bpm(expt);
976 cpl_mask_threshold_image(bpm, expt, 0, DBL_MAX, CPL_BINARY_0);
977 cpl_image_set_bpm(expt, bpm);
978 properties->exptime = cpl_image_get_median(expt);
979 cpl_image_delete(expt);
982 cpl_array_set_long(properties->obid, kexposure, obid);
984 cpl_array_set_string(properties->progid, kexposure, progid);
988 unsigned int nraw = cpl_propertylist_get_size(properties->prov);
999 char *name = cpl_sprintf(
"PROV%-u", ++nraw);
1000 cpl_propertylist_append_string(properties->prov, name, prov);
1003 unsigned int iraw = 1;
1006 char *name = cpl_sprintf(
"PROV%-u", ++nraw);
1007 cpl_propertylist_append_string(properties->prov, name, prov);
1013 cpl_propertylist_delete(phead);
1015 properties->skyres /= properties->ncombine;
1020 double abmaglim = 0.0;
1022 cpl_msg_info(cpl_func,
"compute abmaglim");
1024 double pixnoise = 1;
1026 pixnoise = eris_ifu_sdp_compute_pixnoise(pros_obj);
1028 properties->pixnoise = pixnoise;
1029 cpl_size nobj = cpl_frameset_get_size(raws_obj);
1030 cpl_frameset_delete(raws_obj);
1031 cpl_msg_info(cpl_func,
"obid array size: %lld",
1032 cpl_array_get_size(properties->obid));
1034 cpl_frame* wave_frm = cpl_frameset_find(set, ERIS_IFU_CALIB_WAVE_MAP);
1035 fname = cpl_frame_get_filename(wave_frm);
1036 phead = cpl_propertylist_load(fname, 0);
1040 cpl_propertylist_delete(phead);
1042 hdrl_image* hima_obj_mean = eris_ifu_sdp_get_obj_mean(pros_obj);
1046 double zp = eris_ifu_sdp_compute_zp(bandId);
1048 const cpl_size kernel_size_x = 3;
1049 const cpl_size kernel_size_y = 3;
1052 double histo_min = 0.;
1053 double histo_max = 0.;
1054 double bin_size = 0.;
1055 cpl_size error_niter = 0;
1056 hdrl_mode_type mode_method = HDRL_MODE_MEDIAN;
1063 histo_max, bin_size, mode_method, error_niter);
1066 HDRL_IMAGE_EXTEND_NEAREST, mode_parameter,&abmaglim);
1069 cpl_msg_info(cpl_func,
"HDRL computed abmaglim: %g", abmaglim);
1070 abmaglim = eris_ifu_sdp_compute_abmaglimit(pixnoise, ia_fwhm_corr, bandId);
1071 properties->abmaglimit = abmaglim;
1072 cpl_msg_info(cpl_func,
"LODO computed abmaglim: %g", abmaglim);
1076 properties->prodcatg = cpl_strdup(KEY_PRODCATG_VALUE_IFS_CUBE);
1077 properties->obstech = cpl_strdup(
"IFU");
1079 char *key = cpl_sprintf(
"ESO PRO REC1 PIPE ID");
1080 if(cpl_propertylist_has(header, key)) {
1081 properties->procsoft = cpl_propertylist_get_string(header, key);
1084 properties->referenc = NULL;
1085 if(cpl_propertylist_has(header, KEY_PROG_ID) ){
1086 cpl_propertylist_get_string(header, KEY_PROG_ID);
1088 properties->fluxcal = CPL_TRUE;
1091 cpl_size npros = cpl_frameset_get_size(pros_obj);
1093 properties->asson = cpl_array_new(npros, CPL_TYPE_STRING);
1094 cpl_size kstart = 0;
1097 properties->nobj = 1;
1100 for(cpl_size kexposure = kstart; kexposure < npros; kexposure++) {
1101 frm = cpl_frameset_get_position(pros_obj, kexposure);
1102 fname = cpl_frame_get_filename(frm);
1103 pchead = cpl_propertylist_load(fname, 0);
1104 cpl_array_set_string(properties->asson, kexposure,
1106 cpl_propertylist_delete(pchead);
1113 properties->specres = resol_med;
1114 properties->specsys = cpl_sprintf(
"TOPOCENT");
1118 if(cpl_propertylist_has(header,
"CRVAL3")) {
1119 properties->wlenrange[0] = cpl_propertylist_get_double(header,
"CRVAL3");
1123 if(cpl_propertylist_has(header,
"CD3_3")) {
1124 cd3_3 = cpl_propertylist_get_double(header,
"CD3_3");
1126 properties->wlenrange[1] = properties->wlenrange[0] + cd3_3 * (double)(naxis3 -1.);
1149 if (pros_obj) cpl_frameset_delete(pros_obj);
1159static int cmp_double_asc(
const void *p1,
const void *p2) {
1160 double d = (*(
const double *)p1 - *(
const double *)p2);
1161 return (d < 0)?-1:(d>0)?1:0;
1164static int cmp_double_desc(
const void *p1,
const void *p2) {
1165 double d = (*(
const double *)p1 - *(
const double *)p2);
1166 return (d < 0)?1:(d>0)?-1:0;
1169static int cmp_float_asc(
const void *p1,
const void *p2) {
1170 float d = (*(
const float *)p1 - *(
const float *)p2);
1171 return (d < 0)?-1:(d>0)?1:0;
1175static int cmp_float_desc(
const void *p1,
const void *p2) {
1176 float d = (*(
const float *)p1 - *(
const float *)p2);
1177 return (d < 0)?1:(d>0)?-1:0;
1182static int cmp_int_asc(
const void *p1,
const void *p2) {
1183 return (*(
const int *)p1 - *(
const int *)p2);
1186static int cmp_int_desc(
const void *p1,
const void *p2) {
1187 return (*(
const int *)p2 - *(
const int *)p1);
1190static int cmp_long_asc(
const void *p1,
const void *p2) {
1191 return (*(
const long *)p1 - *(
const long *)p2);
1194static int cmp_long_desc(
const void *p1,
const void *p2) {
1195 return (*(
const long *)p2 - *(
const long *)p1);
1199static int cmp_string_asc(
const void *p1,
const void *p2) {
1200 return strcmp(*(
const char **)p1, *(
const char **)p2);
1203static int cmp_string_desc(
const void *p1,
const void *p2) {
1204 return strcmp(*(
const char **)p2, *(
const char **)p1);
1220 cpl_ensure_code(aArray != NULL, CPL_ERROR_NULL_INPUT);
1221 cpl_ensure_code(!cpl_array_has_invalid(aArray), CPL_ERROR_NULL_INPUT);
1223 cpl_size n = cpl_array_get_size(aArray);
1224 if (cpl_array_get_type(aArray) == CPL_TYPE_DOUBLE) {
1225 double *d = cpl_array_get_data_double(aArray);
1226 qsort(d, n,
sizeof(
double), (aOrder)?cmp_double_asc:cmp_double_desc);
1227 return CPL_ERROR_NONE;
1228 }
else if (cpl_array_get_type(aArray) == CPL_TYPE_FLOAT) {
1229 float *d = cpl_array_get_data_float(aArray);
1230 qsort(d, n,
sizeof(
float), (aOrder)?cmp_float_asc:cmp_float_desc);
1231 return CPL_ERROR_NONE;
1232 }
else if (cpl_array_get_type(aArray) == CPL_TYPE_INT) {
1233 int *d = cpl_array_get_data_int(aArray);
1234 qsort(d, n,
sizeof(
int), (aOrder)?cmp_int_asc:cmp_int_desc);
1235 return CPL_ERROR_NONE;
1236 }
else if (cpl_array_get_type(aArray) == CPL_TYPE_LONG) {
1237 long *d = cpl_array_get_data_long(aArray);
1238 qsort(d, n,
sizeof(
long), (aOrder)?cmp_long_asc:cmp_long_desc);
1239 return CPL_ERROR_NONE;
1240 }
else if (cpl_array_get_type(aArray) == CPL_TYPE_STRING) {
1241 char **d = cpl_array_get_data_string(aArray);
1242 qsort(d, n,
sizeof(
char *), (aOrder)?cmp_string_asc:cmp_string_desc);
1243 return CPL_ERROR_NONE;
1245 return CPL_ERROR_ILLEGAL_INPUT;
1250eris_ifu_sdp_properties_update(cpl_propertylist *aHeader,
1251 const eris_ifu_sdp_properties *aProperties)
1253 cpl_ensure(aHeader && aProperties, CPL_ERROR_NULL_INPUT, CPL_ERROR_NULL_INPUT);
1256 cpl_ensure(cpl_array_get_size(aProperties->obid) == aProperties->ncombine,
1257 CPL_ERROR_ILLEGAL_INPUT, CPL_ERROR_ILLEGAL_INPUT);
1259 cpl_ensure(cpl_array_get_size(aProperties->progid) == aProperties->ncombine,
1260 CPL_ERROR_ILLEGAL_INPUT, CPL_ERROR_ILLEGAL_INPUT);
1261 cpl_ensure(cpl_propertylist_get_size(aProperties->prov) >= aProperties->ncombine,
1262 CPL_ERROR_ILLEGAL_INPUT, CPL_ERROR_ILLEGAL_INPUT);
1265 cpl_propertylist_erase_regexp(aHeader, CLEAN_KEYS_REGEXP, 0);
1267 cpl_propertylist_update_double(aHeader, KEY_RA, aProperties->fovcenter[0]);
1268 cpl_propertylist_set_comment(aHeader, KEY_RA, KEY_RA_COMMENT);
1269 cpl_propertylist_update_double(aHeader, KEY_DEC, aProperties->fovcenter[1]);
1270 cpl_propertylist_set_comment(aHeader, KEY_DEC, KEY_DEC_COMMENT);
1271 cpl_propertylist_update_double(aHeader, KEY_EXPTIME, aProperties->exptime);
1272 cpl_propertylist_set_comment(aHeader, KEY_EXPTIME, KEY_EXPTIME_COMMENT);
1274 cpl_propertylist_insert_after_double(aHeader, KEY_EXPTIME,
1275 KEY_TEXPTIME, aProperties->texptime);
1276 cpl_propertylist_set_comment(aHeader, KEY_TEXPTIME, KEY_TEXPTIME_COMMENT);
1278 cpl_propertylist_insert_after_int(aHeader, KEY_TEXPTIME,
1279 KEY_NCOMBINE, aProperties->ncombine);
1280 cpl_propertylist_set_comment(aHeader, KEY_NCOMBINE, KEY_NCOMBINE_COMMENT);
1282 cpl_propertylist_set_comment(aHeader, KEY_MJDOBS, KEY_MJDOBS_COMMENT);
1283 cpl_propertylist_insert_after_double(aHeader, KEY_MJDOBS,
1284 KEY_MJDEND, aProperties->mjd_end);
1285 cpl_propertylist_set_comment(aHeader, KEY_MJDEND, KEY_MJDEND_COMMENT);
1288 cpl_array *obids = cpl_array_duplicate(aProperties->obid);
1293 long obid = cpl_array_get_long(obids, 0, NULL);
1294 cpl_msg_warning(cpl_func,
"obid: %ld",obid);
1295 cpl_propertylist_update_long(aHeader, KEY_OBID1, obid);
1296 cpl_propertylist_set_comment(aHeader, KEY_OBID1, KEY_OBID_COMMENT);
1298 if (aProperties->ncombine > 1) {
1299 unsigned int ik = 1;
1301 for (idx = 1; idx < aProperties->ncombine; ++idx) {
1302 long _obid = cpl_array_get_long(obids, idx, NULL);
1303 if (_obid != obid) {
1304 char *key = cpl_sprintf(KEY_OBID
"%-u", ++ik);
1305 cpl_propertylist_update_long(aHeader, key, _obid);
1306 cpl_propertylist_set_comment(aHeader, key, KEY_OBID_COMMENT);
1312 cpl_array_delete(obids);
1319 if(aProperties->progid != NULL) {
1321 cpl_array *progids = cpl_array_duplicate(aProperties->progid);
1326 const char *progid = cpl_array_get_string(progids, 0);
1328 if (aProperties->ncombine > 1) {
1329 unsigned int nprogid = 1;
1331 for (idx = 1; idx < aProperties->ncombine; ++idx) {
1332 const char *_progid = cpl_array_get_string(progids, idx);
1333 if (strcmp(_progid, progid) != 0) {
1339 progid = cpl_array_get_string(progids, 0);
1341 cpl_propertylist_update_string(aHeader, KEY_PROG_ID, progid);
1343 cpl_propertylist_update_string(aHeader, KEY_PROG_ID,
1344 KEY_PROG_ID_VALUE_MULTIPLE);
1345 cpl_propertylist_update_string(aHeader, KEY_PROGID
"1", progid);
1346 cpl_propertylist_set_comment(aHeader, KEY_PROGID
"1", KEY_PROGID_COMMENT);
1348 unsigned int ik = 1;
1349 for (idx = 1; idx < aProperties->ncombine; ++idx) {
1350 const char *_progid = cpl_array_get_string(progids, idx);
1351 if (strcmp(_progid, progid) != 0) {
1352 char *key = cpl_sprintf(KEY_PROGID
"%-u", ++ik);
1353 cpl_propertylist_update_string(aHeader, key, _progid);
1354 cpl_propertylist_set_comment(aHeader, key, KEY_PROGID_COMMENT);
1360 cpl_propertylist_set_comment(aHeader, KEY_PROG_ID, KEY_PROG_ID_COMMENT);
1363 cpl_propertylist_update_string(aHeader, KEY_PROG_ID, progid);
1364 cpl_propertylist_set_comment(aHeader, KEY_PROG_ID, KEY_PROG_ID_COMMENT);
1366 cpl_array_delete(progids);
1371 cpl_propertylist_append(aHeader, aProperties->prov);
1375 cpl_size idx_start = 0;
1376 if(aProperties->nobj == 1) {
1380 for (cpl_size idx = idx_start; idx < cpl_array_get_size(aProperties->asson); ++idx) {
1381 char *name = cpl_sprintf(KEY_ASSON
"%-" CPL_SIZE_FORMAT, idx - idx_start + 1 );
1382 cpl_propertylist_update_string(aHeader, name,
1383 cpl_array_get_string(aProperties->asson, idx));
1388 cpl_propertylist_update_string(aHeader, KEY_PRODCATG, aProperties->prodcatg);
1389 cpl_propertylist_set_comment(aHeader, KEY_PRODCATG, KEY_PRODCATG_COMMENT);
1391 cpl_propertylist_update_string(aHeader, KEY_PROCSOFT, aProperties->procsoft);
1392 cpl_propertylist_set_comment(aHeader, KEY_PROCSOFT, KEY_PROCSOFT_COMMENT);
1394 cpl_propertylist_update_string(aHeader, KEY_OBSTECH, aProperties->obstech);
1395 cpl_propertylist_set_comment(aHeader, KEY_OBSTECH, KEY_OBSTECH_COMMENT);
1397 const char *fluxcal = KEY_FLUXCAL_VALUE_TRUE;
1398 if (aProperties->fluxcal == CPL_FALSE) {
1399 fluxcal = KEY_FLUXCAL_VALUE_FALSE;
1402 cpl_propertylist_update_string(aHeader, KEY_FLUXCAL, fluxcal);
1403 cpl_propertylist_set_comment(aHeader, KEY_FLUXCAL, KEY_FLUXCAL_COMMENT);
1404 double um2nm = 1000.;
1405 cpl_propertylist_insert_after_double(aHeader, KEY_FLUXCAL, KEY_WAVELMIN,
1406 aProperties->wlenrange[0] * um2nm);
1407 cpl_propertylist_set_comment(aHeader, KEY_WAVELMIN, KEY_WAVELMIN_COMMENT);
1408 cpl_propertylist_insert_after_double(aHeader, KEY_WAVELMIN, KEY_WAVELMAX,
1409 aProperties->wlenrange[1] * um2nm);
1410 cpl_propertylist_set_comment(aHeader, KEY_WAVELMAX, KEY_WAVELMAX_COMMENT);
1411 cpl_propertylist_insert_after_double(aHeader, KEY_WAVELMAX, KEY_SPEC_RES,
1412 aProperties->specres);
1413 cpl_propertylist_set_comment(aHeader, KEY_SPEC_RES, KEY_SPEC_RES_COMMENT);
1414 cpl_propertylist_insert_after_string(aHeader, KEY_SPEC_RES, KEY_SPECSYS,
1415 aProperties->specsys);
1416 cpl_propertylist_set_comment(aHeader, KEY_SPECSYS, KEY_SPECSYS_COMMENT);
1423 cpl_propertylist_insert_after_double(aHeader, KEY_SPEC_RES, KEY_SKY_RES,
1424 fabs(aProperties->skyres));
1426 const char *method_qualifier = (aProperties->skyres < 0.) ?
1427 "default" :
"measured";
1428 char *comment = cpl_sprintf(KEY_SKY_RES_COMMENT
" (%s)", method_qualifier);
1429 cpl_propertylist_set_comment(aHeader, KEY_SKY_RES, comment);
1440 cpl_propertylist_insert_after_double(aHeader, KEY_SKY_RES, KEY_PIXNOISE,
1441 aProperties->pixnoise);
1442 cpl_propertylist_set_comment(aHeader, KEY_PIXNOISE, KEY_PIXNOISE_COMMENT);
1445 cpl_propertylist_insert_after_double(aHeader, KEY_WAVELMAX, KEY_ABMAGLIM,
1446 aProperties->abmaglimit);
1447 cpl_propertylist_set_comment(aHeader, KEY_ABMAGLIM, KEY_ABMAGLIM_COMMENT);
1449 const char *reference =
"";
1450 if (aProperties->referenc) {
1451 reference = aProperties->referenc;
1453 cpl_propertylist_update_string(aHeader, KEY_REFERENC, reference);
1454 cpl_propertylist_set_comment(aHeader, KEY_REFERENC, KEY_REFERENC_COMMENT);
1493 return CPL_ERROR_NONE;
ifsPreopticsScale eris_ifu_get_preopticsScale(cpl_propertylist *header)
Return the the pre-optics scaling.
ifsBand eris_ifu_get_band(const cpl_propertylist *header)
Determine preoptic band.
const char * eris_ifu_pfits_get_origfile(const cpl_propertylist *aHeaders)
find out the origfile
cpl_error_code eris_ifu_cplarray_sort(cpl_array *aArray, cpl_boolean aOrder)
Sort float, int or double array by quicksort.
cpl_error_code eris_ifu_mask_nans_in_hdrlimage(hdrl_image **hima)
Flag NANs in image.
double eris_ifu_get_band_resolution(ifsBand band)
eris_ifu_get_band_resolution
cpl_mask * eris_ifu_hima_get_obj_mask(hdrl_image *hima, const cpl_size niter, const double kappa)
find mask flagging pixels above a threshold set by ks-clip algorithm
double eris_pfits_get_mjdobs(const cpl_propertylist *aHeaders)
find out the Julian Date of the observation
const char * eris_pfits_get_raw_filename(const cpl_propertylist *aHeaders, unsigned int idx)
find out the i-th raw file name.
const char * eris_pfits_get_arcfile(const cpl_propertylist *plist)
find out the arcfile
double eris_pfits_get_fwhm_start(const cpl_propertylist *aHeaders)
find out the ambient seeing at start of exposure (in arcsec)
double eris_pfits_get_fwhm_end(const cpl_propertylist *aHeaders)
find out the ambient seeing at end of exposure (in arcsec)
const char * eris_pfits_get_pipefile(const cpl_propertylist *aHeaders)
find out the PIPEFILE id
int eris_pfits_get_ndit(const cpl_propertylist *plist)
find out the DIT value
const char * eris_pfits_get_ancestor(const cpl_propertylist *aHeaders)
find out the ancestor of a file.
const char * eris_pfits_get_progid(const cpl_propertylist *aHeaders)
find out the ESO program identification
long eris_pfits_get_obsid(const cpl_propertylist *aHeaders)
find out the observation block id
double eris_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
cpl_error_code eris_check_error_code(const char *func_id)
handle CPL errors
cpl_frameset * eris_dfs_extract_frames_with_tag(cpl_frameset *input, const char *rtag)
Extract frames of user given tag.
hdrl_parameter * hdrl_collapse_mode_parameter_create(double histo_min, double histo_max, double bin_size, hdrl_mode_type mode_method, cpl_size error_niter)
create a parameter object for the mode
cpl_error_code hdrl_image_reject_from_mask(hdrl_image *self, const cpl_mask *map)
set bpm of hdrl_image
double hdrl_image_get_stdev(const hdrl_image *self)
computes the standard deviation of the data of an image
hdrl_image * hdrl_image_create(const cpl_image *image, const cpl_image *error)
create a new hdrl_image from to existing images by copying them
cpl_image * hdrl_image_get_image(hdrl_image *himg)
get data as cpl image
void hdrl_image_delete(hdrl_image *himg)
delete hdrl_image
cpl_size hdrl_imagelist_get_size(const hdrl_imagelist *himlist)
Get the number of images in the imagelist.
cpl_error_code hdrl_maglim_compute(const cpl_image *image, const double zeropoint, const double fwhm, const cpl_size kernel_size_x, const cpl_size kernel_size_y, const hdrl_image_extend_method image_extend_method, const hdrl_parameter *mode_parameter, double *limiting_magnitude)
Computes the limiting magnitude of an image.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter