	PRO CDS_SNAPSHOT, INPUT, ERRMSG=ERRMSG, REVERSE=REVERSE,	$
		NOCLEAN=NOCLEAN, WINDOWS=WINS, WAVESORT=WAVESORT,	$
		SPECTRA=SPECTRA, WO_CR=WO_CR, FRACTION=FRACTION,	$
		QUASI_FIT=QFIT, CHARSIZE=D_CHARSIZE, CHARTHICK=D_CHARTHICK, $
		ROTATE=DIRECTION, NOTITLE=NOTITLE, NOLABEL=NOLABEL,$
                LARGE_TITLE=LARGE_TITLE, LOG=LOG, MOSAIC=MOSAIC,	$
		MIN=IMIN, MAX=IMAX, ROLL=ROLL
;+
; Project     :	SOHO - CDS
;
; Name        :	CDS_SNAPSHOT
;
; Purpose     :	Makes a thumbnail sketch of images from a CDS study.
;
; Category    :	CDS, Class3, Quicklook
;
; Explanation :	Displays all the images associated with a CDS observation,
;		together with a label that shows information about the data.
;
; Syntax      :	CDS_SNAPSHOT, FILENAME
;		CDS_SNAPSHOT, DATA
;
; Examples    :	CDS_SNAPSHOT, 's3042r00.fits'
;
;		A = READCDSFITS('s3042r00.fits')
;		CDS_SNAPSHOT, A
;
; Inputs      :	FILENAME = Name of CDS FITS file to read in.
;
; Opt. Inputs :	DATA	 = A quicklook data structure as returned by
;			   READCDSFITS.
;
; Outputs     :	None.
;
; Opt. Outputs:	None.
;
; Keywords    :	REVERSE = If set, then plot is done in inverse video.  In other
;			  words, white areas on the screen will appear dark,
;			  and visa versa.  This saves toner on greyscale
;			  printers.
;
;		NOCLEAN = If set, then CDS_CLEAN_IMAGE is not called.
;
;		WINDOWS = An array of windows to display.  The windows can be
;			  passed as either the NUMBERS of the data windows
;			  (NOTE: numbering from 0...N-1) or as text with the
;			  LABELS of the desired spectral windows.  The windows
;			  will be displayed in the order given by the WINDOWS
;			  array, unless the WAVESORT keyword is passed.
;
;		WAVESORT = If set, then the windows are displayed in wavelength
;			   order.  (Note that second order lines will be
;			   displayed according to their first order
;			   equivalent.)
;
;		QUASI_FIT= If set, then the routine CDS_QUASI_FIT is called to
;			   extract the images.  See the documentation on that
;			   routine for more information.
;
;		SPECTRA	 = If set, then spectra are shown instead of images.
;			   For some data sets, spectra are shown by default.
;
;		MOSAIC	 = If set, then a mosaic is formed out of the
;			   individual exposures.  This option is only used for
;			   rasters made with slit #6, and is otherwise ignored.
;
;		LOG	 = If set, then spectra are plotted logarithmically.
;			   Only used for line plots.
;
;		WO_CR	 = If set, then spectra are calculated using AVG_WO_CR
;			   instead of AVERAGE.  Warning, very slow.
;
;		FRACTION = Fraction to pass to SIGRANGE function.  The default
;			   is 0.99.
;
;		CHARSIZE = Character size to use for the window labels.
;
;		CHARTHICK= Character thickness.
;
;		NOTITLE	 = If set, then the title information at the bottom of
;			   the page is suppressed.
;
;		NOLABEL	 = If set, then the labels above each data window are
;			   suppressed.
;
;		ROTATE	 = If passed, then is the value of the parameter passed
;			   to the ROTATE function to change the image
;			   orientation.  For example, using ROTATE=1 would
;			   rotate the image by +90 degrees, while ROTATE=3
;			   would rotate it by -90 degrees.  (See also ROLL).
;
;		MIN,MAX	 = Arrays of the minimum and maximum values to be
;			   applied to each window.  Must be in the same order
;			   as the windows are displayed.
;
;		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 = ''
;				CDS_SNAPSHOT, INPUT, ERRMSG=ERRMSG
;				IF ERRMSG NE '' THEN ...
;
;               LARGE_TITLE = Make last two lines of titles larger.
;
;               ROLL    = If set, and the image is from a period when SOHO is
;                         upside-down, then roll the data by 180 degrees.
;                         Ignored if ROTATE keyword is passed.
;
; Calls       :	DATATYPE, READCDSFITS, GT_WINDATA, GT_WINDESC, AVERAGE,
;		CDS_CLEAN_IMAGE, CONGRID, SIGRANGE, PUT, LABEL_IMAGE
;
; Common      :	None.
;
; Restrictions:	Can only be used for rasters which build up images via mirror
;		(and slit for GIS) movements.  Otherwise, average spectra are
;		shown.
;
; Side effects:	None.
;
; Prev. Hist. :	None.
;
; History     :	Version 1, 10-Jun-1996, William Thompson, GSFC
;		Version 2, 12-Jun-1996, William Thompson, GSFC
;			Made more robust, added NOCLEAN keyword.
;		Version 3, 13-Jun-1996, William Thompson, GSFC
;			Added call to CDS_WAVE_LABEL.
;			Modified label thickness for non-PostScript output.
;		Version 4, 17-Jul-1996, William thompson, GSFC
;			Adjust label size to space available.
;			Change way that "invisible" plot is generated, to make
;			sure it really is invisible.
;		Version 5, 23-Jul-1996, William Thompson, GSFC
;			Added keywords WINDOWS, and WAVESORT.
;		Version 6, 19-Aug-1996, William Thompson, GSFC
;			Show spectra when can't show images.  Added keyword
;			SPECTRA.
;		Version 7, 21-Aug-1996, William Thompson, GSFC
;			Added keyword WO_CR
;		Version 8, 19-Aug-1996, William Thompson, GSFC
;			Fixed bug where images appeared in one window and
;			caption in another, when TVDEVICE was enabled.
;		Version 9, 28-Oct-1996, William Thompson, GSFC
;			Added word SOHO to caption.
;			Added keyword FRACTION.
;		Version 10, 22-Nov-1996, William Thompson, GSFC
;			Handle case where only summed NIS spectrum is returned.
;		Version 11, 20-Dec-1996, William Thompson, GSFC
;			Take slit size into account in label
;		Version 12, 14-Jan-1997, Dominic Zarro & William Thompson, GSFC
;			Added keywords ROTATE, NOLABEL, NOTITLE, CHARSIZE,
;			CHARTHICK and QUASI_FIT.
;		Version 13, 20-Mar-1997, William Thompson, GSFC
;			Changed printed YHEIGHT for GIS when NY=1.
;		Version 14, 15-May-1997, CDP, RAL
;                       Added LARGE_TITLE keyword
;		Version 15, 05-Jun-1997, William Thompson, GSFC
;			Corrected bug when full height of NIS slit is not used.
;		Version 16, 13-Jun-1997, William Thompson, GSFC
;			Make sure all images displayed at same size.
;		Version 17, 15-Oct-1997, William Thompson, GSFC
;			Filter out those images which weren't read in.
;		Version 18, 20-Oct-1997, William Thompson, GSFC
;			Added keyword /NOMISSING to CDS_CLEAN_IMAGE, in case
;			the missing pixel value was set with SETFLAG.
;		Version 19, 19-Mar-1999, William Thompson, GSFC
;			Added keyword /LOG.  Made small improvements in
;			plotting of GIS spectra.
;		Version 20, 17-Sep-1999, William Thompson, GSFC
;			Made default character sizes larger on some displays
;			and more consistent across displays.
;		Version 21, 02-Nov-1999, William Thompson, GSFC
;			Added keyword MOSAIC.
;			Make window numbering from 0,...,N-1
;			Fixed PostScript bug introduced in version 20.
;		Version 22, 18-Dec-2000, William Thompson, GSFC
;			Improved generation of images for GIS data
;		Version 23, 26-Mar-2002, William Thompson, GSFC
;			Added keywords MIN, MAX
;               Version 24, 17-Jul-2003, William Thompson, GSFC
;                       Added keyword ROLL
;
; Contact     :	WTHOMPSON
;-
;
	ON_ERROR, 2
;
;  Check the number of parameters passed.
;
	IF N_PARAMS() NE 1 THEN BEGIN
	    MESSAGE = 'Syntax:  CDS_SNAPSHOT, FILENAME or ' +	$
		    'CDS_SNAPSHOT, DATA'
	    GOTO, HANDLE_ERROR
	ENDIF
;
;  Determine whether to plot images or spectra.  Could be overridden below.
;
	DO_SPECTRA = KEYWORD_SET(SPECTRA)
;
;  Determine the fraction value to use for SIGRANGE.  The default is 0.99.
;
	IF N_ELEMENTS(FRACTION) EQ 0 THEN FRACTION = 0.99
;
;  If a data structure was passed, then use it.  Otherwise, read the FITS file
;  whose name was passed.
;
	IF DATATYPE(INPUT,1) EQ 'Structure' THEN BEGIN
	    A = INPUT
	END ELSE BEGIN
	    IF DATATYPE(INPUT,1) NE 'String' THEN BEGIN
		MESSAGE = 'INPUT must be either a structure or ' +	$
			'a character string'
		GOTO, HANDLE_ERROR
	    ENDIF
;
	    A = READCDSFITS(INPUT)
	    IF DATATYPE(A,1) NE 'Structure' THEN BEGIN
		MESSAGE ='Unable to read FITS file ' + INPUT
		GOTO, HANDLE_ERROR
	    ENDIF
	ENDELSE
;
;  Extract the number of windows from either the WINDOWS array, or the data
;  structure.
;
	IF N_ELEMENTS(WINS) GT 0 THEN BEGIN
		WINDOWS = WINS
		N_WINDOWS = N_ELEMENTS(WINDOWS)
	END ELSE BEGIN
		N_WINDOWS = N_ELEMENTS(A.DETDESC)
		WINDOWS = INDGEN(N_WINDOWS)
	ENDELSE
;
;  Filter out those windows which don't exist.
;
	IXSTOP = A.DETDESC.IXSTOP
	W_VALID = WHERE(IXSTOP(0,WINDOWS) GE 0, COUNT)
	IF COUNT GT 0 THEN BEGIN
		WINDOWS  = WINDOWS(W_VALID)
		N_WINDOWS = N_ELEMENTS(WINDOWS)
	END ELSE BEGIN
		MESSAGE = 'No windows to display'
		GOTO, HANDLE_ERROR
	ENDELSE
;
;  Get the size of the image.
;
	XSIZE = ROUND(A.HEADER.NX * A.HEADER.XSTEP)
	IF A.HEADER.DETECTOR EQ 'NIS' THEN BEGIN
	    YSIZE = ROUND(A.HEADER.IYWIDTH)
	END ELSE BEGIN
	    YSIZE = ROUND(A.HEADER.NY * A.HEADER.YSTEP)
	ENDELSE
;
;  Make sure that the image is big enough to display.
;
	AA = GT_WINDATA(A,0)
	SZ = SIZE(AA)
	IF SZ(0) LT 3 THEN DO_SPECTRA = 1
	IF SZ(2) LT 3 OR SZ(3) LT 3 THEN DO_SPECTRA = 1
;
;  If the spatial area is 0 in either direction, then display spectra instead.
;
	IF XSIZE*YSIZE EQ 0 THEN DO_SPECTRA = 1
;
;  If doing spectra, but the number of NIS pixels along the slit is greater
;  than 3, then replace XSIZE and YSIZE with the number of pixels.  Save the
;  current values in XSIZE0, YSIZE0.
;
	XSIZE0 = XSIZE
	YSIZE0 = YSIZE
	IF DO_SPECTRA AND (A.HEADER.DETECTOR EQ 'NIS') AND (SZ(1) GE 3) AND $
		(SZ(3) GE 3) AND (SZ(0) GE 3) THEN BEGIN
	    XSIZE = SZ(1)
	    YSIZE = SZ(3)
	ENDIF
;
;  Make a dummy invisible plot to make sure that all the plotting parameters
;  are correctly defined.  This also has the effect of erasing the plot window.
;
	PLOT, [0,1], [0,1], /NODATA, XSTYLE=4, YSTYLE=4, NOERAS=0,	$
		COLOR=!P.BACKGROUND, TITLE=''
;
;  Allocate enough space for two normal size label lines, and one 1.5 size
;  line, plus margins.  Convert to normalized coordinates.  A target character
;  size of at least 8x12 pixels is used.
;
	LABEL_SIZE = 7.0 * (12 > !D.Y_CH_SIZE) / !D.Y_SIZE
;
;  Determine whether or not to roll the image by 180 degrees.
;
        IF KEYWORD_SET(ROLL) AND (N_ELEMENTS(DIRECTION) EQ 0) THEN BEGIN
            DD = GT_WINDESC(A,0)
            IF DD.SPACING(1) LT 0 THEN BEGIN
                IF DO_SPECTRA THEN DIRECTION=7 ELSE DIRECTION=2
            ENDIF
        ENDIF
;
;  If DIRECTION was passed, and would reverse the axes, then reverse XSIZE and
;  YSIZE.
;
	IF N_ELEMENTS(DIRECTION) EQ 1 THEN BEGIN
            DDIR = DIRECTION MOD 8
            IF DDIR LT 0 THEN DDIR = DDIR + 8
            CASE DDIR OF
                0: DO_REVERSE = 0
                1: DO_REVERSE = 1
                2: DO_REVERSE = 0
                3: DO_REVERSE = 1
                4: DO_REVERSE = 1
                5: DO_REVERSE = 0
                6: DO_REVERSE = 1
                7: DO_REVERSE = 0
            ENDCASE
            IF DO_REVERSE THEN BEGIN
                TEMP = XSIZE
                XSIZE = YSIZE
                YSIZE = TEMP
            ENDIF
	ENDIF
;
;  Determine how many rows and columns to use in displaying the images.
;
	NX = N_WINDOWS
	NY = 1
	AMAX = 0
	DXSIZE = !D.X_SIZE
	DYSIZE = !D.Y_SIZE * (1 - LABEL_SIZE)
	IF !D.NAME EQ 'PS' THEN CHARTHICK=2 ELSE CHARTHICK=1
        IF EXIST(D_CHARTHICK) THEN CHARTHICK=D_CHARTHICK
;
	IF XSIZE*YSIZE EQ 0 THEN BEGIN
	    NX = FIX(SQRT(N_WINDOWS))
	    NY = (N_WINDOWS + NX - 1) / NX
	END ELSE BEGIN
	    FOR NI = 1,N_WINDOWS DO BEGIN
		NJ = (N_WINDOWS + NI - 1) / NI
		AX = DXSIZE / (XSIZE*FLOAT(NI))
		AY = DYSIZE / (YSIZE*FLOAT(NJ))
		AA = AX < AY
		IF AA GT AMAX THEN BEGIN
			AMAX = AA
			NX = NI
			NY = NJ
		ENDIF
	    ENDFOR
	ENDELSE
	NY = NY / (1 - LABEL_SIZE)
;
;  Return XSIZE, YSIZE to their correct values.
;
	XSIZE = XSIZE0
	YSIZE = YSIZE0
;
;  Calculate the amount of space to allocate for the label above each image.
;
	IF N_ELEMENTS(D_CHARSIZE) EQ 1 THEN CHARSIZE = D_CHARSIZE ELSE	$
		CHARSIZE = DXSIZE / (80. * !D.X_CH_SIZE)
	RELATIVE = 1  -  3 * !D.Y_CH_SIZE * NY * CHARSIZE / !D.Y_SIZE
	IF RELATIVE LT 0.1 THEN BEGIN
	    CHARSIZE = CHARSIZE / 2.
	    RELATIVE = 1  -  3 * !D.Y_CH_SIZE * NY * CHARSIZE / !D.Y_SIZE
	ENDIF
;
;  Step through the windows, and determine the size to use in displaying the
;  window labels.  Also keep track of the wavelengths.
;
	WAVES = FLTARR(N_WINDOWS)
	FOR I_WINDOW = 1,N_WINDOWS DO BEGIN
	    MESSAGE = ''
	    DD = GT_WINDESC(A,WINDOWS(I_WINDOW-1),ERRMSG=MESSAGE)
	    IF MESSAGE(0) NE '' THEN GOTO, HANDLE_ERROR
	    LABEL = CDS_WAVE_LABEL(DD.LABEL)
	    CHARSIZE = (0.9*DXSIZE / (!D.X_CH_SIZE * STRLEN(LABEL) * NX)) $
		    < CHARSIZE
	    WAVES(I_WINDOW-1) = DD.WAVELENGTH
	ENDFOR
;
;  If the WAVESORT keyword was passed, then resort the windows into increasing
;  wavelength order.
;
	IF KEYWORD_SET(WAVESORT) THEN WINDOWS = WINDOWS(SORT(WAVES))
;
;  Display each window.
;
	ISIZE = 0
	FOR I_WINDOW = 1,N_WINDOWS DO BEGIN
	    DD = GT_WINDESC(A,WINDOWS(I_WINDOW-1))
	    IF KEYWORD_SET(MOSAIC) AND (A.HEADER.SLIT_NUM EQ 6) AND	$
		    (NOT KEYWORD_SET(DO_SPECTRA)) THEN BEGIN
		DO_MOSAIC = 1
		CDS_MOSAIC, A, WINDOWS(I_WINDOW-1), AA, ORIGIN
	    END ELSE BEGIN
		AA = GT_WINDATA(A,WINDOWS(I_WINDOW-1))
		DO_MOSAIC = 0
;
;  Make sure that the image is big enough to display.
;
		SZ = SIZE(AA)
		IF SZ(2) LT 3 OR SZ(3) LT 3 THEN DO_SPECTRA = 1
	    ENDELSE
;
;  Determine where to put the data.
;
	    IX = ((I_WINDOW - 1) MOD NX) + 1
	    IY = (I_WINDOW - 1)/NX + 1
;
;  Average over dimensions other than the spatial ones.
;
	    IF NOT KEYWORD_SET(DO_SPECTRA) THEN BEGIN
		IF NOT KEYWORD_SET(DO_MOSAIC) THEN BEGIN
		    IF NOT KEYWORD_SET(QFIT) THEN BEGIN
			IF SZ(1) EQ 2048 THEN AA = AA(64:2047-64,*,*,*)
			AA = AVERAGE(TEMPORARY(AA), 1, MISSING=DD.MISSING)
		    END ELSE AA = CDS_QUASI_FIT(AA, DD.MISSING, /QUIET)
		    IF SZ(0) EQ 4 THEN AA = AVERAGE(TEMPORARY(AA), 3,	$
			    MISSING=DD.MISSING)
;
;  If NIS data, then remove cosmic rays.
;
		    IF (A.HEADER.DETECTOR EQ 'NIS') AND		$
			    (NOT KEYWORD_SET(NOCLEAN)) THEN	$
			    CDS_CLEAN_IMAGE, AA, /NOMISSING
		ENDIF
;
;  Resample the data to the correct aspect ratio, and display.
;
		AA = CONGRID(TEMPORARY(AA), XSIZE, YSIZE)
		IF N_ELEMENTS(DIRECTION) EQ 1 THEN	$
			AA = ROTATE(TEMPORARY(AA), DIRECTION)
		IF (FRACTION LT 1) AND (FRACTION GT 0) THEN AA =	$
			SIGRANGE(TEMPORARY(AA), FRACTION=FRACTION,	$
			MISSING=DD.MISSING)
		IF KEYWORD_SET(REVERSE) THEN BEGIN
		    AA = -TEMPORARY(AA)
		    DD.MISSING = -DD.MISSING
		ENDIF
		IF N_ELEMENTS(IMIN) EQ N_WINDOWS THEN IIMIN = IMIN(I_WINDOW-1)
		IF N_ELEMENTS(IMAX) EQ N_WINDOWS THEN IIMAX = IMAX(I_WINDOW-1)
		PUT, AA, IX, NX, IY, NY, MISSING=DD.MISSING,	$
			RELATIVE=RELATIVE, /NOEXACT, /DISABLE,	$
			SIZE=ISIZE, MIN=IIMIN, MAX=IIMAX
		LABEL = CDS_WAVE_LABEL(DD.LABEL)
		IF NOT KEYWORD_SET(NOLABEL) THEN LABEL_IMAGE, LABEL,	$
			CHARTHICK=CHARTHICK, CHARSIZE=CHARSIZE, /DISABLE
;
;  If displaying spectra, then average over dimensions other then the spectral
;  ones.  For NIS data, attempt to show average deselected spectra.
;
	    END ELSE BEGIN
		IF KEYWORD_SET(WO_CR) AND (A.HEADER.DETECTOR EQ 'NIS') THEN $
			FUNC = 'AVG_WO_CR' ELSE FUNC = 'AVERAGE'
		IF (A.HEADER.DETECTOR EQ 'NIS') AND (SZ(1) GE 3) AND	$
			(SZ(3) GE 3) THEN BEGIN
		    IF SZ(0) EQ 4 THEN AA = CALL_FUNCTION(FUNC,	$
			    AA,4,MISSING=DD.MISSING)
		    IF SZ(2) EQ 1 THEN AA = REFORM(AA) ELSE	$
			    AA = CALL_FUNCTION(FUNC,AA,2,MISSING=DD.MISSING)
		    SZ = SIZE(AA)
		END ELSE BEGIN
		    AA = REFORM(AA)
		    SZ = SIZE(AA)
		    WHILE SZ(0) GT 1 DO BEGIN
			AA = CALL_FUNCTION(FUNC,AA,2,MISSING=DD.MISSING)
			SZ = SIZE(AA)
		    ENDWHILE
		END
;
;  If the data is single valued, then plot between the minimum and maximum
;  values.  Otherwise, use the pixel values for the data array.
;
		IF N_ELEMENTS(AA) EQ 1 THEN BEGIN
		    AA = [AA,AA]
		    WW = [DD.WAVEMIN, DD.WAVEMAX]
		END ELSE BEGIN
		    WW = DD.ORIGIN(0) + INDGEN(N_ELEMENTS(AA))*DD.SPACING(0)
		ENDELSE
;
;  Plot the data.
;
		LABEL = CDS_WAVE_LABEL(DD.LABEL)
		IF SZ(0) EQ 2 THEN BEGIN
		    IF (FRACTION LT 1) AND (FRACTION GT 0) THEN AA =	$
			SIGRANGE(AA, FRACTION=FRACTION, MISSING=DD.MISSING)
		    IF KEYWORD_SET(REVERSE) THEN BEGIN
			AA = -AA
			DD.MISSING = -DD.MISSING
		    ENDIF
		    IF N_ELEMENTS(IMIN) EQ N_WINDOWS THEN	$
			    IIMIN = IMIN(I_WINDOW-1)
		    IF N_ELEMENTS(IMAX) EQ N_WINDOWS THEN	$
			    IIMAX = IMAX(I_WINDOW-1)
                    IF (N_ELEMENTS(DIRECTION) EQ 1) THEN        $
                            AA = ROTATE(TEMPORARY(AA), DIRECTION)
		    PUT, AA, IX, NX, IY, NY, MISSING=DD.MISSING,	$
			    RELATIVE=RELATIVE, /NOEXACT, /DISABLE,	$
			    SIZE=ISIZE, MIN=IIMIN, MAX=IIMAX
		    IF NOT KEYWORD_SET(NOLABEL) THEN LABEL_IMAGE, LABEL, $
			    CHARTHICK=CHARTHICK, CHARSIZE=CHARSIZE, /DISABLE
		END ELSE BEGIN
		    SETVIEW, IX, NX, IY, NY
		    IF A.HEADER.DETECTOR EQ 'GIS' THEN BEGIN
			IF N_ELEMENTS(AA) EQ 2048 THEN BEGIN
			    AAA = GOOD_PIXELS(AA(64:2047-64),	$
				    MISSING=DD.MISSING)
			    IF KEYWORD_SET(LOG) THEN AAA = GOOD_PIXELS(AAA>0, $
				    MISSING=0)
			    AAMIN = MIN(AAA, MAX=AAMAX)
			    XSTYLE = 1
			END ELSE BEGIN
			    AAA = GOOD_PIXELS(AA, MISSING=DD.MISSING)
			    IF KEYWORD_SET(LOG) THEN AAA = GOOD_PIXELS(AAA>0, $
				    MISSING=0)
			    AAMIN = MIN( AAA, MAX=AAMAX)
			    XSTYLE = 0
			ENDELSE
		    END ELSE BEGIN
			AAMIN = MIN( GOOD_PIXELS(AA, MISSING=DD.MISSING), $
				MAX=AAMAX)
			XSTYLE = N_ELEMENTS(AA) EQ 1024
		    ENDELSE
		    PLOT, WW, AA, TITLE=LABEL, /YNOZERO, XSTYLE=XSTYLE,	$
			    YLOG=KEYWORD_SET(LOG), YRANGE=[AAMIN,AAMAX]
		    SETVIEW
		ENDELSE
	    ENDELSE
	ENDFOR
;
;  Display the title.  Make sure that each title will fit within the window.
;
	IF KEYWORD_SET(NOTITLE) THEN GOTO, FINISH
;
	IF !D.NAME EQ 'PS' THEN TCHARTHICK=5 ELSE TCHARTHICK=1
        IF EXIST(D_CHARTHICK) THEN TCHARTHICK=D_CHARTHICK
	DATE = ANYTIM2UTC(A.HEADER.DATE_OBS, /VMS, /TRUNCATE)
	YPOS = 5.0 * (12 > !D.Y_CH_SIZE) / !D.Y_SIZE
	TITLE = 'SOHO/CDS ' + A.HEADER.DETECTOR + ' Raster, ' + DATE
	CHARSIZE = (2 < (72./STRLEN(TITLE))) * DXSIZE / (80.*!D.X_CH_SIZE)
	XYOUTS, 0.5, YPOS, TITLE, ALIGNMENT=0.5, /NORMAL,	$
		CHARTHICK=TCHARTHICK, CHARSIZE=CHARSIZE
;
	YPOS = 3.0 * (12 > !D.Y_CH_SIZE) / !D.Y_SIZE
        IF KEYWORD_SET(LARGE_TITLE) THEN BEGIN
    	   TITLE = A.HEADER.OBS_PROG + ' -- ' + $
                   STRPAD(STRMID(A.HEADER.SCI_OBJ,0,25),25,/AFTER) + ' -- ' + $
		   A.HEADER.FILENAME
	   CHARSIZE = (0.9*DXSIZE / (!D.X_CH_SIZE * STRLEN(TITLE)))
        ENDIF ELSE BEGIN
    	   TITLE = A.HEADER.OBS_PROG + ' -- ' + A.HEADER.SCI_OBJ + ' -- ' + $
		   A.HEADER.FILENAME
	   CHARSIZE = (1 < (72./STRLEN(TITLE))) * DXSIZE / (80.*!D.X_CH_SIZE)
        ENDELSE
	XYOUTS, 0.5, YPOS, TITLE, ALIGNMENT=0.5, /NORMAL,	$
		CHARTHICK=CHARTHICK, CHARSIZE=CHARSIZE
;
;  Calculate the size of the image when the actual width of the slit is taken
;  into account.
;
	CASE A.HEADER.SLIT_NUM OF
		1:  BEGIN  &  SXWIDTH =  2  &  SYWIDTH =   2	& END
		2:  BEGIN  &  SXWIDTH =  4  &  SYWIDTH =   4	& END
		3:  BEGIN  &  SXWIDTH =  8  &  SYWIDTH =  50.8	& END
		4:  BEGIN  &  SXWIDTH =  2  &  SYWIDTH = 240	& END
		5:  BEGIN  &  SXWIDTH =  4  &  SYWIDTH = 240	& END
		6:  BEGIN  &  SXWIDTH = 90  &  SYWIDTH = 240	& END
		ELSE: BEGIN
		    SXWIDTH = A.HEADER.XSTEP
		    SYWIDTH = A.HEADER.YSTEP
		    END
	ENDCASE
	XXSIZE = ROUND((A.HEADER.NX-1)*A.HEADER.XSTEP + SXWIDTH)
	YYSIZE = ROUND((A.HEADER.NY-1)*A.HEADER.YSTEP + SYWIDTH)
	IF A.HEADER.DETECTOR EQ 'NIS' THEN YYSIZE = YSIZE
;
	XCEN = TRIM(ROUND(A.HEADER.XCEN))
	YCEN = TRIM(ROUND(A.HEADER.YCEN))
  	TITLE = 'Center = (' + XCEN + '",' + YCEN + '"),  ' + 'Size = ' + $
		TRIM(XXSIZE) + '"x' + TRIM(YYSIZE) + '"'
        IF KEYWORD_SET(LARGE_TITLE) THEN BEGIN
	   YPOS = 1.0 * (12 > !D.Y_CH_SIZE) / !D.Y_SIZE
	   CHARSIZE = (3 < (72./STRLEN(TITLE))) * DXSIZE / (80.*!D.X_CH_SIZE)
        ENDIF ELSE BEGIN
   	   YPOS = 1.5 * (12 > !D.Y_CH_SIZE) / !D.Y_SIZE
	   CHARSIZE = (1 < (72./STRLEN(TITLE))) * DXSIZE / (80.*!D.X_CH_SIZE)
        ENDELSE
	XYOUTS, 0.5, YPOS, TITLE, ALIGNMENT=0.5, /NORMAL,	$
		CHARTHICK=CHARTHICK, CHARSIZE=CHARSIZE
	GOTO, FINISH
;
;  Error handling point.
;
HANDLE_ERROR:
	IF N_ELEMENTS(ERRMSG) NE 0 THEN ERRMSG = 'CDS_SNAPSHOT: ' + MESSAGE $
		ELSE FOR I=0,N_ELEMENTS(MESSAGE)-1 DO	$
			MESSAGE, MESSAGE(I), /CONTINUE
;
FINISH:
	RETURN
	END
