;$author: baldwin $
;$Date: 2014-04-01 14:57:35 -0700 (Tue, 01 Apr 2014) $
;$Header: /home/cdaweb/dev/control/RCS/spdf_plotmaster.pro,v 1.289 2014/03/18 17:56:40 kovalick Exp kovalick $
;$Locker: kovalick $
;$Revision: 14728 $
;+------------------------------------------------------------------------
; NAME: spdf_plotmaster
; PURPOSE: To plot the data given in 1 to 10 anonymous structure of the type
; returned by the spdf_read_mycdf function. This function determines
; the plot type for each variable, and generates the plot.
; CALLING SEQUENCE:
; out = spdf_plotmaster(a,[more_structures])
; INPUTS:
; a = structure returned by the spdf_read_mycdf procedure.
;
; KEYWORD PARAMETERS:
; TSTART = String of the form '1996/01/02 12:00:00' or a DOUBLE CDF_EPOCH
; time that is the desired start time of the plots. Data is clipped or
; padded to conform to this time. Default is the start time of the
; earliest data.
;
; TSTOP = String of the form '1996/01/02 12:00:00' or a DOUBLE
; CDF_EPOCH time that is the desired stop time of the plots. Data is
; clipped or padded to conform to this time. Default is the stop time of
; the latest data.
;
; GIF
; Set to send plot(s) to a gif file, ie. /GIF or GIF=1L. If set a file
; will be produced in the current working directory (see OUTDIR keyword),
; using the following naming conventions: Spacecraft_instrument_pid_# (see
; the PID keyword for customization). If GIF is not set then the plot(s)
; will be put into an x-window.
;
; PS
; Set to send plot to a ps file. Works just as GIF above.
;
; PID
; May be used to customize part of the name of a gif file. The value of
; PID may be either a number or a string and will be inserted in the gif
; file name as follows: Spacecraft_instrument_pid_#.gif. If GIF is not
; set then the plot(s) will be put into an x-window and this keyword is
; ignored.
;
; OUTDIR
; This keyword indiates the output directory where a gif file will be
; placed. If GIF is set but OUTDIR is not, then the gif file will be put
; in the user's current working directory.GIF
;
; AUTO
; Set this keyword to use autoscaling instead of the variables SCALEMIN
; and SCALEMAX attribute values. The scales will be set to the min and
; max values of the data, after fill values have been filtered from the
; data (see also NONOISE keyword). If the user wishes to modify variable
; scale values for plotting purposes, you may do so by changing the
; appropriate data structure values, ie. struct.variable.scalemin = 0.0.
; Please use great care in modifying the data structures values since
; they will greatly influence what your plots or listings may look like.
;
; CDAWEB
; Set this keyword to force the margin on the right side of time series
; plots to be 100 pixels. This is the same margin used for spectrograms
; for the color bar. By default, spdf_plotmaster will examine the data, and if
; ANY spectrograms will be produced, then it will align the margins
; properly. This keyword is only necessary for use in the CDAWeb system.
;
; SLOW
; Set this keyword to have spectrogram plotted using the POLYFILL method.
; This method is slower but more accurate than TV (used in the QUICK method).
;
; SMOOTH
; Set this keyword to have spectrogram data reduced prior to plotting.
; This will increase plotting speed significantly.
;
; QUICK
; Set this keyword to have spectrograms plotted using the TV method.
; This method is very fast, but will produce inaccurate spectrograms
; if scales are non-linear or if fill data or data gaps are present
; in the data.
;
; THUMBSIZE
; Set this to change the "thumbnail" size of each image when plotting
; a series of images. The default is 50w x 62h. 12 pixels is added to
; the height to allow for the time stamps under each image. So, if
; you specify a thumsize of 70 pixels, each will actually be 70x82.
;
; FRAME
; Used to indicate the frame number within a series of images. If you
; specify FRAME = 2, then spdf_plotmaster will produce a "full size" version
; of the 3rd image in a sequence of images.
;
; COMBINE = if set, all time series and spectrogram plots will be
; combined into a single window or gif file.
; NONOISE = if set, filter values outside 3-sigma from the mean
; DEBUG = if set, turns on additional debug output.
; ELEMENTS = if set, then only these elements of a dimensional variable
; will be plotted for stack_plot use only (right now).
;
; LIMIT_MOVIE = if set, then the number of frames in a movie file
; will be limited by the underlying s/w routines (to 200 or so as of
; 2/2006) if not set, no limit on the # of frames (TJK 2/9/2006)
;
; OUTPUTS:
; out = status flag, 0=0k, -1 = problem occurred.
; AUTHOR:
; Richard Burley, NASA/GSFC/Code 632.0, Feb 22, 1996
; burley@nssdca.gsfc.nasa.gov (301)286-2864
; MODIFICATION HISTORY:
; 8/13/96 : R. Burley : Add NONOISE keyword
; 8/30/96 : R. Baldwin : Add error handling STATUS,DATASET,IMAGE,GIF
; 8/30/96 : R. Baldwin : Add orbit plotting
; 1/7/97 ; T. Kovalick : Modified many of the code that goes w/ the
; keywords; GIF, CDAWEB, TSTART, TSTOP and added
; the header documentation for them. Still more
; work to do...
; 2/10/97 ; R. Baldwin : Add SSCWEB keyword and map_keywords.pro
; function
; 6/6/97 ; T. Kovalick : Added the Stacked time series plot type.
;
; 9/4/97 ; T. Kovalick : Added the ELEMENTS keyword for stack_plot
; usage, it could also be used in time_series.
; 4/98 ; R. Baldwin : Added virtual variable plot types;
; plot_map_images.pro
; 11/98 ; R. Baldwin : Added movie_images and movie_map_images
;
;
;Copyright 1996-2013 United States Government as represented by the
;Administrator of the National Aeronautics and Space Administration. All Rights Reserved.
;
;-------------------------------------------------------------------------
FUNCTION spdf_plotmaster, a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,$
a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,$
a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,$
COMBINE=COMBINE,PANEL_HEIGHT=PANEL_HEIGHT,$
XSIZE=XSIZE,CDAWEB=CDAWEB,DEBUG=DEBUG,FILLER=FILLER,$
AUTO=AUTO,QUICK=QUICK,SLOW=SLOW,SMOOTH=SMOOTH,$
GIF=GIF, PS=PS, TSTART=TSTART,TSTOP=TSTOP,NONOISE=NONOISE,$
COLORTAB=COLORTAB,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
REPORT=REPORT,PID=PID,STATUS=STATUS,OUTDIR=OUTDIR, $
SSCWEB=SSCWEB, ELEMENTS=ELEMENTS, LIMIT_MOVIE=LIMIT_MOVIE
compile_opt idl2
; Verify that number of parameters is acceptable
if ((n_params() le 0)OR(n_params() gt 30)) then begin
print, 'STATUS= No data selected for plotting'
print,'ERROR=Number of parameters must be from 1 to 30' & return,-1
endif
;RCJ be careful using 'ps' in this program!
if keyword_set(gif) then plottype='gif' else $
if keyword_set(ps) then plottype='pscript' else $
plottype=''
; Initialize window state structure
if plottype eq 'pscript' then begin
;WS = {snum:0L,xs:0L,ys:0L,pos:lonarr(4),xmargin:[2000,1500],ymargin:[2000,3000]}
WS = {snum:0L,xs:0L,ys:0L,pos:lonarr(4),xmargin:[3500,1500],ymargin:[2000,3000]}
endif else begin ; if plot is gif/window
WS = {snum:0L,xs:0L,ys:0L,pos:lonarr(4),xmargin:[100L,40L],ymargin:[30L,100L]}
endelse
PS = 0 ; Initialize plot script structure
; RTB Test for Z-buffer use of carriage returns in labels
;!P.Charsize=1
; Initialize other local variables
a = 0 ; create variable to be filled via the execute function
a_id = -1 ; initialize the current structure number
ini_complex = dcomplex(0.0D0)
;11/3/2006 TJK - Changed the named structure PLOTDESC to PLOTDESC2 so
;that when running this s/w in client/server mode, like sscweb does,
;the ops definition doesn't conflict w/ the dev. version (because I've
;added btime16 and etime16 to this structure).
p_template = {PLOTDESC2,snum:0,vname:'',vnum:0,ptype:0,npanels:0,$
iwidth:0,iheight:0,btime:0.0D0,etime:0.0D0,btime16:ini_complex, $
etime16:ini_complex,btimett2000:long64(0),etimett2000:long64(0),title:'',source:'',movie_frame_rate:0, movie_loop:0}
; Verify proper keyword parameters
; 9/96 RTB added STATUS, OUTDIR, PID
; statusflag is not currently checked before printing
if keyword_set(STATUS) then statusflag= 1L else statusflag= 0L
;TJK took out the following and replaced with one line below.
;if keyword_set(OUTDIR) then outdir=OUTDIR else begin
; if keyword_set(CDAWEB) then outdir='/home/rumba/cdaweb/html/tmp/' $
; else outdir='tmp'
;endelse
if keyword_set(OUTDIR) then outdir=OUTDIR else outdir=''
;test to see if LIMIT_MOVIE has been set at all by the calling program
if (n_elements(LIMIT_MOVIE) gt 0) then begin
if (keyword_set(LIMIT_MOVIE)) then limit_movie=1L else limit_movie=0L
endif else limit_movie=1L
; TJK take out the relationship between CDAWEB and GIF keywords...
;if keyword_set(CDAWEB) then GIF=1L else GIF=0L
if keyword_set(PID) then pid=strtrim(string(PID),2) else pid=''
; panel_height now being set below. RCJ 02/26/2007
;if keyword_set(PANEL_HEIGHT) then pheight=PANEL_HEIGHT else pheight=100
; RCJ 10/29/03 Commented this out. Now that mode code for the combine
; keyword was added this doesn't seem to be needed.
;if n_params() eq 1 then COMBINE=1 ; single structure must be combined
;gifopen = 0L ; initialize flag indicating no gif is currently open
gif_ps_open = 0L ; initialize flag indicating no gif or ps is currently open
case plottype of
'gif': begin
max_xsize=640
; a = size(GIF) & b = n_elements(a) ; validate gif keyword
; if (a(b-2) ne 7) then GIF='idl00.gif'
noclipflag = 1
if keyword_set(PANEL_HEIGHT) then pheight=PANEL_HEIGHT else pheight=100
end
'pscript': begin
max_xsize = 18000
;max_xsize = 16000 ; fits in latex doc w/o having to fix the width
noclipflag = 1
; RCJ The numbers below are checked for later. If you change them
; here, change them in the code ahead too.
if keyword_set(PANEL_HEIGHT) then pheight=10000 else pheight=5000
end
else: begin ; determine xwindow resolution
;GIF = 0L ; set gif keyword to no gif
a = lonarr(2) & DEVICE,GET_SCREEN_SIZE=a ; get device resolution
max_xsize = (a[0] * 0.9) & max_ysize = (a[1] * 0.9)
noclipflag = 0
if keyword_set(PANEL_HEIGHT) then pheight=PANEL_HEIGHT else pheight=100
end
endcase
; Open report file if keyword is set
;if keyword_set(REPORT) then begin & reportflag=1L & a=size(REPORT)
; if (a(n_elements(a)-2) ne 7) then REPORT='idl.rep'
if keyword_set(REPORT) then begin
reportflag=1L & OPENW,1,REPORT,132,WIDTH=132
endif else reportflag=0L
if keyword_set(XSIZE) then WS.xs=XSIZE else WS.xs=max_xsize
if keyword_set(AUTO) then autoscale = 1L else autoscale = 0L
;if keyword_set(SMOOTH) then smoothflag = 1L else smoothflag = 0L
if keyword_set(QUICK) then quickflag = 1L else quickflag = 0L
if keyword_set(SLOW) then slowflag = 1L else slowflag = 0L
if keyword_set(FILLER) then fillflag = 1L else fillflag = 0L
if keyword_set(DEBUG) then debugflag = 1L else debugflag = 0L
if keyword_set(SSCWEB) then SSCWEB=1L else SSCWEB=0L
; Evaluate each dataset structure, and each variable within each dataset,
; in order to determine the plot type for each variable, as well as the total
; number of panels to be plotted so that the windows (or Z-buffer) can be
; created with the proper size.
plottable_found = 0 ; initialize flag
for i=0,n_params()-1 do begin ; process each structure parameter
w = execute('a=a'+strtrim(string(i),2))
if w ne 1 then begin
if (reportflag eq 1) then begin
printf, 1, 'STATUS= A plotting error has occurred' & close,1
endif
print,'ERROR= Error in EXECUTE function'
print, 'STATUS= A plotting error has occurred'
return, -1
endif
; RTB Add code to trap a=-1 bad structures
ibad=0
str_tst=size(a)
if(str_tst[str_tst[0]+1] ne 8) then begin
ibad=1
v_data='DATASET=UNDEFINED'
v_err='ERROR=a'+strtrim(string(i),2)+' not a structure.'
v_stat='STATUS=Cannot plot this data'
a=create_struct('DATASET',v_data,'ERROR',v_err,'STATUS',v_stat)
endif else begin
; Test for errors trapped in spdf_read_mycdf
atags=tag_names(a)
rflag=spdf_tagindex('DATASET',atags)
if(rflag[0] ne -1) then ibad=1
endelse
;
if(ibad) then begin
atags=tag_names(a)
aw=where(atags eq 'ERROR',awc)
print,a.DATASET
if(awc gt 0) then print,a.ERROR
print,a.STATUS
p=p_template
;TJK 1/24/01 - change the ptype to -1 so that the plotting s/w lower down
;won't bother trying to do anything w/ this variables data (since it won't
;be there). I believe, the main reason we end up here is that the data
;is fill and indicates that the instrument was off.
; p(0).ptype=0
p[0].ptype=-1
p[0].snum=i
endif else begin
;total_npanels=0
vnames = tag_names(a)
p = replicate(p_template,n_elements(vnames))
for j=0,n_elements(tag_names(a))-1 do begin
b = evaluate_varstruct(a.(j)) & c = size(b)
if c[n_elements(c)-2] ge 8 then begin ; record the evaluation results
p[j].snum = i & p[j].vnum = j
p[j].ptype = b.ptype & p[j].npanels = b.npanels
p[j].iwidth = b.iwidth & p[j].iheight = b.iheight
p[j].btime = b.btime & p[j].etime = b.etime
p[j].btime16 = b.btime16 & p[j].etime16 = b.etime16
p[j].btimett2000 = b.btimett2000 & p[j].etimett2000 = b.etimett2000
p[j].title = b.title & p[j].source = b.source
p[j].movie_frame_rate = b.movie_frame_rate
p[j].movie_loop = b.movie_loop
if (b.vname ne '') then p[j].vname=b.vname else p[j].vname=vnames[j]
if b.ptype ne 0 then plottable_found = 1; set flag
; RCJ 02/21/2007 This is only working for timeseries for now:
;if p(j).ptype eq 1 then total_npanels=total_npanels+p(j).npanels
; RCJ 03/16/2007 Timeseries and spectrograms:
;if (p(j).ptype eq 1 or p(j).ptype eq 2) then total_npanels=total_npanels+p(j).npanels
; RCJ 04/23/2007 Timeseries, spectrograms, stack_plots, radar and
; orbit plots, and time_text,
; but we don't have to add npanels for radar, orbit plots, or time_text:
;if (p(j).ptype eq 1 or p(j).ptype eq 2 or p(j).ptype eq 7) then total_npanels=total_npanels+p(j).npanels
endif else begin ; fatal error during evaluation
if (reportflag eq 1) then $
printf,1,'STATUS=A plotting error has occurred' & close,1
print,'STATUS=A plotting error has occurred'
print,'ERROR=FATAL error during eval'
return,-1
endelse
endfor ; for every variable
endelse
if (plottype eq 'pscript') then begin
failed=0
;q=where (p(*).ptype gt 1)
;q=where (p(*).ptype gt 2)
q=where (p[*].ptype gt 2 and p[*].ptype ne 7 $
and p[*].ptype ne 3 and p[*].ptype ne 5 and p[*].ptype ne 12)
if q[0] ne -1 then begin
for k=0,n_elements(q)-1 do begin
; RCJ For each case that's commented out I have to
; remove the condition "and (plottype ne 'pscript')"
; from the part of the code that does the specific plot
case p[q[k]].ptype of
;1:thisptype='time_series'
;2: thisptype='spectrogram, topside_ionogram or bottomside_ionogram'
;3:thisptype='radar_vector'
4:thisptype='image'
;5:thisptype='orbit'
6:thisptype='mapped'
;7:thisptype='stack_plot'
8:thisptype='map_image'
9:thisptype='plasmagram'
10:thisptype='movie'
11:thisptype='map_movie'
;12:thisptype='time_text'
13:thisptype='flux_image'
14:thisptype='flux_movie'
15:thisptype='plasma_movie'
16:thisptype='fuv_image'
17:thisptype='fuv_movie'
18:thisptype='wind_plot'
19:thisptype='wind_movie'
20:thisptype='skymap' ;special mapped image s/w for TWINS
21:thisptype='skymap_movie' ;special mapped image s/w for TWINS
else: thisptype='unknown type'
endcase
failed=failed+1
mm=''
;if (pheight eq 5000 and total_npanels gt 4) then mm=' and no more than 4 plots for ps/pdf please!'
;if (pheight eq 10000 and total_npanels gt 2) then mm=' and no more than 2 plots for ps/pdf please!'
;print,'STATUS= Sorry. PS/PDF output is not now possible for '+p(q[k]).vname+ $
; ', which is a '+thisptype+' display'+mm
endfor
;print, 'ERROR= PS/PDF output(s) failed.'
; RCJ if all are going to fail (-1 because one is Epoch) return error
; if not, each failing ps plot will be skipped below,
; when its turn comes about.
;if failed eq n_elements(p(*).ptype)-1 then return, -1
endif
;if (pheight eq 5000 and total_npanels gt 4) then begin
; print,'STATUS= No more than 4 plots for ps/pdf please!'
; print, 'ERROR= More than 4 plots requested for ps'
; return, -1
;endif
;if (pheight eq 10000 and total_npanels gt 2) then begin
; print,'STATUS= No more than 2 plots for ps/pdf please!'
; print, 'ERROR= More than 2 plots requested for ps'
; return, -1
;endif
endif
; append the plot evaluations of the current structure to any previous ones
if (i eq 0) then PS = p else PS = [PS,p]
; RTB changed from a_id = i
; a_id = i
; if (i eq 0) then a_id=-1 else a_id = i ; set parameter id variable
endfor ; evaluate every data structure
; Check flag to determine if any plottable variables were found.
;TJK changed the two status messages to be a little more descriptive -
;basically, no data was found that could be plotted.
;TJK 12/21/2005 added check for ptype - if its equal to -1, then we've
;already printed out the error and status, don't print the message below
if (plottable_found eq 0) then begin
if (p[0].ptype gt -1) then begin
print,'STATUS=No plottable data found for selected variables.'
print,'STATUS=Please select another time range. Either your time range was too short (no data found for the interval) or'
print,'STATUS=too long (your session timed out before all of the data you requested could be read).'
endif
if (reportflag eq 1) then begin
printf,1,'STATUS=A plotting error has occurred'
close,1
endif
return,-1
endif
; make sure timetexts will be displayed last in gif/ps/window:
if keyword_set(combine) then begin
q12 = where(ps.ptype eq 12 or ps.ptype eq 0)
if q12[0] ne -1 then begin
qnot12=where(ps.ptype ne 12 and ps.ptype ne 0)
if qnot12[0] ne -1 then begin
ps_tmp=[ps[qnot12],ps[q12]]
endif else begin
ps_tmp=[ps[q12[0]],ps[q12]]
ps_tmp[0].vname='CDAWeb_created_variable' & ps_tmp[0].ptype=1 & ps_tmp[0].npanels=1
endelse
endif else begin
ps_tmp=ps
endelse
ps=ps_tmp
endif else begin
min_snum=min(ps.snum,max=max_snum)
psd=[ps[0]]
psd.ptype=-99
for i=min_snum,max_snum do begin
q_snum=where(ps.snum eq i)
ps_snum=ps[q_snum]
;q12=where(ps_snum.ptype eq 12 or ps_snum.ptype eq 0) ; support data (0) goes
q12=where(ps_snum.ptype eq 12 or ps_snum.ptype eq 0) ; support data (0) goes
; after plot types
q_zero=where(ps_snum.ptype eq 0,count)
;if q12[0] ne -1 then begin
if (q12[0] ne -1) and (count ne n_elements(ps_snum.ptype)) then begin
qnot12=where(ps_snum.ptype ne 12 and ps_snum.ptype ne 0)
if qnot12[0] ne -1 then begin
ps_tmp=[ps_snum[qnot12],ps_snum[q12]]
endif else begin
ps_tmp=[ps_snum[q12[0]],ps_snum[q12]]
ps_tmp[0].vname='CDAWeb_created_variable' & ps_tmp[0].ptype=1 & ps_tmp[0].npanels=1
endelse
endif else begin
ps_tmp=[ps_snum]
endelse
psd=[psd,ps_tmp]
endfor
ps=psd[where(psd.ptype ne -99)]
endelse
;
; n_q12 and q12 to be used later, if keyword 'combine' is set. RCJ
q12 = where(ps.ptype eq 12,n_q12)
;
; For SSCWEB read keyword file
if(SSCWEB) then begin
REPORT=OUTDIR+'idl_'+PID+'.rep'
reportflag=1L
OPENW,1,REPORT,132,WIDTH=132
station=create_struct('NUM',0)
status=map_keywords(ORB_VW=orb_vw, XUMN=xumn, XUMX=xumx, YUMN=yumn, $
YUMX=yumx,ZUMN=zumn,ZUMX=zumx,RUMN=rumn,RUMX=rumx, $
DOYMARK=doymark, HRMARK=hrmark, HRTICK=hrtick, $
MNTICK=mntick,MNMARK=mnmark,LNTHICK=lnthick,$
CHTSIZE=chtsize, BZ=bz, PRESS=press, STATION=station, $
IPROJ=iproj,LIM=lim,LATDEL=latdel, LONDEL=londel, $
Ttitle=thetitle,SYMSIZ=symsiz, SYMCOL=symcol, POLAT=polat, $
POLON=polon, ROT=rot, LNLABEL=lnlabel,BSMP=bsmp,ATLB=autolabel,$
DTLB=datelabel,XSIZE=xs_ssc,YSIZE=ys_ssc, NOCONT=nocont,$
EQLSCL=eqlscl,PANEL=panel,$
REPORT=reportflag,PID=PID,OUTDIR=OUTDIR,US=us,_extra=extras)
;TJK quick test to see if I can change the line thickness
;lnthick = 2.0
if (not(keyword_set(ps))) then begin
if(n_elements(xs_ssc) ne 0) then WS.xs=xs_ssc
if(n_elements(ys_ssc) ne 0) then WS.ys=ys_ssc
print, 'not setting xs_ssc and yx_ssc because want postscript'
endif
endif
; Need to determine GIF naming method, which depends on whether only a single ; GIF file or multiple ones. Currently, only a single GIF can be produced
; by this routine, but this will have to change, and this will involve the
; other plot types, which will have to be in separate gifs.
multiple_gifs = 0L & gif_counter = 0L ; initialize assuming single
if keyword_set(GIF) then begin
if ((NOT keyword_set(COMBINE))AND(n_params() gt 1)) then multiple_gifs=1L
endif
; RCJ. multiple_gifs is not used so I'm not going to create
; the same var for postscript, only ps_counter:
ps_counter=0L
; If we are combining variables from different megastructures, then we must
; determine the start time and stop time of the data so that they can be
; plotted along a common axis. This is overridden by TSTART/TSTOP keywords
; TJK commented out start_time = 0.0D0 ; initialize
; need to set default values for start_time and stop_time
; if min in p.btime = [0,0,epoch] then min epoch will be missed RTB
btime=ps.btime ; RTB
we=where(btime ne 0.D0,wc) ; RTB
if (wc gt 0) then min_ep=btime[we] $
else min_ep=0.D0 ; need some default value. min_ep would be
;undefined below if time range requested has no data in it
; RCJ 05/28/2003 var fUHR from dataset po_h1_pwi caused problem here
; when one of its cdfs had all virtual values for epoch,
; making btime=0.0D0, the default
; TJK 10/27/2006 - add checking for epoch16 times when epoch doesn't exist
; RCJ 04/09/2013 Look for tt2000 too
if we[0] eq -1 then begin
;btime = ps.btime16 ;try looking for epoch16 value
;we=where(btime ne 0.D0,wc)
;if we[0] eq -1 then min_ep=0.0D0 else min_ep=btime[we]
btime16 = ps.btime16 ;try looking for epoch16 value
btime2000 = ps.btimett2000 ;try looking for tt2000 value
we1=-1 & we2=-1
we1=where(btime16 ne 0.D0,wc)
we2=where(btime2000 ne long64(0),wc)
if we1[0] ne -1 then min_ep=btime16[we1]
if we2[0] ne -1 then min_ep=btime2000[we2]
endif
etime=ps.etime
we=where(etime ne 0.D0,wc)
if (wc gt 0) then max_ep=etime[we] else $
max_ep=0.D0 ; need some default value. max_ep would be
;undefined below if time range requested has no data in it
;TJK 10/27/2006 - add checking for epoch16 end times when epoch doesn't exist
; RCJ 04/09/2013 Look for tt2000 too
if we[0] eq -1 then begin
;etime = ps.etime16 ;try looking for epoch16 value
;we=where(etime ne 0.D0,wc)
;if we[0] eq -1 then max_ep=0.0D0 else max_ep=etime[we]
etime16 = ps.etime16 ;try looking for epoch16 value
etime2000 = ps.etimett2000 ;try looking for tt2000 value
we1=-1 & we2=-1
we1=where(etime16 ne 0.D0,wc)
we2=where(etime2000 ne 0.D0,wc)
if we1[0] ne -1 then max_ep=etime16[we1]
if we2[0] ne -1 then max_ep=etime2000[we2]
endif
start_time = min(min_ep)
stop_time = max(max_ep)
;print,'start time ', start_time, ' ', 'stop_time ',stop_time, ' before tstart/tstop code'
; TJK 7/20/2006 - compute the equivalent epoch16 start/stop times so
; that comparison w/ data stored as epoch16 is
; possible.
;if keyword_set(TSTART) then begin ; determine datatype and process if needed
if (keyword_set(TSTART) or ((not keyword_set(TSTART)) and (start_time ne 0.0))) then begin ; determine datatype and process if needed
if ((not keyword_set(TSTART)) and (start_time ne 0.0)) then TSTART=start_time
b = size(TSTART) & c = n_elements(b)
; if (b(c-2) eq 5) then start_time = TSTART $ ; double float already
; else if (b(c-2) eq 7) then start_time = encode_cdfepoch(TSTART) $ ; string
case b[c-2] of
5: begin
start_time = TSTART
end
7: begin
;TJK 10/23/2009 if the TSTART value has a milliseconds component, use
;that when computing the start time (to get the precision)
split_ep=strsplit(TSTART,'.',/extract)
start_time = encode_cdfepoch(TSTART) ; string
;start_time16 = encode_cdfepoch(TSTART,/EPOCH16) ; string
if (n_elements(split_ep) eq 2) then begin
start_time16 = encode_cdfepoch(TSTART,/EPOCH16,msec=split_ep[1]) ; string
start_timett = encode_cdfepoch(TSTART, /TT2000, MSEC=split_ep[1]) ;TJK added for TT2000 time
endif else begin
start_time16 = encode_cdfepoch(TSTART,/EPOCH16) ; string
start_timett = encode_cdfepoch(TSTART, /TT2000) ;TJK added for TT2000 time
endelse
end
14: begin
start_timett=TSTART ; already long64
end
else: begin
if (reportflag eq 1) then $
printf,1,'STATUS= Time Range Error' & close, 1
print,'STATUS= Time Range Error'
print,'ERROR= TSTART parameter must be STRING or DOUBLE' & return,-1
end
endcase
endif else begin
if keyword_set(COMBINE) then begin
; first find all structures with variable plotted as t/s or spectrum
if keyword_set(DEBUG) then print,'Computing combined axis start time...'
w = where(((PS.ptype eq 1) OR (PS.ptype eq 2)),wc)
if (wc gt 0) then begin ; now find earliest time of these structures
b = PS[w].snum & bs = size(b) ; determine structure numbers
if (bs[0] gt 0) then begin & c=uniq(b) & b=b[c] & endif ; make list
;c = where(PS.btime ne 0.0D0,wc) ; find list of all start times
c = where(((PS.btime ne 0.0D0) and (strpos(strupcase(ps.vname),'EPOCH') ne -1)),wc)
if (wc gt 0) then begin ;TJK added
w = where(PS[c].snum eq b) ; find which times belong to t/s & spectro
start_time = min(PS[c[w]].btime) & b = decode_cdfepoch(start_time)
if keyword_set(DEBUG) then print,'Combined axis start time=',b
endif else $
if keyword_set(DEBUG) then print,'Combined axis start time=',start_time
endif
endif
endelse
; If we are combining variables from different megastructures, then we must
; determine the stop time of the data so that they can be plotted along a
; common axis. This is overridden by TSTOP keyword.
; TJK commented out stop_time = 0.0D0 ; initialize
;if keyword_set(TSTOP) then begin ; determine datatype and process if needed
if (keyword_set(TSTOP) or ((not keyword_set(TSTOP)) and (stop_time ne 0.0))) then begin ; determine datatype and process if needed
if ((not keyword_set(TSTOP)) and (stop_time ne 0.0)) then TSTOP=stop_time
b = size(TSTOP) & c = n_elements(b)
; if (b(c-2) eq 5) then stop_time = TSTOP $ ; double float already
; else if (b(c-2) eq 7) then stop_time = encode_cdfepoch(TSTOP) $ ; string
case b[c-2] of
5: begin
stop_time = TSTOP ; stop_time is double float already
end
7: begin
;TJK 10/23/2009 if the TSTOP value has a milliseconds component, use
;that when computing the start time (to get the precision)
split_ep=strsplit(TSTOP,'.',/extract)
stop_time = encode_cdfepoch(TSTOP) ; string
; stop_time16 = encode_cdfepoch(TSTOP,/EPOCH16) ; string
if (n_elements(split_ep) eq 2) then begin
stop_time16 = encode_cdfepoch(TSTOP,/EPOCH16,msec=split_ep[1]) ; string
stop_timett = encode_cdfepoch(TSTOP, /TT2000, MSEC=split_ep[1]) ;TJK added for TT2000 time
endif else begin
stop_time16 = encode_cdfepoch(TSTOP,/EPOCH16) ; string
stop_timett = encode_cdfepoch(TSTOP, /TT2000) ;TJK added for TT2000 time
endelse
end
14: begin
stop_timett= TSTOP ; already long64
end
else: begin
if (reportflag eq 1) then $
printf,1,'STATUS= Time range error.' & close,1
print,'ERROR= TSTOP parameter must be STRING or DOUBLE' & return,-1
print, 'STATUS= Time range error.'
end
endcase
endif else begin
if keyword_set(COMBINE) then begin
; first find all structures with variable plotted as t/s or spectrum
if keyword_set(DEBUG) then print,'Computing combined axis stop time...'
w = where(((PS.ptype eq 1)OR(PS.ptype eq 2)),wc)
if (wc gt 0) then begin ; now find latest time of these structures
b = PS[w].snum & bs = size(b) ; determine structure numbers
if (bs[0] gt 0) then begin & c=uniq(b) & b=b[c] & endif ; make list
c = where(PS.etime ne 0.0D0,wc) ; find list of all stop times
if (wc gt 0) then begin ;TJK added
w = where(PS[c].snum eq b) ; find which times belong to t/s & spectro
stop_time = max(PS[c[w]].etime) & b = decode_cdfepoch(stop_time)
if keyword_set(DEBUG) then print,'Combined axis stop time=',b
endif else $
if keyword_set(DEBUG) then print,'Combined axis stop time=',stop_time
endif
endif
endelse
; Modify the window margin if ordered or required for spectrogram plots
if keyword_set(CDAWEB) then begin ; leave space for colorbar
; TJK change this allow more space on the right WS.xmargin=[100,100] & cdawebflag = 1L
case plottype of
'pscript': begin
;WS.xmargin=[2000,1500] ; see later if this needs to change
cdawebflag = 1L
end
else: begin ; gif/xwindows
WS.xmargin=[90,110]
cdawebflag = 1L
end
endcase
endif else begin ; determine if extra space for spectrogram colorbar is needed
w = where(PS.ptype eq 2,wc)
if (wc gt 0) then WS.xmargin=[89,110]
cdawebflag = 0L
endelse
;if ((NOT keyword_set(GIF)) and keyword_set(CDAWEB)) then begin
if (plottype eq '' and keyword_set(CDAWEB)) then begin
CDAWEB = 0L ; turn CDAWEB off if no gif.
cdawebflag = 0L
endif
; Make a pass thru the plot script and generate all timeseries and
; spectrogram plots. Create windows or gif files as needed.
; gather some info to be used if there is ptype = 12. RCJ
case plottype of
'pscript': begin ; these are all .... empirical.
pheight_12=500
labeloffset=-1500
end
else: begin ; same for gif/xwindows
pheight_12=10 ; 10 is the ysize of each line of label
labeloffset=-40
end
endcase
prev_snum=ps[0].snum
;
if keyword_set(COMBINE) then begin
combined_title = 'Multiple datasets being plotted; refer to labels on either side of plot. ' ;TJK added 10/14/2003
pi_list = 'Please acknowledge data provider(s), '
l_source = ''
endif
for i=0,n_elements(PS)-1 do begin
;TJK 3/14/2012 - add this check for ptype of -1 to go w/ added a
; display_type value of "no_plot", so that we can turn
; off plotting of certain variables in the masters.
if (PS[i].ptype eq -1 and PS[i].npanels eq 0) then begin
print, 'STATUS=',PS[i].source,':',PS[i].vname,' plotting not supported.'
endif
; Prepare for plotting by creating window and last_plot flag
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if ((PS[i].ptype eq 1)OR(PS[i].ptype eq 2)OR(PS[i].ptype eq 7)OR $
(PS[i].ptype eq 12)) then begin
; 1: time_series
; 2: spectrogram, topside_ionogram, bottomside_ionogram
; 7: stack_plot
; 12: time_text
;
q12snum=where(ps.snum eq ps[i].snum and ps.ptype eq 12,n_q12snum)
if not keyword_set(combine) and (q12snum[0] ne -1) and (ps[i].snum ne prev_snum) then begin
if plottype eq 'gif' then labeloffset=-40 ; reset offset for next timetext
if plottype eq 'pscript' then labeloffset=-1500 ; reset offset for next timetext
prev_snum=ps[i].snum
endif
;if q12snum[0] ne -1 then print,ps(q12snum).vname,ps(q12snum).ptype,ps(q12snum).npanels
;
; Determine if this plot will fit within current window/gif
;if (ps[i].ptype eq 12) then b = WS.pos[3] - (ps[i].npanels * pheight_12) $
;else b = WS.pos[3] - (ps[i].npanels * pheight)
; RCJ 09/28/2007 This *1. is needed. npanels and pheight
; are integers and if npanels is too high (8 already caused
; problems) then the multiplication of the 2 will give us
; garbage in return.
if (PS[i].ptype eq 12) then b = WS.pos[3] - (PS[i].npanels*1. * pheight_12) $
else b = WS.pos[3] - (PS[i].npanels*1. * pheight)
;if (b lt WS.ymargin[1]) then new_window = 1 else new_window = 0
; the above statement was valid when we only had graphs
; but now we have labels too. RCJ 03/10/00
if (b lt 50) then new_window = 1 else new_window = 0
; if nonoise is set, make title say so
if keyword_set(nonoise) then ps[i].title=ps[i].title+'!CFiltered to remove values >3-sigma from mean of all plotted values'
; Create a window/gif/ps file if current plot will not fit
if (new_window eq 1) then begin
if keyword_set(DEBUG) then print,'Creating new window...'
;if keyword_set(GIF) then begin ; writing to gif file
if (plottype eq 'gif' or plottype eq 'pscript') then begin
; writing to gif/ps file
; Close the currently open gif file - if any
;if (gifopen eq 1) then begin
if (gif_ps_open eq 1) then begin
if plottype eq 'pscript' then $
project_subtitle,a.(0),mytitle,/ps,SSCWEB=SSCWEB,tcolor=0 $; title/subtitle the ps
else $
project_subtitle,a.(0),mytitle,SSCWEB=SSCWEB,tcolor=0 ; title/subtitle the gif
deviceclose & gif_ps_open=0 ; close it
endif
;TJK 12/14/2004 - need to check whether ELEMENTS are specified, if so this determines the
;number of panels for a given variable for a dataset. Reine is trying to use this in her
;Web services client...
if n_elements(ELEMENTS) ne 0 then begin
PS[i].npanels = n_elements(ELEMENTS)
endif
; Determine the size for the next gif file
if keyword_set(COMBINE) then begin
; compute size to fit t/s and spectrograms for ALL variables
w = where((PS.ptype eq 1)OR(PS.ptype eq 2)OR(PS.ptype eq 7))
if (w[0] ne -1) then b = (total(PS[w].npanels)*1. * pheight) else b = 0
if (q12[0] ne -1) then b = b +(total(ps[q12].npanels)*1.* pheight_12)
if (n_params() eq 1) then mytitle = ps[i].title else mytitle=''
endif else begin
; compute size to fit t/s and spectrograms for THIS structure
w = where((PS.snum eq PS[i].snum) and ((PS.ptype eq 1)OR(PS.ptype eq 2)OR(PS.ptype eq 7)))
if (w[0] ne -1) then b = (total(PS[w].npanels)*1. * pheight) else b = 0
if (q12snum[0] ne -1) then b = b + (total(ps[q12snum].npanels)*1. * pheight_12)
mytitle = PS[i].title
endelse
; Determine name for new gif file and create GIF/window
;if (gif_counter gt 0) then begin
;c = strpos(GIF,'.gif') ; search for .gif suffix
;if (c ne -1) then begin
;c = strmid(GIF,0,c) & GIF=c+strtrim(string(gif_counter),2)+'.gif'
;endif else GIF=GIF+strtrim(string(gif_counter),2)
;endif
if plottype eq 'gif' then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
; Initialize window state and open the gif file
WS.ys = b + WS.ymargin[0] + WS.ymargin[1] ; add room for timeaxis
;
deviceopen,6,fileOutput=GIF,sizeWindow=[WS.xs,WS.ys]
;deviceopen,6,fileOutput=GIF,sizeWindow=[20000,20000]
gif_ps_open=1L & gif_counter = gif_counter + 1
endif
if plottype eq 'pscript' then begin
if(ps_counter lt 100) then psn='0'+strtrim(string(ps_counter),2)
if(ps_counter lt 10) then psn='00'+strtrim(string(ps_counter),2)
if(ps_counter ge 100) then psn=strtrim(string(ps_counter),2)
out_ps=outdir+PS[i].source+'_'+pid+'_'+psn+'.eps'
; Initialize window state and open the ps file
WS.ys = b + WS.ymargin[0] + WS.ymargin[1] ; add room for timeaxis
;
deviceopen,1,fileOutput=out_ps,/portrait,sizeWindow=[WS.xs,WS.ys]
gif_ps_open=1L & ps_counter = ps_counter + 1
endif
; RTB test p.charsize for carriage returns in labels
;!P.Charsize=1
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
if (ps[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then begin
printf, 1, 'DATASET=',PS[i].source
;printf,1,'GIF=',GIF
if plottype eq 'gif' then printf,1,'GIF=',GIF
if plottype eq 'pscript' then printf,1,'PS=',out_ps
endif
;TJK 7/11/2007 dataset names are too long to fit on one IDL output
;line, need to split in two. Decided not to get into this split
;name/dir business for the SSC case (reportflag section above) since
;we only have short s/c names to deal w/ in SSC.
print, 'DATASET=',PS[i].source
; if plottype eq 'gif' then print,'GIF=',GIF
if plottype eq 'gif' then begin
split=strsplit(GIF,'/',/extract)
loutdir='/'
for t=0L,n_elements(split)-2 do loutdir=loutdir+split[t]+'/'
print, 'GIF_OUTDIR=',loutdir
fmt='(a9,a'+strtrim(strlen(split[t]),2)+')'
print, 'LONG_GIF=',split[t], format=fmt
endif
; if plottype eq 'pscript' then print,'PS=',out_ps
if plottype eq 'pscript' then begin
split=strsplit(out_ps,'/',/extract)
loutdir='/'
for t=0L,n_elements(split)-2 do loutdir=loutdir+split[t]+'/'
print, 'PS_OUTDIR=',loutdir
fmt='(a8,a'+strtrim(strlen(split[t]),2)+')'
print, 'LONG_PS=',split[t], format=fmt
endif
endif ; end if keyword_set(GIF)
;if NOT keyword_set(GIF) then begin ; producing XWINDOWS
if (plottype ne 'gif' and plottype ne 'pscript') then begin ; producing XWINDOWS
if keyword_set(COMBINE) then begin ; size for as many vars as possible
b=0 & c=0 ; initialize loop
for j=i,n_elements(PS)-1 do begin & d = PS[j].ptype
;if ((d eq 1)OR(d eq 2)) then begin
if ((d eq 1)OR(d eq 2)OR(d eq 7)OR(d eq 12)) then begin
if (d eq 12) then b = PS[j].npanels*1. * pheight_12 $
else b = PS[j].npanels*1. * pheight
if ((c+b) le (max_ysize - WS.ymargin[1])) then c=c+b
endif
endfor
if (n_params() eq 1) then mytitle = PS[i].title else mytitle=''
endif else begin ; size only for variables from current structure
b=0 & c=0 ; initialize loop
for j=i,n_elements(PS)-1 do begin
if (PS[j].snum eq PS[i].snum) then begin & d = PS[j].ptype
if ((d eq 1)OR(d eq 2)OR(d eq 7)OR(d eq 12)) then begin
;if ((d eq 1)OR(d eq 2)) then begin
if (d eq 12) then b = PS[j].npanels*1. * pheight_12 $
else b = PS[j].npanels*1. * pheight
if ((c+b) le (max_ysize - WS.ymargin[1])) then c=c+b
endif
endif
endfor
mytitle = PS[i].title
endelse
; Verify that the height of the new window is valid
if (c eq 0) then begin
if (reportflag eq 1) then begin
printf,1,'STATUS=An error occurred plotting this variable
close, 1
endif
print,'STATUS=An error occurred plotting this variable
print,'ERROR=Single variable does not fit in window' & return,-1
endif else begin ; create the window and initialize window_state
WS.ys = c + WS.ymargin[0] + WS.ymargin[1] ; add room for timeaxis
deviceopen, 0 ;TJK added so that labels will come out on stacked and spectrogram
window,/FREE,XSIZE=WS.xs,YSIZE=WS.ys,TITLE=mytitle
; RCJ 01/29/2007 Set gifopen=1 even if this is not a gif
; because we want the subtitles to the graphs, which
; is done below and only if gif_ps_open=1.
gif_ps_open=1
if (reportflag eq 1) then printf,1,'WINDOW=',mytitle
endelse
;endif ; end if not keyword_set(GIF)
endif ; end if plottype is not gif or ps, ie, it's an xwindow
; Reinitialize window state
WS.snum = PS[i].snum
WS.pos[0] = WS.xmargin[0] ; x origin
WS.pos[2] = WS.xs - WS.xmargin[1] ; x corner
WS.pos[3] = WS.ys - WS.ymargin[0] ; y corner
if (PS[i].ptype eq 12) then WS.pos[1] = (WS.ys - WS.ymargin[0]) - pheight_12 $
else WS.pos[1] = (WS.ys - WS.ymargin[0]) - pheight ; y origin
endif ; end if new_window eq 1
; Determine if this plot will be the first/last in the window
first_plot = new_window ; it is first if this is a new window
; RCJ 09/28/2007 The *1. below is needed. See full explanation by searching for 'RCJ 09/28/2007'
if (PS[i].ptype eq 12) then b = WS.pos[1] - (PS[i].npanels*1. * pheight_12) $
else b = WS.pos[1] - (PS[i].npanels*1. * pheight)
; Life was simple before the time_text plots: RCJ
;if (b lt WS.ymargin[1]) then last_plot = 1 else last_plot = 0
; Now this is what we have to do to determine last_plot:
if (PS[i].ptype ne 12) then begin
if (b lt WS.ymargin[1]) then last_plot = 1 else last_plot = 0
if (q12[0] ne -1) and ((PS[i+1].ptype eq 12) or (PS[i+1].ptype eq 0)) then last_plot=1
endif else last_plot=1
if (PS[i].ptype eq 12) then begin
if keyword_set(combine) then begin
if (n_q12 eq 1) then last_plot = 1 else last_plot = 0
n_q12=n_q12-1
endif else begin
if (n_q12snum eq 1) then last_plot = 1 else last_plot = 0
n_q12snum=n_q12snum-1
endelse
endif
;print,' ps.type = ',PS[i].ptype
;print,' b, ws.ymargin[1], last_plot = ',b, ws.ymargin[1], last_plot
endif ; end if ps.ptype eq 1,2,7 or 12
;TJK 11/30/2006 - save off and restore start/stop time values so that
;subsequece dataset calls w/o epoch16 values will work (they need the
;regular epoch value
if (i eq 0) then begin
save_start_time = start_time
save_stop_time = stop_time
endif else begin
start_time = save_start_time
stop_time = save_stop_time
endelse
; Generate TIME SERIES plots
if (PS[i].ptype eq 1) then begin
; Ensure that 'a' holds the correct data structure
SCATTER = 0L ; turn off by default
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Get the index of the time variable associated with variable to be plotted
b = a.(PS[i].vnum).DEPEND_0 & c = spdf_tagindex(b[0],tag_names(a))
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as time series.'
;****** TJK adding code for handling the parsing of the DISPLAY_TYPE attribute
; for time series plots. In this plot types case, we are looking for a
; a syntax like time_series>y=flux[1] (July 30, 1999).
; determine how many dimensions are in the data by looking at
; the data - unfortunately I have to get it out of either the plain
; structure or a handle.
Yvar = (a.(PS[i].vnum))
t = size(Yvar)
if (t[n_elements(t)-2] ne 8) then begin
print,'ERROR=input to spdf_plotmaster not a structure' & return,-1
endif else begin
YTAGS = tag_names(Yvar) ; avoid multiple calls to tag_names
t = spdf_tagindex('DAT',YTAGS)
if (t[0] ne -1) then THEDATA = Yvar.DAT $
else begin
t = spdf_tagindex('HANDLE',YTAGS)
if (t[0] ne -1) then handle_value,Yvar.HANDLE,THEDATA $
else begin
print,'ERROR=Yvariable does not have DAT or HANDLE tag' & return,-1
endelse
endelse
endelse
datasize = size(thedata)
; Determine if the display type variable attribute is present
d = spdf_tagindex('DISPLAY_TYPE',tag_names(a.(PS[i].vnum)))
if (d[0] ne -1) then begin
;TJK 5/14/2001 - added two "keywords" to the display_type syntax for time_series, scatter and noauto
; to allow for scatter plots vs. line plots and no auto scaling (use the values specified in
; the scalemin/max attributes.
keywords=str_sep(a.(PS[i].vnum).display_type,'>') ; keyword 1 or greater
scn=where(strupcase(keywords) eq 'SCATTER',sn)
;turn scatter plot on if "scatter" is set
if (sn gt 0) then SCATTER = 1L else SCATTER = 0L
;TJK 2/4/2004, save the autoscaling setup that was passed in by the calling program
;so that it can be restored at the bottom of the time-series plot type code.
if (autoscale) then save_auto = 1L else save_auto = 0L
acn=where(strupcase(keywords) eq 'NOAUTO',noauto) ;noauto is a display_type keyword that overrides
;auto that's passed in.
;turn autoscaling off if "noauto" is set
;TJK 10/21/2004 don't set autoscale "on" if noauto isn't set
; if (noauto gt 0) then autoscale = 0L else autoscale = 1L
if (noauto gt 0) then autoscale = 0L
; examine_spectrogram_dt looks at the DISPLAY_TYPE structure member in
; detail. for spectrograms and stacked time series the DISPLAY_TYPE
; can contain syntax like the following: stack_plot>y=flux[1],y=flux[3],
; y=flux[5],z=energy where this indicates that we only want to plot
; the 1st, 3rd and 5th energy channel for the flux variable. This
; routine returns a structure of the form e = {x:xname,y:yname,z:zname,
; npanels:npanels,dvary:dvary,elist:elist,lptrn:lptrn,igram:igram},
e = examine_spectrogram_dt(a.(PS[i].vnum).DISPLAY_TYPE, thedata=thedata,$
data_fillval=a.(PS[i].vnum).fillval, $
valid_minmax=[a.(PS[i].vnum).validmin,a.(PS[i].vnum).validmax], debug=debugflag)
esize=size(e)
;if keyword_set(ELEMENTS) then begin
; RCJ 11/13/2003 Statement above was not a good way to check for elements
; because if elements=0 (we want the x-component) it's as if the keyword
; is not set and we get all 3 time_series plots: x,y and z.
if n_elements(ELEMENTS) ne 0 then begin
if esize[n_elements(esize)-2] eq 8 then begin
datasize = size(ELEMENTS)
;rebuild e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lonarr(datasize[1])
elist = ELEMENTS
e = {x:e.x,y:e.y,z:e.z,npanels:datasize[1],$
dvary:e.dvary,elist:elist,lptrn:e.lptrn,igram:e.igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endif else begin
; RCJ 11/13/2003 Elements is set but display_type is empty
elist = ELEMENTS
e = {elist:elist}
esize=size(e) ; recalculate esize
endelse
endif else begin
if (esize[n_elements(esize)-2] eq 8) then begin ; results confirmed
if (e.npanels eq 0) then begin
;rebuild e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lindgen(datasize[1]) ;TJK changed this from a for loop
e = {x:e.x,y:e.y,z:e.z,npanels:datasize[1],$
dvary:e.dvary,elist:elist,lptrn:e.lptrn,igram:e.igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endif
endif else begin ;no arguments to time_series display_type
;build an e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lindgen(datasize[1]) ;TJK changed this from a for loop
e = {elist:elist}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endelse
endelse ;else looking for the element information through the display_type
;attribute vs. the direct IDL use of the ELEMENTS keyword
endif else begin ;else if no display_type exists
;build an e structure and set the e.elist to contain the index values for
;all elements in the y variable.
if n_elements(elements) ne 0 then begin
elist=elements
endif else begin
elist = lindgen(datasize[1]) ;TJK changed this from a for loop
endelse
e = {elist:elist}
esize=size(e) ; since I build e, then need to determine the size again.
endelse
;****** end of added section for picking out single array elements to
;be plotted.
;q12snum is where(PS(current_snum).ptype eq 12). if there are extra x-axis labels do not print
; subtitle after the last graph:
if keyword_set(combine) then begin
if (q12[0] ne -1) then nosubtitle=1 else nosubtitle=0
endif else begin
if (q12snum[0] ne -1) then nosubtitle=1 else nosubtitle=0
endelse
if ps[i].vname eq 'CDAWeb_created_variable' then onlylabel=1
;
;Find out if we are supposed to use error bars:
tags=tag_names(a.(PS[i].vnum))
err_p=spdf_tagindex('DELTA_PLUS_VAR',tags)
err_m=spdf_tagindex('DELTA_MINUS_VAR',tags)
if ((err_p[0] ne -1) and (err_m[0] ne -1)) then begin
; get the names
err_p=a.(PS[i].vnum).(err_p[0])
err_m=a.(PS[i].vnum).(err_m[0])
; RCJ 02/07/2005 Added the test below.
if ((err_p[0] ne '') and (err_m[0] ne '')) then begin
; where in a are those variables?
; RCJ 04/22/2003 'vnames' was here instead of 'tag_names(a)'
; but vnames will be the tag names of the *last* structure a
; read during another loop above.
err_p1=spdf_tagindex(spdf_replace_bad_chars(err_p[0]),tag_names(a))
err_m1=spdf_tagindex(spdf_replace_bad_chars(err_m[0]),tag_names(a))
if a.(err_p1).var_type eq 'additional_data' then $
err_p=-1 else $
err_p=spdf_tagindex(spdf_replace_bad_chars(err_p[0]),tag_names(a))
if a.(err_m1).var_type eq 'additional_data' then $
err_m=-1 else $
err_m=spdf_tagindex(spdf_replace_bad_chars(err_m[0]),tag_names(a))
endif else begin ; RCJ 02/08/2005 Added this so the test below will work.
err_m=-1 & err_p=-1
endelse
endif
;
;TJK 7/20/2006 if data is epoch16, then set the start/stop_time
;variables to the ep16 values
;determine datatype and process if needed
if (strpos(a.(c[0]).CDFTYPE, 'CDF_EPOCH16') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in epoch16
if (n_elements(start_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, start_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
if (n_elements(stop_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, stop_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
start_time = start_time16 & stop_time = stop_time16
endif
if (strpos(a.(c[0]).CDFTYPE, 'CDF_TIME_TT2000') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in time TT2000
;instead of regular Epoch or Epoch16
if (n_elements(start_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, start_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
if (n_elements(stop_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, stop_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
start_time = start_timett & stop_time = stop_timett
endif
; Produce the time series plot with specific time axis range
if ((start_time ne 0.0D0)AND(stop_time ne 0.0D0)) then begin
; Plot with error bars:
if ((err_p[0] ne -1) and (err_m[0] ne -1)) then begin
; read uncertainty variables
handle_value,a.(err_p[0]).handle,err_plus
handle_value,a.(err_m[0]).handle,err_minus
;
; RCJ 02/27/2007 Note: we don't need to pass a keyword 'ps' to
; plot_timeseries because it only needs to know if the plot is a
; gif or otherwise if a new window/page is to be open.
; Since we offer only one page of ps for the moment we don't
; have to worry about this.
;
s = plot_timeseries(a.(c[0]),a.(PS[i].vnum),POSITION=WS.pos,/CDAWEB,$
PANEL_HEIGHT=pheight,AUTO=autoscale, ELEMENTS=e.elist,$
TSTART=start_time,TSTOP=stop_time,COMBINE=COMBINE,$
err_plus=err_plus,err_minus=err_minus,$
NOSUBTITLE=nosubtitle, ONLYLABEL=onlylabel,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
NONOISE=NONOISE,SCATTER=SCATTER, $
;gif=gif,ps=out_ps,DEBUG=debugflag)
gif=gif,DEBUG=debugflag)
endif else begin
; Plot without error bars:
s = plot_timeseries(a.(c[0]),a.(PS[i].vnum),POSITION=WS.pos,/CDAWEB,$
PANEL_HEIGHT=pheight,AUTO=autoscale, ELEMENTS=e.elist,$
TSTART=start_time,TSTOP=stop_time,COMBINE=COMBINE,$
NOSUBTITLE=nosubtitle, ONLYLABEL=onlylabel,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
NONOISE=NONOISE,SCATTER=SCATTER,$
;gif=gif,ps=out_ps,DEBUG=debugflag)
gif=gif,DEBUG=debugflag)
endelse
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Time-series plot failed' & close, 1
print, 'STATUS=Time-series plot failed'
;return, -1
endif
endif else begin ; Produce the time series plot normally
; Plot with error bars:
if ((err_p[0] ne -1) and (err_m[0] ne -1)) then begin
; read uncertainty variables
handle_value,a.(err_p[0]).handle,err_plus
handle_value,a.(err_m[0]).handle,err_minus
;
s = plot_timeseries(a.(c[0]),a.(PS[i].vnum),POSITION=WS.pos,/CDAWEB,$
PANEL_HEIGHT=pheight,AUTO=autoscale, ELEMENTS=e.elist,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,COMBINE=COMBINE,$
err_plus=err_plus,err_minus=err_minus,$
NOSUBTITLE=nosubtitle, ONLYLABEL=onlylabel,$
NONOISE=NONOISE,SCATTER=SCATTER,$
;gif=gif,ps=out_ps,DEBUG=debugflag)
gif=gif,DEBUG=debugflag)
endif else begin
; Plot without error bars:
s = plot_timeseries(a.(c[0]),a.(PS[i].vnum),POSITION=WS.pos,/CDAWEB,$
PANEL_HEIGHT=pheight,AUTO=autoscale, ELEMENTS=e.elist,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,COMBINE=COMBINE,$
NOSUBTITLE=nosubtitle, ONLYLABEL=onlylabel,$
NONOISE=NONOISE,SCATTER=SCATTER,$
;gif=gif,ps=out_ps,DEBUG=debugflag)
gif=gif,DEBUG=debugflag)
endelse
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Time-series plot failed' & close, 1
print, 'STATUS=Time-series plot failed'
return, -1
endif
endelse
onlylabel=0
; Update the state of the window
WS.pos[3] = WS.pos[3] - (pheight * PS[i].npanels) ; update Y corner
WS.pos[1] = WS.pos[1] - (pheight * PS[i].npanels) ; update Y origin
;check if "noauto" was set and turn it back on for subsequent variables/datasets
if (n_elements(save_auto) gt 0) then begin
if (save_auto) then autoscale = 1L else autoscale = 0L
endif
endif ; end if ps[i].ptype eq 1
; Generate SPECTROGRAM plots
if (PS[i].ptype eq 2) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine default x and y variable from depend attributes
b = a.(PS[i].vnum).DEPEND_0 & c = spdf_tagindex(b[0],tag_names(a))
b = a.(PS[i].vnum).DEPEND_1
; RCJ 05/16/2013 If alt_cdaweb_depend_1 exists use it instead:
if (spdf_tagindex('ALT_CDAWEB_DEPEND_1',tag_names(a.(PS[i].vnum)))) ne -1 then $
if (a.(PS[i].vnum).ALT_CDAWEB_DEPEND_1 ne '') then b = a.(PS[i].vnum).ALT_CDAWEB_DEPEND_1
d = spdf_tagindex(b[0],tag_names(a))
; Determine if the display type variable attribute is present
b = spdf_tagindex('DISPLAY_TYPE',tag_names(a.(PS[i].vnum)))
if (b[0] ne -1) then begin
; examine_spectrogram_dt looks at the DISPLAY_TYPE structure member in detail.
; for spectrograms and stacked time series the DISPLAY_TYPE can contain syntax
; like the following: SPECTROGRAM>y=flux[1],y=flux[3],y=flux[5],z=energy
; where this indicates that we only want to plot the 1st, 3rd and 5th energy
; channel for the flux variable. This routine returns a structure of the form
; e = {x:xname,y:yname,z:zname,npanels:npanels,dvary:dvary,elist:elist,
; lptrn:lptrn,igram:igram},
;TJK 2/4/2004, save the autoscaling setup that was passed in by the calling program
;so that it can be restored at the bottom of the spectrogram plot type code.
if (autoscale) then save_auto = 1L else save_auto = 0L
;TJK 2/12/2003 add the capability to look for the 'noauto' keyword
keywords=str_sep(a.(PS[i].vnum).display_type,'>') ; keyword 1 or greater
acn=where(strupcase(keywords) eq 'NOAUTO',an)
;turn autoscaling off if "noauto" is set
if (an gt 0) then autoscale = 0L else autoscale = 1L
; RCJ 03/15/2013 Added this code to get thedata and dfillval:
Yvar = (a.(PS[i].vnum))
t = size(Yvar)
if (t[n_elements(t)-2] ne 8) then begin
print,'ERROR=input to spdf_plotmaster not a structure' & return,-1
endif else begin
YTAGS = tag_names(Yvar) ; avoid multiple calls to tag_names
t = spdf_tagindex('DAT',YTAGS)
if (t[0] ne -1) then begin
THEDATA = Yvar.DAT
dfillval=yvar.fillval
endif else begin
t = spdf_tagindex('HANDLE',YTAGS)
if (t[0] ne -1) then begin
handle_value,Yvar.HANDLE,THEDATA
dfillval=yvar.fillval
endif else begin
print,'ERROR=Yvariable does not have DAT or HANDLE tag' & return,-1
endelse
endelse
endelse
e = examine_spectrogram_dt(a.(PS[i].vnum).DISPLAY_TYPE, thedata=thedata, data_fillval=dfillval,$
valid_minmax=[a.(PS[i].vnum).VALIDMIN,a.(PS[i].vnum).VALIDMAX], debug=debugflag)
esize=size(e)
if (esize[n_elements(esize)-2] eq 8) then begin ; results confirmed
if (e.x ne '') then c = spdf_tagindex(e.x,tag_names(a))
if (e.y ne '') then d = spdf_tagindex(e.y,tag_names(a))
endif
endif
; Produce debug output if requested.
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as spectrogram.'
; Generate the spectrogram
;if NOT keyword_set(GIF) then deviceopen,0 ; producing XWINDOWS
if (plottype ne 'gif' and plottype ne 'pscript') then deviceopen,0; producing XWINDOWS
;q12snum is where(PS(current_snum).ptype eq 12) if there are extra x-axis labels do not print
; subtitle after the last graph:
if keyword_set(combine) then begin
if (q12[0] ne -1) then nosubtitle=1 else nosubtitle=0
endif else begin
if (q12snum[0] ne -1) then nosubtitle=1 else nosubtitle=0
endelse
;
if (strpos(a.(c[0]).CDFTYPE, 'CDF_EPOCH16') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in epoch16
if (n_elements(start_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, start_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
if (n_elements(stop_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, stop_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
start_time = start_time16 & stop_time = stop_time16
endif
;
if (strpos(a.(c[0]).CDFTYPE, 'CDF_TIME_TT2000') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in time TT2000
;instead of regular Epoch or Epoch16
if (n_elements(start_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, start_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
if (n_elements(stop_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, stop_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
start_time = start_timett & stop_time = stop_timett
endif
print, 'DEBUG in spectrogram section i = ',i, 'start_time = ',start_time
s = plot_spectrogram(a.(c[0]),a.(d[0]),a.(PS[i].vnum),$
POSITION=WS.pos,/CDAWEB,QUICK=quickflag,$
PANEL_HEIGHT=pheight,AUTO=autoscale,NOCLIP=noclipflag,$
TSTART=start_time,TSTOP=stop_time,FILLER=fillflag,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
NOSUBTITLE=nosubtitle, COMBINE=COMBINE,npanels=PS[i].npanels,$
SLOW=slowflag,DEBUG=debugflag)
;SLOW=slowflag,SMOOTH=smoothflag,DEBUG=debugflag)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Spectrogram plot failed' & close, 1
print, 'STATUS=Spectrogram plot failed'
return, -1
endif
; Update the state of the window
WS.pos[3] = WS.pos[3] - (pheight * PS[i].npanels) ; update Y corner
WS.pos[1] = WS.pos[1] - (pheight * PS[i].npanels) ; update Y origin
;check if "noauto" was set and turn it back on for subsequent variables/datasets
if (n_elements(save_auto) gt 0) then begin
if (save_auto) then autoscale = 1L else autoscale = 0L
endif
endif
; Make a pass thru the plot script and generate all stacked time series plots
; Generate STACKED TIME SERIES plot
if (PS[i].ptype eq 7) then begin
; Ensure that 'a' holds the correct data structure
scatter = 0L
reverse_order = 0L
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Get the index of the time variable associated with variable to be plotted
; Determine default x, y and z variables from depend attributes
b = a.(PS[i].vnum).DEPEND_0 & c = spdf_tagindex(b[0],tag_names(a))
b = a.(PS[i].vnum).DEPEND_1
; RCJ 05/16/2013 If alt_cdaweb_depend_1 exists use it instead:
if (spdf_tagindex('ALT_CDAWEB_DEPEND_1',tag_names(a.(PS[i].vnum)))) ne -1 then $
if (a.(PS[i].vnum).ALT_CDAWEB_DEPEND_1 ne '') then b = a.(PS[i].vnum).ALT_CDAWEB_DEPEND_1
z = spdf_tagindex(b[0],tag_names(a))
; Determine if the display type variable attribute is present
b = spdf_tagindex('DISPLAY_TYPE',tag_names(a.(PS[i].vnum)))
if (b[0] ne -1) then begin
; RCJ 10/15/2013 added scatter:
keywords=str_sep(a.(PS[i].vnum).display_type,'>') ; keyword 1 or greater
scn=where(strupcase(keywords) eq 'SCATTER',sn)
;turn scatter plot on if "scatter" is set
if (sn gt 0) then SCATTER = 1L else SCATTER = 0L
; TJK 12/31/2013 added reverse:
keywords=str_sep(a.(PS[i].vnum).display_type,'>') ; keyword 1 or greater
scn=where(strupcase(keywords) eq 'REVERSE',sn)
;turn scatter plot on if "scatter" is set
if (sn gt 0) then REVERSE_ORDER = 1L else REVERSE_ORDER = 0L
; examine_spectrogram_dt looks at the DISPLAY_TYPE structure member in
; detail. for spectrograms and stacked time series the DISPLAY_TYPE
; can contain syntax like the following: stack_plot>y=flux[1],y=flux[3],
; y=flux[5],z=energy where this indicates that we only want to plot
; the 1st, 3rd and 5th energy channel for the flux variable. This
; routine returns a structure of the form e = {x:xname,y:yname,z:zname,
; npanels:npanels,dvary:dvary,elist:elist,lptrn:lptrn,igram:igram},
e = examine_spectrogram_dt(a.(PS[i].vnum).DISPLAY_TYPE, thedata=thedata, $
data_fillval=a.(PS[i].vnum).fillval, $
valid_minmax=[a.(PS[i].vnum).validmin,a.(PS[i].vnum).validmax], debug=debugflag)
esize=size(e)
; determine how many dimensions are in the data by looking at
; the data - unfortunately I have to get it out of either the plain
; structure or a handle.
Yvar = (a.(PS[i].vnum))
t = size(Yvar)
if (t[n_elements(t)-2] ne 8) then begin
print,'ERROR=input to spdf_plotmaster not a structure' & return,-1
endif else begin
YTAGS = tag_names(Yvar) ; avoid multiple calls to tag_names
t = spdf_tagindex('DAT',YTAGS)
if (t[0] ne -1) then THEDATA = Yvar.DAT $
else begin
t = spdf_tagindex('HANDLE',YTAGS)
if (t[0] ne -1) then handle_value,Yvar.HANDLE,THEDATA $
else begin
print,'ERROR=Yvariable does not have DAT or HANDLE tag' & return,-1
endelse
endelse
endelse
datasize = size(thedata)
;TJK shouldn't need here as well as above
;if keyword_set(PANEL_HEIGHT) then pheight=PANEL_HEIGHT else pheight=100
if keyword_set(ELEMENTS) then begin
; RCJ 11/13/2003 Unlike for time_series plots, the options here are not to have
; the element keyword set or to have it set to an array ([0,1] for instance)
; so we don't run into the same problem as w/ time_series where elements could
; be =0 and the keyword wouldn't be set.
datasize = size(ELEMENTS)
;rebuild e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lonarr(datasize[1])
elist = ELEMENTS
e = {x:e.x,y:e.y,z:e.z,npanels:datasize[1],$
dvary:e.dvary,elist:elist,lptrn:e.lptrn,igram:e.igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
;TJK rearranged the logic below to check for whether e is even a structure before
;trying to use it, this is an issue if the following is specified "DISPLAY_TYPE=stack_plot"
;w/ no "y=var(i), etc. syntax. - 2/14/2002
endif else begin
if (n_tags(e) gt 0) then begin ; e is a structure
if (e.npanels eq 0) then begin
;rebuild e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lonarr(datasize[1])
for j = 0, datasize[1]-1 do elist[j] = j
;TJK pheight = pheight*(n_elements(elist))
e = {x:e.x,y:e.y,z:e.z,npanels:datasize[1],$
dvary:e.dvary,elist:elist,lptrn:e.lptrn,igram:e.igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
print, 'Setting elements to ',e.elist
endif
endif else begin ; e isn't a structure yet because no elements were specified.
; want to to set elist to all index values - just like above.
elist = lonarr(datasize[1])
for j = 0, datasize[1]-1 do elist[j] = j
;need initialize the structure members
xname='' & yname='' & zname='' & lptrn=1 & igram=0
npanels=0 & dvary=-1
e = {x:xname,y:yname,z:zname,npanels:datasize[1],$
dvary:dvary,elist:elist,lptrn:lptrn,igram:igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endelse
endelse
if (esize[n_elements(esize)-2] eq 8) then begin ; results confirmed
if (e.x ne '') then c = spdf_tagindex(e.x,tag_names(a))
if (e.y ne '') then d = spdf_tagindex(e.y,tag_names(a))
if (e.z ne '') then f = spdf_tagindex(e.z,tag_names(a)) $
else f = z
endif
;if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
;print, 'DATASET=',PS[i].source
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as stacked time series.'
; Generate the stack plot
if (plottype ne 'gif' and plottype ne 'pscript') then deviceopen,0; producing XWINDOWS
;q12snum is where(PS(current_snum).ptype eq 12) ; if there are extra x-axis labels do not print
; subtitle after the last graph:
if keyword_set(combine) then begin
if (q12[0] ne -1) then nosubtitle=1 else nosubtitle=0
endif else begin
if (q12snum[0] ne -1) then nosubtitle=1 else nosubtitle=0
endelse
;TJK 4/26/2013 added the code to accept epoch16 and tt2000 time types
;TJK 7/20/2006 if data is epoch16, then set the start/stop_time
;variables to the ep16 values
;determine datatype and process if needed
if (strpos(a.(c[0]).CDFTYPE, 'CDF_EPOCH16') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in epoch16
if (n_elements(start_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, start_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
if (n_elements(stop_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, stop_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
start_time = start_time16 & stop_time = stop_time16
endif
if (strpos(a.(c[0]).CDFTYPE, 'CDF_TIME_TT2000') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in time TT2000
;instead of regular Epoch or Epoch16
if (n_elements(start_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, start_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
if (n_elements(stop_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, stop_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
start_time = start_timett & stop_time = stop_timett
endif
; Produce the stacked time series plot with specific time axis range
if ((start_time ne 0.0D0)AND(stop_time ne 0.0D0)) then begin
s = plot_stack(a.(c[0]),a.(PS[i].vnum),a.(f[0]),/CDAWEB,$
ELEMENTS = e.elist, $ ;XSIZE = 400,$
;YSIZE = 700, $
PANEL_HEIGHT=pheight,COMBINE=COMBINE,$
POSITION=WS.pos, NOSUBTITLE=nosubtitle,$
AUTO=autoscale,GIF=GIF,$
TSTART=start_time,TSTOP=stop_time,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
SCATTER=SCATTER, REVERSE_ORDER=REVERSE_ORDER,$
NONOISE=NONOISE,DEBUG=debugflag, /COLORBAR);,$/NOGAPS)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Stack plot failed' & close, 1
print, 'STATUS=Stack plot failed'
;return, -1 RTB; Allows remaining structures to plot
endif else begin
if(s eq -2) then begin ;all fill data found - status being printed from plot_stack
; return, -1 RTB; Allows remaining structures to plot
endif
endelse
endif else begin ; Produce the stack plot normally
s = plot_stack(a.(c[0]),a.(PS[i].vnum),a.(f[0]),/CDAWEB,$
ELEMENTS = e.elist, $ ;XSIZE = 400,$
;YSIZE = 700, $
POSITION=WS.pos, NOSUBTITLE=nosubtitle,$
PANEL_HEIGHT=pheight,COMBINE=COMBINE,$
AUTO=autoscale, GIF=GIF,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
SCATTER=SCATTER, REVERSE_ORDER=REVERSE_ORDER,$
NONOISE=NONOISE,DEBUG=debugflag, /COLORBAR);,$/NOGAPS)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Stack plot failed' & close, 1
print, 'STATUS=Stack plot failed'
deviceclose ; close any open gif
;return, -1 RTB; Allows remaining structures to plot
endif else begin
if(s eq -2) then begin ;all fill data found - status being printed from plot_stack
deviceclose ; close any open gif
;return, -1 RTB; Allows remaining structures to plot
endif
endelse
; if keyword_set(GIF) then begin
;if (reportflag) then printf, 1, 'GIF=',GIF else print,'GIF=',GIF
;endif
endelse ; end stacked time series plot w/o start and stop time specs.
endif ; if (b[0] ne -1)
; Update the state of the window
WS.pos[3] = WS.pos[3] - (pheight * PS[i].npanels) ; update Y corner
WS.pos[1] = WS.pos[1] - (pheight * PS[i].npanels) ; update Y origin
endif ; if plottype eq stacked time series
; Generate PLOT_TIMETEXT plot
;
if (PS[i].ptype eq 12) then begin
;if ((PS[i].ptype eq 12) and (plottype ne 'pscript')) then begin
; the following was copied/pasted from the time series section above
; and modified
;
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Get the index of the time variable associated with variable to be plotted
b = a.(PS[i].vnum).DEPEND_0 & c = spdf_tagindex(b[0],tag_names(a))
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as time text.'
;
; TJK added code for handling the parsing of the DISPLAY_TYPE attribute
; for time series plots. In this plot types case, we are looking for a
; a syntax like time_series>y=flux[1] (July 30, 1999).
; determine how many dimensions are in the data by looking at
; the data - unfortunately I have to get it out of either the plain
; structure or a handle.
Yvar = (a.(PS[i].vnum))
t = size(Yvar)
if (t[n_elements(t)-2] ne 8) then begin
print,'ERROR=input to spdf_plotmaster not a structure' & return,-1
endif else begin
YTAGS = tag_names(Yvar) ; avoid multiple calls to tag_names
t = spdf_tagindex('DAT',YTAGS)
if (t[0] ne -1) then THEDATA = Yvar.DAT $
else begin
t = spdf_tagindex('HANDLE',YTAGS)
if (t[0] ne -1) then handle_value,Yvar.HANDLE,THEDATA $
else begin
print,'ERROR=Yvariable does not have DAT or HANDLE tag' & return,-1
endelse
endelse
endelse
datasize = size(thedata)
; Determine if the display type variable attribute is present
d = spdf_tagindex('DISPLAY_TYPE',tag_names(a.(PS[i].vnum)))
if (d[0] ne -1) then begin
; examine_spectrogram_dt looks at the DISPLAY_TYPE structure member in
; detail. for time series, time text, spectrograms and
; stacked time series the DISPLAY_TYPE
; can contain syntax like the following: stack_plot>y=flux[1],y=flux[3],
; y=flux[5],z=energy where this indicates that we only want to plot
; the 1st, 3rd and 5th energy channel for the flux variable. This
; routine returns a structure of the form e = {x:xname,y:yname,z:zname,
; npanels:npanels,dvary:dvary,elist:elist,lptrn:lptrn,igram:igram},
e = examine_spectrogram_dt(a.(PS[i].vnum).DISPLAY_TYPE, thedata=thedata,$
data_fillval=a.(PS[i].vnum).fillval, $
valid_minmax=[a.(PS[i].vnum).validmin,a.(PS[i].vnum).validmax], debug=debugflag)
esize=size(e)
;if keyword_set(ELEMENTS) then begin
; RCJ 11/13/2003 As for time_series plots, statement above was not a good way to check for elements
; because if elements=0 (we want the x-component) it's as if the keyword
; is not set and we get all 3 time_series plots: x,y and z.
if n_elements(ELEMENTS) ne 0 then begin
datasize = size(ELEMENTS)
;rebuild e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lonarr(datasize[1])
elist = ELEMENTS
e = {x:e.x,y:e.y,z:e.z,npanels:datasize[1],$
dvary:e.dvary,elist:elist,lptrn:e.lptrn,igram:e.igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endif else begin
if (esize[n_elements(esize)-2] eq 8) then begin ; results confirmed
if (e.npanels eq 0) then begin
;rebuild e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lindgen(datasize[1]) ;TJK changed this from a for loop
e = {x:e.x,y:e.y,z:e.z,npanels:datasize[1],$
dvary:e.dvary,elist:elist,lptrn:e.lptrn,igram:e.igram}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endif
endif else begin ;no arguments to time_text display_type
;build an e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lindgen(datasize[1]) ;TJK changed this from a for loop
e = {elist:elist}
esize=size(e) ; since I rebuild e, then need to determine the size again.
endelse
endelse ;else looking for the element information through the display_type
;attribute vs. the direct IDL use of the ELEMENTS keyword
endif else begin ;else if no display_type exists
;build an e structure and set the e.elist to contain the index values for
;all elements in the y variable.
elist = lindgen(datasize[1]) ;TJK changed this from a for loop
e = {elist:elist}
esize=size(e) ; since I build e, then need to determine the size again.
endelse
if keyword_set(combine) then begin
if (last_plot eq 1) then nosubtitle=0 else nosubtitle=1
endif else begin
if ps[i].ptype ne ps[i+1].ptype then nosubtitle=0 else nosubtitle=1
endelse
;
if (strpos(a.(c[0]).CDFTYPE, 'CDF_EPOCH16') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in epoch16
if (n_elements(start_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, start_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
if (n_elements(stop_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, stop_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
start_time = start_time16 & stop_time = stop_time16
endif
;
if (strpos(a.(c[0]).CDFTYPE, 'CDF_TIME_TT2000') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in time TT2000
;instead of regular Epoch or Epoch16
if (n_elements(start_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, start_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
if (n_elements(stop_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, stop_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
start_time = start_timett & stop_time = stop_timett
endif
; Produce the time text with specific time axis range
if ((start_time ne 0.0D0)AND(stop_time ne 0.0D0)) then begin
; warning: Plot_timetext assumes there's no need to open a new window.
qv=where(ps.vname eq 'CDAWeb_created_variable')
if (qv[0] ne -1) then onlylabel=1
s = plot_timetext(a.(c[0]),a.(PS[i].vnum),notime=1, $
PANEL_HEIGHT=pheight_12,AUTO=autoscale, ELEMENTS=e.elist,$
plabeloffset=labeloffset, nosubtitle=nosubtitle, $
TSTART=start_time,TSTOP=stop_time, GIF=GIF,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
DEBUG=debugflag, onlylabel=onlylabel, COMBINE=COMBINE)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Time-text plot failed' & close, 1
;TJK 5/167/2013 don't need to error out
;print, 'STATUS=Time-text plot failed'
;return, -1
endif
endif else begin ; Produce the time text plot normally
s = plot_timetext(a.(c[0]),a.(PS[i].vnum),notime=1, $
PANEL_HEIGHT=pheight_12,AUTO=autoscale, ELEMENTS=e.elist,$
plabeloffset=labeloffset, nosubtitle=nosubtitle, $
GIF=GIF, COMBINE=COMBINE,$
FIRSTPLOT=first_plot,LASTPLOT=last_plot,$
DEBUG=debugflag, onlylabel=onlylabel)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Time-text plot failed' & close, 1
print, 'STATUS=Time-text plot failed'
return, -1
endif
endelse
onlylabel=0
if plottype eq 'pscript' then begin
labeloffset=labeloffset-(ps[i].npanels * 400) ; yup, empirical
endif else begin
labeloffset=labeloffset-(ps[i].npanels * 10) ; this is in number of pixels
endelse
; Update the state of the window
WS.pos[3] = WS.pos[3] - (pheight_12 * PS[i].npanels) ; update Y corner
WS.pos[1] = WS.pos[1] - (pheight_12 * PS[i].npanels) ; update Y origin
endif ; if plottype eq time_text
if keyword_set(COMBINE) then begin
mytitle=combined_title
;now determine the pi and affiliation for this dataset
;only add a pi/affiliation to the pi_list if its a new one
t_source = ''
b = spdf_tagindex('LOGICAL_SOURCE',tag_names(a.(0)))
if (b[0] ne -1) then begin
if(n_elements(a.(0).LOGICAL_SOURCE) eq 1) then t_source = a.(0).LOGICAL_SOURCE
endif
if (t_source ne l_source) then begin ; if logical source changed
l_source = t_source ;set this for the next iteration
b = spdf_tagindex('PI_NAME',tag_names(a.(0)))
if (b[0] ne -1) then begin
;if(n_elements(a.(0).PI_NAME) eq 1) then pi = a.(0).PI_NAME else pi=' '
; RCJ 01/05/2004 Sometimes the pi_name can be an array of n elements so I changed
; the line above to:
if(n_elements(a.(0).PI_NAME) ge 1) then pi = a.(0).PI_NAME[0]
; RCJ 01/05/2004 The line below can handle n-element arrays
; but the subtitle could get pretty long if there are more pi's and affiliations
; from other instruments (additional datasets).
;for pii=1,n_elements(a.(0).PI_NAME)-1 do pi = pi +' '+ a.(0).PI_NAME(pii)
endif else pi='' ; RCJ 02/10/2006 Added this 'else'. pi needed to be
; initialized or program would break further down.
b = spdf_tagindex('PI_AFFILIATION',tag_names(a.(0)))
if (b[0] ne -1) then begin
;if((n_elements(a.(0).PI_AFFILIATION) eq 1) and (a.(0).PI_AFFILIATION[0] ne "")) then $
; RCJ 01/05/2004 Same as above, pi_affiliation can be an array of n elements
if((n_elements(a.(0).PI_AFFILIATION) ge 1) and $
(a.(0).PI_AFFILIATION[0] ne "")) then begin
affil=a.(0).PI_AFFILIATION[0]
; RCJ 01/05/2004 Same case here as above, this line can handle n-element arrays
; but the subtitle could get pretty long if there are more pi's and affiliations
; from other instruments (additional datasets).
;for pii=1,n_elements(a.(0).PI_AFFILIATION)-1 do affil = affil +', '+ a.(0).PI_AFFILIATION(pii)
;pi = pi + ' at '+ a.(0).PI_AFFILIATION
pi = pi + ' at '+ affil
endif
if (i lt n_elements(PS)-1) then pi = pi + ' and '
endif
endif else pi = '' ; endif logical source changed
endif
if (n_elements(pi_list) gt 0) then begin ;if this is a combined request
;pi_list will exist, otherwise not.
;check if this pi is already in list
if (strpos(pi_list, pi) eq -1) then pi_list = pi_list + pi
endif
endfor
if (gif_ps_open eq 1) then begin
if (keyword_set(COMBINE)) then begin
;combined_subtitle, a.(0), pi_list, mytitle
case plottype of
'pscript': combined_subtitle, a.(0), pi_list, mytitle,/ps
'gif': combined_subtitle, a.(0), pi_list, mytitle
else:combined_subtitle, a.(0), pi_list, mytitle ; subtitle the xwindows
endcase
endif else begin
;project_subtitle,a.(0),mytitle,SSCWEB=SSCWEB ; subtitle the gif
case plottype of
'pscript': project_subtitle,a.(0),mytitle,SSCWEB=SSCWEB,/ps,tcolor=0
'gif': project_subtitle,a.(0),mytitle,SSCWEB=SSCWEB,tcolor=0
else: project_subtitle,a.(0),mytitle,SSCWEB=SSCWEB,tcolor=0; subtitle the xwindows
endcase
endelse
deviceclose ; close any open gif
endif
; end for time_series, spectrogram, topside and bottomside ionograms, stack_plot and
; time_text
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all image plots
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 4) then begin
if ((PS[i].ptype eq 4) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
;if (gif_counter gt 0) then begin
;c = strpos(GIF,'.gif') ; search for .gif suffix
;if (c ne -1) then begin
;c = strmid(GIF,0,c) & GIF=c+strtrim(string(gif_counter),2)+'.gif'
;endif else GIF=GIF+strtrim(string(gif_counter),2)
;endif
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce the images
s = plot_images(a,PS[i].vname,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
DEBUG=debugflag,/COLORBAR)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Image plot failed' & close, 1
print, 'STATUS=Image plot failed'
return, -1
endif
endif
endfor
; end for image plots. plot_images calls tv, making ps's really big....
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;S/W to create Rick Burley's new flux images w/ an earth superimposed on the image.
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all flux_image plots
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 13) then begin
if ((PS[i].ptype eq 13) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as flux images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
;No matter what size thumbnail you specifiy you can't get one smaller
;than 140x140
if(cdawebflag) then FRAME=0
; Produce the images
;TJK 4/25/01 set smoothflag to false because it doesn't work well for euv yet
smoothflag = 0
s = plot_fluximages(a,PS[i].vname,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
DEBUG=debugflag, SMOOTH=smoothflag,/COLORBAR)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Image plot failed' & close, 1
print, 'STATUS=Image plot failed'
return, -1
endif
endif
endfor
; end for flux images
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all image plots for flux movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 14) then begin
if ((PS[i].ptype eq 14) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif' ; was '.mpg'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as flux movie...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Produce the images
;TJK 4/25/01 set smoothflag to false because it doesn't work well for euv yet
smoothflag = 0
s = flux_movie(a,PS[i].vname,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop, limit=limit_movie,$
DEBUG=debugflag,/COLORBAR,SMOOTH=smoothflag)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Image flux movie failed' & close, 1
print, 'STATUS=Image flux movie failed'
return, -1
endif
endif
endfor
; end for flux movies
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all image plots for movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 10) then begin
if ((PS[i].ptype eq 10) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce the images
s = movie_images(a,PS[i].vname,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop,limit=limit_movie,$
DEBUG=debugflag,/COLORBAR)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Image movie failed' & close, 1
print, 'STATUS=Image movie failed'
return, -1
endif
endif
endfor
; end for mapped movies
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all image plots for map movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 11) then begin
if ((PS[i].ptype eq 11) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce the images
;s = plot_images(a,PS[i].vname,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
s = movie_map_images(a,PS[i].vname,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop,LIMIT=limit_movie,$
DEBUG=debugflag,/COLORBAR)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Image movie failed' & close, 1
print, 'STATUS=Image movie failed'
return, -1
endif
endif
endfor
; end for movie map images
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Make a pass thru the plot script and generate all radar plots
a_id=-1 ; Reset structure id
for i=0,n_elements(PS)-1 do begin
if (PS[i].ptype eq 3) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Only DARN radar data is currently plottable. Verify that the source
; of this variable is DARN.
proceed = 1L & b = spdf_tagindex('SOURCE_NAME',tag_names(a.(PS[i].vnum)))
if (b[0] eq -1) then begin
proceed = 0L & print,'ERROR=Unable to determine source for radar plot...'
endif
if (strpos(strupcase(a.(PS[i].vnum).SOURCE_NAME),'DARN') eq -1) then begin
proceed = 0L & print,'ERROR=Source of radar plot not equal to DARN...'
endif
if (proceed eq 1) then begin
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as Radar...'
;if keyword_set(GIF) then begin
; ;if (gif_counter gt 0) then begin
; ;c = strpos(GIF,'.gif') ; search for .gif suffix
; ; if (c ne -1) then begin
; ; c = strmid(GIF,0,c) & GIF=c+strtrim(string(gif_counter),2)+'.gif'
; ;endif else GIF=GIF+strtrim(string(gif_counter),2)
; ;endif
; if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
; if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
; if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
; GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
;endif
if plottype eq 'gif' then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_ps_open=1L & gif_counter = gif_counter + 1
xysize=400
endif
if plottype eq 'pscript' then begin
if(ps_counter lt 100) then psn='0'+strtrim(string(ps_counter),2)
if(ps_counter lt 10) then psn='00'+strtrim(string(ps_counter),2)
if(ps_counter ge 100) then psn=strtrim(string(ps_counter),2)
out_ps=outdir+PS[i].source+'_'+pid+'_'+psn+'.eps'
;; Initialize window state and open the ps file
;WS.ys = b + WS.ymargin[0] + WS.ymargin[1] ; add room for timeaxis
;;
;deviceopen,1,fileOutput=out_ps,/portrait,sizeWindow=[WS.xs,WS.ys]
gif_ps_open=1L & ps_counter = ps_counter + 1
xysize=15000 ; RCJ 04/18/2007 This number is 100% arbitrary.
endif
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Produce the radar plots
s = plot_radar(a,PS[i].vnum,XYSIZE=XYSIZE,GIF=GIF,GCOUNT=gif_counter,$
ps=out_ps,pcount=ps_counter,$
TSTART=start_time,TSTOP=stop_time,$
REPORT=reportflag,DEBUG=debugflag)
if(s eq -1) then begin
print, 'STATUS=Radar Plot Failed'
if(reportflag) then printf, 1, 'STATUS=Radar Plot Error'
;endif else gif_counter=s
endif else begin
if keyword_set(GIF) then gif_counter=s
if keyword_set(ps) then ps_counter=s
endelse
endif
endif
endfor
; end for radar plots
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all mapped plots
pwc=where(PS.ptype eq 6,pwcn)
; RCJ 02/17/2006 Picking better colors. Avoiding yellow and picking
; greens/blues as far from each other as possible.
; If the max number of satellites allowed to be plotted increases
; more lines have to be added here.
isymcol=0
if pwcn/2 le 2 then symcols=[70,238]
if pwcn/2 eq 3 then symcols=[70,200,238]
if pwcn/2 eq 4 then symcols=[70,130,200,238]
if pwcn/2 eq 5 then symcols=[46,82,128,200,238]
if pwcn/2 eq 6 then symcols=[40,70,100,170,200,238]
if pwcn/2 eq 7 then symcols=[40,65,85,110,160,200,238]
if pwcn/2 eq 8 then symcols=[10,40,70,100,130,170,200,238]
if pwcn/2 eq 9 then symcols=[10,25,40,70,100,130,170,200,238]
if pwcn/2 eq 10 then symcols=[10,25,40,55,70,100,130,170,200,238]
if pwcn/2 eq 11 then symcols=[10,25,40,55,70,100,130,145,170,200,238]
if pwcn/2 eq 12 then symcols=[10,25,40,55,70,100,130,145,170,185,200,238]
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 6) then begin
if ((PS[i].ptype eq 6) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
; Write dataset name for each structure processed for overplotting s/c on
; 1 plot
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if(reportflag) then begin
printf, 1, 'DATASET=',PS[i].source
endif
print, 'DATASET=',PS[i].source
if(i eq pwc[0]) then begin ; Remove this condition blk for single gifs
; This condition will allow multiple s/c to be overploted
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
; Control size for projection
; pmode=0 ;For mulitple gif files
;xs=790 & ys=512
;yoffset=0.15 ; For mulitple gif files
xs=790 & ys=612
yoffset=0.23 ; For mulitple gif files
;symcol=63
; User control of window size will likely cause map scale distortions to occur
;if(SSCWEB) then begin
;if(n_elements(xs_ssc) ne 0) then xs=xs_ssc
;if(n_elements(ys_ssc) ne 0) then ys=ys_ssc
;endif
;if((iproj eq 1) or (iproj eq 2) or (iproj eq 6)) then xs=460 & ys=520
deviceopen,6,fileOutput=GIF,sizeWindow=[xs,ys]
; COMMENTED OUT THIS SECTION FOR OVERPLOTS RTB 1/98
; Modify source name for SSCWEB DATASET label
;if(SSCWEB) then begin
;satname=strtrim(a.epoch.source_name,2)
;PS[i].source= PS[i].source + '_' + satname
;endif
;
;if(reportflag) then begin
;printf, 1, 'DATASET=',PS[i].source
;printf, 1, 'GIF=',GIF
;endif
;print, 'DATASET=',PS[i].source
;print,'GIF=',GIF
endif ; Remove this condition for single gifs.
; This condition will allow multiple s/c to be overploted
endif else begin
window,/FREE,XSIZE=xs,YSIZE=ys,TITLE='MAPPED PLOT'
endelse
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' ... as MAPPED.'
rng_val=[start_time,stop_time]
; Produce the mapped plots
;For overplot on single gif file
;if(i eq pwc[0]) then pmode=0 else if(pmode eq -1) then pmode=7
; RCJ 12/20/2007 pmode is (number_of_satellite_traces_I_want - 1)
if(i eq pwc[0]) then pmode=0 else if(pmode eq -1) then pmode=11
if((n_elements(polon) ne 0) and (n_elements(polat) ne 0) and $
(n_elements(rot) ne 0)) then begin
vlat=fltarr(3)
vlat[0]=polat
vlat[1]=polon
vlat[2]=rot
endif
symcol=symcols[isymcol]
isymcol=isymcol+1
s = plot_maps(a,station=station,vlat=vlat,iproj=iproj,lim=lim,$
latdel=latdel,londel=londel,Ttitle=thetitle,$
pmode=pmode,rng_val=rng_val,num_int=num_int,$
lthik=lthik,symsiz=symsiz,symcol=symcol,$
charsize=chtsize,xmargin=xmargin,ymargin=ymargin,$
xoffset=xoffset,yoffset=yoffset,lnlabel=lnlabel,nocont=nocont,$
SSCWEB=SSCWEB,doymark=doymark,hrmark=hrmark,hrtick=hrtick,$
mntick=mntick,mnmark=mnmark,lnthick=lnthick,$
autolabel=autolabel,datelabel=datelabel,_extra=extras)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Mapped plot failed' & close, 1
print, 'STATUS=Mapped plot failed'
return, -1
endif
endif
endif
; The following condition should be removed for separate single gif files
; This will allow multiple s/c to be overploted
if(pwcn gt 0) then begin
if(i eq pwc[pwcn-1]) then begin
if(reportflag) then begin
printf, 1, 'GIF=',GIF
endif
print, 'GIF=',GIF
deviceclose ; close any open gif
endif
endif
endfor
; end for mapped plots
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Make a pass thru the plot script, select all structures for orbit plots,
; submit all structures to orb_mgr to plot satellites by coordinate system
; chosen.
iorb=0
orbit_trip=0
a_id=-1 ; Reset structure id
for i=0,n_elements(PS)-1 do begin
if (PS[i].ptype eq 5) then begin
orbit_trip=1
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
aa_lab='aa'+strtrim(string(iorb),2)
s=execute(aa_lab+'=a'+strtrim(string(PS[i].snum),2))
if(iorb eq 0) then begin
mega_aa=create_struct(aa_lab,aa0)
endif else begin
if(iorb eq 1) then temp_mg=create_struct(aa_lab,aa1)
if(iorb eq 2) then temp_mg=create_struct(aa_lab,aa2)
if(iorb eq 3) then temp_mg=create_struct(aa_lab,aa3)
if(iorb eq 4) then temp_mg=create_struct(aa_lab,aa4)
if(iorb eq 5) then temp_mg=create_struct(aa_lab,aa5)
if(iorb eq 6) then temp_mg=create_struct(aa_lab,aa6)
if(iorb eq 7) then temp_mg=create_struct(aa_lab,aa7)
if(iorb eq 8) then temp_mg=create_struct(aa_lab,aa8)
if(iorb eq 9) then temp_mg=create_struct(aa_lab,aa9)
if(iorb eq 10) then temp_mg=create_struct(aa_lab,aa10)
if(iorb eq 11) then temp_mg=create_struct(aa_lab,aa11)
if(iorb eq 12) then temp_mg=create_struct(aa_lab,aa12)
mega_aa=create_struct(mega_aa,temp_mg)
endelse
a_id = PS[i].snum
iorb=iorb+1
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
if(n_elements(xs_ssc) ne 0) then xsize=xs_ssc
if(n_elements(ys_ssc) ne 0) then ysize=ys_ssc ; Orbits xsize=ysize
; satname=strtrim(temp_mg.epoch.source_name,2)
x1=execute('satname='+aa_lab+'.epoch.source_name')
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
endif
endif
endfor
if(orbit_trip eq 1) then begin
out_name=strarr(10)
if(n_elements(start_time) ne 0) then tstart=start_time
if(n_elements(stop_time) ne 0) then tstop=stop_time
;if keyword_set(GIF) then begin
; ;if (gif_counter gt 0) then begin
; ; c = strpos(GIF,'.gif') ; search for .gif suffix
; ;if (c ne -1) then begin
; ;c = strmid(GIF,0,c) & GIF=c+strtrim(string(gif_counter),2)+'.gif'
; ;endif else GIF=GIF+strtrim(string(gif_counter),2)
; ; endif
; ; For orbit 1 image can have multiple sources
; ; GIF=outdir+PS[i].source+'_'+pid+'_'+string(gif_counter)+'.gif'
; if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
; if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
; if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
; GIF=outdir+'ORBIT_'+pid+'_'+gifn+'.gif'
;endif
if plottype eq 'gif' then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+'ORBIT_'+pid+'_'+gifn+'.gif'
gif_ps_open=1L & gif_counter = gif_counter + 1
xsize=720 & ysize=850 ; RCJ Default in orb_mgr.pro
endif
if plottype eq 'pscript' then begin
if(ps_counter lt 100) then psn='0'+strtrim(string(ps_counter),2)
if(ps_counter lt 10) then psn='00'+strtrim(string(ps_counter),2)
if(ps_counter ge 100) then psn=strtrim(string(ps_counter),2)
out_ps=outdir+'ORBIT_'+pid+'_'+psn+'.eps'
;; Initialize window state and open the ps file
;WS.ys = b + WS.ymargin[0] + WS.ymargin[1] ; add room for timeaxis
;;
;deviceopen,1,fileOutput=out_ps,/portrait,sizeWindow=[WS.xs,WS.ys]
gif_ps_open=1L & ps_counter = ps_counter + 1
;3/18/2010 TJK needed smaller x for 4 panel (ssc type) orbits - somehow making
;the x dimension smaller males the 4 panels fit... go figure
;xsize=25000 & ysize=28000 ; RCJ Utter guesses
xsize=21000 & ysize=28000 ; TJK seems to work better...
endif
;Check to see if spdf_plotmaster is being called by ssc_plot, and
;Postscript option requested
help, /traceback, output=trace_back
if (n_elements(trace_back) gt 1) then begin
if (strcmp('ssc_plot',trace_back[n_elements(trace_back)-1], /fold_case) && keyword_set(PS)) then begin
; print, 'TJK DEBUG Requested size of orbit plot is ',xsize, ysize
; print, 'TJK setting orb_vw to xy'
orb_vw='xy'
endif
endif
out_strc=orb_mgr(mega_aa,$
tstart=tstart,tstop=tstop,xsize=xsize,ysize=ysize, $
orb_vw=orb_vw,press=press,bz=bz,xmar=xmar,$
ymar=ymar,doymark=doymark,hrmark=hrmark,hrtick=hrtick, $
mntick=mntick,mnmark=mnmark,xumn=xumn,xumx=xumx,yumn=yumn,$
yumx=yumx,zumn=zumn,zumx=zumx,rumn=rumn,rumx=rumx,labpos=labpos,$
chtsize=chtsize,GIF=GIF,GCOUNT=gif_counter,ps=out_ps,pCOUNT=ps_counter, $
SSC=SSCWEB,REPORT=reportflag,$
DEBUG=debugflag,us=us,bsmp=bsmp, $
symsiz=symsiz,lnthick=lnthick,autolabel=autolabel,datelabel=datelabel,$
eqlscl=eqlscl,panel=panel)
s=out_strc
if(s eq -1) then begin
if(reportflag) then begin
printf, 1, 'STATUS=Orbit Plot Failed'
close, 1
endif
print, 'STATUS=Orbit Plot Failed'
return, -1
endif
endif
; Display of map images will be accomplished through calls to spdf_plotmaster
; where the DISPLAY_TYPE for map image variables will be set to "MAP_IMAGE"
; These variables will be passed to a new function called plot_map_images.pro
; which will process and display each image in a fashion similar to plot_images
; (ie. an image of thumbnails will initially be produced w/ an option to
; select & displays individual thumbnails). The auroral_image.pro function will
; be incorporated into plot_map_images. Uviptg.pro used to generate lats and
; lons for polar uvi display will be incorporated into the virtual variables
; scheme.
; AT THIS POINT SETTING UP CASE SPECIFIC CODE. WIll NEED TO GO BACK
; AND INCORPORATE SOME OF THIS INTO VIRTUAL VARIABLES
;
; end for orbit plots
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all auroral image map plots
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 8) then begin
if ((PS[i].ptype eq 8) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as map images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
;Test for GPS - does work for Dieter's additional request
; Continent = 0
; Grid = 0
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce the images
s = plot_map_images(a,PS[i].vname,CENTERLONLAT=CENTERLONLAT,$
THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
DEBUG=debugflag,/COLORBAR)
;GPS Test DEBUG=debugflag,/COLORBAR,GRID=GRID,CONTINENT=CONTINENT)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Map Image plot failed' & close, 1
print, 'STATUS=Map Image plot failed'
return, -1
endif
endif
endfor ;for all mapped image plots
; end for mapped images
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all skymap plots (TWINS)
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 20) then begin
if ((PS[i].ptype eq 20) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as skymap images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/
; image data to be processed otherwise
; keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce the images
s = plot_skymap(a,PS[i].vname,THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
DEBUG=debugflag,/COLORBAR)
;,GRID=GRID,CONTINENT=CONTINENT)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next
;plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=SkyMap Image plot failed' & close, 1
print, 'STATUS=SkyMap Image plot failed'
return, -1
endif
endif
endfor ;for all skymap image plots
; end for skymap images - special for TWINS
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all skymap image movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 21) then begin
if ((PS[i].ptype eq 21) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as skymap movie images...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Produce the skymap movie file
s = movie_skymap(a,PS[i].vname,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
xsize=xsize, ysize=ysize, movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop,LIMIT=limit_movie,$
DEBUG=debugflag,/COLORBAR)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=SKYmap movie failed' & close, 1
print, 'STATUS=SKYmap movie failed'
return, -1
endif
endif
endfor
; end for movie skymap images
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Generate all Plasmagram plots
a_id=-1
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 9) then begin ;look for all plasmagrams
if ((PS[i].ptype eq 9) and (plottype ne 'pscript')) then begin ;look for all plasmagrams
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Produce debug output if requested.
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as plasmagram.'
; Generate the plasmagram
; Determine name for new gif file and create GIF/X-window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif else deviceopen,0 ; producing XWINDOWS
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Get the index of the time variable associated with variable to be plotted
b = a.(PS[i].vnum).DEPEND_0 & c = spdf_tagindex(b[0],tag_names(a))
if (strpos(a.(c[0]).CDFTYPE, 'CDF_EPOCH16') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP is not
;used but the data is in epoch16
if (n_elements(start_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, start_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
if (n_elements(stop_time16) eq 0) then begin ;convert the regular epoch to epoch16
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_epoch16, stop_time16, yr,mo,dd,hr,mm,ss,mil,0,0,0,/compute
endif
start_time = start_time16 & stop_time = stop_time16
endif
if (strpos(a.(c[0]).CDFTYPE, 'CDF_TIME_TT2000') ge 0) then begin
;The following if statements are needed in the case where TSTART/TSTOP are not
;used but the data is in time TT2000
;instead of regular Epoch or Epoch16
if (n_elements(start_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, start_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, start_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
if (n_elements(stop_timett) eq 0) then begin ;convert the regular epoch to tt2000
cdf_epoch, stop_time, yr,mo,dd,hr,mm,ss,mil,/break
cdf_tt2000, stop_timett, yr,mo,dd,hr,mm,ss,mil,0,0,/compute
endif
start_time = start_timett & stop_time = stop_timett
endif
s = plot_plasmagram(a,PS[i].vname,$
GIF=GIF, /CDAWEB, TSTART=start_time,TSTOP=stop_time, $
/colorbar, DEBUG=debugflag, thumbsize=thumbsize,$
FRAME=FRAME, REPORT=reportflag, NONOISE=NONOISE)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Plasmagram plot failed' & close, 1
print, 'STATUS=Plasmagram plot failed'
return, -1
endif
; Update the state of the window
WS.pos[3] = WS.pos[3] - (pheight * PS[i].npanels) ; update Y corner
WS.pos[1] = WS.pos[1] - (pheight * PS[i].npanels) ; update Y origin
endif
endfor
; end for plasmagrams
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all image plots for plasmagram
; movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 15) then begin
if ((PS[i].ptype eq 15) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as flux movie...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Produce the images
s = plasma_movie(a,PS[i].vname,XSIZE=XSIZE,YSIZE=YSIZE,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop,$
DEBUG=debugflag,/COLORBAR)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Plasmagram movie failed' & close, 1
print, 'STATUS=Plasmagram movie failed'
return, -1
endif
endif
endfor
; end for plasma movies
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate fuv images
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 16) then begin
if ((PS[i].ptype eq 16) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as flux image...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Produce the images
print,'Calling plot_fuv_images. Gif = ',gif
s = plot_fuv_images(a,PS[i].vname,$
CDAWEB=cdawebflag,GIF=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,NONOISE=NONOISE,$
DEBUG=debugflag,/COLORBAR)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=FUV image failed' & close, 1
print, 'STATUS=FUV image failed'
return, -1
endif
endif
endfor
; end for fuv images
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate fuv movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 17) then begin
if ((PS[i].ptype eq 17) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif' ; was 'mpg'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as fuv movie...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; Produce the images
;print,'Calling fuv_movie. mpeg = ',gif
s = fuv_movie(a,PS[i].vname,$
MPEG=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,$
movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop,LIMIT=limit_movie,$
/COLORBAR)
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=FUV movie failed' & close, 1
print, 'STATUS=FUV movie failed'
return, -1
endif
endif
endfor
;
a_id=-1 ; Reset structure id
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 18) then begin
if ((PS[i].ptype eq 18) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
;if keyword_set(GIF) then begin
; if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
; if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
; if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
; GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
; gif_counter = gif_counter + 1
;endif
if plottype eq 'gif' then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_ps_open=1L & gif_counter = gif_counter + 1
endif
if plottype eq 'pscript' then begin
if(ps_counter lt 100) then psn='0'+strtrim(string(ps_counter),2)
if(ps_counter lt 10) then psn='00'+strtrim(string(ps_counter),2)
if(ps_counter ge 100) then psn=strtrim(string(ps_counter),2)
out_ps=outdir+PS[i].source+'_'+pid+'_'+psn+'.eps'
gif_ps_open=1L & ps_counter = ps_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as wind plot...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce the images
s = plot_wind_map(a,PS[i].vname,$
THUMBSIZE=THUMBSIZE,FRAME=FRAME,$
CDAWEB=cdawebflag,GIF=GIF,ps=out_ps,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,$
; following line is for tidi. 15 orbits in one day, 29 points each
MYSCALE=200., xy_step=29.*15.,$
DEBUG=debugflag)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Wind plot failed' & close, 1
print, 'STATUS=Wind plot failed'
return, -1
endif
endif
endfor ;for all mapped image plots
; end for wind maps
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
; Make a pass thru the plot script and generate all image plots for map movies
for i=0,n_elements(PS)-1 do begin
;if (PS[i].ptype eq 19) then begin
if ((PS[i].ptype eq 19) and (plottype ne 'pscript')) then begin
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
; Determine name for new gif file and create GIF/window
if keyword_set(GIF) then begin
if(gif_counter lt 100) then gifn='0'+strtrim(string(gif_counter),2)
if(gif_counter lt 10) then gifn='00'+strtrim(string(gif_counter),2)
if(gif_counter ge 100) then gifn=strtrim(string(gif_counter),2)
;GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.mpg'
GIF=outdir+PS[i].source+'_'+pid+'_'+gifn+'.gif'
gif_counter = gif_counter + 1
endif
; Produce debug output if requested
if keyword_set(DEBUG) then print,'Plotting ',PS[i].vname,' as movie...'
; Modify source name for SSCWEB DATASET label
if(SSCWEB) then begin
satname=strtrim(a.epoch.source_name,2)
PS[i].source= PS[i].source + '_' + satname
endif
if (reportflag eq 1) then printf, 1, 'DATASET=',PS[i].source
print, 'DATASET=',PS[i].source
; For CDAWEB set the FRAME=0. This will allow multiple structures w/ image
; data to be processed otherwise keyword_set(FRAME) is true even for structures
; where it shouldn't be RTB 4/98
if(cdawebflag) then FRAME=0
; Produce movie
s = movie_wind_map(a,PS[i].vname,$
CDAWEB=cdawebflag,mgif=GIF,REPORT=reportflag,$
TSTART=start_time,TSTOP=stop_time,$
; following line is for tidi. 15 orbits in one day, 29 points each
MYSCALE=200., xy_step=29.*15.,$
movie_frame_rate=ps[i].movie_frame_rate,$
movie_loop=ps[i].movie_loop,$
DEBUG=debugflag)
thumbsize = 50 ;reset thumbsize otherwise what is set inside the
;above call will be used for the next plot type...
if(s eq -1) then begin
if(reportflag) then printf, 1, 'STATUS=Wind map movie failed' & close, 1
print, 'STATUS=Wind map movie failed'
return, -1
endif
endif
endfor
; end for wind map movies
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a_id=-1 ; Reset structure id
;TJK - 2/14/2005 - handle the case where the values for data variable(s) are all fill.
for i=0,n_elements(PS)-1 do begin
eflag = strpos(strupcase(PS[i].vname),'EPOCH') ;don't tell the user about epoch variables.
; Ensure that 'a' holds the correct data structure
if (PS[i].snum ne a_id) then begin
s=execute('a=a'+strtrim(string(PS[i].snum),2)) & a_id = PS[i].snum
endif
;j = PS[i].vname
;stat = execute('v_type = a.'+j+'.var_type')
; RCJ 02/25/2005 Changed this line to get the number instead
; of the name because a var called 'Ne' gave us a syntax error!
stat = execute('v_type = a.('+strtrim(string(ps[i].vnum),2)+').var_type')
stat = execute('c_type = a.('+strtrim(string(ps[i].vnum),2)+').cdftype')
;print, 'TJK DEBUG: VARIABLE ',ps[i].vname,' ',v_type
; RCJ 03/29/2006 The line below fails if there's no v_type
;if (strupcase(v_type) eq 'DATA' and stat) then begin
if (stat ne 0) then begin
if (strupcase(v_type) eq 'DATA') then begin
if (PS[i].ptype eq 0 and PS[i].npanels eq 0 and eflag eq -1)then begin
if (n_elements(ds) eq 0) then begin
ds = PS[i].source
print, 'DATASET=',ds
if strupcase(c_type) eq 'CDF_CHAR' then $
print, 'STATUS= ',PS[i].vname,' is of CDF_CHAR type and is not plottable.' else $
print, 'STATUS= ',PS[i].vname,' data are all fill: reselect time range.'
endif else begin
if (PS[i].source ne ds) then begin
ds = PS[i].source
print, 'DATASET=',ds
endif
if strupcase(c_type) eq 'CDF_CHAR' then $
print, 'STATUS= ',PS[i].vname,' is of CDF_CHAR type and is not plottable.' else $
print, 'STATUS= ',PS[i].vname,' data are all fill: reselect time range.'
endelse
endif
endif
endif
endfor
; If generating a log/report file then close it.
if (reportflag eq 1) then close,1
; Set plot back to native method
case strupcase(strtrim(strmid(!version.os_family,0,3),2)) of
'MAC' : set_plot,'MAC' ; return to interactive on Mac
'WIN' : set_plot,'WIN' ; return to interactive on Windows
else : set_plot,'X' ; return to interactive on Unix/X
endcase
return,0
end