1 /**
  2  * @fileOverview A simple one dimensional histogram.
  3  * @author <a href="mailto:thomas.bretz@epfl.ch">Thomas Bretz</a>
  4  */
  5 'use strict';
  6 
  7 /**
  8  *
  9  * @constructor
 10  *
 11  * @param {Interger} nx
 12  *
 13  * @param {Number} xmin
 14  *
 15  * @param {Number} xmax
 16  *
 17  * @returns
 18  *     A sub-classed array with the Hist1D functions added as properties.
 19  *
 20  * @example
 21  *     var hist = Hist1D(10, -0.5, 1.5);
 22  *
 23  */
 24 function Hist1D(nx, xmin, xmax)
 25 {
 26     /**
 27      *
 28      * Array
 29      *
 30      */
 31     var arr = new Array(nx);
 32 
 33     /**
 34      *
 35      * @exports arr.get as Hist1D.get
 36      *
 37      */
 38     arr.get = function(x)
 39     {
 40         var ix = parseInt(nx*(x-xmin)/(xmax-xmin));
 41 
 42         return arr[ix] ? arr[ix] : 0;
 43     }
 44 
 45     /**
 46      *
 47      * @exports arr.fill as Hist1D.fill
 48      *
 49      */
 50     arr.fill = function(x, w)
 51     {
 52         if (!x || x===NaN)
 53             return false;
 54 
 55         var ix = parseInt(nx*(x-xmin)/(xmax-xmin));
 56         if (ix<0 || ix>=nx)
 57             return false;
 58 
 59         if (!arr[ix])
 60             arr[ix] = 0;
 61 
 62         arr[ix] += w ? w : 1;
 63 
 64         return true;
 65     }
 66 
 67     /**
 68      *
 69      * @exports arr.print as Hist1D.print
 70      *
 71      */
 72     arr.print = function(len)
 73     {
 74         if (!len)
 75             len = 40;
 76         if (len<6)
 77             len = 6;
 78 
 79         var sum = arr.reduce(function(a,b){return a+b;}, 0);
 80         var max = arr.reduce(function(a,b){return Math.max(a,b);}, 0);
 81 
 82         console.out("");
 83         for (var ix=nx-1; ix>=0; ix--)
 84         {
 85             var entry = arr[ix] ? arr[ix] : 0;
 86 
 87             var line ="%3d [%3d%] ".$(ix, sum==0 ? 0 : 100*entry/sum);
 88             if (arr[ix])
 89             {
 90                 var val = parseInt(len*arr[ix]/max);
 91                 var entry = ("%"+val+"s").$("");
 92                 entry = entry.replace(/ /g, "*");
 93                 line += ("%-"+len+"s").$(entry)+" |";
 94             }
 95 
 96             console.out(line);
 97         }
 98 
 99         var entry = arr[ix] ? arr[ix] : 0;
100         console.out("   --------"+("%"+(len-5)+"s").$("")+"-------");
101 
102         var line =" %9d  ".$(sum);
103         line += ("%"+len+"d").$(max);
104         console.out(line);
105         console.out("");
106     }
107 
108     return arr;
109 }
110