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