/usr/share/gnudatalanguage/astrolib/fxbaddcol.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 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 | PRO FXBADDCOL,INDEX,HEADER,ARRAY,TTYPE,COMMENT,TUNIT=TUNIT, $
TSCAL=TSCAL,TZERO=TZERO,TNULL=TNULL,TDISP=TDISP, $
TDMIN=TDMIN,TDMAX=TDMAX,TDESC=TDESC,TROTA=TROTA, $
TRPIX=TRPIX,TRVAL=TRVAL,TDELT=TDELT,TCUNI=TCUNI, $
NO_TDIM=NO_TDIM,VARIABLE=VARIABLE,DCOMPLEX=DCOMPLEX, $
BIT=BIT,LOGICAL=LOGICAL,ERRMSG=ERRMSG
;+
; NAME:
; FXBADDCOL
; PURPOSE :
; Adds a column to a binary table extension.
; EXPLANATION :
; Modify a basic FITS binary table extension (BINTABLE) header array to
; define a column.
; USE :
; FXBADDCOL, INDEX, HEADER, ARRAY [, TTYPE [, COMMENT ]]
; INPUTS :
; HEADER = String array containing FITS extension header.
; ARRAY = IDL variable used to determine the data size and type
; associated with the column. If the column is defined as
; containing variable length arrays, then ARRAY must be of the
; maximum size to be stored in the column.
; Opt. Inputs :
; TTYPE = Column label.
; COMMENT = Comment for TTYPE
; Outputs :
; INDEX = Index (1-999) of the created column.
; HEADER = The header is modified to reflect the added column.
; Opt. Outputs:
; None.
; Keywords :
; VARIABLE= If set, then the column is defined to contain pointers to
; variable length arrays in the heap area.
; DCOMPLEX= If set, and ARRAY is complex, with the first dimension being
; two (real and imaginary parts), then the column is defined as
; double-precision complex (type "M"). This keyword is
; only needed prior to IDL Version 4.0, when the double
; double complex datatype was unavailable in IDL
; BIT = If passed, and ARRAY is of type byte, then the column is
; defined as containing bit mask arrays (type "X"), with the
; value of BIT being equal to the number of mask bits.
; LOGICAL = If set, and array is of type byte, then the column is defined
; as containing logical arrays (type "L").
; NO_TDIM = If set, then the TDIMn keyword is not written out to the
; header. No TDIMn keywords are written for columns containing
; variable length arrays.
; TUNIT = If passed, then corresponding keyword is added to header.
; TSCAL = Same.
; TZERO = Same.
; TNULL = Same.
; TDISP = Same.
; TDMIN = Same.
; TDMAX = Same.
; TDESC = Same.
; TCUNI = Same.
; TROTA = Same.
; TRPIX = Same.
; TRVAL = Same.
; TDELT = Same.
; ERRMSG = If defined and passed, then any error messages will be
; returned to the user in this parameter rather than
; depending on the MESSAGE routine in IDL. If no errors are
; encountered, then a null string is returned. In order to
; use this feature, ERRMSG must be defined first, e.g.
;
; ERRMSG = ''
; FXBADDCOL, ERRMSG=ERRMSG, ...
; IF ERRMSG NE '' THEN ...
;
; Calls :
; FXADDPAR, FXPAR
; Common :
; None.
; Restrictions:
; Warning: No checking is done of any of the parameters defining the
; values of optional FITS keywords.
;
; FXBHMAKE must first be called to initialize the header.
;
; If ARRAY is of type character, then it must be of the maximum length
; expected for this column. If a character string array, then the
; largest string in the array is used to determine the maximum length.
;
; The DCOMPLEX keyword is ignored if ARRAY is not double-precision.
; ARRAY must also have a first dimension of two representing the real and
; imaginary parts.
;
; The BIT and LOGICAL keywords are ignored if ARRAY is not of type byte.
; BIT takes precedence over LOGICAL.
;
; Side effects:
; If the data array is multidimensional, then a TDIM keyword is added to
; the header, unless either NO_TDIM or VARIABLE is set.
;
; No TDIMn keywords are written out for bit arrays (format 'X'), since
; the dimensions would refer to bits, not bytes.
;
; Category :
; Data Handling, I/O, FITS, Generic.
; Prev. Hist. :
; William Thompson, Jan 1992.
; W. Thompson, Feb 1992, changed from function to procedure.
; W. Thompson, Feb 1992, modified to support variable length arrays.
; Written :
; William Thompson, GSFC, January 1992.
; Modified :
; Version 1, William Thompson, GSFC, 12 April 1993.
; Incorporated into CDS library.
; Version 2, William Thompson, GSFC, 31 May 1994
; Added ERRMSG keyword.
; Version 3, William Thompson, GSFC, 23 June 1994
; Modified so that ERRMSG is not touched if not defined.
; Version 4, William Thompson, GSFC, 30 December 1994
; Added keyword TCUNI.
; Version 5, Wayne Landsman, GSFC, 12 Aug 1997
; Recognize double complex IDL datatype
; Version 6, Wayne Landsman, GSFC. C. Yamauchi (ISAS) 23 Feb 2006
; Support 64bit integers
; Version 7, C. Markwardt, GSFC, Allow unsigned integers, which
; have special TSCAL/TZERO values. Feb 2009
; Version 8, P.Broos (PSU), Wayne Landsman (GSFC) Mar 2010
; Do *not* force TTYPE* keyword to uppercase
; Version :
; Version 8, Mar 2010
;-
;
ON_ERROR,2
;
; Check the number of parameters first.
;
IF N_PARAMS() LT 3 THEN BEGIN
MESSAGE = 'Syntax: FXBADDCOL, INDEX, HEADER, ARRAY ' + $
'[, TTYPE [, COMMENT]]'
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
ENDIF
;
; Get the next column number.
;
INDEX = FXPAR(HEADER,'TFIELDS') + 1
;
; Determine the data type and size of the data array. Use this to
; calculate the parameters needed for the binary table.
;
S = SIZE(ARRAY) ;obtain size of array.
TYPE = S[S[0]+1] ;type of data.
N_ELEM = N_ELEMENTS(ARRAY) ;Number of elements
;
CASE TYPE OF
0: BEGIN
MESSAGE = 'Data parameter is not defined'
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
END
;
; If the array is of type byte, then check to see if either the BIT or LOGICAL
; keywords were passed.
;
1: BEGIN
IF N_ELEMENTS(BIT) EQ 1 THEN BEGIN
N_BYTES = LONG((BIT+7)/8)
IF N_BYTES NE N_ELEM THEN BEGIN
MESSAGE = 'Number of bits does ' + $
'not match array size.'
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
ENDIF
N_ELEM = BIT
TFORM = "X"
TF_COMMENT = 'Bit array'
END ELSE IF KEYWORD_SET(LOGICAL) THEN BEGIN
N_BYTES = N_ELEM
TFORM = "L"
TF_COMMENT = 'Logical array'
END ELSE BEGIN
N_BYTES = N_ELEM
TFORM = "B"
TF_COMMENT = 'Integer*1 (byte)'
ENDELSE
END
;
; If complex, then check to see if the DCOMPLEX keyword was set, and if the
; first dimension is two.
;
5: BEGIN
IF KEYWORD_SET(DCOMPLEX) THEN BEGIN
IF S[1] NE 2 THEN BEGIN
MESSAGE = 'The first dimension ' + $
'of ARRAY must be two'
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
ENDIF
N_BYTES = 8*N_ELEM
N_ELEM = N_ELEM / 2
TFORM = "M"
TF_COMMENT = 'Complex*16 (double-' + $
'precision complex)'
S = [S[0]-1,S[2:*]]
END ELSE BEGIN
N_BYTES = 8*N_ELEM
TFORM = "D"
TF_COMMENT = 'Real*8 (double precision)'
ENDELSE
END
;
; Note that character string arrays are considered to have an extra first
; dimension, namely the (maximum) number of characters.
;
7: BEGIN
STR_LEN = MAX(STRLEN(ARRAY))
N_BYTES = STR_LEN*N_ELEM
N_ELEM = N_BYTES
TFORM = "A"
TF_COMMENT = 'Character string'
S = [S[0]+1, STR_LEN, S[1:*]] ;Add extra dimension
END
;
; All other types are straightforward.
;
2: BEGIN
N_BYTES = 2*N_ELEM
TFORM = "I"
TF_COMMENT = 'Integer*2 (short integer)'
END
3: BEGIN
N_BYTES = 4*N_ELEM
TFORM = "J"
TF_COMMENT = 'Integer*4 (long integer)'
END
4: BEGIN
N_BYTES = 4*N_ELEM
TFORM = "E"
TF_COMMENT = 'Real*4 (floating point)'
END
6: BEGIN
N_BYTES = 8*N_ELEM
TFORM = "C"
TF_COMMENT = 'Complex*8 (complex)'
END
8: BEGIN
MESSAGE = "Can't write structures to FITS files"
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
END
9: BEGIN
N_BYTES = 16*N_ELEM
TFORM = "M"
TF_COMMENT = 'Complex*16 (double-' + $
'precision complex)'
END
12: BEGIN
;; Unsigned 16-bit integers are stored as signed
;; integers with a TZERO offset.
N_BYTES = 2*N_ELEM
TFORM = "I"
TF_COMMENT = 'Unsigned Integer*2 (short integer)'
IF N_ELEMENTS(TSCAL) EQ 0 THEN TSCAL = 1
IF N_ELEMENTS(TZERO) EQ 0 THEN TZERO = 32768
IF TSCAL[0] NE 1 OR TZERO[0] NE 32768 THEN BEGIN
MESSAGE = 'For 2-byte unsigned type, TSCAL/TZERO must be 1/32768'
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
ENDIF
END
13: BEGIN
;; Unsigned 32-bit integers are stored as signed
;; integers with a TZERO offset.
N_BYTES = 4*N_ELEM
TFORM = "J"
TF_COMMENT = 'Unsigned Integer*4 (long integer)'
IF N_ELEMENTS(TSCAL) EQ 0 THEN TSCAL = 1
IF N_ELEMENTS(TZERO) EQ 0 THEN TZERO = 2147483648D
IF TSCAL[0] NE 1 OR TZERO[0] NE 2147483648D THEN BEGIN
MESSAGE = 'For 4-byte unsigned type, TSCAL/TZERO must be 1/2147483648'
IF N_ELEMENTS(ERRMSG) NE 0 THEN BEGIN
ERRMSG = MESSAGE
RETURN
END ELSE MESSAGE, MESSAGE
ENDIF
END
14: BEGIN
N_BYTES = 8*N_ELEM
TFORM = "K"
TF_COMMENT = 'Integer*8 (long long ' + $
'integer)'
END
ENDCASE
;
; If the column is to contain variable length data, then the number of bytes
; is 8, and TFORM has "1P" in the front, and "(<n_elem>)" in the back.
;
IF KEYWORD_SET(VARIABLE) THEN BEGIN
N_BYTES = 8
TFORM = '1P' + TFORM + '(' + STRTRIM(N_ELEM,2) + ')'
TF_COMMENT = TF_COMMENT + ', variable length'
;
; Otherwise, TFORM has "<n_elem>" in the front.
;
END ELSE TFORM = STRTRIM(N_ELEM,2) + TFORM
;
; Update the mandatory keywords in the header.
;
NAXIS1 = FXPAR(HEADER,'NAXIS1')
FXADDPAR,HEADER,'NAXIS1',NAXIS1+N_BYTES
FXADDPAR,HEADER,'TFIELDS',INDEX
;
; Add the keyword defining this column.
;
COL = STRTRIM(INDEX,2) ;ASCII form of column index
FXADDPAR, HEADER, 'TFORM'+COL, TFORM, TF_COMMENT
;
; If the TTYPE parameter has been passed, then add this keyword to the header.
;
IF N_PARAMS() GE 4 THEN BEGIN
If N_PARAMS() EQ 4 THEN COMMENT="Label for column "+COL
FXADDPAR,HEADER,'TTYPE'+COL,TTYPE,COMMENT
ENDIF
;
; If the number of dimensions of the data array are greater than one, then add
; the TDIM keyword. Don't add this keyword if either the NO_TDIM, VARIABLE or
; BIT keyword is set.
;
IF (S[0] GT 1) AND NOT (KEYWORD_SET(NO_TDIM) OR KEYWORD_SET(BIT) OR $
KEYWORD_SET(VARIABLE)) THEN BEGIN
TDIM = "(" + STRTRIM(S[1],2)
FOR I = 2,S[0] DO TDIM = TDIM + "," + STRTRIM(S[I],2)
TDIM = TDIM + ')'
FXADDPAR,HEADER,'TDIM'+COL,TDIM, $
'Array dimensions for column '+COL
ENDIF
;
; If the various keywords were passed, then add them to the header.
;
IF N_ELEMENTS(TUNIT) EQ 1 THEN FXADDPAR,HEADER,'TUNIT'+COL,TUNIT, $
'Units of column '+COL
IF N_ELEMENTS(TSCAL) EQ 1 THEN FXADDPAR,HEADER,'TSCAL'+COL,TSCAL, $
'Scale parameter for column '+COL
IF N_ELEMENTS(TZERO) EQ 1 THEN FXADDPAR,HEADER,'TZERO'+COL,TZERO, $
'Zero offset for column '+COL
IF N_ELEMENTS(TNULL) EQ 1 THEN FXADDPAR,HEADER,'TNULL'+COL,TNULL, $
'Null value for column '+COL
IF N_ELEMENTS(TDISP) EQ 1 THEN FXADDPAR,HEADER,'TDISP'+COL,TDISP, $
'Display format for column '+COL
;
IF N_ELEMENTS(TDMIN) EQ 1 THEN FXADDPAR,HEADER,'TDMIN'+COL,TDMIN, $
'Minimum value in column '+COL
IF N_ELEMENTS(TDMAX) EQ 1 THEN FXADDPAR,HEADER,'TDMAX'+COL,TDMAX, $
'Maximum value in column '+COL
IF N_ELEMENTS(TDESC) EQ 1 THEN FXADDPAR,HEADER,'TDESC'+COL,TDESC, $
'Axis labels for column '+COL
IF N_ELEMENTS(TCUNI) EQ 1 THEN FXADDPAR,HEADER,'TCUNI'+COL,TCUNI, $
'Axis units for column '+COL
IF N_ELEMENTS(TROTA) EQ 1 THEN FXADDPAR,HEADER,'TROTA'+COL,TROTA, $
'Rotation angles for column '+COL
IF N_ELEMENTS(TRPIX) EQ 1 THEN FXADDPAR,HEADER,'TRPIX'+COL,TRPIX, $
'Reference pixel for column '+COL
IF N_ELEMENTS(TRVAL) EQ 1 THEN FXADDPAR,HEADER,'TRVAL'+COL,TRVAL, $
'Reference position for column '+COL
IF N_ELEMENTS(TDELT) EQ 1 THEN FXADDPAR,HEADER,'TDELT'+COL,TDELT, $
'Axis increments for column '+COL
;
IF N_ELEMENTS(ERRMSG) NE 0 THEN ERRMSG = ''
RETURN
END
|