Source: src/idl_cvs/adddate.pro

 NAME:
       addDate
 PURPOSE:
       Add days to a date. Tries to return string in same form as input
 CATEGORY:
	Dates
 CALLING SEQUENCE:
       newDate = addDate(date, ndays)
 INPUTS:
       date = date string, e.g., '6/17/1951', '1951/6/17', or 19510617    
         17 Jun, 1951     Jun 17 1951   1951 Jun 17
         17/Jun/85   17-Jun-1951   85-Jun-17   17 June, 1951.
	nDays - number of days to add (negative number OK)
 KEYWORD PARAMETERS:
	JULIAN - if set, return as Julian day
	LONGYEAR - if set, return year as 4-digits 
 OUTPUTS:
       newDate = Returned date string
 EXAMPLES:
	IDL> print, addDate('6/17/1951', 13)
	06/30/1951

	IDL> print, addDate('June 17, 1951', 13)
	June 30, 1951

	IDL> print, addDate('6/17/51', 365)
	06/16/52				

	IDL> print, addDate('6-17-1951', -30)
	05-18-1951

	IDL> print, addDate('17-Jun-1951', -30)
	18-May-1951

	IDL> print, addDate('20110520', -30)
	20110420

	IDL> print, adddate(systime(),-2)
	28 Jun 11

 COMMON BLOCKS:
 NOTES:
 MODIFICATION HISTORY:
	20-May-2011 fix for longdates
	19-Feb-2010 add LONGYEAR keyword so 4-digit year returned
	17-Aug-2009 Written by Bill Davis

Source: src/idl_cvs/addlabelnodes.pro

 NAME:
       addLabelNodes
 PURPOSE:
       Add LABEL sub-nodes to MDSplus signal nodes reading info from a file
 CATEGORY:
       MDSplus, TCL 
 CALLING SEQUENCE:
       addLabelNodes, shot1, shot2, filename=filename
 INPUTS:
	shot1 = starting shot number to process (defaults to last shot)
	shot2 = last shot number to process (optional)
 KEYWORDS:
	filename - name of file with info - REQUIRED, 
		   see, e.g., BDAVIS$:[CVS.MISC.WF]tauslabel.dat
	   the file must contain 4 columns, separated by white space.  
	   the first column is the tagname (without \), the last column is 
	   the Label text enclosed in double quotes. The middle columns
	   can be any single word or character (file format from another
	   application).
	tree - name of tree -- defaults to 'WF'
 COMMON BLOCKS:
       NONE
 NOTES:
       YOU NEED PRIVILEGES to write to the MDSplus tree.
 LIMITATIONS:
 MODIFICATION HISTORY:
	25-Jan-01 Written by Bill Davis.

Source: src/idl_cvs/addmdstags.pro

 NAME:
       addmdstags
 PURPOSE:
       Add tags to MDSplus nodes
 PROCEDURE:
 CATEGORY:
       MDSplus, Summary 
 CALLING SEQUENCE:
       addmdstags, shot=shot, nodes=nodes, tags=tags
 INPUTS:
 KEYWORDS:
	shot - shot number to process
	nodes - MDSplus node names to which tag will added (all in same tree)
	tags - to add
	VERBOSE  - if set, more info is printed
	test  - doesn't write to MDSplus
 EXAMPLE:
       nodes = ['\PASSIVESPEC::TOP.IR.IMG0.RAWDATA.IR_408:TIMES', $
		 '\PASSIVESPEC::TOP.IR.IMG1.RAWDATA.IR_408:TIMES', $
		 '\PASSIVESPEC::TOP.IR.IMG2.RAWDATA.IR_408:TIMES' ]
	tags = ['img0_408_times', 'img1_408_times', 'img2_408_times' ]
	addmdstags, shot=128000, nodes=nodes, tags=tags, /verb, /test
   for i=shot1,shot1+499 do addmdstags, shot=i, nodes=nodes, tags=tags, /verb
 NOTES:
       YOU NEED PRIVILEGES to write to the MDSplus tree.
 LIMITATIONS:
	Divide by zeroes, etc. will cause a message like:
	    % Program caused arithmetic error: Floating illegal operand
 MODIFICATION HISTORY:
	27-Mar-2008 Written by Bill Davis.

Source: src/idl_cvs/addsignodes.pro

 NAME:
       addsignodes
 PURPOSE:
       Add signal nodes and tags to a MDSplus tree for many shots
 PROCEDURE:
 CATEGORY:
       MDSplus
 CALLING SEQUENCE:
       addsignodes, shot1, shot2, tags=[tag1,tag2,tag3,...]
 INPUTS:
	shot1 = starting shot number to process
	shot2 = last shot number to process
 KEYWORDS:
	tags - tags to add (if defined in the model tree, you
	       will not need to specify the corresponding nodes).
	nodes = if tags are not defined in the model tree, these are necessary
	tree - MDSplus tree
	usage - for MDSTCL node creation. Default='signal'
	VERBOSE  - if set, more info is printed
	test  - doesn't write to MDSplus
 NOTES:
       YOU NEED PRIVILEGES to write to the MDSplus tree.
 LOGIC:
	finds node names for tags. Then, if node names are not different
	than the "tag" names, does not add tags.
 LIMITATIONS:
	all signals must be in the same tree
 MODIFICATION HISTORY:
	11-Apr-07 changed for Linux (add output= to mdstcl)
	13-Jun-02 Written by Bill Davis.

Source: src/idl_cvs/addtreetotag.pro

 NAME:
       addTreeToTag
 PURPOSE:
       return tags with trees merged in
 CATEGORY:
       MDSplus, SCOPE
 CALLING SEQUENCE:
	names = addTreeToTag( tags, trees )
 INPUTS:
   tags - array of tags, e.g., '\ip1' (if tree already there, will not change)
   trees - array of trees (same dimension as tags)
 RETURNED:
	names - tag names with tree in them, e.g., '\engineering::ip1'
 KEYWORDS:
 COMMON BLOCKS:
       none
 EXAMPLE:
 	IDL> print, addTreeToTag( ['\ip1+\ip2'], ['engineering'] )
	\engineering::ip1+\engineering::ip2
 	IDL> print, addTreeToTag( ['\engineering::ip1.blah+\ip2'], ['engineering'] )      
	\engineering::ip1.blah+\engineering::ip2

 LIMITATIONS:
 MODIFICATION HISTORY:
	30-Apr-01 Written by Bill Davis

Source: src/idl_cvs/add_tag.pro

 NAME:
    ADD_TAG
       
 PURPOSE:
    Add a new tag to the structure. NOTE: if you want to add more
    than one tag at once, use ADD_TAGS

 CATEGORY:
    Programming
 
 CALLING SEQUENCE:
    add_tag, oldstruct, tagname, tagValue, newstruct, structyp=structyp

 INPUTS: 
    oldstruct: The original structure (or array of structures)
    tagname: string containing the new tag name
    tagValue: the initial value of the new tag, e.g. fltarr(5)
           or [3,5,6], or 0L, etc.

 KEYWORD PARAMETERS:
   structyp: a string with the name of the new structure.
     if already defined an error is printed.

 OUTPUTS: 
    newstruct: The structure with the new tag it it.

 OPTIONAL OUTPUT
    NONE

 CALLED ROUTINES:
    COMBINE_STRUCTS
 

 REVISION HISTORY:
    25-OCT-2000, Judith Racusin.

Source: src/idl_cvs/alphamovie10.pro

 NAME:
       alphamovie10
 PURPOSE:
       Plot every 10th frame in time, and overlay
       10 d-alpha traces. Have a marching vertical line indicating time 
	in a plot indicating the Strike Point Radius.

 CATEGORY:
       Animation, NSTX

 CALLING SEQUENCE:
	IDL> d=alphamovie10( 138000, tStart=tStart, tEnd=tEnd )

 INPUTS:
       shot = NSTX shot number 
 KEYWORD PARAMETERS:
    Inputs:
	tStart - 
	tEnd - 
	rMin - minimum time to display (DEFAULT: 25 )
	rMax - minimum time to display (DEFAULT: 85 )
	inc - how many D-alpha traces to put on a plot
	efit - 
	xsize - horizontal size of X window (DEFAULT: 600 )
	ysize - vertical size of X window (DEFAULT: 450 )
	xpos - initial X position of lower left of X window in pixels
	ypos - initial Y position of lower left of X window in pixels
	charsize - size of characters on plot (Default: 1.5)
	verbose - if set, will print many informational messages
	debug - if set, will stop before returning
 OUTPUTS:
       MPEGS can be saved from the IDL Animation Widget interface
 EXAMPLE:
	IDL> d=alphamovie10( 138000, /verb )

 NOTES:
       This routine uses X-memory, so too many frames can cause X errors.
	Try reducing the number of frames or xsize and ysize.
 MODIFICATION HISTORY:
	19-Jul-2010 put into xinteranimate by Bill Davis
	20-Apr-2010 written by Josh Kallman. cam4_fy10 written by Vlad.

Source: src/idl_cvs/amedian.pro

 NAME:
       AMEDIAN
 PURPOSE:
       Works the same as MEDIAN, but the effect tapers off at the edges.
 CATEGORY:
       Smoothing, Math
 CALLING SEQUENCE:
       Result = AMEDIAN( ARRAY, WIDTH )
 INPUT PARAMETERS:
       ARRAY   = One or two-dimensional array to be median filtered.
       WIDTH   = Width of the median filter box.
 OPTIONAL KEYWORD PARAMETERS:
       None.
 COMMON BLOCKS:
       None.
 SIDE EFFECTS:
       None.
 RESTRICTIONS:
       ARRAY must be one or two-dimensional.
 PROCEDURE:
       A larger array is constructed with the border filled with the reflected
       edges of the original array.  Then MEDIAN is applied to this larger
       array, and the area corresponding to the original array is returned as
       the result of the function.
 MODIFICATION HISTORY:
	26-Oct-2010 added edge keyword
	15-Jul-2008 for True Color images (dimensioned [3,xsize,ysize]), 
		    smooth over each color.
   	12-Jun-01 Made work for 1 dimension of 2 being small. [BD]
   	21-Feb-01 Just return array if width < or = 1. [BD]
       WRITTEN by William Thompson, February 1993.

Source: src/idl_cvs/anim2cine.pro

 NAME:
    anim2cine

 PURPOSE:
    Create an mpeg or avi movie from two .cin files from Phantom Cameras.
    The data can be color or monochrome

 CATEGORY:
    animation

 CALLING SEQUENCE:
    anim2cine, CineFile1, CineFile2, movieFile=movieFile, t1=t1, t2=t2

 INPUTS:
	CineFile1 - cine file
	CineFile2 - (optional)
	 - 
 OPTIONAL KEYWORD PARAMETERS:
	movieFile - name of output MPEG or QuickTime file (will default to a nice name), or 
	prefix - what would precede _shot_t1_t2 (in msec) in the output filename
	t1 - start time of animation in seconds
	t2 - end time of animation in seconds
	VIEW - if set, just displays images, and does not make an mpeg
   	ndups - if given means repeat every image 'ndups' times
   	despeckle - if set call despeckle routine (slow, but less "intrusive" 
		    than median)
	nSmooth - number input to median smoothing routine for camera data
	sigSmooth - number input to median smoothing routine for signal data
	topPixels -
	botPixels - 
	charsize - character size for plots. Default=2
	ctb - color table for non-color image 
	label1 - label on plot for CineFile1 (default='Monochrome')
	label2 - label on plot for CineFile2 (default='Color')
	gamma1 - gamma setting for camera 1
	gamma2 - gamma setting for camera 2
	saturation1 - saturation setting for camera 1, if color 
	saturation2 - saturation setting for camera 2, if color 
	min1 - minimum value for bytescaling camera 1
	min2 - minimum value for bytescaling camera 2
	max1 - maximum value for bytescaling camera 1
	max2 - maximum value for bytescaling camera 2
	region1 - crop region to display for camera 1    
	region2 - crop region to display for camera 2     
	byteScale - if set, will scale 
	sigName - if set, will not show Fast Camera images, but this
		  signal vs. time (defaults to \passivespec::BAYC_DALF_HAIFA)
	sigT1 - starting time of signal vs. time plot
	sigT2 - ending time of signal vs. time plot
	sigTitle - if set, will be displayed above sigName plot,
		   else tries to get label from MDSplus
	verbose - if set will print out info as it works
 OUTPUTS: 
	an MPEG file named by movieFile keyword

 EXAMPLE:
    
    anim2cine,camera1="Phantom710-9206", camera2="Phantom73-6663", shot=138767, $
		 sig1='\wf::ip',sig2='\wf::nel', t1=.405, t2=.406,  $
		 gamma1=.37,  min1=20, max1=1442, $
		 gamma2=.8, sat2=.3, max2=1440, rot2=1                               ,/debug

    anim2cine,camera1="Phantom710-9206", camera2="Miro2-7988", shot=138767, $
		 sig1='\wf::ip',sig2='\wf::nel', t1=.405, t2=.406,  $
		 gamma1=.37,  min1=20, max1=1442, $
		 gamma2=.3, sat2=.3, max2=255                                 ,/debug

    f1=findcamfiles('nstx_1_135258.cin')
    f2=findcamfiles('Miro_135258.cin')
    anim2cine,f1,f2,t1=.17,t2=.53, inc=10, mag1=2, mag2=3,  $
	       region1=[.08,.05,1,1], region2=[.1,.0, 1.0,.9], $
	       sig1='\operations::mi_h908_01:input_03*(-1.6)', sig2='\wf::prf', $
	       Units1='mTor', /QUICKTIME, sigLabel1='Antenna Power', /debug

    anim2cine, camera1='Phantom710-9206', camera2='Miro2-7988',  $
	        shot=140000, t1=0.2, t2=0.3, sigT1=0.0, sigT2=1.0, $
		sig1='\wf::ip', sig2='\wf::pnb',  nSmooth=5,  /verbose  , /debug

    anim2cine, 'NSTX_130387.cin', $
		'MIRO_130387.cin', $
		t1=0.1, t2=1.4, sig1='\wf::ip', sigTitle='Plasma Current', /verbose                      

    anim2cine, shot=130370, t1=0.5, t2=0.58, /verbose, /view    , /debug

    f1=findcamfiles('nstx_1_135254.cin')
    f2=findcamfiles('Miro_135254.cin')
    anim2cine,f1,f2,t1=.180,t2=.580, inc=10, $
              movieFile='NSTX_135254_180-580ms.mpg', mag1=2, mag2=3    , /debug
    	  
    f1='/p/nstxcam-archive/Phantom71-5040/2009/nstx_1_135254.cin'
    f2='/p/nstxcam-archive/Miro2-7988/2009/Miro_135254.cin'
    anim2cine,f1,f2,t1=.180,t2=.580, inc=10, $
		region1=[.08,.05,1,1], region2=[.1,.0, 1.0,.9], $
              movieFile='NSTX_135254_180-580ms.mpg', mag1=2, mag2=3    , /debug

    f1=findcamfiles('nstx_1_136159.cin')	; fastest one
    f2=findcamfiles('Miro_136159.cin')
    anim2cine, f1,f2,  mag2=2,  $
		label1='Full', label2='Dropper View', $
		gamma1=0.096,  min1=65,  max1=4095, $
		gamma2=1.188, min2=1114, max2=11075                 , /debug

   mv files to /w/nstx.pppl.gov/htdocs/nstx/Software/Diagnostics/FC2008
   (or whatever year) for web viewing at
   http://nstx.pppl.gov/nstx/Software/Diagnostics/

 MODIFICATION HISTORY:
	08-Dec-2011 added flip1 and flip2 keywords (also made work with just 1 file)
	31-Aug-2010 lots of changes to allow to work off web tool nstxmovie.html
	01-Jul-2010 added region1 and region2 keywords and allow different 
		    magnifications for different cameras
	08-Oct-2009 updates for 2009 cameras. Extract shot # from filenames, 
			if not input
	12-Nov-2008 mods because cineload now assuming frame 0 is beginning of data
	16-Jul-2008 Use Z-buffer, even when viewing, for smoother displays
	15-Jul-2008 Written by Bill Davis

Source: src/idl_cvs/animxyplot.pro

 NAME:
       animxyplot
 PURPOSE:
       Animate X-Y plot of a 2-D array
 CATEGORY:
       Animation
 CALLING SEQUENCE:
       IDL> animxyplot, data2d, x, time [, ....]
 INPUTS:
       data2d - 2 d array (1st dimension like x, 2nd like time)
	x - array for x-axis of x-yplot
	time
 KEYWORD PARAMETERS:
	(can have any keywords used in PLOT command -- will be passed on)
 	mpeg - if set, will create an mpeg of animation
	filename - name of mpeg file (default =  'plotanimation.mpg')
	rep - # number of times to repeat frames (to slow down mpeg) default=0
	t1 - time to start animation (indexes into time array) (default=start)
	t2 - time to end animation (default=end)
	xtitle - 
	ytitle - 
	xsize - xsize of window in pixels
	ysize - ysize of window in pixels 
	flip - if set, will flip mpeg image    
	timeTitle - appended to indication of time on plot (def='Sec.')
	pause - # of seconds to pause between plotted frames when creating
	verbose - if set, will print many informational messages
	debug - if set, debug output will be printed
 OUTPUTS:
       NONE; just the mpeg file, if specified
 EXAMPLE:
	nframes = 20
	nPts = 1000
	data2d = fltarr(npts, nframes)
	time = findgen(nFrames)/1000 +0.2
	x =findgen(npts)/npts*150 + 50
	for i=0,nframes-1 do data2d[0,i]=sin(x*5/max(x)+i/10.)*exp(1.-x/100-i/10.)
	animxyplot, data2d, x, time, xtitle='Radii', ytitle='Value', /mpeg
 NOTES:
 MODIFICATION HISTORY:
       18-Jan-2008 Written by Bill Davis, PPPL

Source: src/idl_cvs/arraymask.pro

 NAME:
	arrayMask

 PURPOSE:
 	Return an array mask where values are 1 if within the drawn polygon
 	and 0 if outside. 

 CATEGORY:
       Utility
 CALLING SEQUENCE:
       IDL> mask=arrayMask( fullx, fully, x, y )
 INPUTS:
	fullx - full X array of data 
	fully - full y array of data
	x - x coordinates of polygon to enclose
	y - y coordinates of polygon to enclose

 OUTPUTS:
       mask - array dimensioned same as fullX and fullY containing 1's and 0's.

 EXAMPLE:
	IDL> fullx = findgen(65)
	IDL> fully = findgen(65)
	IDL> x = [10,10,20,20]
	IDL> y = [10,30,30,10]
	IDL> mask=arrayMask( fullx, fully, x, y )

 WRITTEN 03-Dec-2009 by Bill Davis

Source: src/idl_cvs/array_eq.pro

 NAME:
	ARRAY_EQ
 PURPOSE:
  	Return TRUE if two arrays are equal, else false.
 CATEGORY:
       Programming
 CALLING SEQUENCE: 
	logical=ARRAY_EQ(array1,array2)

 INPUTS:   
	bigArray - an array of numbers to look in
  	littleArray - an array to look for matches in bigArray
 OUTPUTS:
	logical - 0/1

 COMMON BLOCKS:
 NOTES:
 MODIFICATION HISTORY:
 	17-May-99 WMD Written

Source: src/idl_cvs/viewtext.pro

 NAME:
     badpar
 PURPOSE: (one line)
     Validate an input parameter against valid entries.
 DESCRIPTION:

     This is a general parameter checking function for validating input
     quantities in other procedures and functions.  This routine will
     generate an error message indicating what is wrong with the item.

     Example of use:

     pro foo,array
     if badpar(array,[4,5],2,CALLER='foo') then return
        .
        . code for foo .
        .
     end     This would cause an immediate return to the routine that called foo
     with an error message if the input was not either floating or double
     and 2 dimensional.

     As of IDL v3.0, these are the recognized type codes (see 1-218 in
        reference guide).

        Type
        Code     Data Type
        ----    -----------------------------
          0      Undefined
          1      Byte
          2      Integer
          3      Longword integer
          4      Floating point
          5      Double-precision floating
          6      Complex floating
          7      String
          8      Structure

 CATEGORY:
  Utility
 CALLING SEQUENCE:
     val = badpar(param,goodtype,goodrank)
 INPUTS:
     param    - IDL variable to validate.
     goodtype - Scalar or vector of type codes that are valid.
     goodrank - Scalar or vector of valid ranks.
 OPTIONAL INPUT PARAMETERS:
 KEYWORD PARAMETERS:
     CALLER   - String identifying the calling routine.
     DEFAULT  - Value to return in param if undefined and undefined allowed.
     DIMEN    - Dimensions of variable.
     NPTS     - Total number of elements in variable.
     RANK     - Rank of variable.
     TYPE     - Type of variable.
 OUTPUTS:
     Return value is true if the parameter is bad.  False if good.
 COMMON BLOCKS:
 SIDE EFFECTS:
	using the font keywords makes resizing very slow and inaccurate
 RESTRICTIONS:
 PROCEDURE:
 MODIFICATION HISTORY:
	03-Feb-03 Added FIT, FILE, and WID keywords. Made font work [BD]
     3/24/93 - Written by Marc W. Buie, Lowell Observatory.
     4/27/93 - MWB, added TYPE and DEFAULT keywords.

Source: src/idl_cvs/bad_ptdata_error.pro

 NAME:
       BAD_PTDATA_ERROR
 PURPOSE:
       Return a logical true IF  the PTDATA error is serious
 CATEGORY:
       GA, error processing
 CALLING SEQUENCE:
       logical = Bad_PTDATA_Error(ptdata_ierr)
 INPUTS:
       ptdata_ierr - error return from PTDATA calls
 KEYWORD PARAMETERS:
 OUTPUTS:
 RETURNED:	logical indication of a serious error 
		(per IDL definition, e.g., 0 IF  false)
 COMMON BLOCKS:
 MODIFICATION HISTORY:
               1-Apr-97 WMD Written

Source: src/idl_cvs/bangpw.pro

 NAME:
       bangPW
 PURPOSE:
       Widget to set interactively some !P values. Lists colors by name, 
	if mk_color used; otherwise finds "closest" index to named colors. 
	Allows selection of several custom plotting symbols (see PLOTSYM).
 CATEGORY:
       Graphics, Widgets
 CALLING SEQUENCE:
       IDL> bangPW
 INPUTS:
 KEYWORD PARAMETERS:
     Optional Keywords:
	  UPDATECALLBACK - a routine to call after struct system variable is set
	  GROUP_LEADER - This widget is destroyed if it's GL is destroyed
 OUTPUTS:
       The system variable !P is changed               	
 COMMON BLOCKS:
       NONE
 EXAMPLE:
	IDL> bangPW, UPDATECALLBACK='myReplotter'
 NOTES:
	If an application overrides !P.* parameters, or specifies them on
	the plot command, changing settings with this widget will not override.
	!P.SYMSIZE not controlled, because it seems to have no effect.
 MODIFICATION HISTORY:
	29-Apr-08 check for routine being compiled (vs. needing to be found)
		  added a "Refresh" button which, if a proper plotting routine
		  is provided, will replot with any changed settings.
	17-Aug-01 Allow lines with symbols [BD]
	30-Oct-00 Written by Bill Davis, PPPL

Source: src/idl_cvs/bell.pro

 NAME:
       BELL
 PURPOSE:
       Ring terminal bell.
 CATEGORY:
	Programming, Sound, Errors
 CALLING SEQUENCE:
       bell, [n]
 INPUTS:
       n = number of rings (def=1).  in
 KEYWORD PARAMETERS:
 OUTPUTS:
 COMMON BLOCKS:
 NOTES:
 MODIFICATION HISTORY:
       R. Sterner, 20 Oct, 1989.

 Copyright (C) 1989, Johns Hopkins University/Applied Physics Laboratory
 This software may be used, copied, or redistributed as long as it is not
 sold and this copyright notice is reproduced on each copy made.  This
 routine is provided as is without any express or implied warranties
 whatsoever.  Other limitations apply as described in the file disclaimer.txt.

Source: src/idl_cvs/betterrainbow.pro

 NAME:
       betterrainbow
 PURPOSE:
       Loads a rainbow color palette with 6 evenly-spaced (roughly) colors
 CATEGORY:
      Colors,  Graphics
 CALLING SEQUENCE:
       IDL> betterrainbow
 INPUTS:
       NONE  
 KEYWORD PARAMETERS:
    Optional Keywords:
	BAR - if set, will draw a color bar on plot
	nColors - # of colors to load (Defaults to !D.TABLE_SIZE)
	lessRed - if set, rainbow will have a smaller red region
	WhiteBottom - if set, there will be a white region at the bottom
	topColor - can be an index or 'white' or 'black'
	botColor - can be an index or 'white' or 'black'
	linePlots - if set, top color will be black and bottom color will be white
	noYellow - if set, don't have yellow (because doesn't show up well on white)
 OUTPUTS:
       NONE (color table changed)
 EXAMPLE:
	IDL> betterrainbow, botColor='white', /bar
	IDL> 

 LIMITATIONS:
	always starts at the bottom of color palette.
 MODIFICATION HISTORY:
	13-Aug-2012 mucked with white bottom
	04-Nov-2011 smoothed out corners in green between 180 & 240, so discontinuity not
		    seen in organge
	26-Aug-2011 added smooth parameter, default it to 50. Round off purple to
		    blue transition.
	18-Jun-2008 added NoYellow keyword
	02-Aug-2007 fix bug for /lineplot and ncolors<256; 
		    if /linePlots keyword set, reset !p.color & !p.background
	30-Apr-2007 added linePlots keyword
	26-May-2006 added ncolors and whiteBottom keywords
	14-Feb-2005 add topColor and botColor keywords
       15-Jul-2002 Written by Bill Davis, PPPL

Source: src/idl_cvs/betterticklabels.pro

 NAME:
 	betterticklabels

  PURPOSE:
 	Tick labels are made a little cleaner. E.g., shorter exponentials,
	no unnecessary trailing zeroes, accurate numbers when tick values
	are small differences between large numbers, etc.

 CATEGORY:
	Plotting, Graphics

  EXAMPLE:
	IDL> plot, y, ytickformat='betterticklabels'

  EXAMPLE A - Make a dummy plot call so can determine Tick Max:
	IDL> COMMON betterticklabels_common, yticklabels
	IDL> plot, y, ytick_get=yticklabels, ytickname=replicate('      ',30)
	IDL> AXIS, YAXIS=1, YRANGE=!y.crange, ytickformat='betterticklabels'
	IDL> dum = TEMPORARY(yticklabels)	; so doesn't affect later calls

  HISTORY:
	03-Mar-2008 slight mod to handle floating point comparison
       03-Aug-2006 fixed for values less than 2.e-6
	15-Apr-04 be able to return xtick values and x tic labels (NOT DEBUGGED)
	15-Oct-01 shift y axis labels if !p.font=0 (helps with some 3-D plots)
	11-Jan-01 shift y-axis labels if on TEK and !p.font=0 
	09-Oct-00 Written by Bill Davis

Source: src/idl_cvs/bin2d.pro

 NAME:
       Bin2D
 PURPOSE:
       Create a density image (2D histogram) from arrays of (x,y) points,
       or create an image of a function from arrays of ( x, y, f(x,y) ) data.
       In first case each pixel counts # of (x,y) points falling into
       a 2D bin (box), thus forming an image of counters. In optional case,
       each pixel is the average of all f(x,y) data falling into the box.
       Boxes are determined by dividing the (x,y) range into a uniform grid.
 CATEGORY:
	Image Processing
 CALLING EXAMPLES:
       imh = Bin2D( x, y, NPIX=64, XRAN=[0,20], YRAN=[-5,5] )
       imz = Bin2D( x, y, FXY=z, NPIX=[200,100] )
 INPUTS:
       X = array (any dimension) of x values.
       Y = array of y values, should correspond to x array.
               optionally, x can be of the form [[x],[y]]
               containing both x and y coordinates as rows of matrix,
               and then argument y should not be specified.
 KEYWORDS:
       XRAN and YRAN : specify the x,y range to be mapped into the image.
                       Common Bin2D, xminc,xmaxc, yminc,ymaxc
                       can also specify the x,y range if keywords are not used,
                       otherwise the defaults = min-max ranges of x and y.
       NPIXELS = 1 or 2 element integer array specifying size of result,
                       (single value means square image), default = [64,64].
      /NOCLIP means do not bother checking if (x,y) are within range (faster).
       TYPE_VAR = type code specifying the IDL variable type of result,
               (1=byte, 2=short, 3=Long, 4=float,... default=2, short integer).
 KEYWORDS (optional):
       IMAGE_DENSITY = an existing image of counters (2D histogram)
                       to which the result is added (overrides NPIX=).
       FXY = array giving z = f(x,y) for the purpose of binning into an image
               however, bins with no (x,y) data points are left = zero.
               (NOTE: must specify XRAN and YRAN, or set /NOCLIP).
   if /BOTH is set and FXY=z is given, then the binned image of z=f(x,y) is
               returned by function, and an image of (x,y) density is
               returned via the keyword IMAGE_DENSITY.
 OUTPUTS:
       Result of function is an image of the density of (x,y) points, or an
       image of scalar field function if z values are given at (x,y) points.
 PROCEDURE:
       Binning is performed by finding number of (x,y) duplicates
       at each pixel,  using the IDL sort and where functions.
 HISTORY:
       written Frank Varosi, U.of MD., 1988.
               F.V. 1990, modif. for IDL-V2.

Source: src/idl_cvs/bitmapbuttons.pro

 NAME:
       bitmapbuttons
 PURPOSE:
       Illustrate use of bitmapbuttons in IDL
 CATEGORY:
       GUI, buttons
 CALLING SEQUENCE:
       IDL> bitmapbuttons
    Then click on buttons and watch them change.
 COMMON BLOCKS:
       none
 NOTES:
	Requires IDL 5.2 or later.
 LIMITATIONS:
	This may not be the easiest way to manage button states
 MODIFICATION HISTORY:
	27-Jan-00 [BD]

Source: src/idl_cvs/bits.pro

 NAME:
       bits
 PURPOSE:
       Given a byte or integer, return a vector of 8 or 16 values
       which are the binary representation of the value.
 CATEGORY:
       bits, hardware
 INPUT:
       invalue - The byte or integer value to check
 OUTPUT:
       bitarr  - The 8-element array with values set
                 if the bit is set
 EXAMPLE:
	IDL> BITS, invalue, BITARR
 HISTORY:
       Written 1988 by M.Morrison
       13-Nov-92 (MDM) - Modified to allow integer*2 values
                         and to allow an array of values.
        7-Apr-94 (MDM) - Allow integer*4 values
       15-Aug-94 (MDM) - Corrected error from 7-Apr-94 mod which
                         did not allow an array of inputs

Source: src/idl_cvs/blobbinranges.pro

 NAME:
 	blobbinranges

 PURPOSE:
	plot bins of one variable vs another from blob database  and drawn
       ranges, of say 90%, in Y for each binned point.
       See http://nstx.pppl.gov/nstx/Software/Applications/blobDBdefs.txt
	for an explanation of variables and units of database variables.

 CATEGORY:
       Blobs

 CALLING SEQUENCE:
	IDL> blobBinRanges, filename

  INPUTS:
  ------
	filename - file saved from DbAccess

  KEYWORDS:
  --------
	xVar - Column in DbAccess for independent variable (default='topNorm')
	yVar - Column in DbAccess for dependent variable (default='xVel')
		Note: velocities are in Km/sec. Most other things are in pixels.
	x1 - starting pixel in horizontal direction to consider
	x2 - ending pixel in horizontal direction to consider
	t1 - starting pixel in vertical direction to consider     
	t2 - ending pixel in vertical direction to consider        
	percent - % of data points to draw bars over (Default=90, but 95% might be better)
	binSize - length of bin (on X axis)
	nBins - if set, will set binsize so this # of bins cover range of X data
	minHt - min value of topNorm
	maxHt - max value of topNorm
	saveFile - if=1, will save a JPEG file
	plotFile - file name to save JPEG to
	position - bounding box in normalized coords (def=[.1,.1,.95, .9])
	xrange - the x limits of the plot (set !x.style=1 before running for exact)
	yrange - the y limits of the plot (set !y.style=1 before running for exact)
	explain - include in the legend an explanation of bars and numbers
	ctb - color table for color contours (default=3, hot metal)
	interp - if set, will interpolate colors indicating blobs per bin

  EXAMPLES:
  --------
    IDL> blobBinRanges, '/u/bdavis/cvs/idl_cvs/DBoutSH142000.txt', /debug	  

    IDL> blobBinRanges, '/u/bdavis/cvs/idl_cvs/DBoutSH142000.txt', $
	     x1=40, charsize=1.5,  $    
    	     xtitle='Normalized Blob Brightness',  $
	     ytitle='Radial Velocity (Km/s)',  $  
    	     title='Shot 142000; 240-270 msec', legend='Outside Separatrix', $    
    	     percent=90, yrange=[-2,4], xrange=[1,7], /contours, /rainbow		  
 

    IDL> blobBinRanges, '/u/mko/testfile_142000.txt', x1=40, charsize=1.5,  $    
    	     xtitle='Normalized Blob Brightness',  $
	     ytitle='Radial Velocity (Km/s)',  $  
    	     title='Shot 142000; 240-270 msec', legend='Outside Separatrix', $    
    	     percent=90, yrange=[-2,4], xrange=[1,7], /contours, /rainbow		  
	
  MODIFICATION HISTORY:
  --------------------
  	WRITTEN 26-Jul-2012 by Bill Davis

Source: src/idl_cvs/blobtrails.pro

 NAME:
        blobtrails

 PURPOSE:
        draw trails of blob trajectories that go through a certain region of the image. 
        Data comes from a database of blob characteristics for a given shot, and perhaps
        just part of a shot (see populateblobs.pro).
      
 CATEGORY:
       Blobs

 CALLING SEQUENCE:
       IDL> blobtrails, table=table, xpt=xpt, ypt=ypt, box=box, minht=minht

 INPUTS:
 -------
      database - SQL database (server maintained by Tom Carroll) for blobs, DEF='BLOBS'
      table - table name in database of blobs for a period within a shot, or
      shot - will assume table is named 'SH'+shot

      xpt - horizontal center of region from which trajectories start
      ypt - vertical center of region from which trajectories start
      boxradius - # of pixels around [xpt, ypt] to allow for start of trajectories
      minHt - min height of blob in normalized image. (when blob passes through box) 
      lifeRequired - lifetime required in seconds (after passing through box) , or
      needed - number of frames needed (after passing through box) to bother with
      t1 - (optional) 1st time to consider (seconds)
      t2 - (optional) last time to consider (seconds)
      timeOffSet - amount needed to be added to camera time to get to shot time
      rainbow - if set, will use "betterrainbow" pallette, rather than hot metal.
      nSmooth - smoothing to be applied before track is plotted (default=3)
      maxJump - max # of pixel to change per frame to be considered same blob
                 (DEF=10)
      msec - if set, display times in millisec
      ellipse - if set, draw ellipses where fit was made
      symWidth - if <=0 then draw ellipses in realistic shapes
      scale - if realistic blob sizes drawn, scale their size by this factor
      xplot1 - starting x pixel for plot
      xplot2 - ending x pixel for plot
      yplot1 - starting y pixel for plot
      yplot2 - ending y pixel for plot
      verbose - if set, lots of information output listed
      debug - if set, will output even more and may stop at some spots
          "rise" was the difference from the max of a blob (after normalizing frame) 
              and the lowest closed contour line that enclosed it. 

 EXAMPLES:
      IDL> blobtrails, 32,32, box=2, /rainbow, minht=1.1, /list, /debug

      IDL> blobtrails, 25,25, box=2, /rainbow, shot=138234, ny=80, /list     , /debug

      IDL> maxJump=5
      IDL> blobtrails, table='SH138234',xpt='32',ypt='32',boxRadius='2',minHt='2', $
                       maxJump=maxJump, needed='3',t1='0',t2='20', ctb='-1', ListTimes='on', $
                       eFileType='None',psfilename='blobtrails',emailPsAddress='', /deb

      IDL> blobtrails, table='SH1091216028', x1=39, x2=41, y1=2,y2=62, psym=4, minHt='1.5', $
                       maxJump=10, needed='3',t1='0',t2='20', ctb='-1', ListTimes='on',   $
                       xplot1=30, xplot2=60,  /msec,  chimax=5, nSmooth=3, $
                       eFileType='None',psfilename='blobtrails',emailPsAddress='', /deb

         blobtrails, table='SH138234',xpt='20',ypt='20',boxRadius='3', minHt='2', $
                   maxJump=maxJump, needed='3',ctb='-1',  $
                    t1=530, t2=550, $
                   xplot1=10, xplot2=50, yplot1=10, yplot2=80, charsize=1.5, /ellip          , /deb

         blobtrails, table='SH138234',x1=15, x2=30, y1=20, y2=22,  minHt='2.5', $
                   maxJump=maxJump, needed='3',ctb='-1',  $
                    t1=530, t2=550, $
                   xplot1=15, xplot2=50, yplot1=10, yplot2=80, charsize=1.5, /ellip          , /deb

         blobtrails, 20, 20, boxRadius=3, shot=138234,  $
                     minHt=2.2, t1=530, t2=550, xSize=500, ySize=600, $
                     /ListTimes, charsize=1.8, psym=4, symSize=2,$
                     xplot1=10, xplot2=40, yplot1=0, yplot2=30

   to get a track of just one blob:
         blobtrails, 8, 40, boxRadius=4, shot=138234,  $
                     minHt=2.2, t1=534, t2=535, xSize=500, ySize=600, $
                     /ListTimes, charsize=1.6, psym=4, symSize=2,$
                     xplot1=-10, xplot2=40   ;;;, yplot1=0, yplot2=30

 MODIFICATION HISTORY:
	01-Oct-2012 colors for single tracks was broken; fixed.
		    Now, both blob positions and separatrix (and limiter) are plotted
		    physical coordinates when plotting in cm. Previously, and still when
		    plotting vs. pixels, the "rhomboid" shape of the fiber bundle is
		    not accounted for.
	28-Sep-2012 when axesInCm set, use actual R & Z values for blob positions, and 
		    plot separtrix from actual R & Zs.
	13-Sep-2012 added EveryOther, suppress, noTitle keywords
  	18-Jul-2012 adjust for plot area not all the pixels
	26-Mar-2012 option to draw separatrix
       22-Mar-2012 Use HM values for ellipse shapes (have an option for size, too)
       01-Dec-2011 fixed duplication of first and last blob indices
       17-Jun-2011 fixed for Database time in msec
       08-Mar-2011 added wholeLife field to database, so "needed" makes more sense
                    (the blob has to have persisted for that many frames to be considered)
       WRITTEN 2-Feb-2011 by Bill Davis for Stewart Zweben

Source: src/idl_cvs/bpass.pro

 NAME:
		bpass
 PURPOSE:
		Implements a real-space bandpass filter which suppress 
		pixel noise and slow-scale image variations while 
		retaining information of a characteristic size.

 CATEGORY:
		Image Processing
 CALLING SEQUENCE:
		res = dgfilter( image, lnoise, lobject )
 INPUTS:
		image:	The two-dimensional array to be filtered.
		lnoise: Characteristic lengthscale of noise in pixels.
			Additive noise averaged over this length should
			vanish. MAy assume any positive floating value.
		lobject: A length in pixels somewhat larger than a typical
			object. Must be an odd valued integer.
 OUTPUTS:
		res:	filtered image.
 PROCEDURE:
		simple 'wavelet' convolution yields spatial bandpass filtering.
 NOTES:
 MODIFICATION HISTORY:
   19-May-2009 Limit filter width so convol doesn't exceed array dimensions [BD]
		Written by David G. Grier, The University of Chicago, 2/93.
		Greatly revised version DGG 5/95.
		Added /field keyword JCC 12/95.
		Revised & added 'stack','voxel' capability JCC 5/97.

	This code 'bpass.pro' is copyright 1997, John C. Crocker and 
	David G. Grier.  It should be considered 'freeware'- and may be
	distributed freely in its original form when properly attributed.

Source: src/idl_cvs/bpwfedit.pro

 NAME:
	BPWFEDIT

 PURPOSE:
	Read, Edit, & Plot Breakpoint Waveform files used in ppcc system on TFTR
 CATEGORY:
       TFTR, Waveforms, GUI Editing

 REVISION HISTORY:
	21-Aug-98 Written by Bill Davis

Source: src/idl_cvs/breakmdsname.pro

 NAME:
       BreakMDSname

 PURPOSE:
       break an MDS pathname near the middle, if too long

 CATEGORY:
	MDSplus, Strings

 CALLING SEQUENCE:
        newLines = BreakMDSname( line )

 INPUTS:
       line - string containing an MDSplus tag or node name      in

 KEYWORD PARAMETERS:
	MAXLENGTH  - max line length (default 72)  OPTIONAL

 OUTPUTS:
	newlines - string array of MDSplus name broken near middle

 EXAMPLE:
    IDL> line = '\ENGINEERING::OPERATIONS.PC_OH_BR_1_CUR_1'
    IDL> newLines = BreakMDSname( line, MAXLENGTH=25 )

 COMMON BLOCKS:
 NOTES:

 MODIFICATION HISTORY:
	01-Apr-99 Written earlier by Bill Davis

Source: src/idl_cvs/breakstring.pro

 NAME:
       BreakString
 PURPOSE:
      Break a string up and return a string array
 CATEGORY:
       Strings
 CALLING SEQUENCE:
       IDL> str_array = BreakString(longString)
 INPUTS:
       longString = a string of words 
 KEYWORD PARAMETERS:
       Optional Keywords:
	  MAXLENGTH - Maximum length of array elements of output (else=72)
	  DELIMITER - delimiter, else ' ' 
		(see WORDARRAY for multispace delmiters')
	  COMPRESS    - if set, squeeze out extra imbedded blanks
 OUTPUTS:
       str_array = returned array of strings             	out
 COMMON BLOCKS:
       NONE
 EXAMPLE:
    IDL> line = '\ENGINEERING::OPERATIONS.PC_OH_BR_1_CUR_1'
    IDL> newLines = BreakString( BreakString, MAXLENGTH=25, DELIM=':' )
 NOTES:
	Can be used as a replacement for obsolete str_sep routine
 MODIFICATION HISTORY:
	31-Jan-02 bug fix and speed improvement 
       1-Apr-99 Written by Bill Davis, PPPL

Source: src/idl_cvs/breaktext.pro

 NAME:
       breaktext
 PURPOSE:
       break up (justify) text so lines not longer than a certain length.
 CATEGORY:
       strings
 CALLING SEQUENCE:
       IDL> newText = breakText( text )
 INPUTS:
	text - string array or scalar
 KEYWORD PARAMETERS:
	nper - number of characters per line (DEFAULT=72)
	break - if set, lines longer than nper characters will be broken at an earlier space
 OUTPUTS:
       string array returned
 EXAMPLE:
    text = ['This is the first line  this is the second', ' ',  $
	     '123456789 123456789 123456789 123456789 123456789 ']
    wrapped = breaktext( text, delim='  ', maxlength=25 )

 NOTE:
  
 MODIFICATION HISTORY:
	14-Aug-2008  Written by Bill Davis, PPPL

Source: src/idl_cvs/break_path.pro

 NAME: 
    BREAK_PATH

 PURPOSE: 
     Breaks up a path string into its component directories.

 CATEGORY:
       MDSplus, Strings
 CALLING SEQUENCE: 
     Result = BREAK_PATH( PATHS [ /NoCurrent])

 INPUTS: 
     PATHS   = A string containing one or more directory paths.  The
               individual paths are separated by commas, although in UNIX, 
               colons can also be used.  In other words, PATHS has the same 
               format as !PATH, except that commas can be used as a separator 
               regardless of operating system.

               A leading $ can be used in any path to signal that what follows 
               is an environmental variable, but the $ is not necessary.  (In 
               VMS the $ can either be part of the path, or can signal logical
               names for compatibility with Unix.)  Environmental variables
               can themselves contain multiple paths.

 OUTPUT: 
      The result of the function is a string array of directories.
      Unless the NOCURRENT keyword is set, the first element of the array is 
      always the null string, representing the current directory.  All the 
      other directories will end in the correct separator character for the 
      current operating system.

 OPTIONAL INPUT KEYWORD:
      /NOCURRENT = If set, then the current directory (represented by
               the null string) will not automatically be prepended to the
               output.

 PROCEDURE CALLS:
      Functions:  DATATYPE(), breakstring()

 REVISION HISTORY:
       Version 1, William Thompson, GSFC, 6 May 1993.
               Added IDL for Windows compatibility.
       Version 2, William Thompson, GSFC, 16 May 1995
               Added keyword NOCURRENT
       Version 3, William Thompson, GSFC, 29 August 1995
               Modified to use OS_FAMILY
       Version 4, Zarro, GSFC, 4 August 1997
               Added trim to input
       Converted to IDL V5.0   W. Landsman 25-Nov-1997

Source: src/idl_cvs/btest.pro

 NAME:
    BTEST       

 PURPOSE:
    To test bit N in FIX(X)

 CATEGORY:
    Bits, Hardware

 CALLING SEQUENCE:
    YesNo = btest( X, N )

 PARAMETERS:  
    Inputs:
    	X      (REQ) (I) (0 1) (I  F)
           	X is the variable to be tested
   
    	N      (REQ) (I) (0) (I)
           	The bit of X to be tested
     Returned:
    	YESNO  (REQ) (O) (0 1) (I)
           	The result of the test. 1(true) if bit N is set, 0(false)
           	otherwise.

 EXAMPLES:

        YESNO = btest( !X.STYLE, 4 )
        IF YESNO THEN PRINT,'X-axis suppressed' $
                 ELSE PRINT,'Draw X-axis'

        To find points in NEWSIPS which are outside calibrated region:
        YESNO = btest( ABS(NU),1 )             ; look for nu flag = -2
        IND = WHERE (YESNO EQ 0)            ; keep points where yesno = 0
        PLOT,W(IND),F(IND)                  ; plot calibrated points
        
 NOTES:

     Note that negative integers are stored in twos complement form.
     Therefore, the left-most bits are ON rather than OFF as they are for 
     positive numbers. Input the absolute value of X is negative numbers 
     to avoid this problem. 

     This procedure can be used to check the values of complex
     IDL system variables such as ![XYZ].STYLE.

 PROCEDURE:

     Checks whether (FIX(X) OR (NOT 2^N)) = -1 to set the output
     flag YESNO.

 MODIFICATION HISTORY:
	26-Oct-99 Convert from btest to make a function (like FORTRAN)
     Mar  6 1983 RJP GSFC initial program
     Aug 24 1987 RWT GSFC add PARCHECK
     Mar  7 1988 CAG GSFC all VAX RDAF-style prolog
     Jul 13 1990 RWT GSFC Sun mods: use examples pertinent to SUN IDL
                 and add listing of procedure call statement
     Jun 19 1991 PJL GSFC cleaned up; tested on SUN and VAX; updated prolog
     Mar  8 1993 RWT GSFC modify to allow X & YESNO to be vectors and 
                 add documentation about negative numbers.