improved averaging choices
authorAndrew Tridgell <tridge@samba.org>
Sat, 16 Oct 2010 23:45:57 +0000 (10:45 +1100)
committerAndrew Tridgell <tridge@samba.org>
Sat, 16 Oct 2010 23:45:57 +0000 (10:45 +1100)
live/graphs.js

index f144649069f7c0aee105d67e17ee639b9794958e..9a6d3a6f7fc8645bd0e3a155c50b011b61de6cb0 100644 (file)
@@ -730,28 +730,27 @@ function round_time(t, n) {
  */
 function average_data(data, n) {
   var ret = new Array();
-  var rem = data.length % n;
   var y;
-  for (y=0; y<data.length-rem; y++) {
-    var y2 = Math.round((y/n)-0.5);
+  var counts = new Array();
+  for (y=0; y<data.length; y++) {
     var t = round_time(data[y][0], n);
-    if (ret[y2] == undefined) {
-      ret[y2] = data[y];
-      for (var x=1; x<ret[y2].length; x++) {
-       ret[y2][x] /= n;
+    var y2 = ret.length;
+    if (ret.length > 0 && t == ret[ret.length-1][0]) {
+      y2 = ret.length-1;
+      counts[y2]++;
+      for (var x=1; x<data[y].length; x++) {
+       ret[y2][x] += data[y][x];
       }
     } else {
-      for (var x=1; x<ret[y2].length; x++) {
-       ret[y2][x] += data[y][x]/n;
-      }
+      counts[y2] = 1;
+      ret[y2] = data[y];
+      ret[y2][0] = t;
     }
-    ret[y2][0] = t;
   }
-  for (; y<data.length; y++) {
-    var y2 = ret.length;
-    var t = round_time(data[y][0], 1);
-    ret[y2] = data[y];
-    ret[y2][0] = t;
+  for (y2=0; y2<ret.length; y2++) {
+    for (var x=1; x<ret[y2].length; x++) {
+      ret[y2][x] /= counts[y2];
+    }
   }
   return ret;
 }
@@ -870,7 +869,19 @@ function graph_csv_files_func(divname, filenames, columns, func1, func2, attrs)
     }
     if (auto_averaging) {
       if (d2.data != null && (d2.data.length/defaultAttrs.averaging) > max_points) {
-       set_averaging(Math.round(0.5+(d2.data.length / max_points)));
+       var averaging_times = [ 1, 2, 5, 10, 15, 20, 30, 60, 120 ];
+       var tdiff = 1;
+       for (var y=d2.data.length-1; y>1; y--) {
+         if (d2.data[y][0] != undefined && d2.data[y-1][0] != undefined) {
+           tdiff = (d2.data[y][0] - d2.data[y-1][0])/(60*1000);
+         }
+       }
+       for (var i=0; i<averaging_times.length-1; i++) {
+         if (d2.data.length/(averaging_times[i]*tdiff) <= max_points) {
+           break;
+         }
+       }
+       set_averaging(averaging_times[i]);
       }
     }