#! python import sys sys.path.append("./py-svg") import time import math import svgscene # hardwired min resolution of 60s def logtimeago(fromtime, latesttime): logago = math.log(latesttime - fromtime) minresolution = math.log(300) # 5 minutes if logago < minresolution: return 0 else: return logago - minresolution class inverseLogGraph: def __init__(self, xmin, xmax, xorigin, ymin, ymax, width, height): self._xmin = xmin self._xmax = xmax self._xorigin = xorigin self._ymin = ymin self._ymax = ymax self._width = width self._height = height def xvaltopixel(self, value): if value < self._xmin: raise "value too low" valuelog = logtimeago(value, self._xorigin) xminlog = logtimeago(self._xmin, self._xorigin) xmaxlog = logtimeago(self._xmax, self._xorigin) return self._width * ( xminlog - valuelog ) / ( xminlog - xmaxlog ) def yvaltopixel(self, value): scaled = self._height * ( value - self._ymin ) / ( self._ymax - self._ymin ) return self._height - scaled class dataset: def __init__(self, origintime): self._buckets = [] self._latesttime = origintime def add(self, fromtime, value): bucket = self.getbucket(fromtime) bucket.addtime(fromtime) bucket.add(value) def getbucket(self, fromtime): timeago = logtimeago(fromtime, self._latesttime) bucketnum = int(timeago * 10) while len(self._buckets) <= bucketnum: self._buckets.append(bucket()) return self._buckets[bucketnum] def maxcount(self): maxc = self._buckets[0].max for b in self._buckets: if b.max > maxc: maxc = b.max return maxc def oldesttime(self): return self._buckets[len(self._buckets)-1].mintime def latesttime(self): for b in self._buckets: if b.nonempty(): return b.maxtime def graph(self, scene, graph, css): maxcount = self.maxcount() for b in self._buckets: b.drawmarker(scene, graph, css) def dump(self): for b in self._buckets: if b.nonempty(): b.dump() class bucket: def __init__(self): self.max = None self.min = None self.total = 0 self.points = 0 self.maxtime = None self.mintime = None def add(self, value): if self.max == None or value > self.max: self.max = value if self.min == None or value < self.min: self.min = value self.total = self.total + value self.points = self.points + 1 def addtime(self, time): if self.maxtime == None or time > self.maxtime: self.maxtime = time if self.mintime == None or time < self.mintime: self.mintime = time def dump(self): print self.min, "to", self.max, "avg", (self.total / self.points), "between", time.ctime(self.mintime), "and", time.ctime(self.maxtime) def nonempty(self): return self.max != None def drawmarker(self, scene, graph, css): if not self.nonempty(): return xhigh = graph.xvaltopixel(self.mintime) xlow = graph.xvaltopixel(self.maxtime) midpoint = xlow + ( xhigh - xlow ) / 2 ymax = graph.yvaltopixel(self.max) ymin = graph.yvaltopixel(self.min) yavg = graph.yvaltopixel(self.total / self.points) if xlow == xhigh: scene.line(xlow-1, yavg, xhigh+1, yavg, css) else: scene.line(midpoint, ymin, midpoint, ymax, css) scene.line(xlow, yavg, xhigh, yavg, css) def fileheader(filetitle): print """