/usr/share/gnudatalanguage/astrolib/tvlaser.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 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 | PRO TVLASER, hdr, Image, BARPOS=BarPos, CARROWS=CArrows, CLABELS=CLabels, $
COLORPS=ColorPS, COMMENTS=Comments, CSIZE=CSize, CTITLE=CTitle, $
DX=dX, DY=dY, ENCAP=encap, FILENAME=filename, HEADER=Header, HELP=Help,$
IMAGEOut=ImageOut, INTERP=Interp, MAGNIFY=Magnify, NoClose=noclose, $
NODELETE=NoDelete, NO_PERS_INFO=No_Pers_Info, NOEIGHT=NoEight, $
NOPRINT=NoPrint, NORETAIN = NoRetain, PORTRAIT=Portrait, $
PRINTER = Printer, REVERSE=Reverse, SCALE=Scale, TITLE=Title, $
XSTART=XStart, YSTART=YStart, XDIM=XDim, YDIM=YDim, $
TrueColor=TrueColor, BOTTOMDW=bottomdw, NCOLORSDW=ncolorsdw
;+
; NAME:
; TVLASER
; PURPOSE:
; Prints screen or image array onto a Postscript file or printer.
; Information from FITS header is optionally used for labeling.
;
; CALLING SEQUENCE:
; TVLASER, [header, Image, BARPOS = ,CARROWS =, CLABELS = ,/COLORPS,
; COMMENTS = ,CSIZE = ,CTITLE = , DX = , DY =, /ENCAP, FILENAME =
; HEADER = ,/HELP, IMAGEOUT = ,/INTERP, /MAGNIFY, /NoCLOSE,
; /NoDELETE, /NO_PERS_INFO, /NoEIGHT, /NoPRINT, /NoRETAIN,
; /PORTRAIT, PRINTER = , /REVERSE, /SCALE, TITLE = , /TrueColor,
; XDIM=, XSTART=, YDIM=, YSTART=, BOTTOMDW=, NCOLORSDW= ]
;
; Note that the calling sequence was changed in May 1997
; OPTIONAL INPUTS:
; HEADER - FITS header string array. Object and astrometric info from
; the FITS header will be used for labeling, if available
; IMAGE - if an array is passed through this parameter, then this image
; will be used rather than reading off the current window. This
; allows easy use of large images. It is usually preferable
; to optimally byte scale IMAGE before supplying it to TVLASER
;
; OPTIONAL KEYWORD INPUT PARAMETERS:
; BARPOS - A four- or five-element vector giving the position and
; orientation of the color bar. The first four elements
; [X0,Y0,XSize,YSize] indicate the position and size of the color
; bar in INCHES, relative to origin of the displayed image.
; (X0,Y0) are the position of the lower left corner and
; (XSize,YSize) are the width and height. The fifth element is
; optional, and if present, the color bar will be printed
; horizontally rather than vertically. If BARPOS is set to
; anything but a four- or five-element vector, the bar is NOT
; printed. The default value is BARPOS = [-0.25, 0.0, 0.2, 2.0]
; BOTTOMDW - The lowest value to use in building the density
; wedge. Used with NCOLORSDW. Compatible with BOTTOM and
; NCOLORS keywords of XLOADCT.
; CARROWS - The color to print the North-East arrows. Default is dark.
; Three types of values can be passed:
; SCALAR: that value's color in the current color table
; 3-ELEMENT VECTOR: the color will be [R,G,B]
; STRING: A letter indicating the color. Valid names are:
; 'W' (white), 'D' (dark/black), 'R' (red), 'G' (green),
; 'B' (blue), 'T' (turquoise), 'V' (violet), 'Y' (yellow),
; If the keyword is set to a value of -1, the arrows are
; NOT printed.
; COLORPS - If present and non-zero, the idl.ps file is written using
; color postscript.
; COMMENTS - A string that will be included in the comment line below the
; image. For multi-line comments you can either use "!C" in the
; string as a carriage return {although the vertical spacing
; might be a little off} or, preferably, make the COMMENTS a
; string array with each line as a separate element.
; CLABELS - Color to print the labels, same format as for CARROWS.
; CSIZE - Color to print the size-scale bar and label, same format as for
; CARROWS.
; CTITLE - Color to print the title, same format as for CARROWS.
; DX,DY - offsets in INCHES added to the position of the figure on the
; paper. As is the case for the device keywords XOFFSET and
; YOFFSET, when in landscape mode DX and DY are the same
; *relative to the paper*, not relative to the plot (e.g., DX is
; the horizontal offset in portrait mode, but the *vertical*
; offset in landscape mode).
; ENCAP - If present and non-zero, the IDL.PS file is written in
; encapsulated postscript for import into LaTeX documents
; FILENAME - scalar string giving name of output postscript file.
; Default is idl.ps. Automatically sets /NODELETE
; HEADER = FITS header. This is an alternative to supplying the FITS
; header in the first parameter.
; HELP - print out the sytax for this procedure.
; INTERP - If present and non-zero, current color table will be
; interpolated to fill the full range of the PostScript color
; table (256 colors). Otherwise, the current color table will be
; directly copied. You probably will want to use this if you
; are using IMAGE keyword and a shared color table.
; MAGNIFY - The net magnification of the entire figure. At this point,
; the figure is not automatically centered on the paper if the
; value of MAGNIFY is not equal to 1, but the DX and DY keywords
; can be used to shift location. For example, to fit a full plot
; on the printable area (8.5x8.5 inches) of the Tek PhaserIISD
; color printer use: MAGNIFY=0.8, DX=0.5, DY=0.5.;
; NCOLORSDW - The number of values to include in the density
; wedge. Used with BOTTOMDW. Compatible with
; BOTTOM/NCOLORS keywords of XLOADCT.
; NoCLOSE - If present and non-zero, then the postscript file is not
; closed (or printed), the device is set to 'PS', and the data
; coordinate system is set to match the image size. This allows the
; user to add additional plotting commands before printing. For
; example, to include a 15 pixel circle around a source at
; coordinates (150,160), around an image, im, with FITS header
; array, h
;
; IDL> tvlaser,h,im,/NoClose ;Write image & annotation
; IDL> tvcircle,15,150,160,/data ;Draw circle
; IDL> device,/close ;Close postscript file & print
;
; NoDELETE - If present and non-zero, the postscript file is kept AND is
; also sent to the printer
; NoEIGHT - if set then only four bits sent to printer (saves space)
; NO_PERS_INFO - if present and non-zero, output notation will NOT
; include date/user block of information.
; NoPRINT - If present and non-zero, the output is sent to a file (default
; name 'idl.ps'), which is NOT deleted and is NOT sent to the
; printer.
; NoRETAIN - In order to avoid possible problems when using TVRD with
; an obscured window, TVLASER will first copy the current window
; to a temporary RETAIN=2 window. Set /NORETAIN to skip this
; step and improve performance
; PORTRAIT - if present and non-zero, the printer results will be in
; portrait format; otherwise, they will be in landscape format.
; If labels are requested, image will be in portrait mode,
; regardless
; PRINTER - scalar string giving the OS command to send a the postscript
; file to the printer. Under Unix, the default value of PRINTER
; is 'lpr ' while for other OS it is 'print '
; REVERSE - if present and non-zero, color table will be fliped, so black
; and white are reversed.
; SCALE - if present and non-zero, image will be bytscaled before being
; sent to postscript file.
; TITLE - if present and non-zero, the string entered here will be the
; title of the picture. Default is the OBJECT field in the
; header (if present).
; TRUECOLOR - if present and non-zero, the postscript file is created
; using the truecolor switch (i.e. true=3). The colorbar is
; not displayed in this mode.
; XDIM,YDIM - Number of pixels. Default is from !d.x_size and !d.y_size,
; or size of image if passed with IMAGE keyword.
; XSTART,YSTART - lower left corner (default of (0,0))
;
; OPTIONAL KEYWORD OUTPUT PARAMETER
; IMAGEOUT = the image byte array actually sent to the postscript file.
;
; SIDE EFFECTS:
; A postscript file is created in the current directory. User must have
; write privileges in the current directory. The file is named idl.ps
; unless the FILENAME keyword is given. The file is directed to the
; printer unless the /ENCAP, /NoCLOSE, or /NOPRINT keywords are given.
; After printing, the file is deleted unless the /NODELETE or FILENAME
; keywords are given.
; PROCEDURE:
; Read display or take IMAGE and then redisplay into a postscript file.
; If a header exists, printout header information. If header has
; astrometry, then print out orientation and scale information.
; PROCEDURES USED:
; ARROWS, EXTAST, FDECOMP, GETROT, PIXCOLOR, SXPAR(), XYAD, ZPARCHECK
;
;*EXAMPLE:
; 1) Send a true color image (xsize,ysize,3) to a printer (i.e. print23l),
; tvlaser,huv,cpic,/colorps,/truecolor,printer="print23l"
; % TVLASER: Now printing image: $print23l idl.ps
;
; MODIFICATION HISTORY:
; Major rewrite from UIT version W. Landsman Dec 94
; Massive rewrite. Added North-East arrows, pixel scale bar, color bar,
; and keywords DX, DY, MAGNIFY, INTERP, HELP, and COMMENTS.
; Created ablility to define colors for annotation and
; text. Repositioned text labels. J.Wm.Parker, HITC, 5/95
; Make Header and Image parameters instead of keywords. Add PRINTER
; keyword. Include alternate FITS keywords. W. Landsman May 97
; Copy to a RETAIN=2 window, work without FITS header W. Landsman June 97
; Cleaner output when no astrometry in header W. Landsman June 97
; Added /INFO to final MESSAGE W. Landsman July 1997
; 12/4/97 jkf/acc - added TrueColor optional keyword.
; Added /NoClose keyword, trim Equinox format W. Landsman 9-Jul-1998
; Don't display coordinate labels if no astrometry, more flexible
; formatting of exposure time W. Landsman 30-Aug-1998
; BottomDW and NColorsDW added. R. S. Hill, 1-Mar-1999
; Apply func tab to color bar if not colorps. RSH, 21 Mar 2000
; Fix problem with /NOCLOSE and unequal X,Y sizes W. Landsman Feb 2001
; Use TVRD(True=3) if /TRUECOLOR set W. Landsman November 2001
; More synonyms, check for header supplied W. Landsman November 2007
;-
compile_opt idl2
on_error,2
if keyword_set(Help) then begin
print, 'Syntax: TVLASER, [ Header, Image ]'
print, 'Keywords: BARPOS= ,CARROWS= , CLABELS= ,/COLOPS, COMMENTS= ,'
print, ' CSIZE= , CTITLE= , DX= , DY= , /ENCAP, FILENAME= ,'
print, ' HEADER= ,/HELP, IMAGEOUT= , /INTERP, /MAGNIFY,/NoCLOSE ,'
print, ' /NoDELETE, NO_PERS_INFO, /NoEIGHT, /NoPRINT, /NORETAIN,'
print, ' /PORTRAIT,PRINTER=,/REVERSE, /SCALE, TITLE= , /TRUECOLOR,'
print, ' XDIM= ,XSTART=, YDIM= , YSTART= ] '
print, ' '
return
endif
;----------------------------;
; SECTION: INITIALIZATION ;
;----------------------------;
;;;
; Save some info and set some variables. LogoDir may need to be changed
; depending on where the GIF logos are.
;
sv_device = !D.NAME
sv_color = !P.Color
if !D.NAME EQ 'PS' then set_plot,'X' ;Return to X terminal
tvlct,sv_rr,sv_gg,sv_bb,/get
if keyword_set(NoEight) THEN NBits = 4 ELSE NBits = 8
if keyword_set(Portrait) THEN Lands = 0 ELSE Lands = 1
ColorPS = keyword_set(ColorPS)
Encap = keyword_set(Encap)
NoPrint = keyword_set(NoPrint)
NoDelete = keyword_set(NoDelete)
TrueColor= keyword_set(TrueColor)
if TrueColor then TrueValue =3 else TrueValue =0
if N_elements(hdr) EQ 0 then $
if N_elements(header) NE 0 then hdr = header
if (N_params() GE 1) and (N_elements(hdr) EQ 0) then message,/INF, $
'Warning - No valid FITS header supplied'
if N_elements(hdr) NE 0 then zparcheck,'TVLASER',hdr,1,7,1,'FITS image header'
;;;
; If no image was passed in the IMAGE keyword, then we will be reading the
; image from the screen. Default values are to start at 0,0 and read the
; entire window.
;
FromTV = N_elements(Image) eq 0
if FromTV then begin
if !D.WINDOW EQ -1 then begin
tvlaser,/help
return
endif
message,'Reading image from window ' + strtrim(!D.WINDOW,2) + $
' ... Please be patient', /INF
if not keyword_set(XStart) then XStart = 0
if not keyword_set(YStart) then YStart = 0
if not keyword_set(XDim) then XDim = !d.x_size
if not keyword_set(YDim) then YDim = !d.y_size
if not keyword_set(noretain) then begin
chan = !D.WINDOW
xsize = !D.X_SIZE & ysize = !D.Y_SIZE
window,/free,xsize=xsize,ysize=ysize
wset,!D.WINDOW
device,copy=[0,0,xsize,ysize,0,0,chan]
endif
ImageOut = tvrd(XStart,YStart,XDim,YDim,true = truevalue)
if not keyword_set(noretain) then begin
wdelete,!D.WINDOW
wset,chan
endif
endif else begin
XStart = 0
YStart = 0
XDim = (size(Image))[1]
YDim = (size(Image))[2]
ImageOut = Image
endelse
;;;
; YSpace is used to scale the vertical spacing of text and the title.
;
YSpace = (float(Xdim) / Ydim) > 1. ;Modified December 1994 WBL
XSpace = (float(Ydim) / Xdim) > 1.
;;;
; If using B/W PostScript, use NTSC color -> B/W formula, J Brinkmann
; Scale and/or reverse if desired.
;
if not(ColorPS) then ImageOut = $
0.299 * sv_rr[ImageOut] + 0.587 * sv_gg[ImageOut] + 0.114 * sv_bb[ImageOut]
if keyword_set(Scale) then ImageOut = bytscl(ImageOut)
if keyword_set(Reverse) then ImageOut = 255b - temporary(ImageOut)
;;;
; If a header is given, put in portrait mode regardless.
;
if N_elements(hdr) NE 0 then Lands = 0
;;;
; Set up colors for density wedge.
;
if N_elements(BottomDW) LE 0 then BottomDW = 0
nc = !D.table_size - BottomDW
if n_elements(NColors) GT 0 then nc = nc < ncolors
if nc LE 0 then begin
message, /INFO, 'Bad color spec; using default'
BottomDW = 0
nc = !D.table_size
endif
;------------------------------;
; SECTION: POSTSCRIPT SETUP ;
;------------------------------;
;;;
; Redirect output to Postscript printer file, which may be printed.
; Size of image is restricted to 7.5 inches in the paper's narrow direction
; for MAGNIFY=1. If we will be printing out header info, then restrict the
; Y size to be no more than 7.5 also.
;
if (Lands eq 1) then begin
inx = 10.0
iny = float(YDim)/float(XDim)*float(inx)
if (iny gt 7.5) then begin
iny = 7.5
inx = (float(XDim)/float(YDim))*float(iny)
endif
endif
if (Lands eq 0) then begin
if N_elements(hdr) NE 0 then iny = 7.5 else iny = 10.0
inx = float(XDim)/float(YDim)*float(iny)
if (inx gt 7.5) then begin
inx = 7.5
iny = (float(YDim)/float(XDim))*float(inx)
endif
endif
;;;
; Some info for the user, and setting the filename.
;
pstype = ' '
if Encap then pstype = pstype + 'encapsulated '
if ColorPS then pstype = pstype + 'color '
if not keyword_set(filename) then fname = 'idl.ps' else begin
fdecomp,filename,disk,dir,name,ext
if ext EQ '' then ext = 'ps'
fname = disk + dir + name + '.' + ext
NoDelete = 1
endelse
if keyword_set(NoDelete) or keyword_set(EnCap) or keyword_set(NoPrint) then $
message,'Writing image to' + pstype + 'postscript file ' + fname, /INF
;;;
; Set plot to the PostScript printer. Set all the device keywords.
;
set_plot, 'ps', INTERPOLATE=keyword_set(Interp)
sv_font = !P.FONT
!p.font = 0
if not keyword_set(dX) then dX = 0
if not keyword_set(dY) then dY = 0
XOff = 0.75 + dX
YOff = 10.25 + dY
if Lands then begin
device, /landscape
YOff = inx + ((11 - inx) / 2.0) + dY ; centered
endif else begin
device, /portrait
YOff = Yoff - iny
endelse
device, xsize=inx, ysize=iny, xoffset=XOff, yoffset=YOff, /inches, $
bits=NBits, filename=fname, /helvetica, encapsulated=Encap, color=ColorPS
if keyword_set(Magnify) then device, scale=Magnify else device, scale=1
;-----------------------;
; SECTION: TV OUTPUT ;
;-----------------------;
tv, ImageOut,true=TrueValue
; If the BarPos keyword has four or five elements, then show the color bar.
if (not(TrueValue)) then begin
if (N_elements(BarPos) eq 0) then BarPos = [-0.25, 0.0, 0.2, 2.0]
NumEls = N_elements(BarPos)
if ( (NumEls eq 4) or (NumEls eq 5) ) then begin
ColorBar = byte(round(congrid(findgen(nc)+BottomDW, 256))) $
# make_array(20,val=1b)
if not(ColorPS) then $
ColorBar = 0.299 * sv_rr[ColorBar] + 0.587 * sv_gg[ColorBar] $
+ 0.114 * sv_bb[ColorBar]
ColorBar[0:*,[0,19]] = 0
ColorBar[[0,255],0:*] = 0
if (NumEls eq 4) then ColorBar = transpose(ColorBar)
tv, ColorBar, BarPos[0],BarPos[1], xsize=BarPos[2],ysize=BarPos[3], /INCHES
endif
endif
;;;
; Now that the image has been displayed with the desired color table, we will
; play with the color table a bit to get the appropriate colors for the text,
; arrows, and scale bar. The three RGB values for each one will be loaded into
; vectors called things like 'CArrowsRGBN', 'CSizeRGBN', etc. The last value
; in this vector will be the location of that color in the color table.
; "Colors" is a string array of the keyword names, then via the EXECUTE
; function, we determine what the content of each variable is: a string to be
; used inthe pixcolor procedure, a single number indicating the location in the
; current color table, or a 3-element vector with RGB values. One reason for
; doing it this way, is that if more objects to be colored are added to the
; keywords, only the variable COLORS need be changed here by adding those
; keyword names.
; "Val" is where we will be temporarily putting the new colors (usually in
; the bottom bin).
;
Colors = ['CArrows','CSize','CTitle','CLabels']
r_new = bytarr(n_elements(Colors))
g_new = r_new
b_new = r_new
for N=0,(n_elements(Colors) -1) do begin
tvlct, sv_rr, sv_gg, sv_bb
Val = 0
dummy = execute( 'NumEls = n_elements(' + Colors[N] + ')' )
if (NumEls eq 0) then begin
dummy = execute( Colors[N] + ' = "D"' )
NumEls = 1
endif
dummy = execute( 'C = ' + Colors[N] )
if (NumEls eq 1) then begin ; string or color value
if ((size(C))[1] eq 7) then pixcolor, Val, C else Val = C
endif else begin
if (NumEls eq 3) then tvlct,transpose(C) else pixcolor, Val, 'D'
endelse
tvlct, r, g, b, /get
if (Val[0] ne -1) then begin
r_new[N] = r[Val]
g_new[N] = g[Val]
b_new[N] = b[Val]
dummy = execute(Colors[N]+'RGBN = [r[Val],g[Val],b[Val],N]')
endif
endfor
tvlct, r_new, g_new, b_new
;-------------------------------;
; SECTION: HEADER and LABELS ;
;-------------------------------;
;;;
; If a FITS header was given then include whatever of the following FITS
; keywords that are present as annotation: OBJECT (becomes the title if none
; given), TELESCOP, IMAGE, EXPTIME, EQUINOX, CRVAL1 (Right Ascension), CRVAL2
; (Declination), NAXIS1, NAXIS2, CD (Rotation angle and pixel size), PDSDATIM
; (Date of Microdensitometry). Also will include the name of the user and the
; current date. Some blocks can be suppressed...see description of keywords
; above. Also prints directional arrows and scale.
;
if (N_elements(Hdr) NE 0) then begin
;;;
; Does the header have astrometry?
;
extast, hdr, astr, NoAstrom
if NoAstrom GT 0 then begin
ast_type = strmid( strupcase( strtrim(astr.ctype[0],2) ), 0 ,4)
if ((ast_type NE 'RA--') and (ast_type NE 'GLON') and $ ;Valid projection?
(ast_type NE 'ELAT') ) then NoAstrom = -1
endif
if (NoAstrom LT 0) then begin
rga = 'N/A'
decl = 'N/A'
equi = ''
ROTATE = 'N/A'
CDELT = [0.0,0.0]
CDELTAS = 'N/A'
endif else begin
xcen = (XDim-XStart-1)/2.
ycen = (YDim-YStart-1)/2.
if FromTV then zoom_xy,xcen,ycen ;In case TV image has non-zero zoom or roam
xyad,hdr, xcen, ycen, ra_cen, dec_cen
str = adstring(ra_cen,dec_cen,1)
rga = strmid( str, 1, 11)
decl = strmid( str, 14, 11)
equi = sxpar( hdr, 'EQUINOX', Count = N_equi)
if N_equi EQ 0 then equi = '' else $
equi = '(' + strmid(strtrim(equi,2),0,7) + ')'
getrot, hdr ,ROTATE, CDELT
ROTATE = strtrim(string(ROTATE, format='(f7.2)'),2) + ' degrees'
CDELT = abs(CDELT*60.*60.)
if CDELT[0] LT 0.1 then fmt = '(f7.3)' else fmt = '(f7.2)'
CDELTAS = strtrim(string(CDELT[0],format=fmt ),2)
if (abs(CDELT[0] - CDELT[1]) GT 0.05*CDELT[0]) THEN $
CDELTAS = CDELTAS + ' by ' + strtrim(string(CDELT[1],format=fmt),2)
CDELTAS = CDELTAS + ' arcsec/pixel'
endelse
;;;
; Printout the image information? YSpace is used to scale the spacing of the
; linformation lines in NORMAL units. dY is one line height. LabXs and LabYs
; are arrays that define the placement of Label/Value pairs in the NORMAL
; coordinates. So to increment to the next line, simply use:
; LabYs = LabYs + dY
;
if (strtrim(CLabels[0],2) ne '-1') then begin
dY = -0.025 * YSpace
LabYs = [-0.05, -0.05] * YSpace
LabX1s = [ 0.01, 0.21] * XSpace
LabX2s = [ 0.64, 0.74] * XSpace
;;;
; Set the label color and print out each label/value.
;
!P.Color = CLabelsRGBN[3]
;OBJECT
OBJ = strtrim( sxpar(hdr,'OBJECT', Count = N_Obj),2 )
if N_Obj EQ 0 then begin
OBJ = strtrim( sxpar( hdr,'TARGNAME', Count = N_Obj),2)
if N_Obj EQ 0 then OBJ = 'N/A'
endif
XYOUTS, LabX1s, LabYs, ['OBJECT:',OBJ],/ NORMAL
LabYs = LabYs + dY
;TITLE (set here, but print out later in case no header was given)
if NOT keyword_set(TITLE) then begin
if (N_Obj NE 0) then TITLE=OBJ else TITLE = ''
endif
;IMAGE ID
imname = 'N/A'
imname = sxpar(hdr,'IMAGE', Count = N_image)
if N_image EQ 0 then imname = sxpar(hdr,'EXPNAME', Count = N_image)
if N_image EQ 0 then imname = sxpar(hdr,'OBS_ID', Count = N_image)
if N_image EQ 0 then imname = sxpar(hdr,'ROOTNAME', Count = N_image)
imname = strtrim(imname,2)
XYOUTS,LabX1s,LabYs,['IMAGE:',IMNAME],/NORMAL
LabYs = LabYs + dY
LabYs = LabYs + dY
;TELESCOPE
scop = sxpar( hdr,'INSTRUME', Count = N_Scop)
if N_Scop EQ 0 then scop = sxpar( hdr,'TELESCOP', Count = N_Scop)
if N_Scop EQ 0 then scop = sxpar( hdr,'OBSERVAT', Count = N_Scop)
if N_Scop EQ 0 then scop = '' else scop = strtrim(scop,2)
detector = sxpar( hdr,'DETECTOR', Count = N_det)
if N_det EQ 0 then detector = '' else detector = strtrim(detector,2)
if scop EQ '' then scop = detector else $
if detector NE '' then scop = scop + '/' + detector
XYOUTS,LabX1s,LabYs,['INSTRUMENT:',scop],/NORMAL
;SIZE
SIZ = strtrim(XDim,2) +' by ' + strtrim(YDim,2) + ' pixels'
XYOUTS,LabX2s,LabYs,['SIZE:',SIZ],/NORMAL
LabYs = LabYs + dY
;FILTER
filter = sxpar(hdr, 'FILTER', Count= N_filter)
if N_filter EQ 0 then filter = sxpar(hdr, 'FILTNAM1', Count= N_filter)
if N_filter EQ 0 then filter = sxpar(hdr, 'FILTER1', Count= N_filter)
if N_filter EQ 0 then FILTER = 'N/A' else filter = strtrim(filter,2)
XYOUTS,LabX1s,LabYs,['CAMERA/FILTER:',FILTER],/NORMAL
;SCALE
if NoAstrom GE 0 then XYOUTS,LabX2s,LabYs,['SCALE:',CDELTAS],/NORMAL
LabYs = LabYs + dY
;EXPOSURE TIME First try 'EXPTIME' then 'EXPOSURE' then 'INTEG'
exptime = sxpar(hdr, 'EXPTIME', Count = N_time)
if N_time EQ 0 then exptime = sxpar(hdr, 'EXPOSURE', Count = N_time)
if N_time EQ 0 then exptime = sxpar(hdr, 'INTEG', Count = N_time)
if N_time EQ 0 then exptime = 'N/A' else $
exptime = strmid( strtrim(exptime,2),0,6) + ' seconds'
XYOUTS,LabX1s,LabYs,['EXPOSURE TIME:',EXPTIME],/NORMAL
LabYs = LabYs + dY
LabYs = LabYs + dY
if noastrom GE 0 then begin
;CENTER COORDINATES
XYOUTS, LabX1s, LabYs,['CENTER '+ equi + ':', $
'RA = ' + RGA + ' DEC = ' + DECL], /NORMAL
LabYs = LabYs + dY
;ROTATION
XYOUTS,LabX1s,LabYs,['ROTATION:',strtrim(ROTATE,2)],/NORMAL
LabYs = LabYs + dY
endif
;COMMENTS
if keyword_set(Comments) then begin
XYOUTS,LabX1s[0],LabYs[0],'COMMENTS:',/NORMAL
for N=0,(n_elements(Comments)-1) do $
XYOUTS,LabX1s[1],(LabYs[1] + (dY * N)),Comments[N],/NORMAL
endif
LabYs = LabYs + dY
;USER and DATE/TIME
if not keyword_set(No_pers_info) then begin
XYOUTS, LabX2s[0],LabYs[0], GetEnv('USER') + ' (' + $
STRMID(systime(),4,20) + ')' ,SIZE=0.9, /NORMAL
endif
endif
;ARROWS
; The calculations AX and XY allow the smallest use of space for the arrows
; for all possible rotation angles. To test the extent of the circle, add
; code like the following in before the "R = float(..." line:
; hextract,ImageOut,h,i1,h1,0,5,0,5 & for N=0,18 do begin
; hrot,i1,h1,i2,h2,N*20,-1,-1,0 & getrot, h2 ,Rotate
;
if ((strtrim(CArrows[0],2) ne '-1') and (NoAstrom ne -1)) then begin
R = float(rotate) * !pi / 180
AX = ( 0.50 + (0.05 * (cos(R) + sin(R)))) * XSpace
AY = (-0.10 - (0.05 * (cos(R) - sin(R)))) * YSpace
!P.Font = -1
!P.Color = CArrowsRGBN[3]
arrows, hdr, AX, AY, /NORMAL, FONT=13, COLOR=!P.Color, arrowlen=3, charsize=2
!P.Font = 0
endif
;SIZE SCALE BAR
; This is probably more complicated than necessary, but the idea is to find
; the best size scale bar for any image, where the scale may be a few arcsec
; or a few degrees.
; "BarLength" is the length of a 1 arcsecond bar in normal coordinates
; "BarScale" is the list of standard sizes for the bar in arcsec or arcmin.
; "BarLength" is the length in normal coordiates of the "best" scale bar.
;
if ((strtrim(CSize[0],2) ne '-1') and (NoAstrom ne -1)) then begin
BarLength = 1.0 / (CDelt[0] * XDim)
BarScale = [1,2,3,5,10,15,20,25,30,40]
MinBar = 0.1 * XSpace
BS = where((BarLength * BarScale) gt MinBar) ; bar scale in arcsec?
if (BS[0] ne -1) then begin
BarLength = BarLength * BarScale[BS[0]]
BarLabel = strtrim(BarScale[BS[0]], 2) + '"'
endif else begin
BS = where((BarLength * BarScale * 60) gt MinBar) ; bar scale in arcmin?
if (BS[0] ne -1) then begin
BarLength = BarLength * BarScale[BS[0]] * 60
BarLabel = strtrim(BarScale[BS[0]], 2) + "'"
endif else begin
BarLength = BarLength * 3600
BarLabel = '1 degree'
endelse
endelse
; Barlength = BarLength * XSpace
BarX = 0.7 * XSpace ; left end of bar
BarY = -0.03 * YSpace ; Y position of bar
BarDY = 0.01 * [-1,1] * YSpace ; height of bar's endpoints
LabY = BarY - (0.025 * YSpace) ; position of label
!P.Color = CSizeRGBN[3]
plots, BarX+[0,BarLength], [BarY,BarY], /NORMAL
plots, [BarX,BarX], BarY+BarDY, /NORMAL
plots, BarLength+[BarX,BarX], BarY+BarDY,/NORMAL
xyouts, ((BarX + (BarX + BarLength)) / 2.0), LabY, /NORMAL, ALIGN=0.5, $
'!6'+BarLabel+'!X', FONT=-1
endif
endif
;;;
; TITLE (handle here in case no header was given but TITLE keyword was used.)
;
if (keyword_set(TITLE) and (strtrim(CTitle[0],2) ne '-1')) then begin
!P.Color = CTitleRGBN[3]
XYOUTS, 0.50*XSpace, 1+(0.01*YSpace), TITLE,SIZE=2.0, /NORMAL, ALIGN=0.5
endif
if keyword_set(NoClose) then begin
plot,[0,xdim-1],[0,ydim-1],/noerase,xsty=5,ysty=5,/nodata, $
pos = [0,0,1,1]
return
endif
Device,/close
;-------------------------------;
; SECTION: PRINTING THE FILE ;
;-------------------------------;
if not(NoPrint or Encap) then begin ;Should the file be printed out?
if not keyword_set(PRINTER) then begin
case !VERSION.OS_FAMILY of
'unix': printer = 'lpr'
else: printer = 'print'
endcase
endif
spawn,printer + ' ' + fname
message,/INFO,'Now printing image: $' + printer + ' ' + fname
endif
; Reset output direction to X-windows, and restore some variables.
tvlct,sv_rr,sv_gg,sv_bb
set_plot, sv_device
!P.font = sv_font
!P.Color = sv_color
return
end
|