00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025
00026
00027
00028
00029 #include <cpl.h>
00030 #include <math.h>
00031 #include <string.h>
00032
00033 #include "muse_pfits.h"
00034 #include "muse_instrument.h"
00035
00036
00040
00041
00044
00052
00053 const char *
00054 muse_pfits_get_arcfile(const cpl_propertylist *aHeaders)
00055 {
00056 const char *value = cpl_propertylist_get_string(aHeaders, "ARCFILE");
00057 cpl_ensure(value, cpl_error_get_code(), NULL);
00058 return value;
00059 }
00060
00061
00069
00070 const char *
00071 muse_pfits_get_origfile(const cpl_propertylist *aHeaders)
00072 {
00073 const char *value = cpl_propertylist_get_string(aHeaders, "ORIGFILE");
00074 cpl_ensure(value, cpl_error_get_code(), NULL);
00075 return value;
00076 }
00077
00078
00086
00087 const char *
00088 muse_pfits_get_pipefile(const cpl_propertylist *aHeaders)
00089 {
00090 const char *value = cpl_propertylist_get_string(aHeaders, "PIPEFILE");
00091 cpl_ensure(value, cpl_error_get_code(), NULL);
00092 return value;
00093 }
00094
00095
00103
00104 const char *
00105 muse_pfits_get_dpr_type(const cpl_propertylist *aHeaders)
00106 {
00107 cpl_errorstate prestate = cpl_errorstate_get();
00108 const char *value = cpl_propertylist_get_string(aHeaders, "ESO DPR TYPE");
00109 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00110 return value;
00111 }
00112
00113
00121
00122 const char *
00123 muse_pfits_get_dpr_catg(const cpl_propertylist *aHeaders)
00124 {
00125 cpl_errorstate prestate = cpl_errorstate_get();
00126 const char *value = cpl_propertylist_get_string(aHeaders, "ESO DPR CATG");
00127 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00128 return value;
00129 }
00130
00131
00139
00140 const char *
00141 muse_pfits_get_pro_type(const cpl_propertylist *aHeaders)
00142 {
00143 cpl_errorstate prestate = cpl_errorstate_get();
00144 const char *value = cpl_propertylist_get_string(aHeaders, "ESO PRO TYPE");
00145 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00146 return value;
00147 }
00148
00149
00157
00158 const char *
00159 muse_pfits_get_pro_catg(const cpl_propertylist *aHeaders)
00160 {
00161 cpl_errorstate prestate = cpl_errorstate_get();
00162 const char *value = cpl_propertylist_get_string(aHeaders, "ESO PRO CATG");
00163 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00164 return value;
00165 }
00166
00167
00179
00180 cpl_boolean
00181 muse_pfits_has_ifu(const cpl_propertylist *aHeaders, unsigned char aIFU)
00182 {
00183 cpl_errorstate prestate = cpl_errorstate_get();
00184 const char *extname = muse_pfits_get_extname(aHeaders);
00185 if (!cpl_errorstate_is_equal(prestate) ||
00186 strncmp(extname, "CHAN", 4) ||
00187 strlen(extname) < 6) {
00188 cpl_errorstate_set(prestate);
00189 return CPL_FALSE;
00190 }
00191 unsigned char chan = atoi(extname + 4);
00192 return chan == aIFU;
00193 }
00194
00195
00203
00204 const char *
00205 muse_pfits_get_extname(const cpl_propertylist *aHeaders)
00206 {
00207 cpl_errorstate prestate = cpl_errorstate_get();
00208 const char *value = cpl_propertylist_get_string(aHeaders, "EXTNAME");
00209 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00210 return value;
00211 }
00212
00213
00221
00222 const char *
00223 muse_pfits_get_bunit(const cpl_propertylist *aHeaders)
00224 {
00225 cpl_errorstate prestate = cpl_errorstate_get();
00226 const char *value = cpl_propertylist_get_string(aHeaders, "BUNIT");
00227 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00228 return value;
00229 }
00230
00231
00240
00241 cpl_size
00242 muse_pfits_get_naxis(const cpl_propertylist *aHeaders, unsigned int aAxis)
00243 {
00244 cpl_errorstate prestate = cpl_errorstate_get();
00245 if (aAxis == 0) {
00246 cpl_size value = cpl_propertylist_get_long_long(aHeaders, "NAXIS");
00247 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
00248 return value;
00249 }
00250 char keyword[KEYWORD_LENGTH];
00251 snprintf(keyword, KEYWORD_LENGTH, "NAXIS%u", aAxis);
00252 cpl_size value = cpl_propertylist_get_long_long(aHeaders, keyword);
00253 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
00254 return value;
00255 }
00256
00257
00265
00266 double
00267 muse_pfits_get_ra(const cpl_propertylist *aHeaders)
00268 {
00269 cpl_errorstate prestate = cpl_errorstate_get();
00270 const double value = cpl_propertylist_get_double(aHeaders, "RA");
00271 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00272 return value;
00273 }
00274
00275
00283
00284 double
00285 muse_pfits_get_dec(const cpl_propertylist *aHeaders)
00286 {
00287 cpl_errorstate prestate = cpl_errorstate_get();
00288 const double value = cpl_propertylist_get_double(aHeaders, "DEC");
00289 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00290 return value;
00291 }
00292
00293
00304
00305 double
00306 muse_pfits_get_equinox(const cpl_propertylist *aHeaders)
00307 {
00308 cpl_errorstate prestate = cpl_errorstate_get();
00309 double value = cpl_propertylist_get_double(aHeaders, "EQUINOX");
00310 if (!cpl_errorstate_is_equal(prestate)) {
00311 cpl_errorstate_set(prestate);
00312 value = cpl_propertylist_get_long_long(aHeaders, "EQUINOX");
00313 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00314 }
00315 return value;
00316 }
00317
00318
00326
00327 double
00328 muse_pfits_get_lst(const cpl_propertylist *aHeaders)
00329 {
00330 cpl_errorstate prestate = cpl_errorstate_get();
00331 const double value = cpl_propertylist_get_double(aHeaders, "LST");
00332 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00333 return value;
00334 }
00335
00336
00344
00345 double
00346 muse_pfits_get_mjdobs(const cpl_propertylist *aHeaders)
00347 {
00348 cpl_errorstate prestate = cpl_errorstate_get();
00349 const double value = cpl_propertylist_get_double(aHeaders, "MJD-OBS");
00350 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00351 return value;
00352 }
00353
00354
00362
00363 const char *
00364 muse_pfits_get_dateobs(const cpl_propertylist *aHeaders)
00365 {
00366 cpl_errorstate prestate = cpl_errorstate_get();
00367 const char *value = cpl_propertylist_get_string(aHeaders, "DATE-OBS");
00368 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00369 return value;
00370 }
00371
00372
00380
00381 double
00382 muse_pfits_get_exptime(const cpl_propertylist *aHeaders)
00383 {
00384 cpl_errorstate prestate = cpl_errorstate_get();
00385 const double value = cpl_propertylist_get_double(aHeaders, "EXPTIME");
00386 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00387 return value;
00388 }
00389
00390
00399
00400 double
00401 muse_pfits_get_crpix(const cpl_propertylist *aHeaders, unsigned int aAxis)
00402 {
00403 cpl_errorstate prestate = cpl_errorstate_get();
00404 char keyword[KEYWORD_LENGTH];
00405 snprintf(keyword, KEYWORD_LENGTH, "CRPIX%u", aAxis);
00406 const double value = cpl_propertylist_get_double(aHeaders, keyword);
00407
00408 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00409 return value;
00410 }
00411
00412
00421
00422 double
00423 muse_pfits_get_crval(const cpl_propertylist *aHeaders, unsigned int aAxis)
00424 {
00425 cpl_errorstate prestate = cpl_errorstate_get();
00426 char keyword[KEYWORD_LENGTH];
00427 snprintf(keyword, KEYWORD_LENGTH, "CRVAL%u", aAxis);
00428 const double value = cpl_propertylist_get_double(aHeaders, keyword);
00429
00430 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00431 return value;
00432 }
00433
00434
00444
00445 double
00446 muse_pfits_get_cd(const cpl_propertylist *aHeaders, unsigned int aAxisI,
00447 unsigned int aAxisJ)
00448 {
00449 cpl_errorstate prestate = cpl_errorstate_get();
00450 char keyword[KEYWORD_LENGTH];
00451 snprintf(keyword, KEYWORD_LENGTH, "CD%u_%u", aAxisI, aAxisJ);
00452 const double value = cpl_propertylist_get_double(aHeaders, keyword);
00453
00454 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00455 return value;
00456 }
00457
00458
00467
00468 const char *
00469 muse_pfits_get_ctype(const cpl_propertylist *aHeaders, unsigned int aAxis)
00470 {
00471 cpl_errorstate prestate = cpl_errorstate_get();
00472 char keyword[KEYWORD_LENGTH];
00473 snprintf(keyword, KEYWORD_LENGTH, "CTYPE%u", aAxis);
00474 const char *value = cpl_propertylist_get_string(aHeaders, keyword);
00475
00476 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), " ");
00477 return value;
00478 }
00479
00480
00489
00490 const char *
00491 muse_pfits_get_cunit(const cpl_propertylist *aHeaders, unsigned int aAxis)
00492 {
00493 cpl_errorstate prestate = cpl_errorstate_get();
00494 char keyword[KEYWORD_LENGTH];
00495 snprintf(keyword, KEYWORD_LENGTH, "CUNIT%u", aAxis);
00496 const char *value = cpl_propertylist_get_string(aHeaders, keyword);
00497
00498 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), " ");
00499 return value;
00500 }
00501
00502
00510
00511 int
00512 muse_pfits_get_read_id(const cpl_propertylist *aHeaders)
00513 {
00514 cpl_errorstate prestate = cpl_errorstate_get();
00515 const int value = cpl_propertylist_get_int(aHeaders, "ESO DET READ CURID");
00516 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
00517 return value;
00518 }
00519
00520
00528
00529 const char *
00530 muse_pfits_get_read_name(const cpl_propertylist *aHeaders)
00531 {
00532 cpl_errorstate prestate = cpl_errorstate_get();
00533 const char *value = cpl_propertylist_get_string(aHeaders, "ESO DET READ CURNAME");
00534 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00535 return value;
00536 }
00537
00538
00546
00547 int
00548 muse_pfits_get_binx(const cpl_propertylist *aHeaders)
00549 {
00550 cpl_errorstate prestate = cpl_errorstate_get();
00551 const int value = cpl_propertylist_get_int(aHeaders, "ESO DET BINX");
00552 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 1);
00553 return value;
00554 }
00555
00556
00564
00565 int
00566 muse_pfits_get_biny(const cpl_propertylist *aHeaders)
00567 {
00568 cpl_errorstate prestate = cpl_errorstate_get();
00569 const int value = cpl_propertylist_get_int(aHeaders, "ESO DET BINY");
00570 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 1);
00571 return value;
00572 }
00573
00574
00582
00583 const char *
00584 muse_pfits_get_chip_name(const cpl_propertylist *aHeaders)
00585 {
00586 cpl_errorstate prestate = cpl_errorstate_get();
00587 const char *value = cpl_propertylist_get_string(aHeaders, "ESO DET CHIP NAME");
00588 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00589 return value;
00590 }
00591
00592
00600
00601 const char *
00602 muse_pfits_get_chip_id(const cpl_propertylist *aHeaders)
00603 {
00604 cpl_errorstate prestate = cpl_errorstate_get();
00605 const char *value = cpl_propertylist_get_string(aHeaders, "ESO DET CHIP ID");
00606 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00607 return value;
00608 }
00609
00610
00618
00619 const char *
00620 muse_pfits_get_chip_date(const cpl_propertylist *aHeaders)
00621 {
00622 cpl_errorstate prestate = cpl_errorstate_get();
00623 const char *value = cpl_propertylist_get_string(aHeaders, "ESO DET CHIP DATE");
00624 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
00625 return value;
00626 }
00627
00628
00637
00638 cpl_boolean
00639 muse_pfits_get_chip_live(const cpl_propertylist *aHeaders)
00640 {
00641 cpl_errorstate prestate = cpl_errorstate_get();
00642 const cpl_boolean value = cpl_propertylist_get_bool(aHeaders,
00643 "ESO DET CHIP LIVE") == 0
00644 ? CPL_FALSE : CPL_TRUE;
00645 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), CPL_FALSE);
00646 return value;
00647 }
00648
00649
00658
00659 double
00660 muse_pfits_get_ron(const cpl_propertylist *aHeaders, unsigned char aQuadrant)
00661 {
00662 char keyword[KEYWORD_LENGTH];
00663 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d RON", aQuadrant);
00664 if (!cpl_propertylist_has(aHeaders, keyword)) {
00665 cpl_msg_warning(__func__, "Could not get %s, using RON=1.0",
00666 keyword);
00667 return 1.0;
00668 }
00669 return cpl_propertylist_get_double(aHeaders, keyword);
00670 }
00671
00672
00684
00685 double
00686 muse_pfits_get_gain(const cpl_propertylist *aHeaders, unsigned char aQuadrant)
00687 {
00688 char keyword[KEYWORD_LENGTH];
00689 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d GAIN", aQuadrant);
00690 return cpl_propertylist_get_double(aHeaders, keyword);
00691 }
00692
00693
00702
00703 int
00704 muse_pfits_get_out_output_x(const cpl_propertylist *aHeaders,
00705 unsigned char aQuadrant)
00706 {
00707 cpl_errorstate prestate = cpl_errorstate_get();
00708 char keyword[KEYWORD_LENGTH];
00709 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d X", aQuadrant);
00710 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00711 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00712 return value;
00713 }
00714
00715
00724
00725 int
00726 muse_pfits_get_out_output_y(const cpl_propertylist *aHeaders,
00727 unsigned char aQuadrant)
00728 {
00729 cpl_errorstate prestate = cpl_errorstate_get();
00730 char keyword[KEYWORD_LENGTH];
00731 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d Y", aQuadrant);
00732 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00733 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00734 return value;
00735 }
00736
00737
00746
00747 int
00748 muse_pfits_get_out_nx(const cpl_propertylist *aHeaders, unsigned char aQuadrant)
00749 {
00750 cpl_errorstate prestate = cpl_errorstate_get();
00751 char keyword[KEYWORD_LENGTH];
00752 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d NX", aQuadrant);
00753 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00754 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00755 return value;
00756 }
00757
00758
00767
00768 int
00769 muse_pfits_get_out_ny(const cpl_propertylist *aHeaders, unsigned char aQuadrant)
00770 {
00771 cpl_errorstate prestate = cpl_errorstate_get();
00772 char keyword[KEYWORD_LENGTH];
00773 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d NY", aQuadrant);
00774 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00775 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00776 return value;
00777 }
00778
00779
00788
00789 int
00790 muse_pfits_get_out_prescan_x(const cpl_propertylist *aHeaders,
00791 unsigned char aQuadrant)
00792 {
00793 cpl_errorstate prestate = cpl_errorstate_get();
00794 char keyword[KEYWORD_LENGTH];
00795 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d PRSCX", aQuadrant);
00796 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00797 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00798 return value;
00799 }
00800
00801
00810
00811 int
00812 muse_pfits_get_out_prescan_y(const cpl_propertylist *aHeaders,
00813 unsigned char aQuadrant)
00814 {
00815 cpl_errorstate prestate = cpl_errorstate_get();
00816 char keyword[KEYWORD_LENGTH];
00817 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d PRSCY", aQuadrant);
00818 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00819 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00820 return value;
00821 }
00822
00823
00832
00833 int
00834 muse_pfits_get_out_overscan_x(const cpl_propertylist *aHeaders,
00835 unsigned char aQuadrant)
00836 {
00837 cpl_errorstate prestate = cpl_errorstate_get();
00838 char keyword[KEYWORD_LENGTH];
00839 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d OVSCX", aQuadrant);
00840 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00841 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00842 return value;
00843 }
00844
00845
00854
00855 int
00856 muse_pfits_get_out_overscan_y(const cpl_propertylist *aHeaders,
00857 unsigned char aQuadrant)
00858 {
00859 cpl_errorstate prestate = cpl_errorstate_get();
00860 char keyword[KEYWORD_LENGTH];
00861 snprintf(keyword, KEYWORD_LENGTH, "ESO DET OUT%d OVSCY", aQuadrant);
00862 const int value = cpl_propertylist_get_int(aHeaders, keyword);
00863 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
00864 return value;
00865 }
00866
00867
00880
00881 double
00882 muse_pfits_get_geolat(const cpl_propertylist *aHeaders)
00883 {
00884 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL GEOLAT");
00885 if (fabs(value) < DBL_EPSILON) {
00886 return -24.625278;
00887 }
00888 return value;
00889 }
00890
00891
00904
00905 double
00906 muse_pfits_get_geolon(const cpl_propertylist *aHeaders)
00907 {
00908 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL GEOLON");
00909 if (fabs(value) < DBL_EPSILON) {
00910 return 70.402222;
00911 }
00912 return value;
00913 }
00914
00915
00926
00927 double
00928 muse_pfits_get_geoelev(const cpl_propertylist *aHeaders)
00929 {
00930 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL GEOELEV");
00931 if (fabs(value) < DBL_EPSILON) {
00932 return 2648.;
00933 }
00934 return value;
00935 }
00936
00937
00949
00950 double
00951 muse_pfits_get_focu_scale(const cpl_propertylist *aHeaders)
00952 {
00953 double value = 1.705;
00954 if (aHeaders && cpl_propertylist_has(aHeaders, "ESO TEL FOCU SCALE")) {
00955 value = cpl_propertylist_get_double(aHeaders, "ESO TEL FOCU SCALE");
00956 }
00957 return value;
00958 }
00959
00960
00968
00969 double
00970 muse_pfits_get_airmass_start(const cpl_propertylist *aHeaders)
00971 {
00972 cpl_errorstate prestate = cpl_errorstate_get();
00973 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AIRM START");
00974 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00975 return value;
00976 }
00977
00978
00986
00987 double
00988 muse_pfits_get_airmass_end(const cpl_propertylist *aHeaders)
00989 {
00990 cpl_errorstate prestate = cpl_errorstate_get();
00991 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AIRM END");
00992 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
00993 return value;
00994 }
00995
00996
01004
01005 double
01006 muse_pfits_get_temp(const cpl_propertylist *aHeaders)
01007 {
01008 cpl_errorstate prestate = cpl_errorstate_get();
01009 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AMBI TEMP");
01010 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01011 return value;
01012 }
01013
01014
01022
01023 double
01024 muse_pfits_get_rhum(const cpl_propertylist *aHeaders)
01025 {
01026 cpl_errorstate prestate = cpl_errorstate_get();
01027 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AMBI RHUM");
01028 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01029 return value;
01030 }
01031
01032
01040
01041 double
01042 muse_pfits_get_pres_start(const cpl_propertylist *aHeaders)
01043 {
01044 cpl_errorstate prestate = cpl_errorstate_get();
01045 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AMBI PRES START");
01046 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01047 return value;
01048 }
01049
01050
01058
01059 double
01060 muse_pfits_get_pres_end(const cpl_propertylist *aHeaders)
01061 {
01062 cpl_errorstate prestate = cpl_errorstate_get();
01063 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AMBI PRES END");
01064 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01065 return value;
01066 }
01067
01068
01076
01077 double
01078 muse_pfits_get_fwhm_start(const cpl_propertylist *aHeaders)
01079 {
01080 cpl_errorstate prestate = cpl_errorstate_get();
01081 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AMBI FWHM START");
01082 cpl_ensure(cpl_errorstate_is_equal(prestate) && value > 0.,
01083 cpl_error_get_code(), 0.0);
01084 return value;
01085 }
01086
01087
01095
01096 double
01097 muse_pfits_get_fwhm_end(const cpl_propertylist *aHeaders)
01098 {
01099 cpl_errorstate prestate = cpl_errorstate_get();
01100 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL AMBI FWHM END");
01101 cpl_ensure(cpl_errorstate_is_equal(prestate) && value > 0.,
01102 cpl_error_get_code(), 0.0);
01103 return value;
01104 }
01105
01106
01114
01115 double
01116 muse_pfits_get_altang(const cpl_propertylist *aHeaders)
01117 {
01118 cpl_errorstate prestate = cpl_errorstate_get();
01119 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL ALT");
01120 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01121 return value;
01122 }
01123
01124
01132
01133 double
01134 muse_pfits_get_parang_start(const cpl_propertylist *aHeaders)
01135 {
01136 cpl_errorstate prestate = cpl_errorstate_get();
01137 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL PARANG START");
01138 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01139 return value;
01140 }
01141
01142
01150
01151 double
01152 muse_pfits_get_parang_end(const cpl_propertylist *aHeaders)
01153 {
01154 cpl_errorstate prestate = cpl_errorstate_get();
01155 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL PARANG END");
01156 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01157 return value;
01158 }
01159
01160
01168
01169 double
01170 muse_pfits_get_agx_avg(const cpl_propertylist *aHeaders)
01171 {
01172 cpl_errorstate prestate = cpl_errorstate_get();
01173 const double value = cpl_propertylist_get_double(aHeaders, "ESO OCS SGS AG FWHMX AVG");
01174 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01175 return value;
01176 }
01177
01178
01186
01187 double
01188 muse_pfits_get_agx_rms(const cpl_propertylist *aHeaders)
01189 {
01190 cpl_errorstate prestate = cpl_errorstate_get();
01191 const double value = cpl_propertylist_get_double(aHeaders, "ESO OCS SGS AG FWHMX RMS");
01192 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01193 return value;
01194 }
01195
01196
01204
01205 double
01206 muse_pfits_get_agy_avg(const cpl_propertylist *aHeaders)
01207 {
01208 cpl_errorstate prestate = cpl_errorstate_get();
01209 const double value = cpl_propertylist_get_double(aHeaders, "ESO OCS SGS AG FWHMY AVG");
01210 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01211 return value;
01212 }
01213
01214
01222
01223 double
01224 muse_pfits_get_agy_rms(const cpl_propertylist *aHeaders)
01225 {
01226 cpl_errorstate prestate = cpl_errorstate_get();
01227 const double value = cpl_propertylist_get_double(aHeaders, "ESO OCS SGS AG FWHMY RMS");
01228 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01229 return value;
01230 }
01231
01232
01240
01241 double
01242 muse_pfits_get_ia_fwhm(const cpl_propertylist *aHeaders)
01243 {
01244 cpl_errorstate prestate = cpl_errorstate_get();
01245 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL IA FWHM");
01246 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01247 return value;
01248 }
01249
01250
01258
01259 double
01260 muse_pfits_get_ia_fwhmlin(const cpl_propertylist *aHeaders)
01261 {
01262 cpl_errorstate prestate = cpl_errorstate_get();
01263 const double value = cpl_propertylist_get_double(aHeaders, "ESO TEL IA FWHMLIN");
01264 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01265 return value;
01266 }
01267
01268
01276
01277 const char *
01278 muse_pfits_get_drot_mode(const cpl_propertylist *aHeaders)
01279 {
01280 cpl_errorstate prestate = cpl_errorstate_get();
01281 const char *value = cpl_propertylist_get_string(aHeaders, "ESO INS DROT MODE");
01282 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
01283 return value;
01284 }
01285
01286
01294
01295 double
01296 muse_pfits_get_drot_posang(const cpl_propertylist *aHeaders)
01297 {
01298 cpl_errorstate prestate = cpl_errorstate_get();
01299 const double value = cpl_propertylist_get_double(aHeaders, "ESO INS DROT POSANG");
01300 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01301 return value;
01302 }
01303
01304
01312
01313 double
01314 muse_pfits_get_drot_start(const cpl_propertylist *aHeaders)
01315 {
01316 cpl_errorstate prestate = cpl_errorstate_get();
01317 const double value = cpl_propertylist_get_double(aHeaders, "ESO INS DROT START");
01318 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01319 return value;
01320 }
01321
01322
01330
01331 double
01332 muse_pfits_get_drot_end(const cpl_propertylist *aHeaders)
01333 {
01334 cpl_errorstate prestate = cpl_errorstate_get();
01335 const double value = cpl_propertylist_get_double(aHeaders, "ESO INS DROT END");
01336 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01337 return value;
01338 }
01339
01340
01350
01351 muse_ins_mode
01352 muse_pfits_get_mode(const cpl_propertylist *aHeaders)
01353 {
01354 const char *value = muse_pfits_get_insmode(aHeaders);
01355 cpl_ensure(value, cpl_error_get_code(), MUSE_MODE_WFM_NONAO_N);
01356 if (!strncmp(value, "NFM", 3)) {
01357 return MUSE_MODE_NFM_AO_N;
01358 }
01359 if (!strncmp(value, "WFM-AO", 6)) {
01360 return MUSE_MODE_WFM_AO_N;
01361 }
01362 if (!strncmp(value, "WFM-NOAO-N", 10) || !strncmp(value, "WFM-NONAO-N", 11)) {
01363 return MUSE_MODE_WFM_NONAO_N;
01364 }
01365 return MUSE_MODE_WFM_NONAO_X;
01366 }
01367
01368
01378
01379 const char *
01380 muse_pfits_get_insmode(const cpl_propertylist *aHeaders)
01381 {
01382 cpl_errorstate prestate = cpl_errorstate_get();
01383 const char *value = cpl_propertylist_get_string(aHeaders, "ESO INS MODE");
01384 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
01385 return value;
01386 }
01387
01388
01404
01405 double
01406 muse_pfits_get_pam_intensity(const cpl_propertylist *aHeaders, int aDiode)
01407 {
01408 cpl_errorstate prestate = cpl_errorstate_get();
01409 char keyword[KEYWORD_LENGTH];
01410 snprintf(keyword, KEYWORD_LENGTH, "ESO INS AMPL%d CURR", aDiode);
01411 double value = cpl_propertylist_get_double(aHeaders, keyword);
01412 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01413 const char *comment = cpl_propertylist_get_comment(aHeaders, keyword);
01414 cpl_boolean ismilliampere = comment && strstr(comment, "[mA]")
01415 ? CPL_TRUE : CPL_FALSE;
01416 if (!ismilliampere) {
01417 cpl_error_set_message(__func__, CPL_ERROR_INCOMPATIBLE_INPUT,
01418 "Could not ensure that %s is in mA!", keyword);
01419 } else {
01420 value /= 1000.;
01421 }
01422 return value;
01423 }
01424
01425
01434
01435 double
01436 muse_pfits_get_pam_stdev(const cpl_propertylist *aHeaders, int aDiode)
01437 {
01438 cpl_errorstate prestate = cpl_errorstate_get();
01439 char keyword[KEYWORD_LENGTH];
01440 snprintf(keyword, KEYWORD_LENGTH, "ESO INS AMPL%d STDEV", aDiode);
01441 const double value = cpl_propertylist_get_double(aHeaders, keyword);
01442 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01443 return value;
01444 }
01445
01446
01454
01455 const char *
01456 muse_pfits_get_pam2_filter(const cpl_propertylist *aHeaders)
01457 {
01458 cpl_errorstate prestate = cpl_errorstate_get();
01459 const char *value = cpl_propertylist_get_string(aHeaders,
01460 "ESO INS AMPL2 FILTER");
01461 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
01462 return value;
01463 }
01464
01465
01478
01479 int
01480 muse_pfits_get_lampnum(const cpl_propertylist *aHeaders)
01481 {
01482 cpl_errorstate prestate = cpl_errorstate_get();
01483 const int value = cpl_propertylist_get_int(aHeaders, "ESO INS LAMPNUM");
01484 if (!cpl_errorstate_is_equal(prestate)) {
01485
01486 cpl_errorstate_set(prestate);
01487 return 6;
01488 }
01489 return value;
01490 }
01491
01492
01501
01502 const char *
01503 muse_pfits_get_lamp_name(const cpl_propertylist *aHeaders, int aLamp)
01504 {
01505 cpl_errorstate prestate = cpl_errorstate_get();
01506 char keyword[KEYWORD_LENGTH];
01507 snprintf(keyword, KEYWORD_LENGTH, "ESO INS LAMP%d NAME", aLamp);
01508 const char *value = cpl_propertylist_get_string(aHeaders, keyword);
01509 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
01510 return value;
01511 }
01512
01513
01522
01523 int
01524 muse_pfits_get_lamp_status(const cpl_propertylist *aHeaders, int aLamp)
01525 {
01526 cpl_errorstate prestate = cpl_errorstate_get();
01527 char keyword[KEYWORD_LENGTH];
01528 snprintf(keyword, KEYWORD_LENGTH, "ESO INS LAMP%d ST", aLamp);
01529 const int value = cpl_propertylist_get_bool(aHeaders, keyword);
01530 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
01531 return value;
01532 }
01533
01534
01543
01544 const char *
01545 muse_pfits_get_shut_name(const cpl_propertylist *aHeaders, int aShutter)
01546 {
01547 cpl_errorstate prestate = cpl_errorstate_get();
01548 char keyword[KEYWORD_LENGTH];
01549 snprintf(keyword, KEYWORD_LENGTH, "ESO INS SHUT%d NAME", aShutter);
01550 const char *value = cpl_propertylist_get_string(aHeaders, keyword);
01551 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
01552 return value;
01553 }
01554
01555
01564
01565 int
01566 muse_pfits_get_shut_status(const cpl_propertylist *aHeaders, int aShutter)
01567 {
01568 cpl_errorstate prestate = cpl_errorstate_get();
01569 char keyword[KEYWORD_LENGTH];
01570 snprintf(keyword, KEYWORD_LENGTH, "ESO INS SHUT%d ST", aShutter);
01571 const int value = cpl_propertylist_get_bool(aHeaders, keyword);
01572 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
01573 return value;
01574 }
01575
01576
01587
01588 int
01589 muse_pfits_get_posenc(const cpl_propertylist *aHeaders, unsigned short aEncoder)
01590 {
01591 cpl_errorstate prestate = cpl_errorstate_get();
01592 char keyword[KEYWORD_LENGTH];
01593 snprintf(keyword, KEYWORD_LENGTH, "ESO INS POS%d ENC", aEncoder);
01594 const int value = cpl_propertylist_get_int(aHeaders, keyword);
01595 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0);
01596 return value;
01597 }
01598
01599
01616
01617 double
01618 muse_pfits_get_pospos(const cpl_propertylist *aHeaders, unsigned short aEncoder)
01619 {
01620 cpl_errorstate prestate = cpl_errorstate_get();
01621 char keyword[KEYWORD_LENGTH];
01622 snprintf(keyword, KEYWORD_LENGTH, "ESO INS POS%d POS", aEncoder);
01623 const double value = cpl_propertylist_get_double(aHeaders, keyword);
01624 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), 0.0);
01625 return value;
01626 }
01627
01628
01636
01637 long
01638 muse_pfits_get_obsid(const cpl_propertylist *aHeaders)
01639 {
01640 cpl_errorstate prestate = cpl_errorstate_get();
01641 const long value = cpl_propertylist_get_long(aHeaders, "ESO OBS ID");
01642 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), -1);
01643 return value;
01644 }
01645
01646
01654
01655 const char *
01656 muse_pfits_get_progid(const cpl_propertylist *aHeaders)
01657 {
01658 cpl_errorstate prestate = cpl_errorstate_get();
01659 const char *value = cpl_propertylist_get_string(aHeaders, "ESO OBS PROG ID");
01660 cpl_ensure(cpl_errorstate_is_equal(prestate), cpl_error_get_code(), NULL);
01661 return value;
01662 }
01663
01664
01673
01674 const char *
01675 muse_pfits_get_pipe_id(const cpl_propertylist *aHeaders, unsigned int idx)
01676 {
01677 cpl_ensure(aHeaders, CPL_ERROR_NULL_INPUT, NULL);
01678 char *key = cpl_sprintf("ESO PRO REC%-u PIPE ID", idx);
01679 cpl_errorstate prestate = cpl_errorstate_get();
01680 const char *value = cpl_propertylist_get_string(aHeaders, key);
01681 cpl_errorstate_set(prestate);
01682 cpl_free(key);
01683 return value;
01684 }
01685
01686
01695
01696 const char *
01697 muse_pfits_get_raw_filename(const cpl_propertylist *aHeaders, unsigned int idx)
01698 {
01699 cpl_ensure(aHeaders, CPL_ERROR_NULL_INPUT, NULL);
01700 char *key = cpl_sprintf("ESO PRO REC1 RAW%-u NAME", idx);
01701 cpl_errorstate prestate = cpl_errorstate_get();
01702 const char *value = cpl_propertylist_get_string(aHeaders, key);
01703 cpl_errorstate_set(prestate);
01704 cpl_free(key);
01705 return value;
01706 }
01707
01708
01716
01717 const char *
01718 muse_pfits_get_ancestor(const cpl_propertylist *aHeaders)
01719 {
01720 cpl_ensure(aHeaders, CPL_ERROR_NULL_INPUT, NULL);
01721 cpl_errorstate prestate = cpl_errorstate_get();
01722 const char *value = cpl_propertylist_get_string(aHeaders, "ESO PRO ANCESTOR");
01723 cpl_errorstate_set(prestate);
01724 return value;
01725 }
01726