/usr/share/gnudatalanguage/astrolib/hrot.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 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | pro hrot, oldim, oldhd, newim, newhd, angle, xc, yc, int, MISSING=missing, $
INTERP = interp, CUBIC = cubic, PIVOT = pivot,ERRMSG= errmsg
;+
; NAME:
; HROT
; PURPOSE:
; Rotate an image and create new FITS header with updated astrometry.
; EXPLANATION:
; Cubic, bilinear or nearest neighbor interpolation can be used.
;
; CALLING SEQUENCE:
; HROT, oldim, oldhd, [ newim, newhd, angle, xc, yc, int,
; MISSING =, INTERP =, CUBIC = , /PIVOT]
; INPUTS:
; OLDIM - the original image array
; OLDHD - the original FITS image header, string array
;
; OPTIONAL INPUTS:
; NEWIM - If NEWIM is set to -1, then the old image and header will
; be updated
; ANGLE - Rotation angle, degrees clockwise, scalar
; XC - X Center of rotation (-1 for center of image)
; YC - Y Center of rotation (-1 for center of image)
; INT - 0 for nearest neighbor, 1 for bilinear interpolation
; 2 for cubic interpolation.
;
; 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 INPUT KEYWORD:
; MISSING - Set this keyword to a scalar value which will be assigned
; to pixels in the output image which do not correspond to
; existing input images (e.g if one rotates off-center).
; If not supplied then linear extrapolation is used.
; ***NOTE: A bug was introduced into the POLY_2D function in IDL
; V5.5 (fixed in V6.1) such that the MISSING keyword
; may not work properly with floating point data***
;
; INTERP - scalar set to either 0 (nearest neighbor interpolation),
; 1 (bilinear interpolation), or 2 (cubic interpolation).
; The interpolation type can be specified by either the INTERP
; keyword or the int parameter
;
; CUBIC - If set and non-zero then cubic interpolation is used (see ROT),
; which is equivalent to setting INT = 2. In IDL V5.0 and later,
; this keyword can also be set to a value between -1 and 0.
;
; /PIVOT - Setting this keyword causes the image to pivot around the point
; XC, YC, so that this point maps into the same point in the
; output image. If this keyword is set to 0 or omitted, then the
; point XC, YC in the input image is mapped into the center of
; the output image.
;
; OPTIONAL OUTPUT KEYWORD:
; 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 non-interactively 30 degrees clockwise. Use
; bilinear interpolation, and set missing values to 0.
;
; IDL> HROT, im_old, h_old, im_new, h_new, 30, -1, -1, 1, MIS = 0
;
; As above but update the input image and header and pivot about (100,120)
;
; IDL> HROT, im_old, h_old, -1, -1, 30, 100, 120, 1, MIS = 0, /PIVOT
; RESTRICTIONS:
; Unlike the ROT procedure, HROT cannot be used to magnify or
; or demagnify an image. Use HCONGRID or HREBIN instead.
;
; PROCEDURE:
; The image array is rotated using the ROT procedure.
; 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
;
; PROCEDURES USED:
; CHECK_FITS, EXTAST, GETOPT(), GETROT, ROT(), STRN(), SXADDPAR
;
; MODIFICATION HISTORY:
; Written, Aug. 1986 W. Landsman, ST Systems Corp.
; Added MISSING keyword, W. Landsman March, 1991
; Added cubic interpolation, use astrometry structure Feb 1994
; Removed call to SINCE_VERSION() W. Landsman March 1996
; Assume at least V3.5, add CUBIC parameter W. Landsman March 1997
; Converted to IDL V5.0 W. Landsman September 1997
; Fix for CROTA2 defined and CDELT1 NE CDELT2, W. Landsman November 1998
; Fix documentation to specify clockwise rotation W. Landsman Dec. 1999
; Added /PIVOT keyword W. Landsman January 2000
; Added ERRMSG, Use double precision formatting, W. Landsman April 2000
; Consistent conversion between CROTA and CD matrix W. Landsman Oct 2000
; Work for both CD001001 and CDELT defined W. Landsman March 2001
; Recognize PC matrix astrometry W. Landsman December 2001
; Update astrometry correctly when /PIVOT applied W. Landsman March 2002
; Update CROTA2 astrometry correctly, approximate GSSS W.L. June 2003
; Work with CD1_1, PC1_1 and CROTA keywords W. L. July 2003
; Work with angle as a 1 element vector W.L. May 2006
;-
On_error,2
compile_opt idl2
npar = N_params()
if (npar LT 2) or (npar EQ 3) then begin ;Check # of parameters
print,'Syntax: HROT, oldim, oldhd, [ newim, newhd, angle, xc, yc, int,'
print,' CUBIC =, INTERP = , MISSING = ,/PIVOT, ERRMSG= ]'
print, 'Oldim and Oldhd will be updated if only 2 parameters supplied '
return
endif
cdr = !DPI/180.0D ;Change degrees to radians
; 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
xsize = dimen[0] & ysize = dimen[1]
xc_new = (xsize - 1)/2.
yc_new = (ysize - 1)/2.
if npar LT 8 then begin
if npar EQ 2 then print,'Program will modify old image and header'
print,'Original array size is '+ strn(xsize) + ' by ' + strn(ysize)
read,'Angle of rotation (degrees clockwise): ',angle
ans = ''
read,'Enter center (x,y) of rotation ( [RETURN] for center of image): ',ans
center = getopt(ans,'F',2)
if N_elements(center) EQ 1 then begin
xc = -1 & yc = -1
endif else begin
xc = center[0] & yc = center[1]
endelse
endif
if keyword_set( INTERP ) then int = interp
if keyword_set( CUBIC ) then int = 2
if N_elements(int) NE 1 then $
read,'Enter 0 for nearest neighbor, 1 for bilinear, 2 for cubic interpolation: ',int
case int of
0: type = ' Nearest Neighbor Approximation'
1: type = ' Bilinear Interpolation'
2: type = ' Cubic Interpolation'
else: message,'Illegal value of Interp parameter: must be 0,1, or 2'
endcase
if xc LT 0 then xc = xc_new
if yc LT 0 then yc = yc_new
if N_elements(newim) EQ 1 then $
if newim EQ -1 then npar = 2
newhd = oldhd
if N_elements(cubic) EQ 0 then cubic = (int EQ 2)
angle = angle[0]
if N_elements(MISSING) NE 1 then begin
if npar EQ 2 then begin
oldim = rot( oldim, angle, 1, xc,yc, $
CUBIC = cubic, INTERP = int, PIVOT = pivot)
endif else begin
newim = rot( oldim, angle, 1, xc,yc, $
CUBIC = cubic, INTERP = int, PIVOT = pivot)
endelse
endif else begin
if npar EQ 2 then begin
oldim = rot( oldim,angle,1,xc,yc, $
CUBIC = cubic, MISSING = missing, INTERP = int, PIVOT = pivot)
endif else begin
newim = rot( oldim, angle, 1, xc, yc, $
CUBIC = cubic, MISSING = missing, INTERP = int, PIVOT = pivot)
endelse
endelse
label = 'HROT:' + strmid(systime(),4,20)
sxaddpar, newhd, 'HISTORY', label + $
' Rotated by' + string(float(angle), FORM = '(f7.2)') + ' Degrees'
sxaddpar,newhd,'history',label+type
; Update astrometry info if it exists
extast, oldhd, astr, noparams
if strmid(astr.ctype[0],5,3) EQ 'GSS' then begin
gsss_stdast, newhd
extast, newhd, astr, noparams
endif
if noparams GE 0 then begin ;Astrometry parameters exist in header?
crpix = astr.crpix
cd = astr.cd
cdelt = astr.cdelt
theta = angle*cdr
rot_mat = [ [ cos(theta), sin(theta)], $ ;Rotation matrix
[-sin(theta), cos(theta)] ]
ncrpix = transpose(rot_mat)#(crpix-1-[xc,yc]) + 1
if ~keyword_set(PIVOT) then ncrpix = [xc_new,yc_new] + ncrpix $
else ncrpix = [xc,yc] + ncrpix
sxaddpar, newhd, 'CRPIX1', ncrpix[0]
sxaddpar, newhd, 'CRPIX2', ncrpix[1]
newcd = cd # rot_mat
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
; Just need to update the CROTA keywords
crota = atan( -newcd[1,0],newcd[1,1] )*180.0/!DPI
sxaddpar, newhd,'CROTA1', crota
sxaddpar, newhd,'CROTA2', crota
endelse
endif
if npar eq 2 then oldhd = newhd ;update old image and header
return
end
|