#!/usr/bin/env python import random import sys import time try: import resource has_resource = 1 except ImportError: has_resource = 0 from PyQt4 import Qt import PyQt4.Qwt5 as Qwt from PyQt4.Qwt5.anynumpy import * def standard_map(x, y, kappa): """provide one interate of the inital conditions (x, y) for the standard map with parameter kappa. """ y_new = y-kappa*sin(2.0*pi*x) x_new = x+y_new # bring back to [0,1.0]^2 if( (x_new>1.0) or (x_new<0.0) ): x_new = x_new - floor(x_new) if( (y_new>1.0) or (y_new<0.0) ): y_new = y_new - floor(y_new) return x_new, y_new # standard_map class MapDemo(Qt.QMainWindow): def __init__(self, *args): Qt.QMainWindow.__init__(self, *args) self.plot = Qwt.QwtPlot(self) self.plot.setTitle("A Simple Map Demonstration") self.plot.setCanvasBackground(Qt.Qt.white) self.plot.setAxisTitle(Qwt.QwtPlot.xBottom, "x") self.plot.setAxisTitle(Qwt.QwtPlot.yLeft, "y") self.plot.setAxisScale(Qwt.QwtPlot.xBottom, 0.0, 1.0) self.plot.setAxisScale(Qwt.QwtPlot.yLeft, 0.0, 1.0) self.setCentralWidget(self.plot) # Initialize map data self.count = self.i = 1000 self.xs = zeros(self.count, Float) self.ys = zeros(self.count, Float) self.kappa = 0.2 self.curve = Qwt.QwtPlotCurve("Map") self.curve.attach(self.plot) self.curve.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse, Qt.QBrush(Qt.Qt.red), Qt.QPen(Qt.Qt.blue), Qt.QSize(5, 5))) self.curve.setPen(Qt.QPen(Qt.Qt.cyan)) toolBar = Qt.QToolBar(self) self.addToolBar(toolBar) toolBar.addWidget(Qt.QLabel("Count:", toolBar)) sizeCounter = Qwt.QwtCounter(toolBar) toolBar.addWidget(sizeCounter) toolBar.addSeparator() sizeCounter.setRange(0, 1000000, 100) sizeCounter.setValue(self.count) sizeCounter.setNumButtons(3) self.connect( sizeCounter, Qt.SIGNAL('valueChanged(double)'), self.setCount) toolBar.addWidget(Qt.QLabel("Ticks (ms):", toolBar)) tickCounter = Qwt.QwtCounter(toolBar) toolBar.addWidget(tickCounter) toolBar.addSeparator() # 1 tick = 1 ms, 10 ticks = 10 ms (Linux clock is 100 Hz) self.ticks = 10 tickCounter.setRange(0, 1000, 1) tickCounter.setValue(self.ticks) tickCounter.setNumButtons(3) self.connect( tickCounter, Qt.SIGNAL('valueChanged(double)'), self.setTicks) self.tid = self.startTimer(self.ticks) self.timer_tic = None self.user_tic = None self.system_tic = None self.plot.replot() # __init__() def setCount(self, count): self.count = self.i = count self.xs = zeros(self.count, Float) self.ys = zeros(self.count, Float) self.i = self.count self.killTimer(self.tid) self.tid = self.startTimer(self.ticks) # setCount() def setTicks(self, ticks): self.i = self.count self.ticks = int(ticks) self.killTimer(self.tid) self.tid = self.startTimer(ticks) # setTicks() def resizeEvent(self, event): self.plot.resize(event.size()) self.plot.move(0, 0) # resizeEvent() def moreData(self): if self.i == self.count: self.i = 0 self.x = random.random() self.y = random.random() self.xs[self.i] = self.x self.ys[self.i] = self.y self.i += 1 if has_resource: self.user_toc, self.system_toc = resource.getrusage( resource.RUSAGE_SELF)[:2] if self.user_tic: print "user: %s s;" % (self.user_toc-self.user_tic), self.user_tic = self.user_toc if self.system_tic: print "system: %s s;" % (self.system_toc-self.system_tic), self.system_tic = self.system_toc self.timer_toc = time.time() if self.timer_tic: print "wall: %s s." % (self.timer_toc-self.timer_tic) self.timer_tic = self.timer_toc else: self.x, self.y = standard_map(self.x, self.y, self.kappa) self.xs[self.i] = self.x self.ys[self.i] = self.y self.i += 1 # moreData() def timerEvent(self, e): self.moreData() self.curve.setData(self.xs[:self.i], self.ys[:self.i]) self.plot.replot() # timerEvent() # class MapDemo def make(): demo = MapDemo() demo.resize(600, 600) demo.show() return demo # make() def main(args): app = Qt.QApplication(args) demo = make() sys.exit(app.exec_()) # main() # Admire! if __name__ == '__main__': if 'settracemask' in sys.argv: # for debugging, requires: python configure.py --trace ... import sip sip.settracemask(0x3f) main(sys.argv) # Local Variables: *** # mode: python *** # End: ***