51 #include "gravi_pfits.h" 52 #include "gravi_utils.h" 68 cpl_errorstate prestate = cpl_errorstate_get();
69 int value = cpl_propertylist_get_int(plist, PROFILE_STARTX);
70 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
74 int gravi_pfits_get_fullstartx (
const cpl_propertylist * plist)
76 cpl_errorstate prestate = cpl_errorstate_get();
77 int value = cpl_propertylist_get_int(plist, PROFILE_FULLSTARTX);
78 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
82 int gravi_pfits_get_nx (
const cpl_propertylist * plist)
84 cpl_errorstate prestate = cpl_errorstate_get();
85 int value = cpl_propertylist_get_int(plist, PROFILE_NX);
86 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
90 int gravi_pfits_get_window_start (
const cpl_propertylist * plist)
92 cpl_errorstate prestate = cpl_errorstate_get();
93 int value = cpl_propertylist_get_int(plist,
"ESO DET2 FRAM STRX");
94 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
98 double gravi_pfits_get_diameter (
const cpl_propertylist * plist,
int type_data)
100 cpl_errorstate prestate = cpl_errorstate_get();
103 const char * keyword = ( type_data == GRAVI_FT ?
"ESO FT ROBJ " 104 "DIAMETER" :
"ESO INS SOBJ DIAMETER" );
105 if (cpl_propertylist_has (plist, keyword)) {
106 value = cpl_propertylist_get_double( plist, keyword );
108 else if ( !gravi_pfits_is_calib (plist)) {
109 cpl_msg_warning (cpl_func,
"The keyword %s does not " 110 "exist in the propertylist", keyword);
113 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
117 double gravi_pfits_get_pmra (
const cpl_propertylist * plist)
119 const char * keyword =
"ESO FT ROBJ PMA";
120 double pma = gravi_pfits_get_double_silentdefault (plist, keyword, 0.);
124 double gravi_pfits_get_pmdec (
const cpl_propertylist * plist)
126 const char * keyword =
"ESO FT ROBJ PMD";
127 double pmd = gravi_pfits_get_double_silentdefault (plist, keyword, 0.);
131 double gravi_pfits_get_plx (
const cpl_propertylist * plist)
133 const char * keyword =
"ESO FT ROBJ PARALLAX";
134 double plx = gravi_pfits_get_double_silentdefault (plist, keyword, 0.);
138 const char * gravi_pfits_get_extname (
const cpl_propertylist * plist)
140 cpl_errorstate prestate = cpl_errorstate_get();
141 const char * value = cpl_propertylist_get_string(plist,
"EXTNAME");
142 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(),
"");
146 const char * gravi_pfits_get_dpr_type (
const cpl_propertylist * plist)
148 const char * value = cpl_propertylist_get_string(plist,
"ESO DPR TYPE");
149 cpl_ensure (value != NULL, cpl_error_get_code(), NULL);
153 const char * gravi_pfits_get_resolution (
const cpl_propertylist * plist)
155 const char * value = cpl_propertylist_get_string(plist,
"ESO INS FILT2 NAME");
156 cpl_ensure(value != NULL, cpl_error_get_code(), NULL);
160 const char * gravi_pfits_get_spec_res (
const cpl_propertylist * plist)
162 const char * value = cpl_propertylist_get_string(plist,
"ESO INS SPEC RES");
163 cpl_ensure(value != NULL, cpl_error_get_code(), NULL);
167 const char * gravi_pfits_get_pola_mode (
const cpl_propertylist * plist,
int type_data )
169 const char * keyword = ( type_data == GRAVI_FT ?
"ESO FT POLA MODE" :
"ESO INS POLA MODE");
170 const char * value = cpl_propertylist_get_string(plist, keyword);
171 cpl_ensure (value != NULL, cpl_error_get_code(), NULL);
175 int gravi_data_frame_get_mode (
const cpl_frame * frame)
177 cpl_ensure (frame, CPL_ERROR_NULL_INPUT, 0);
178 const char * value = cpl_frame_get_tag (frame);
180 cpl_ensure (value != NULL, cpl_error_get_code(), 0);
181 if (strstr(value,
"SINGLE")) {
184 if (strstr(value,
"DUAL")) {
191 int gravi_pfits_get_mode (
const cpl_propertylist * plist)
195 if (cpl_propertylist_has (plist,
"ESO PRO CATG"))
196 type = cpl_propertylist_get_string (plist,
"ESO PRO CATG");
197 else if (cpl_propertylist_has (plist,
"ESO DPR TYPE"))
198 type = cpl_propertylist_get_string (plist,
"ESO DPR TYPE");
201 if (strstr (type,
"SINGLE")) {
204 if (strstr (type,
"DUAL")) {
211 const char * gravi_pfits_get_mode_name (
const cpl_propertylist * plist)
213 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, NULL);
216 if (cpl_propertylist_has (plist,
"ESO PRO CATG"))
217 type = cpl_propertylist_get_string (plist,
"ESO PRO CATG");
218 else if (cpl_propertylist_has (plist,
"ESO DPR TYPE"))
219 type = cpl_propertylist_get_string (plist,
"ESO DPR TYPE");
220 else return "UNKNOWN";
222 if (strstr (type,
"SINGLE")) {
225 if (strstr (type,
"DUAL")) {
232 int gravi_pfits_get_pola_num (
const cpl_propertylist * plist,
int type_data )
234 const char * keyword = ( type_data == GRAVI_FT ?
"ESO FT POLA MODE" :
"ESO INS POLA MODE");
235 const char * value = cpl_propertylist_get_string(plist, keyword);
236 cpl_ensure (value != NULL, cpl_error_get_code(), 0);
237 return ( !(strcmp(value,
"SPLIT")) ? 2 : 1 );
240 int gravi_pfits_get_extension_type (
const cpl_propertylist * plist)
242 cpl_errorstate prestate = cpl_errorstate_get();
244 const char * value = cpl_propertylist_get_string (plist,
"XTENSION");
245 cpl_ensure (value, CPL_ERROR_ILLEGAL_INPUT, 0);
249 if (! strcmp(value,
"IMAGE"))
251 else if (! strcmp(value,
"BINTABLE"))
253 else if (! strcmp(value,
"TABLE"))
256 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
257 "Type extension is incorrect");
260 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
264 double gravi_pfits_get_metfc_lockmjd (
const cpl_propertylist * plist,
int tel)
266 cpl_errorstate prestate = cpl_errorstate_get();
268 char *lock = cpl_sprintf (
"ESO OCS MET LKDT_FC%i", tel+1);
269 double value = gravi_convert_to_mjd (cpl_propertylist_get_string (plist, lock));
271 if (!cpl_errorstate_is_equal(prestate)) {
272 cpl_errorstate_set (prestate);
273 cpl_msg_warning (cpl_func,
"Cannot read %s", lock);
281 double gravi_pfits_get_met_wavelength_mean (
const cpl_propertylist * plist, cpl_table * met_table)
283 double met_wavelength_ref = gravi_pfits_get_met_wavelength (plist)*1e-9;
284 double lambda_met_mean = met_wavelength_ref +
285 cpl_table_get_column_mean(met_table,
"LAMBDA_LASER")*1e-9;
287 return (lambda_met_mean);
290 double gravi_pfits_get_met_wavelength (
const cpl_propertylist * plist)
292 cpl_errorstate prestate = cpl_errorstate_get();
300 if (cpl_propertylist_has (plist,
"ESO INS MLC POWER") == FALSE) {
302 cpl_msg_warning (cpl_func,
"Cannot read the laser POWER : use MLC wavelength : %f ", wavelength);
309 cpl_msg_info(cpl_func,
"Using laser MLC wavelength : %f ", wavelength);
316 wavelength = cpl_propertylist_get_double(plist,
"ESO INS MLAS LWAV");
317 cpl_msg_info(cpl_func,
"Using laser MLAS wavelength : %f ", wavelength);
320 if (!cpl_errorstate_is_equal(prestate)) {
321 cpl_msg_warning (cpl_func,
"Cannot read the laser wavelength in the header : %s", cpl_error_get_message());
322 cpl_errorstate_set (prestate);
329 double gravi_pfits_get_geolat (
const cpl_propertylist * plist)
331 cpl_errorstate prestate = cpl_errorstate_get();
332 double value = cpl_propertylist_get_double(plist,
"ESO ISS GEOLAT");
333 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
337 double gravi_pfits_get_geolon (
const cpl_propertylist * plist)
339 cpl_errorstate prestate = cpl_errorstate_get();
340 double value = cpl_propertylist_get_double(plist,
"ESO ISS GEOLON");
341 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
345 double gravi_pfits_get_geoelev (
const cpl_propertylist * plist)
347 cpl_errorstate prestate = cpl_errorstate_get();
348 double value = cpl_propertylist_get_double (plist,
"ESO ISS GEOELEV");
349 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
353 const char * gravi_pfits_get_sobj (
const cpl_propertylist * plist)
355 const char * value = gravi_pfits_get_string_default (plist,
"ESO INS SOBJ NAME",
"UNKNOWN_SC");
359 double gravi_pfits_get_sobj_diam (
const cpl_propertylist * plist)
361 cpl_errorstate prestate = cpl_errorstate_get();
362 double value = cpl_propertylist_get_double (plist,
"ESO INS SOBJ DIAMETER");
363 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
367 double gravi_pfits_get_sobj_x (
const cpl_propertylist * plist)
369 double value = gravi_pfits_get_double_default (plist,
"ESO INS SOBJ X", 0.0);
373 double gravi_pfits_get_sobj_y (
const cpl_propertylist * plist)
375 double value = gravi_pfits_get_double_default (plist,
"ESO INS SOBJ Y", 0.0);
379 const char * gravi_pfits_get_robj (
const cpl_propertylist * plist)
381 const char * value = gravi_pfits_get_string_default (plist,
"ESO FT ROBJ NAME",
"UNKNOWN_FT");
385 double gravi_pfits_get_robj_diam (
const cpl_propertylist * plist)
387 cpl_errorstate prestate = cpl_errorstate_get();
388 double value = cpl_propertylist_get_double(plist,
"ESO FT ROBJ DIAMETER");
389 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
398 double gravi_pfits_get_fddlwindow (
const cpl_propertylist * plist)
400 cpl_errorstate prestate = cpl_errorstate_get();
401 double value = cpl_propertylist_get_double(plist,
"ESO INS FDDL WINDOW");
402 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
406 double gravi_pfits_get_mjd (
const cpl_propertylist * plist)
408 cpl_errorstate prestate = cpl_errorstate_get();
409 double value = cpl_propertylist_get_double(plist,
"MJD-OBS");
410 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
414 const char * gravi_pfits_get_met_ph (
const cpl_propertylist * plist)
416 const char * tim1_start = cpl_propertylist_get_string(plist,
"ESO OCS MET PH_DATE");
417 cpl_ensure (tim1_start != NULL, cpl_error_get_code(), NULL);
421 int gravi_pfits_has_gdzero (
const cpl_propertylist * plist,
424 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0);
429 sprintf (name,
"ESO QC MET GD_ZERO_FC%i", tel);
430 if (cpl_propertylist_has(plist, name))
434 sprintf (name,
"ESO PRO MET GD_ZERO_FC%i", tel);
435 if (cpl_propertylist_has(plist, name))
442 double gravi_pfits_get_gdzero (
const cpl_propertylist * plist,
445 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0);
450 sprintf (name,
"ESO QC MET GD_ZERO_FC%i", tel);
451 if (cpl_propertylist_has(plist, name)) {
455 sprintf (name,
"ESO PRO MET GD_ZERO_FC%i", tel);
456 if (cpl_propertylist_has(plist, name)) {
466 int gravi_pfits_has_oplzero (
const cpl_propertylist * plist,
469 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0);
474 sprintf (name,
"ESO QC MET OPL_ZERO_FC%i", tel);
475 if (cpl_propertylist_has(plist, name)) {
478 sprintf (name,
"ESO PRO MET OPL_ZERO_FC%i", tel);
479 if (cpl_propertylist_has(plist, name))
486 double gravi_pfits_get_oplzero (
const cpl_propertylist * plist,
489 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0);
494 sprintf (name,
"ESO QC MET OPL_ZERO_FC%i", tel);
495 if (cpl_propertylist_has(plist, name)) {
499 sprintf (name,
"ESO PRO MET OPL_ZERO_FC%i", tel);
500 if (cpl_propertylist_has(plist, name)) {
511 const char * gravi_pfits_get_start_sc (
const cpl_propertylist * plist)
514 const char * tim1_start = cpl_propertylist_get_string(plist,
"ESO INS TIM1 START");
515 cpl_ensure (tim1_start != NULL, cpl_error_get_code(), NULL);
519 const char * gravi_pfits_get_start_acqcam (
const cpl_propertylist * plist)
522 const char * tim1_start = cpl_propertylist_get_string(plist,
"ESO INS TIM2 START");
523 cpl_ensure (tim1_start != NULL, cpl_error_get_code(), NULL);
527 const char * gravi_pfits_get_start_prcacq (
const cpl_propertylist * plist)
530 const char * acq_start = cpl_propertylist_get_string(plist,
"ESO PCR ACQ START");
531 cpl_ensure (acq_start != NULL, cpl_error_get_code(), NULL);
535 double gravi_pfits_get_dit_acqcam (
const cpl_propertylist * plist)
538 cpl_errorstate prestate = cpl_errorstate_get();
539 double value = cpl_propertylist_get_double(plist,
"ESO DET1 SEQ1 DIT");
540 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
544 double gravi_pfits_get_dit_sc (
const cpl_propertylist * plist)
547 cpl_errorstate prestate = cpl_errorstate_get();
548 double value = cpl_propertylist_get_double(plist,
"ESO DET2 SEQ1 DIT");
549 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
553 double gravi_pfits_get_dit_ft (
const cpl_propertylist * plist)
556 cpl_errorstate prestate = cpl_errorstate_get();
557 double value = cpl_propertylist_get_double(plist,
"ESO DET3 SEQ1 DIT");
558 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
562 double gravi_pfits_get_period_sc (
const cpl_propertylist * plist)
565 cpl_errorstate prestate = cpl_errorstate_get();
566 double value = cpl_propertylist_get_double(plist,
"ESO INS TIM1 PERIOD");
567 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
571 double gravi_pfits_get_period_acqcam (
const cpl_propertylist * plist)
574 cpl_errorstate prestate = cpl_errorstate_get();
575 double value = cpl_propertylist_get_double(plist,
"ESO INS TIM2 PERIOD");
576 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
592 gravi_msg_function_start(0);
593 cpl_ensure (header, CPL_ERROR_NULL_INPUT, 0.0);
594 cpl_errorstate prestate = cpl_errorstate_get();
598 double window_time = gravi_pfits_get_fddlwindow (header);
599 double period = gravi_pfits_get_period_sc (header);
601 double time = 86400 * 1e6 *
602 (gravi_convert_to_mjd (gravi_pfits_get_start_sc (header)) -
603 gravi_convert_to_mjd (gravi_pfits_get_start_prcacq (header)) ) +
604 (period-window_time)/2. * 1e6 +
608 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
610 gravi_msg_function_exit(0);
626 gravi_msg_function_start(0);
627 cpl_ensure (header, CPL_ERROR_NULL_INPUT, 0.0);
628 cpl_ensure (row>=0, CPL_ERROR_ILLEGAL_INPUT, 0.0);
629 cpl_errorstate prestate = cpl_errorstate_get();
633 double period = gravi_pfits_get_period_acqcam (header);
635 double time = 86400 * 1e6 *
636 (gravi_convert_to_mjd (gravi_pfits_get_start_acqcam (header)) -
637 gravi_convert_to_mjd (gravi_pfits_get_start_prcacq (header)) ) +
642 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
644 gravi_msg_function_exit(0);
648 double gravi_pfits_get_ptfc_acqcam (
const cpl_propertylist * plist,
int spot)
650 cpl_errorstate prestate = cpl_errorstate_get();
652 sprintf (name,
"ESO ACQ PTFC REFPOS%i", spot);
653 double value = cpl_propertylist_get_double (plist, name);
654 cpl_ensure (cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
658 double gravi_pfits_get_drotoff (
const cpl_propertylist * plist,
int tel)
663 sprintf (name,
"ESO INS DROTOFF%i", tel+1);
664 double drottoff = cpl_propertylist_get_double (plist, name);
669 double gravi_pfits_get_fangle_acqcam (
const cpl_propertylist * plist,
int tel)
673 if (cpl_propertylist_has (plist,
"ESO INS SOBJ X") &&
674 cpl_propertylist_has (plist,
"ESO INS SOBJ Y") ) {
678 sprintf (name,
"ESO INS DROTOFF%i", tel+1);
679 double drottoff = cpl_propertylist_get_double (plist, name);
682 double dx = cpl_propertylist_get_double (plist,
"ESO INS SOBJ X");
683 double dy = cpl_propertylist_get_double (plist,
"ESO INS SOBJ Y");
686 double posangle = 0.0;
687 if (cpl_propertylist_has(plist,
"ESO INS SOBJ OFFX") &&
688 cpl_propertylist_has(plist,
"ESO INS SOBJ OFFY")) {
690 dx -= gravi_pfits_get_double_default (plist,
"ESO INS SOBJ OFFX", 0.0);
691 dy -= gravi_pfits_get_double_default (plist,
"ESO INS SOBJ OFFY", 0.0);
693 if ((fabs(dx)>0.0) || (fabs(dy)>0.0))
694 posangle = atan2 (dx, dy) * CPL_MATH_DEG_RAD;
697 fangle = - posangle - drottoff + 270;
698 if (fangle >= 180) fangle -= 360.0;
699 if (fangle < -180) fangle += 360.0;
700 if (fangle >= 180) fangle -= 360.0;
701 if (fangle < -180) fangle += 360.0;
703 cpl_msg_info (cpl_func,
"fangle = %.2f [deg] / NorthACQ in Y to X", fangle);
705 cpl_msg_warning (cpl_func,
"Cannot compute field angle: fangle = 0.0");
712 const char * gravi_pfits_get_insname (
const cpl_propertylist * plist)
714 const char * value = cpl_propertylist_get_string(plist,
"INSNAME");
715 cpl_ensure (value != NULL, cpl_error_get_code(), NULL);
731 if ( cpl_propertylist_has (plist,
"MJD-OBS") &&
732 cpl_propertylist_has (plist,
"ESO INS DET3 GAIN") &&
733 cpl_propertylist_get_double (plist,
"MJD-OBS") >= 57584.83 &&
734 cpl_propertylist_get_double (plist,
"MJD-OBS") < 57617.0) {
738 gain = cpl_propertylist_get_double (plist,
"ESO INS DET3 GAIN");
739 if (gain == 3.0) gain = 1.7;
740 cpl_msg_warning (cpl_func,
"Use FT gain of %.3f [adu/e] (wrong units and value in header)", gain);
741 }
else if ( cpl_propertylist_has (plist,
"MJD-OBS") &&
742 cpl_propertylist_has (plist,
"ESO INS DET3 GAIN") &&
743 cpl_propertylist_get_double (plist,
"MJD-OBS") >= 57617.0) {
746 gain = 1. / cpl_propertylist_get_double (plist,
"ESO INS DET3 GAIN");
747 cpl_msg_info (cpl_func,
"Use FT gain of %.3f [adu/e] from header", gain);
751 cpl_msg_warning (cpl_func,
"Force FT gain to %.3f [adu/e] (wrong value or no value in header)", gain);
770 if ( cpl_propertylist_has (plist,
"MJD-OBS") &&
771 cpl_propertylist_has (plist,
"ESO INS DET2 GAIN") &&
772 cpl_propertylist_get_double (plist,
"MJD-OBS") > 57617.0) {
775 gain = 1. / cpl_propertylist_get_double (plist,
"ESO INS DET2 GAIN");
776 cpl_msg_info (cpl_func,
"Use SC gain of %.3f [adu/e] from header", gain);
780 cpl_msg_warning (cpl_func,
"Force SC gain to %.3f [adu/e]", gain);
803 gravi_msg_function_start(1);
805 cpl_propertylist * o_plist = cpl_propertylist_new ();
808 cpl_propertylist_update_string (o_plist,
"CONTENT",
"OIFITS2");
809 cpl_propertylist_update_string (o_plist,
"REFERENC",
"2001PASP..112.1133P");
812 const char * observer = gravi_pfits_get_string_default (header,
"ESO ISS OPER",
"Unknown");
813 cpl_propertylist_update_string (o_plist,
"OBSERVER", observer);
816 const char * prog_id = gravi_pfits_get_string_default (header,
"ESO OBS PROG ID",
"Unknown");
817 cpl_propertylist_update_string (o_plist,
"PROG_ID", prog_id);
820 char * procsoft = cpl_sprintf(
"GRAVITY pipeline %s", PACKAGE_VERSION);
821 cpl_propertylist_update_string (o_plist,
"PROCSOFT", procsoft);
822 FREE (cpl_free, procsoft);
825 const char * sc_object = gravi_pfits_get_sobj (header);
826 const char * ft_object = gravi_pfits_get_robj (header);
827 char *
object = cpl_sprintf (
"%s,%s", sc_object, ft_object);
828 cpl_propertylist_update_string (o_plist,
"OBJECT",
object);
829 FREE (cpl_free,
object);
833 mode = cpl_sprintf (
"%s,%s,%s,%s",
834 gravi_pfits_get_mode_name (header),
835 gravi_pfits_get_spec_res (header),
836 gravi_pfits_get_pola_mode (header, GRAVI_SC),
837 gravi_pfits_get_pola_mode (header, GRAVI_FT));
838 cpl_propertylist_update_string (o_plist,
"INSMODE", mode);
839 FREE (cpl_free, mode);
841 CPLCHECK_NUL (
"Cannot fill the OIFITS2 specific keywords");
843 gravi_msg_function_exit(1);
858 const char * qc =
" QC ";
861 cpl_ensure (header, CPL_ERROR_NULL_INPUT, NULL);
864 cpl_propertylist * applist = cpl_propertylist_new();
865 cpl_size size = cpl_propertylist_get_size (header);
866 for (cpl_size i = 0; i < size; i++) {
867 cpl_property * p = cpl_propertylist_get (header, i);
868 const char * p_name = cpl_property_get_name (p);
869 if ( (strstr(p_name, qc) != NULL) ||
870 (strstr(p_name, GRAVI_NIGHT_OBS) != NULL) ) {
871 cpl_type type_qc = cpl_property_get_type (p);
873 case CPL_TYPE_FLOAT :
874 if (cpl_property_get_float (p) != NAN)
875 cpl_propertylist_append_property(applist, p);
877 cpl_msg_warning(cpl_func,
"The parameter %s is not correct", cpl_property_get_name (p));
879 case CPL_TYPE_DOUBLE :
880 if (cpl_property_get_double (p) != NAN)
881 cpl_propertylist_append_property(applist, p);
883 cpl_msg_warning(cpl_func,
"The parameter %s is not correct", cpl_property_get_name (p));
886 if (cpl_property_get_int (p) != NAN)
887 cpl_propertylist_append_property(applist, p);
889 cpl_msg_warning(cpl_func,
"The parameter %s is not correct", cpl_property_get_name (p));
891 case CPL_TYPE_STRING :
892 if (cpl_property_get_string (p))
893 cpl_propertylist_append_property(applist, p);
895 cpl_msg_warning(cpl_func,
"The parameter %s is not correct", cpl_property_get_name (p));
898 if (cpl_property_get_char (p))
899 cpl_propertylist_append_property(applist, p);
901 cpl_msg_warning(cpl_func,
"The parameter %s is not correct", cpl_property_get_name (p));
904 cpl_propertylist_append_property (applist, p);
907 cpl_msg_error (cpl_func,
"'%s' is an invalid type of property",p_name);
908 cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
909 "invalid type of property");
921 double gravi_convert_to_mjd (
const char * start)
923 cpl_ensure (start, CPL_ERROR_NULL_INPUT, 0.0);
927 char * str = cpl_strdup (start);
935 int iy = atoi (str+0);
936 int im = atoi (str+5);
937 int id = atoi (str+8);
938 double dhr = atof (str+11);
939 double dmin = atof (str+14);
940 double dsec = atof (str+17);
945 eraCal2jd (iy, im,
id, &dmjd0, &dmjd);
948 return dmjd + (dhr + (dmin + dsec/60.0)/60.0)/24.0;
951 char * gravi_convert_to_timestamp (
double mjd)
953 int year, month, day, hour, minute;
954 double fraction, second;
956 eraJd2cal (2400000.5, mjd, &year, &month, &day, &fraction);
958 hour = (int)(fraction/3600.0);
959 fraction -= hour*3600.0;
960 minute = (int)(fraction/60.0);
961 fraction -= minute*60.0;
964 return cpl_sprintf (
"%04i-%02i-%02iT%02i:%02i:%06.3f", year, month, day, hour, minute, second);
967 double gravi_pfits_get_decep (
const cpl_propertylist * plist,
double coef)
969 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0.0);
970 cpl_ensure (coef >= 0 && coef <= 1, CPL_ERROR_ILLEGAL_INPUT, 0.0);
974 double decz = gravi_pfits_get_robj_decep (plist);
977 double xi = gravi_pfits_get_sobj_x (plist) / 3600000. * CPL_MATH_RAD_DEG * coef;
978 double eta = gravi_pfits_get_sobj_y (plist) / 3600000. * CPL_MATH_RAD_DEG * coef;
980 double sdecz = sin(decz);
981 double cdecz = cos(decz);
982 double denom = cdecz - eta * sdecz;
985 double dec = atan2 (sdecz+eta*cdecz, sqrt(xi*xi + denom*denom));
991 double gravi_ra_to_rad (
const char *stri)
993 cpl_ensure (stri, CPL_ERROR_NULL_INPUT, 0.0);
996 char * str = cpl_strdup (stri);
1003 out += atof(str+3) / 60;
1004 out += atof(str+6) / 3600;
1007 return out / 12 * CPL_MATH_PI;
1010 double gravi_dec_to_rad (
const char *stri)
1012 cpl_ensure (stri, CPL_ERROR_NULL_INPUT, 0.0);
1015 char * str = cpl_strdup (stri);
1022 out += atof(str+4) / 60;
1023 out += atof(str+7) / 3600;
1025 out *= (str[0]==
'-' ? -1.0 : 1.0);
1028 return out / 180 * CPL_MATH_PI;
1036 double gravi_pfits_get_raep(
const cpl_propertylist * plist,
double coef)
1038 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0.0);
1039 cpl_ensure (coef >= 0 && coef <= 1, CPL_ERROR_ILLEGAL_INPUT, 0.0);
1042 double raz = gravi_pfits_get_robj_raep (plist);
1043 double decz = gravi_pfits_get_robj_decep (plist);
1046 double xi = gravi_pfits_get_sobj_x (plist) / 3600000. * CPL_MATH_RAD_DEG * coef;
1047 double eta = gravi_pfits_get_sobj_y (plist) / 3600000. * CPL_MATH_RAD_DEG * coef;
1049 double sdecz = sin(decz);
1050 double cdecz = cos(decz);
1051 double denom = cdecz - eta * sdecz;
1054 double ra = atan2 (xi,denom) + raz;
1057 ra = fmod (ra, CPL_MATH_2PI);
1058 if ( ra < 0.0 ) ra += CPL_MATH_2PI;
1064 double gravi_pfits_get_robj_raep(
const cpl_propertylist * plist)
1066 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 99.);
1067 cpl_errorstate prestate = cpl_errorstate_get();
1071 const char * str_value;
1072 str_value = gravi_pfits_get_string_default (plist,
"ESO FT ROBJ ALPHA",
"000000.00");
1077 cpl_msg_debug( cpl_func,
"Found '%s'", str_value );
1080 strncpy(tmp, str_value, 2);
1082 cpl_msg_debug( cpl_func,
"Found tmp '%s' -> %f", tmp, atof(tmp) );
1086 strncpy(tmp, str_value+2, 4);
1088 cpl_msg_debug( cpl_func,
"Found tmp '%s' -> %f", tmp, atof(tmp) );
1089 value += atof(tmp) / 60.0;
1092 strcpy(tmp, str_value+4);
1093 cpl_msg_debug( cpl_func,
"Found tmp '%s' -> %f", tmp, atof(tmp) );
1094 value += atof(tmp) / 3600.0;
1100 cpl_msg_debug( cpl_func,
"Convert RA='%s' into RA=%fdeg", str_value, value);
1102 if (cpl_error_get_code() == CPL_ERROR_DATA_NOT_FOUND) {
1103 cpl_errorstate_set (prestate);
1104 cpl_msg_warning(cpl_func,
"rarp doesn't exist in this file.");
1110 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
1113 return value * CPL_MATH_RAD_DEG;
1116 double gravi_pfits_get_robj_decep (
const cpl_propertylist * plist)
1118 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 99.);
1120 cpl_errorstate prestate = cpl_errorstate_get();
1125 const char * str_value;
1126 str_value = gravi_pfits_get_string_default (plist,
"ESO FT ROBJ DELTA",
"+000000.00");
1129 cpl_msg_debug( cpl_func,
"Found '%s'", str_value );
1133 if ( str_value[0] ==
'-' ) {
1135 str_value = str_value + 1;
1136 }
else if ( str_value[0] ==
'+' ) {
1138 str_value = str_value + 1;
1144 strncpy(tmp, str_value, 2);
1146 cpl_msg_debug( cpl_func,
"Found tmp '%s' -> %f", tmp, atof(tmp) );
1150 strncpy(tmp, str_value+2, 4);
1152 cpl_msg_debug( cpl_func,
"Found tmp '%s' -> %f", tmp, atof(tmp) );
1153 value += atof(tmp) / 60.0;
1156 strcpy(tmp, str_value+4);
1157 cpl_msg_debug( cpl_func,
"Found tmp '%s' -> %f", tmp, atof(tmp) );
1158 value += atof(tmp) / 3600.0;
1164 cpl_msg_debug( cpl_func,
"Convert DEC='%s' into DEC=%fdeg", str_value, value);
1166 if (cpl_error_get_code() == CPL_ERROR_DATA_NOT_FOUND) {
1167 cpl_errorstate_set (prestate);
1168 cpl_msg_warning(cpl_func,
"decep doesn't exist in this file.");
1175 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
1178 return value * CPL_MATH_RAD_DEG;
1185 int gravi_pfits_is_calib (
const cpl_propertylist * plist)
1187 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, 0);
1188 const char * opt1 =
"ESO INS OPTI1 NAME";
1190 if ( !cpl_propertylist_has (plist, opt1) )
return 0;
1192 const char * value = cpl_propertylist_get_string (plist, opt1);
1193 if ( !strcmp (value,
"CALIB") )
return 1;
1219 cpl_ensure (
self, CPL_ERROR_NULL_INPUT, 0);
1220 cpl_ensure (name, CPL_ERROR_NULL_INPUT, 0);
1221 cpl_ensure (cpl_propertylist_has (
self, name), CPL_ERROR_DATA_NOT_FOUND, 0);
1223 cpl_type type = cpl_propertylist_get_type (
self, name);
1226 case CPL_TYPE_UCHAR:
1228 case CPL_TYPE_SHORT:
1229 case CPL_TYPE_USHORT:
1233 case CPL_TYPE_LONG_LONG:
1234 case CPL_TYPE_ULONG:
1236 return cpl_propertylist_get_long(
self, name);
1237 case CPL_TYPE_FLOAT:
1238 case CPL_TYPE_DOUBLE:
1239 return cpl_propertylist_get_double(
self, name);
1240 case CPL_TYPE_STRING:
1241 cpl_msg_debug (cpl_func,
"FITS card %s is string '%s' to double %f",
1242 name,cpl_propertylist_get_string(
self, name),atof(cpl_propertylist_get_string(
self, name)));
1243 return atof(cpl_propertylist_get_string(
self, name));
1245 cpl_error_set(cpl_func, CPL_ERROR_TYPE_MISMATCH);
1251 cpl_error_code gravi_pfits_ensure_double (cpl_propertylist *
self,
const char * name)
1253 cpl_ensure_code (
self, CPL_ERROR_NULL_INPUT);
1254 cpl_ensure_code (name, CPL_ERROR_NULL_INPUT);
1258 char * comment = cpl_sprintf (
"%s", cpl_propertylist_get_comment (
self, name));
1261 cpl_propertylist_erase (
self, name);
1262 cpl_propertylist_append_double (
self, name, value );
1263 cpl_propertylist_set_comment (
self, name, comment);
1266 return cpl_error_get_code();
1273 cpl_error_code gravi_pfits_update_double (cpl_propertylist * plist,
1274 const char * full_name,
double value)
1276 cpl_error_code code;
1277 cpl_ensure_code (plist, CPL_ERROR_NULL_INPUT);
1278 cpl_ensure_code (full_name, CPL_ERROR_NULL_INPUT);
1282 cpl_propertylist_update_double (plist, full_name, GRAVI_NAN_DOUBLE);
1284 cpl_propertylist_update_double (plist, full_name, value);
1287 if ( (code=cpl_error_get_code()) ) {
1288 cpl_msg_warning (cpl_func,
"Cannot set keyword: %s", full_name);
1289 return cpl_error_set_message(cpl_func, code,
"Cannot set keyword: %s", full_name);
1292 return CPL_ERROR_NONE;
1295 cpl_error_code gravi_pfits_update_int (cpl_propertylist * plist,
1296 const char * full_name,
int value)
1298 cpl_error_code code;
1299 cpl_ensure_code (plist, CPL_ERROR_NULL_INPUT);
1300 cpl_ensure_code (full_name, CPL_ERROR_NULL_INPUT);
1303 if ( isnan((
double)value) )
1304 cpl_propertylist_update_int (plist, full_name, GRAVI_NAN_INT);
1306 cpl_propertylist_update_int (plist, full_name, value);
1309 if ( (code=cpl_error_get_code()) ) {
1310 cpl_msg_warning (cpl_func,
"Cannot set keyword: %s", full_name);
1311 return cpl_error_set_message(cpl_func, code,
"Cannot set keyword: %s", full_name);
1314 return CPL_ERROR_NONE;
1317 const char * gravi_pfits_get_string_default (
const cpl_propertylist * plist,
1321 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, def);
1322 cpl_ensure (name, CPL_ERROR_NULL_INPUT, def);
1326 if (cpl_propertylist_has(plist, name)) {
1328 output = cpl_propertylist_get_string(plist, name);
1333 if (!gravi_pfits_is_calib (plist))
1334 cpl_msg_warning (cpl_func,
"Can't find keyword %s (use '%s')", name, def);
1336 cpl_msg_info (cpl_func,
"Can't find keyword %s (use '%s')", name, def);
1342 double gravi_pfits_get_double_default (
const cpl_propertylist * plist,
1346 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, def);
1347 cpl_ensure (name, CPL_ERROR_NULL_INPUT, def);
1351 if (cpl_propertylist_has(plist, name)) {
1358 if (!gravi_pfits_is_calib (plist))
1359 cpl_msg_warning (cpl_func,
"Can't find keyword %s (use '%f')", name, def);
1361 cpl_msg_info (cpl_func,
"Can't find keyword %s (use '%f')", name, def);
1367 double gravi_pfits_get_double_silentdefault (
const cpl_propertylist * plist,
1371 cpl_ensure (plist, CPL_ERROR_NULL_INPUT, def);
1372 cpl_ensure (name, CPL_ERROR_NULL_INPUT, def);
1375 if (cpl_propertylist_has(plist, name))
1400 gravi_msg_function_start(0);
1401 cpl_ensure_code (header, CPL_ERROR_NULL_INPUT);
1402 cpl_ensure_code (msg, CPL_ERROR_NULL_INPUT);
1406 if (cpl_propertylist_has (header,
"ESO QC CHECK FLAGS"))
1407 i = cpl_propertylist_get_int (header,
"ESO QC CHECK FLAGS") + 1;
1409 cpl_propertylist_update_int (header,
"ESO QC CHECK FLAGS", i);
1410 CPLCHECK_MSG (
"Cannot add check flags...");
1414 sprintf (qc_name,
"ESO QC CHECK MSG%i", i);
1416 cpl_msg_warning (cpl_func,
"%s = '%s'", qc_name, msg);
1417 cpl_propertylist_append_string (header, qc_name, msg);
1419 CPLCHECK_MSG (
"Cannot add check msg...");
1421 gravi_msg_function_exit(0);
1422 return CPL_ERROR_NONE;
1440 gravi_msg_function_start(0);
1441 cpl_ensure_code (header, CPL_ERROR_NULL_INPUT);
1450 sprintf (name,
"ESO PRO REC%i PIPE LAST_BUILD", i);
1451 }
while (cpl_propertylist_has (header, name));
1454 sprintf (value,
"%s %s", __DATE__,__TIME__);
1455 cpl_msg_info (cpl_func,
"%s = '%s'", name, value);
1458 cpl_propertylist_update_string (header, name, value);
1459 cpl_propertylist_set_comment (header, name,
"Last 'make clean all install'");
1460 CPLCHECK_MSG (
"Cannot add PIPE LAST_BUILD...");
1462 gravi_msg_function_exit(0);
1463 return CPL_ERROR_NONE;
double gravi_pfits_get_time_sc(const cpl_propertylist *header, cpl_size row)
Time of the middle of the SC exposure row in [us], counted from PRC.ACQ.START.
cpl_propertylist * gravi_plist_get_qc(cpl_propertylist *header)
Extract QC parameters.
int gravi_pfits_get_startx(const cpl_propertylist *plist)
find out the name of the propertylist
cpl_error_code gravi_pfits_add_check(cpl_propertylist *header, char *msg)
Add a QC.CHECK keyword to the header.
double gravi_pfits_get_sc_gain(const cpl_propertylist *plist)
SC system gain in [ADU/e].
cpl_propertylist * gravi_plist_get_oifits_keywords(cpl_propertylist *header)
Create OIFITS keywords to satisfy standar.
double gravi_pfits_get_double(const cpl_propertylist *self, const char *name)
Get the double value of the given property list entry.
double gravi_pfits_get_ft_gain(const cpl_propertylist *plist)
FT system gain in [ADU/e].
double gravi_pfits_get_time_acqcam(const cpl_propertylist *header, cpl_size row)
Time of the middle of the ACQCAM exposure row in [us], counted from PRC.ACQ.START.
cpl_error_code gravi_pfits_add_pipe_build(cpl_propertylist *header)
Add the ESO PRO REC# PIPE LAST_BUILD in header.