/usr/share/gnudatalanguage/astrolib/getrot.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 | pro getrot, hdr, rot, cdelt, DEBUG = debug, SILENT = silent, ALT=alt ;GET ROTation
;+
; NAME:
; GETROT
; PURPOSE:
; Return the rotation and plate scale of an image from its FITS header
; EXPLANATION:
; Derive the counterclockwise rotation angle, and the X and Y scale
; factors of an image, from a FITS image header. The input parameter
; may be either a FITS image header or an astrometry structure (as
; obtained by extast.pro)
;
; CALLING SEQUENCE:
; GETROT, Hdr, [ Rot, CDelt, /SILENT, DEBUG = ]
; or
; GETROT, Astr, Rot, CDelt, /SILENT, DEBUG = ]
;
; INPUT PARAMETERS:
; HDR - FITS Image header (string array). Program will extract the
; astrometry structure
; or
; ASTR - ASTROMETRY structure, of the type returned by EXTAST.
; See the documentation for EXTAST.PRO for details.
;
; OPTIONAL OUTPUT PARAMETERS:
; ROT - Scalar giving the counterclockwise rotation of NORTH in DEGREES
; from the +Y axis of the image.
; CDELT- 2 element vector giving the scale factors in DEGREES/PIXEL in
; the X and Y directions. CDELT[1] is always positive, whereas
; CDELT[0] is negative for a normal left-handed coordinate system,
; and positive for a right-handed system.
;
; If no output variables are supplied (or /DEBUG is set), then GETROT
; will display the rotation and plate scale at the terminal.
;
; OPTIONAL INPUT KEYWORD
;
; ALT - single character 'A' through 'Z' or ' ' specifying an alternate
; astrometry system present in the FITS header. See extast.pro
; for more information on the ALT keyword. Ignored if an
; astrometry structure rather than FITS header is supplied.
; DEBUG - if DEBUG is set, GETROT will print the rotation for both the
; X and Y axis when these values are unequal. If DEBUG is set to 2,
; then the output parameter ROT will contain both X and Y rotations.
;
; /SILENT - if set, then do not provide a warning about a right-handed
; coordinate system
; PROCEDURE:
; If the FITS header already contains CDELT (and CD or CROTA) keyword,
; (as suggested by the Calabretta & Greisen (2002, A&A, 395, 1077) FITS
; standard) then this is used for the scale factor.
;
; If the header contains CD keywords but no CDELT keywords (as in IRAF
; headers) then the scale factor is derived from the CD matrix.
;
; In case of skew (different rotations of the X and Y axes), the rotations
; are averaged together if they are less than 2 degrees. Otherwise,
; a warning is given and the X rotation is used.
;
; PROCEDURES USED:
; EXTAST, GSSS_EXTAST
; REVISION HISTORY:
; Written W. Landsman STX January 1987
; Option to return both rotations added. J. D. Offenberg, STX, Aug 1991
; Use new astrometry structure W. Landsman Mar 1994
; Recognize a GSSS header W. Landsman June 1994
; Correct rotation determination with unequal CDELT values WL October 1998
; Consistent conversion between CROTA and CD matrix WL October 2000
; Correct CDELT computations for rotations near 90 deg WL November 2002
; Preserve sign in the CDELT output WL June 2003
; Check if latitude/longitude reversed in CTYPE WL February 2004
; Fix problem in latitude check M.Lombardi/W.Landsman Sep 2004
; Added ALT keyword W. Landsman May 2005
; Account for any rotation of the native system by examining the value
; of LONGPOLE H. Taylor/W. Landsman
; Account for case where X,Y rotations differ by 2*!pi WL. Aug 2011
;-
Compile_opt IDL2
On_error,2
if N_params() EQ 0 then begin
print,'Syntax: GETROT, Hdr, [ Rot, CDelt, DEBUG= , /SILENT, ALT=]'
print,' OR: GETROT, Astr, [ Rot, CDelt, DEBUG= , /SILENT]'
return
endif
tpi = 2*!dpi
if ~keyword_set(DEBUG) then debug = 0
radeg = 180.0/!DPI
sz = size(hdr,/STR) ;Did user supply a FITS header or a CD matrix?
if ((sz.N_dimensions eq 1) && $
(sz.type_name EQ 'STRING')) then begin ;FITS header?
extast,hdr,astr,alt=alt ;Extract astrometry from header,
if strmid(astr.ctype[0],5,3) EQ 'GSS' then begin
hdr1 = hdr
gsss_stdast, hdr1
extast, hdr1, astr
endif
cd = astr.cd/RADEG ;then extract CD matrix from astrometry.
if N_elements(cd) NE 4 then $
message,'ERROR - Header is missing astrometry keywords CD or CDELT'
endif else $
if ((sz.N_dimensions eq 1) and $
(sz.type_name EQ 'STRUCT')) then begin ;Astrometry Structure?
astr = hdr
cd = astr.cd/RADEG
endif else message, $
'ERROR - First parameter must be an image header or astrometry structure'
if astr.cdelt[0] NE 1.0 then begin
cdelt = astr.cdelt
cd[0,0] *= cdelt[0] & cd[0,1] *= cdelt[0]
cd[1,1] *= cdelt[1] & cd[1,0] *= cdelt[1]
endif else cd = astr.cd/RADEG
ctype = strmid(astr.ctype[0],0,4)
; Check if first coordinate in CTYPE is latitude
if (ctype EQ 'DEC-') or (strmid(ctype, 1) EQ 'LAT') then $
cd = reverse(cd,1)
det = cd[0,0]*cd[1,1] - cd[0,1]*cd[1,0]
if det LT 0 then sgn = -1 else sgn = 1
if ~keyword_set(SILENT) then if det GT 0 then $
message,'WARNING - Astrometry is for a right-handed coordinate system',/INF
cdelt = fltarr(2)
if (cd[1,0] eq 0) && (cd[0,1] eq 0) then begin ;Unrotated coordinates?
rot = 0.
rot2 = 0.
cdelt[0] = cd[0,0]
cdelt[1] = cd[1,1]
endif else begin
rot = atan( sgn*cd[0,1], sgn*cd[0,0] )
rot2 = atan( -cd[1,0], cd[1,1] )
if rot NE rot2 then begin ;Handle unequal rotations
if keyword_set(debug) then $
print,'X axis rotation:',rot*!RADEG, ' Y axis rotation:',rot2*!RADEG
if debug eq 2 then rot = [rot,rot2] else begin
if abs(rot - rot2)*!RADEG LT 2 then rot = (rot + rot2)/2. else $
if abs(rot - rot2- tpi)*!radeg lt 2 then rot = (rot +rot2 -tpi)/2. else $
if abs(rot - rot2 +tpi)*!radeg lt 2 then rot = (rot +rot2 +tpi)/2. else $
message,/INF, $
'WARNING: X and Y axis rotations differ by more than 2 degrees'
endelse
endif
cdelt[0] = sgn*sqrt(cd[0,0]^2 + cd[0,1]^2)
cdelt[1] = sqrt(cd[1,1]^2 + cd[1,0]^2)
endelse
rot = rot*RADEG
if astr.longpole NE 180.0d then rot = rot + ( 180.0d - astr.longpole )
rot = float(rot)
cdelt = float(cdelt*RADEG)
if N_params() EQ 1 || keyword_set(DEBUG) then begin
if debug LT 2 then print,'Rotation (counterclockwise)',rot,' degrees'
print,'Sampling interval X axis',cdelt[0]*3600.,' arc seconds/pixel'
print,' Y axis',cdelt[1]*3600.,' arc seconds/pixel'
endif
return
end
|