/usr/share/gnudatalanguage/astrolib/heuler.pro is in gdl-astrolib 2018.02.16+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | pro heuler,h_or_astr, Galactic = galactic, celestial = celestial, $
ecliptic = ecliptic, alt_in = alt_in, alt_out = alt_out
;+
; NAME:
; HEULER
;
; PURPOSE:
; Change the coordinate system of a FITS header or astrometry structure
; EXPLANATION:
; Converts a FITS header or a astrometry structure containing WCS (world
; coordinate system) information between celestial, ecliptic, and
; Galactic coordinates
;
; CALLING SEQUENCE:
; HEULER, hdr, [/GALACTIC, /CELESTIAL, /ECLIPTIC, ALT_IN = , ALT_OUT=]
; or
; HEULER, astr, /GALACTIC, /CELESTIAL, /ECLIPTIC
;
; INPUT/OUTPUT PARAMETERS:
; hdr - FITS header (string array) containing WCS information
; or
; Astr - Astrometry structure as extracted from a FITS header
; by extast.pro (See EXTAST for more info).
;
; Header or astrometry structure will be modified by the program to
; contain astrometry in the new coordinates system.
; REQUIRED INPUT KEYWORDS:
; One of the following exclusive keywords is *required*
; /GALACTIC - Convert the header to Galactic coordinates
; /CELESTIAL - Convert the header to celestial (RA & Dec) coordinates
; /ECLIPTIC - Convert the header to ecliptic coordinates
;
; OPTIONAL INPUT KEYWORDS:
; The following two keywords apply if the FITS header contains multiple
; WCS keywords. See Section 3.3 of Greisen & Calabretta (2002, A&A, 395,
; 1061) for information about alternate astrometry keywords.
;
; ALT_IN - single character 'A' through 'Z' or ' ' specifying an
; alternate astrometry system present in the input FITS header. The
; default isto use the primary astrometry or ALT = ' '. If /ALT_IN
; is set, then this is equivalent to ALT_IN = 'A'.
; ALT_OUT - single character specifying the alternate WCS keywords
; to write the *output* astrometry. If not specified, then ALT_OUT
; is set equal to ALT_IN.
; RESTRICTIONS:
; Currently assumes that celestial and ecliptic coordinates are in
; J2000. Use HPRECESS if this is not the case.
;
; ST Guide Star (DSS) image headers are first converted to a standard
; tangent projection, prior to the coordinate conversion
; METHOD:
; The algorithm used is described in Section 2.7 of Calabretta & Greisen
; (2002, A&A, 395, 1077). The CRVAL coordinates are transformed
; directly using EULER. The new LONPOLE and LATPOLE values are then
; determined by transforming the pole of the new system to the old, and
; converted to native coordinates using WCS_ROTATE.
; EXAMPLE:
; A FITS header, hdr, has a standard tangent projection WCS information.
; Add an alternate 'G' Galactic projection. Note that the original
; WCS information will be left unchanged
;
; IDL> heuler, hdr, /Galactic, alt='G'
; PROCEDURES USED:
; EULER, EXTAST, GSSS_STDAST, PUTAST, SXADDHIST, WCS_ROTATE
; REVISION HISTORY:
; Written W. Landsman June 2003
; Use PV2 tag in astrometry structure rather than PROJP1 W. L. May 2004
; Use double precision to compute new North pole W.L. Aug 2005
; Check for non-standard CTYPE value W.L. Sep 2012
;-
compile_opt idl2
if N_params() LT 1 then begin
print,'Syntax - HEULER, hdr, /GALACTIC, /CELESTIAL, /ECLIPTIC, ALT_IN=,'
return
endif
sz = size(h_or_astr,/str)
if (sz.type_name EQ 'STRING') && (sz.N_dimensions EQ 1) then begin
if N_elements(alt_out) EQ 0 then if N_elements(alt_in) NE 0 then $
alt_out = alt_in
EXTAST,h_or_astr,astr,status, alt = alt_in
if status LT 0 then message, $
'ERROR - No astrometry present in supplied FITS header' else $
if status EQ 4 then begin
GSSS_STDAST, h_or_astr
EXTAST, h_or_astr, astr, status, alt = alt_in
endif
ctype1 = sxpar(h_or_astr,'CTYPE1') ;Check if non-standard CTYPE was used
if strmid(astr.ctype[0],5,3) NE strmid(ctype1,5,3) then $
putast,h_or_astr,astr
endif else if sz.type_name EQ 'STRUCT' then astr = h_or_astr else message, $
'ERROR - First parameter must be a FITS header or astrometry structure'
map_types=['DEF','AZP','SZP','TAN','STG','SIN','ARC','ZPN','ZEA','AIR','CYP',$
'CEA','CAR','MER','SFL','PAR','MOL','AIT','COP','COE','COD','COO',$
'BON','PCO','GLS','TSC','CSC','QSC']
ctype1 = astr.ctype[0]
ctype2 = astr.ctype[1]
; Use Table 13 of Calbretta & Greisen to determine default values of theta0
coord = strmid(ctype1,0,4)
proj = strmid(ctype1,5,3)
imap = where(map_types EQ proj, N_imap)
if N_imap EQ 0 then message,'ERROR - Unrecognized map projection of ' + proj
imap = imap[0]
if imap LE 9 then theta0 = 90 else $
if (imap GE 18) && (imap LE 21) then theta0 = astr.pv2[0] else theta0 = 0
if keyword_set(GALACTIC) then begin
case coord of
'RA--': select= 1
'ELON': select = 5
'GLON': begin
message,/INF,'FITS header is already in Galactic: nothing changed'
return
end
end
strput,ctype1,'GLON'
strput,ctype2,'GLAT'
conv = 'Galactic'
endif else if keyword_set(CELESTIAL) then begin
case coord of
'RA--': begin
message,/INF,'FITS header is already in Celestial: nothing changed'
return
end
'ELON': select = 4
'GLON': select = 2
end
strput,ctype1,'RA--'
strput,ctype2,'DEC-'
conv = 'Celestial'
endif else if keyword_set(ECLIPTIC) then begin
case coord of
'RA--': select =3
'ELON': begin
message,/INF,'FITS header is already in Celestial: nothing changed'
return
end
'GLON': select = 6
endcase
strput,ctype1,'ELON'
strput,ctype2,'ELAT'
conv = 'Ecliptic'
endif else message, $
'Either /CELESTIAL, /GALACTIC or /ECLIPTIC keyword must be specified'
EULER,astr.crval[0],astr.crval[1],ncrval1,ncrval2,select
;Find new LONPOLE and LATPOLE values
if select mod 2 eq 0 then iselect = select-1 else iselect = select+1
EULER,0.0d,90.0d,lon1,lat1,iselect
WCS_ROTATE,lon1,lat1,lonpole, latpole, astr.crval,LONGPOLE = astr.longpole, $
LATPOLE = astr.latpole, THETA0 = theta0
;Update astrometry structure
astr.ctype = [ctype1,ctype2]
astr.longpole = lonpole
astr.latpole = latpole
astr.crval = [ncrval1, ncrval2]
if sz.type_name EQ 'STRING' then begin ;Update FITS header?
putast, h_or_astr, astr, alt = alt_out
sxaddhist, 'HEULER: ' + STRMID(systime(),4,20) + $
' Converted to ' + conv + ' coordinates', h_or_astr
endif else h_or_astr = astr
return
end
|