/usr/share/gnudatalanguage/astrolib/hrotate.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 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | pro hrotate, oldim, oldhd, newim, newhd, direction,ERRMSG = errmsg
;+
; NAME:
; HROTATE
; PURPOSE:
; Apply the IDL ROTATE function and update astrometry in a FITS header
; EXPLANATION:
; Apply the intrinsic IDL ROTATE function to an image and update
; astrometry in the associated FITS header.
;
; CALLING SEQUENCE:
; HROTATE, oldim, oldhd, newim, newhd, direction
; or
; HROTATE, oldim, oldhd, direction
;
; INPUTS:
; OLDIM - the original image array
; OLDHD - the original FITS image header, string array
; DIRECTION - Scalar integer (0-7) specifying rotation direction,
; exactly as specified by the IDL ROTATE function.
;
; Direction Transpose? Rot. CCW X1 Y1
; ----------------------------------------
; 0 No None X0 Y0 (no change)
; 1 No 90 -Y0 X0
; 2 No 180 -X0 -Y0
; 3 No 270 Y0 -X0
; 4 Yes None Y0 X0
; 5 Yes 90 -X0 Y0
; 6 Yes 180 -Y0 -X0
; 7 Yes 270 X0 -Y0
;
; OPTIONAL OUTPUTS:
; NEWIM - the rotated image, with the same dimensions as Oldim
; NEWHD - header for newim containing updated astrometry info
; If output parameters are not supplied, the program
; will modify the input parameters OLDIM and OLDHD
; to contain the rotated image and updated header.
;
; OPTIONAL KEYWORD OUTPUT:
; ERRMSG - If this keyword is supplied, then any error mesasges will be
; returned to the user in this parameter rather than depending on
; on the MESSAGE routine in IDL. If no errors are encountered
; then a null string is returned.
; EXAMPLE:
; Rotate an image exactly 90 degrees counterclockwise and update the
; FITS image array and header.
;
; IDL> HROT, im, h, im_new, h_new, 1
;
; PROCEDURE:
; The image array is rotated using the ROTATE function.
; The CD (or CROTA) and CRPIX parameters, if present in the FITS header,
; are updated for the new rotation.
; History records are also added to the header
;
; RESTRICTIONS:
; Does not work Guide Star Survey (GSS) astrometry. Use GSSS_STDAST to
; first convert
; PROCEDURES USED:
; CHECK_FITS(), SXADDPAR, EXTAST
;
; MODIFICATION HISTORY:
; Written, Mar 1997 W. Landsman, Hughes STX
; Work for non-square images W. Landsman June 1998 Raytheon STX
; Fix for different plate scales, and CROTA2 defined, November 1998
; Added ERRMSG, Use double precision formatting, W. Landsman April 2000
; Consistent conversion between CROTA and CD matrix W. Landsman Oct 2000
; Correct update when CROTA keyword present W. Landsman June 2003
; Update CDELT for AIPS-style astrometry headers M. Perrin/WL Jul 2003
; Convert GSS astrometry to WCS W. Landsman November 2004
; Work even if no astrometry present, just update NAXIS* WL June 2011
;-
On_error,2
npar = N_params()
if (npar NE 3) and (npar NE 5) then begin ;Check # of parameters
print,'Syntax - HROTATE, oldim, oldhd, newim, newhd, direction'
print,' or '
print,' HROTATE, oldim, oldhd, direction, {ERRMSG = ]'
return
endif
if npar EQ 3 then direction = newim
if N_elements(direction) NE 1 then message, $
'ERROR - Direction parameter must be an integer scalar (0-7)'
dirpar = direction mod 8
if dirpar LT 0 then dirpar = dirpar + 8
; Check that input header matches input image
save_err = arg_present(errmsg) ;Does user want error msgs returned?
; Check for valid 2-D image & header
check_FITS, oldim, oldhd, dimen, /NOTYPE, ERRMSG = errmsg
if errmsg NE '' then begin
if ~save_err then message,'ERROR - ' + errmsg,/CON
return
endif
if N_elements(dimen) NE 2 then begin
errmsg = 'ERROR - Input image array must be 2-dimensional'
if ~save_err then message,'ERROR - ' + errmsg,/CON
return
endif
if N_elements(dimen) NE 2 then message, $
'ERROR - Input image array must be 2-dimensional'
xsize = dimen[0] & ysize = dimen[1]
xc = (xsize-1)/2.
yc = (ysize-1)/2.
newhd = oldhd
if npar EQ 5 then newim = rotate(oldim, direction ) else $
oldim = rotate(oldim, direction )
case dirpar of
0: return
1: rot_mat = [ [0, 1],[-1, 0] ]
2: rot_mat = [ [-1,0],[ 0,-1] ]
3: rot_mat = [ [0,-1], [1, 0] ]
4: rot_mat = [ [0, 1], [-1,0] ]
5: rot_mat = [ [-1,0], [0, -1] ]
6: rot_mat = [ [0,-1], [1, 0] ]
7: rot_mat = [ [1, 0], [0, 1] ]
else: message,$
'ERROR - Illegal value of direction parameter, must be between 0 and 7'
endcase
if (xsize NE ysize) && (rot_mat[0,0] EQ 0) then begin
sxaddpar, newhd, 'NAXIS1', ysize
sxaddpar, newhd, 'NAXIS2', xsize
endif
label = 'HROTATE: ' + strmid(systime(),4,20)
sxaddhist, label + ' Image = ROTATE(Image,' + strtrim(direction,2) + ')',newhd
; Update astrometry info if it exists. If GSS astrometry is present, then
; convert it to standard WCS astrometry
extast, oldhd, astr, noparams
if noparams GE 0 then begin ;Astrometry parameters exist in header?
if strmid(astr.ctype[0],5,3) EQ 'GSS' then begin
gsss_stdast, newhd
extast, newhd, astr, noparams
endif
; For non-square images, check if X and Y axes have been flipped
crpix = astr.crpix
cd = astr.cd
cdelt = astr.cdelt
if cdelt[0] NE 1.0 then begin
cd[0,0] = cd[0,0]*cdelt[0] & cd[0,1] = cd[0,1]*cdelt[0]
cd[1,1] = cd[1,1]*cdelt[1] & cd[1,0] = cd[1,0]*cdelt[1]
endif
ncrpix = [xc,yc] + rot_mat#(crpix-1 -[xc,yc]) + 1
newcd = cd # transpose(rot_mat)
if (dirpar EQ 4) || (dirpar EQ 6) then begin
ncrpix[0] = xsize - ( ncrpix[0] - 1)
newcd[*,0] = -newcd[*,0]
endif
if (dirpar EQ 5) || (dirpar EQ 7) then begin
ncrpix[1] = ysize - (ncrpix[1] -1 )
newcd[*,1] = -newcd[*,1]
endif
if (xsize NE ysize) && (rot_mat[0,0] EQ 0) then begin
ncrpix[0] = ncrpix[0] - xc + yc
ncrpix[1] = ncrpix[1] - yc + xc
endif
sxaddpar, newhd, 'CRPIX1', ncrpix[0]
sxaddpar, newhd, 'CRPIX2', ncrpix[1]
if noparams EQ 3 then begin ;Transformation matrix format
sxaddpar, newhd, 'PC1_1', newcd[0,0]
sxaddpar, newhd, 'PC1_2', newcd[0,1]
sxaddpar, newhd, 'PC2_1', newcd[1,0]
sxaddpar, newhd, 'PC2_2', newcd[1,1]
endif else if noparams EQ 2 then begin
sxaddpar, newhd, 'CD1_1', newcd[0,0]
sxaddpar, newhd, 'CD1_2', newcd[0,1]
sxaddpar, newhd, 'CD2_1', newcd[1,0]
sxaddpar, newhd, 'CD2_2', newcd[1,1]
endif else begin ; noparams = 1. CROTA+CDELT type
crota = atan(-newcd[1,0], newcd[1,1] )*180.0/!DPI
if dirpar GE 4 then sxaddpar, newhd, 'CDELT1', -cdelt[0]
sxaddpar, newhd,'CROTA1', crota
sxaddpar, newhd,'CROTA2', crota
endelse
endif
if npar EQ 3 then oldhd = newhd ;update old image and header
return
end
|