This file is indexed.

/usr/share/gnudatalanguage/astrolib/plothist.pro is in gdl-astrolib 2018.02.16+dfsg-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
PRO plothist, arr, xhist,yhist, BIN=bin,  NOPLOT=NoPlot, $
                 OVERPLOT=Overplot, PSYM = psym, Peak=Peak, $
                 Fill=Fill, FCOLOR=Fcolor, FLINE=FLINE, $
                 FTHICK=FThick, FSPACING=Fspacing, FPATTERN=Fpattern, $
                 FORIENTATION=Forientation, NAN = NAN, $
                 _EXTRA = _extra, Halfbin = halfbin, AUTOBin = autobin, $
                 Boxplot = boxplot, xlog = xlog, ylog = ylog, $
                 xrange=xrange,yrange = yrange, Color = color,axiscolor=axiscolor, $
                 rotate = rotate, WINDOW=window,XSTYLE=xstyle, YSTYLE = ystyle,$
		 THICK= thick, LINESTYLE = linestyle, SQRT=SQRT
;+
; NAME:
;      PLOTHIST
; PURPOSE:
;      Plot the histogram of an array with the corresponding abscissa.
;
; CALLING SEQUENCE:
;      plothist, arr, xhist, yhist, [, BIN=, /FILL, /NOPLOT, /OVERPLOT, PEAK=,
;                                     /AUTOBIN,  ...plotting keywords]
; INPUTS:
;      arr - The array to plot the histogram of.   It can include negative
;            values, but non-integral values will be truncated.              
;
; OPTIONAL OUTPUTS:
;      xhist - X vector used in making the plot  
;              ( = lindgen( N_elements(h)) * bin + min(arr) )
;      yhist - Y vector used in making the plot  (= histogram(arr/bin))
;
; OPTIONAL INPUT-OUTPUT KEYWORD:
;      BIN -  The size of each bin of the histogram, positive scalar (not necessarily
;             integral).  If not present (or zero), then the default is to 
;             automatically determine the binning size using Scott's normal
;             reference rule (see https://en.wikipedia.org/wiki/Histogram )
;             Prior to July 2016, the default was to use the square root of the
;             number of data points (see /sqrt keyword).
;             If undefined on input, then upon return BIN will contain the 
;             automatically computing bin factor.
; OPTIONAL INPUT KEYWORDS:
;      /AUTOBIN - (OBSOLETE) Formerly would automatically determines bin size 
;                 of the histogram as the square root of the number of samples. 
;                 This is now the default so the keyword is no longer needed.
;                 Use the  BIN keyword to manually set the bin size.
;      AXISCOLOR - Color (string or number) of the plotting axes.  
;      BOXPLOT - If set (default), then each histogram data value is plotted
;             "box style" with vertical lines drawn from Y=0 at each end of 
;              the bin width.   Set BOXPLOT=0 to suppress this.
;      COLOR - Color (number or string) of the plotted data.    See CGCOLOR
;              for a list of available color names. 
;      /HALFBIN - Set this keyword to a nonzero value to shift the binning by
;              half a bin size.     This is useful for integer data, where e.g.
;              the bin for values of 6 will go from 5.5 to 6.5.   The default
;              is to set the HALFBIN keyword for integer data, and not for
;              non-integer data.     
;      /NAN - The default is to check for the occurrence of IEEE not-a-number 
;             values for non-integer input.   Set NAN=0 for PLOTHIST to give
;             a traceback error if NaN values are present.
;      /NOPLOT - If set, will not plot the result.  Useful if the intention is
;             to only get the xhist and yhist outputs.
;      /OVERPLOT - If set, will overplot the data on the current plot.  User
;            must take care that only keywords valid for OPLOT are used.
;      PEAK - if non-zero, then the entire histogram is normalized to have
;             a maximum value equal to the value in PEAK.  If PEAK is
;             negative, the histogram is inverted.
;      /FILL - if set, will plot a filled (rather than line) histogram.
;      /ROTATE - if set, the plot is rotated onto it's side, meaning the bars 
;             extend from left to right.  Xaxis corresponds to the count within 
;             in each bin.      Useful for placing a histogram plot
;             at the side of a scatter plot.
;       /SQRT - if set, and the BIN keyword is not supplied, then the bin size
;             is computed as the square root of the number of data points.  This
;             was the default prior to July 2016. 
;       WINDOW - Set this keyword to plot to a resizeable graphics window
;
;
; The following keywords will automatically set the  FILL keyword:
;      FCOLOR - color (string or number) to use for filling the histogram
;      /FLINE - if set, will use lines rather than solid color for fill (see
;              the LINE_FILL keyword in the POLYFILL routine)
;      FORIENTATION - angle of lines for fill (see the ORIENTATION keyword
;              in the POLYFILL routine)
;      FPATTERN - the pattern to use for the fill (see the PATTERN keyword
;              in the POLYFILL routine)
;      FSPACING - the spacing of the lines to use in the fill (see the SPACING
;              keyword in the POLYFILL routine)
;      FTHICK - the thickness of the lines to use in the fill (see the THICK
;              keyword in the POLYFILL routine)
;
; Any input keyword that can be supplied to the cgPLOT procedure (e.g. XRANGE,
;    AXISCOLOR, LINESTYLE, /XLOG, /YLOG) can also be supplied to PLOTHIST.
;
; EXAMPLE:
;       (1) Create a vector of random 1000 values derived from a Gaussian of 
;       mean 0, and sigma of 1.    Plot the histogram of these values with a 
;       binsize of 0.1, and use a blue colored box fill.
;
;       IDL> a = randomn(seed,1000)
;       IDL> plothist,a, bin = 0.1,fcolor='blue'
;
;       (2) As before, but use autobinning and fill the plot with diagonal lines at 
;           a 45 degree angle
;
;       IDL> plothist,a, /fline, forient=45
;
; NOTES:
;       David Fanning has written a similar program CGHISTOPLOT with more graphics
;       options:   See http://www.idlcoyote.com/programs/cghistoplot.pro
; MODIFICATION HISTORY:
;        Written     W. Landsman            January, 1991
;        Add inherited keywords W. Landsman        March, 1994
;        Use ROUND instead of NINT  W. Landsman   August, 1995
;        Add NoPlot and Overplot keywords.   J.Wm.Parker  July, 1997
;        Add Peak keyword.   J.Wm.Parker  Jan, 1998
;        Add FILL,FCOLOR,FLINE,FPATTERN,FSPACING keywords. J.Wm.Parker Jan, 1998
;        Add /NAN keyword        W. Landsman October 2001
;        Don't plot out of range with /FILL, added HALFBIN keyword, make
;        half bin shift default for integer only W. Landsman/J. Kurk May 2002
;        Add BOXPLOT keyword, use exact XRANGE as default W.L.  May 2006
;        Allow use of /XLOG and /YLOG keywords  W.L. June 2006
;        Adjust Ymin when /YLOG is used  W. L.  Sep 2007
;        Added AXISCOLOR keyword, fix color problem with overplots WL Nov 2007
;        Check when /NAN is used and all elements are NAN  S. Koposov Sep 2008
;        Added /ROTATE keyword to turn plot on its side. J. Mullaney, 2009.
;        Added FTHICK keyword for thickness of fill lines. L. Anderson Oct. 2010
;        Use Coyote Graphics  W. Landsman Feb 2011
;        Explicit XSTYLE, YSTYLE keywords to avoid _EXTRA confusion WL. Aug 2011
;        Fix PLOT keyword problem with /ROTATE  WL  Dec 2011
;        Fix problems when /XLOG is set A. Kimball/WL April 2013
;        Fix FILL to work when axis is inverted (xcrange[0] >
;          xcrange[1]) T.Ellsworth-Bowers July 2014
;        Make /NaN,/AUTOBIN and BOXPLOT the default  W. Landsman   April 2016
;        Speed up COLOR processing W. Landsman  July 2016
;        Use Scott's normal reference rule for bin size W. Landsman  July 2016
;        Check for NaN values when computing min and max W. Landsman  Jan 2017
;        Always set a minimum number of bins   W. Landsman   Feb 2017
;-
;			Check parameters.

 compile_opt idl2

 if N_params() LT 1 then begin   
	print,'Syntax - plothist, arr, [xhist,yhist, ' 
        print, '         [/AUTOBIN, BIN=, /BOXPLOT, HALFBIN=, PEAK=, /NOPLOT,'
	print, '         /OVERPLOT, /FILL...plotting keywords]' 
        print,'Fill keywords: FCOLOR=, /FLINE, FORIENTATION=, FPATTERN=,' + $
              'FSPACING= '
	return
 endif


 Catch, theError
 if theError NE 0 then begin 
     Catch,/Cancel
     void = cgErrorMsg(/quiet)
     return
 endif

if N_elements( arr ) LT 2 then message, $
      'ERROR - Input array must contain at least 2 elements',/noname

 
 minarr = min( arr, MAX = maxarr,/NaN)
 if ( minarr EQ maxarr ) then message, /noname, $
       'ERROR - Input array must contain distinct values'
  if N_elements(boxplot) EQ 0 then boxplot=1     

 dtype = size(arr,/type)
 floatp = (dtype EQ 4) || (dtype EQ 5)

 ;Determining how to calculate bin size:
 if ~keyword_set(BIN) then begin

;    Compute bin size using Scott's normal reference rule?

       if keyword_set(sqrt) then $
        bin = (maxarr-minarr)/sqrt(N_elements(arr)) else $   ;Square root rule
       bin = (3.5D * StdDev(arr, /NAN))/N_Elements(arr)^(1./3.0D) 
       if ~floatp then bin = bin > 1
; If xrange is set, make sure we have at least 4 bins       
        if keyword_set(xrange) then bin = bin < (xrange[1] - xrange[0])/4.
       
 endif else begin
    bin = float(abs(bin))
 endelse

 

; Compute the histogram and abscissa.    
; Determine if a half bin shift is 
; desired (default for integer data)     
 if N_elements(halfbin) EQ 0 then halfbin = ~floatp         ;integer data?
 
 
 if N_elements(NaN) EQ 0 then NaN = 1
 if floatp && NaN then begin
      good = where(finite(arr), ngoods )
      if ngoods eq 0 then $
              message, 'ERROR - Input array contains no finite values'

      if halfbin then y = round( ( arr[good] / bin)) $
                 else y = floor( ( arr[good] / bin))
 endif else if halfbin then y = round( ( arr / bin)) $
                       else y = floor( ( arr/ bin)) 
 
 ;Determine number in each bin:
 yhist = histogram( y )
 N_hist = N_elements( yhist )
 
 ;Positions of each bin:
 xhist = lindgen( N_hist ) * bin + min(y*bin) 

 if ~halfbin then xhist = xhist + 0.5*bin

;;;
;   If renormalizing the peak, do so.
;
if keyword_set(Peak) then yhist = yhist * (Peak / float(max(yhist)))

;;;
;   If not doing a plot, exit here.
;
 if keyword_set(NoPlot) then return
 
 ;JRM;;;;;
 xst_set = keyword_set(xstyle)?1:0
 yst_set = keyword_set(ystyle)?1:0
;JRM;;;;;
 
 if N_elements(fill) EQ 0 then $
    fill  = keyword_set(fcolor) || keyword_set(fline)
    
 if keyword_set(over) then begin ;if overplotting, was original plot a log?
      if N_elements(ylog) EQ 0 then ylog = !Y.type
      if N_elements(xlog) EQ 0 then xlog = !X.type
 endif     
 if N_elements(PSYM) EQ 0 then psym = 10         ;Default histogram plotting
 if ~keyword_set(XRANGE) then xrange = [ xhist[0]-bin ,xhist[N_hist-1]+bin ]
 if ~keyword_set(xstyle) then xstyle=1
 
 if  keyword_set(ylog) then begin 
     ymin = min(yhist) GT 1 ? 1 : 0.1
     if N_elements(yrange) EQ 2 then ymin = ymin < yrange[0] 
     ;ydata contains the y-positions where the lines should be linked.
     ydata = [ymin, yhist>ymin, ymin] 
  endif else ydata = [0, yhist, 0]
 ;xdata contains the y-positions where the lines should be linked.
 xdata = [xhist[0] - bin, xhist, xhist[n_hist-1]+ bin]
 if keyword_set(xlog) then xrange[0] = xrange[0]>1
 
 ;JRM;;;;;;;;;;;
  IF n_elements(rotate) EQ 1 THEN BEGIN
    old_xdata = xdata
    old_ydata = ydata
    xdata = old_ydata
    ydata = old_xdata
    
    old_xhist=xhist
    old_yhist=yhist
    xhist=old_yhist
    yhist=old_xhist
    
    ;If xrange is not set.
    ;Then the auto x- range by setting xrange to [0,0].
    if ~xst_set then xstyle=0
    if ~yst_set then ystyle=1
    
 ENDIF
 
 
  if ~keyword_set(Overplot) then begin

     cgplot, xdata , ydata,  $ 
           PSYM = psym, _EXTRA = _extra,xrange=xrange,axiscolor=axiscolor, $
           xstyle=xstyle, xlog = xlog, ylog = ylog, yrange=yrange, $
           ystyle=ystyle, /nodata,window=window
	   if keyword_Set(window) then cgcontrol,execute=0
  endif
;JRM;;;;;;;;;;;;;

;;;
;   If doing a fill of the histogram, then go for it.
;
  if N_elements(color) EQ 0 then color = cgcolor('opposite')
 
 if keyword_set(Fill) then begin
    ;JRM;;;;;;;;;;;
    xcrange = keyword_set(xlog)? 10^!X.CRANGE : !X.CRANGE
    ycrange = keyword_set(ylog)? 10^!Y.CRANGE : !Y.CRANGE
       
    IF n_elements(rotate) EQ 0 THEN BEGIN
       Xfill = transpose([[Xhist-bin/2.0],[Xhist+bin/2.0]])
       Xfill = reform(Xfill, n_elements(Xfill))
       Xfill = [Xfill[0], Xfill, Xfill[n_elements(Xfill)-1]]
       Yfill = transpose([[Yhist],[Yhist]])
       Yfill = reform(Yfill, n_elements(Yfill))
    
       if keyword_set(ylog) then Yfill = [ycrange[0]/10, Yfill, ycrange[0]/10] $
       else yfill = [0, yfill, 0 ]
       
    ENDIF ELSE BEGIN
       Xfill = transpose([[Xhist],[Xhist]])
       Xfill = reform(Xfill, n_elements(Xfill))
       Yfill = transpose([[Yhist-bin/2.0],[Yhist+bin/2.0]])
       Yfill = reform(Yfill, n_elements(Yfill))
       Yfill = [Yfill[0], Yfill, Yfill[n_elements(Yfill)-1]]
    
       if keyword_set(xlog) then Xfill = [xcrange[0]/10, xfill, xcrange[0]/10] $
       else xfill = [0, xfill, 0 ]
    ENDELSE
    ;JRM;;;;;;;;;;;

    ;; TPEB;;;;;;;;;;;
    ;; Check if plot ranges are reversed (i.e. large to small)
    Xfill = (XCRANGE[0] GT XCRANGE[1]) ? Xfill > XCRANGE[1] < XCRANGE[0] : $
            Xfill > XCRANGE[0] < XCRANGE[1] ;Make sure within plot range
    
    Yfill = (YCRANGE[0] GT YCRANGE[1]) ? Yfill > YCRANGE[1] < YCRANGE[0] : $
            Yfill > YCRANGE[0] < YCRANGE[1]
    ;; TPEB;;;;;;;;;;;
    
    if keyword_set(Fcolor) then Fc = Fcolor else Fc = 'Opposite'
    if keyword_set(Fline) then begin
       Fs =  keyword_set(Fspacing) ? Fspacing : 0
       Fo =  keyword_set(Forientation) ? Forientation: 0
       cgcolorfill, Xfill,Yfill, color=Fc, /line_fill, spacing=Fs, orient=Fo, $
         thick = fthick, WINDOW=window
    
    endif else begin
   
       if keyword_set(Fpattern) then begin
          cgcolorfill, Xfill,Yfill, color=Fc, pattern=Fpattern, window=window
       endif else begin
          cgcolorfill, Xfill,Yfill, color=Fc,window=window
       endelse
    endelse
 endif
 
 ;JRM;;;;;;;;;;;
 IF n_elements(rotate) GT 0 THEN BEGIN
    ;Need to determine the positions and use plotS.
    ycrange = keyword_set(ylog)? 10^!Y.CRANGE : !Y.CRANGE
    xcrange = keyword_set(xlog)? 10^!X.CRANGE : !X.CRANGE
    cgplots, xdata[0]<xcrange[1], ycrange[1]<(ydata[0]-bin/2)>ycrange[0], $
           color=color,Thick = thick, LINESTYLE = linestyle, ADDCMD=window
    cgplots, xdata[0]<xcrange[1], ycrange[1]<(ydata[1]-bin/2)>ycrange[0], $
           color=color,THICK = thick, LINESTYLE= linestyle, ADDCMD=window
   
 FOR i=1, n_elements(xdata)-2 DO BEGIN
       sColor = cgcolor(color)
       cgplots, xdata[i]<xcrange[1], ycrange[1]<(ydata[i]-bin/2)>ycrange[0], $
              color=sColor, THICK=thick, LINESTYLE= linestyle, $
	      /CONTINUE,ADDCMD=window
       cgplots, xdata[i]<xcrange[1], ycrange[1]<(ydata[i+1]-bin/2)>ycrange[0], $
              color=sColor, /CONTINUE,THICK=thick, LINESTYLE=linestyle, $
	       ADDCMD=window
    ENDFOR
    cgplots, xdata[i]<xcrange[1], ycrange[1]<(ydata[i]-bin/2)>ycrange[0], $
           color=color, /CONTINUE, THICK=thick, LINESTYLE = linestyle, $
	   ADDCMD=window
 ENDIF ELSE BEGIN
    cgplot, /over, xdata, ydata, XSTYLE= xstyle, YSTYLE = ystyle, $ 
           PSYM = psym, THICK=thick, LINESTYLE = linestyle, $
	    _EXTRA = _extra,color=color,ADDCMD=window
    ENDELSE
 ;JRM;;;;;;;;;;;
 
 ; Make histogram boxes by drawing lines in data color.
if keyword_set(boxplot) then begin
   ;JRM;;;;;;;;;;;
   IF n_elements(rotate) EQ 0 THEN BEGIN
      ycrange = keyword_set(ylog)? 10^!Y.CRANGE : !Y.CRANGE
      scolor = cgcolor(color)
      tabinv,xhist,!x.crange[1],imax
      FOR j =0 ,ceil(imax) DO BEGIN
         cgplotS, [xhist[j], xhist[j]]-bin/2, [YCRange[0], yhist[j], Ycrange[1]], $
                Color=sColor,noclip=0, THICK=thick, LINESTYLE = linestyle, $
		_Extra=extra,ADDCMD=window

      ENDFOR 
      
   ENDIF ELSE BEGIN
      xcrange = keyword_set(xlog)? 10^!X.CRANGE : !X.CRANGE
      scolor = cgcolor(color)
      FOR j =0 ,N_Elements(xhist)-1 DO BEGIN
         cgPlotS, [xcrange[0], xhist[j]<xcrange[1]], [yhist[j], $
	            yhist[j]]-bin/2, ADDCMD=window, THICK=thick, $
                    LINESTYLE = linestyle, Color=sColor, noclip=0
      ENDFOR 
   ENDELSE
   ;JRM;;;;;;;;;;;
endif

 if keyword_Set(window) then cgcontrol,execute=1
 return
 end