1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
#!/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: ***
|